awkでパズルを解く(小町算)

パズルをプログラミングで解いてみよーってことで、とりあえずは下記問題

●小町数と小町算

パズルの世界では、1 から 9 までの数字を 1 個ずつすべて使った数字を小町数といいます。たとえば、123456789 とか 321654987 のような数字です。小町算 というものもあり、たとえば123+456+789 とか 321 * 654 + 987 のようなものです。

小町数は 1 から 9 までの数字を並べるわけですから、個数は全部で 9! = 362880 個しかありません。現在のように強力なマシンが使える環境では、総当たりで検索しても短時間で答えを見つけることができるでしょう。


問題:○に1〜9を1回ずつ入れて式を完成させましょー。

小町分数(1)
○○○○÷○○○○○=1/2

ということで、久しぶりにawkで作ってみた。


BEGIN{
a = 5123; #aの最小値
while(a <= 9876){
b = a * 2;
if(keisan1(a,b)){
print "ans=",a,b;
}
a++;
}
}

function keisan1(a,b){
keta[0] = int(a / 1000);
keta[1] = int((a - keta[0] * 1000) / 100);
keta[2] = int((a - keta[0] * 1000 - keta[1] * 100) / 10);
keta[3] = (a - keta[0] * 1000 - keta[1] * 100) % 10;
keta[4] = int(b / 10000);
keta[5] = int((b - keta[4] * 10000) / 1000);
keta[6] = int((b - keta[4] * 10000 - keta[5] * 1000) / 100);
keta[7] = int((b - keta[4] * 10000 - keta[5] * 1000 - keta[6] * 100) / 10);
keta[8] = (b - keta[4] * 10000 - keta[5] * 1000 - keta[6] * 100) % 10;
for(i = 0;i <= 8;i++){
for(j = i + 1;j <= 8;j++){
if(keta[i] == keta[j]){
return 0;
}else if(keta[i] == 0 || keta[j] == 0){
return 0;
}
}
}
return 1;
}

んで、実行してみると、

ans= 6729 13458
ans= 6792 13584
ans= 6927 13854
ans= 7269 14538
ans= 7293 14586
ans= 7329 14658
ans= 7692 15384
ans= 7923 15846
ans= 7932 15864
ans= 9267 18534
ans= 9273 18546
ans= 9327 18654

とりあえずは上手くいってるっぽい。