小町算part2(awk)
あっという間に12月に入りましたが、皆様いかがお過ごしでしょうか?
さて、前回の続きで小町算を行います。
今回も広井さんのサイトの問題をawkで解いてみます。
www.geocities.jp
問題:○に1~9を1回ずつ入れて式を完成させましょー。 小町分数(2) ○○○○÷○○○○○=4/5
ワシの答え
#!/usr/bin/awk -f BEGIN{ search(1); } function search(n, i){ if(n == 5){ check_answer(); }else{ for(i = 1; i <= 9;i++){ if(!use_flag[i]){ use_flag[i] = 1; number[n] = i; search(n + 1); use_flag[i] = 0; } } } } function check_answer(){ num1 = 0; c = 0; for(j = 1; j <= 9; j++){ flag[j] = use_flag[j]; #コピー } for(i = 1; i <= 4; i++){ num1 = num1 * 10 + number[i]; } num2 = num1 * 5 / 4; split(num2,a,""); for(k in a){ if((a[k] == ".") || flag[a[k]]){ return 0; } c++; flag[a[k]] = 1; } if(c == 5){ print num1,num2; } }
前回同様、再帰を使っている。
再帰関数には、ローカル変数が必要なために引数iを入れている。
実行してみる。
awk -f komachi2.awk 9876 12345
あっという間に出来てしまった。