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

さて、次の問題です。
小町平方数(2)
○○○○○○○○○=□□□□□^2

これは、左辺のみ1~9の判定をすればよいですね。
べき乗とsqrt関数を使ってbの最小値10000と最大値31427を求めてから計算します。


# 小町平方数(2)
# ○○○○○○○○○=□□□□□^2

BEGIN{
    b = 10000; # aの最小値。10000 ^ 2 = 100000000となり9桁
    while(b <= 31427){
      a = b ^ 2;
      if(keisan1(a)){
            print "ans=",a,b;
    }
    b++;
    }
}

function keisan1(a){
  keta[0] = int(a / 100000000);
temp = a - keta[0] * 100000000;
keta[1] = int(temp / 10000000);
temp = temp - keta[1] * 10000000;
keta[2] = int(temp / 1000000);
temp = temp - keta[2] * 1000000;
 keta[3] = int(temp / 100000);
temp = temp - keta[3] * 100000;
  keta[4] = int(temp / 10000);
temp = temp - keta[4] * 10000;
keta[5] = int(temp / 1000);
temp = temp - keta[5] * 1000;
keta[6] = int(temp / 100);
temp = temp - keta[6] * 100;
keta[7] = int(temp / 10);
keta[8] = int(temp % 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= 139854276 11826
ans= 152843769 12363
ans= 157326849 12543
ans= 215384976 14676
ans= 245893761 15681
ans= 254817369 15963
ans= 326597184 18072
ans= 361874529 19023
ans= 375468129 19377
ans= 382945761 19569
ans= 385297641 19629
ans= 412739856 20316
ans= 523814769 22887
ans= 529874361 23019
ans= 537219684 23178
ans= 549386721 23439
ans= 587432169 24237
ans= 589324176 24276
ans= 597362481 24441
ans= 615387249 24807
ans= 627953481 25059
ans= 653927184 25572
ans= 672935481 25941
ans= 697435281 26409
ans= 714653289 26733
ans= 735982641 27129
ans= 743816529 27273
ans= 842973156 29034
ans= 847159236 29106
ans= 923187456 30384

よし、うまくいっているようですね。

しかし、ソースの貼付けの時にタブとスペースが混在していると、ずれちゃいますね・・・