朝日新聞2004年6月5日のパズルパーク問題

問題

04年06月05日18時27分以降で0〜9までの数字を1つずつ使う日付の最小値,最大値を求める。

解答への道(ヒント)

久々にプログラミング可能な問題。プログラムできる環境にない所で頭で解いて家に帰ってからプログラムして結果を見たら物の見事に間違えていた。

最後に念入りに確認しなかったのが原因。やっぱりこういう問題はプログラミングに限る。

ということでプログラムを作って解いてみる。数字の割り当て問題を改良すれば簡単。

問題は ab年cd月ef日gh時ij分 であるから,ループの一番奥で以下のコードを記述する。最大値は98年であることが直感で分かるのでabcdefghijを10桁の数字と見なすと32ビットintでは不足するから,64ビットintを使う。

int Y,M,D,H,MI;
Y = a*10 + b;
M = c*10 + d;
D = e*10 + f;
H = g*10 + h;
MI = i*10 + j;
if( M <= 12 && D <= 31 && H <= 23 && MI <= 59) {
  int64 x = (int64)Y * 100000000L + M * 1000000L + D * 10000 + H * 100 + MI;
  if( x < mind) mind = x;
  if( x > maxd) maxd = x;
}

mind, maxd はループの外側で初期値を設定する。

int64 mind = 10000000000L, maxd = 0;

最後は結果を%I64dで出力する。

ps( "mind = %I64d\n", mind);
ps( "maxd = %I64d\n", maxd);

int64はWindows(VC++)の場合__int64,UNIX(gcc)の場合long long で定義する。

typedef long long int64; // UNIX
typedef __int64 int64; // Windows

UNIXの場合64ビットintの定数値はLLを

int64 mind = 10000000000LL, maxd = 0;

出力はlldを使用する。

ps( "mind = %lld\n", mind);
ps( "maxd = %lld\n", maxd);

解速度

1.7秒(PentiumIII 500MHz), __int64 を使ったせいかちょっと時間が掛かる気がする。