小町算(awk)
さて、小町算をawkで解いてみます。
問題は広井さんのwebページからです。
問題:○に1~9を1回ずつ入れて式を完成させましょー。 小町分数(1) ○○○○÷○○○○○=1/2
#!/usr/bin/gawk -f # 探索(順列の生成) BEGIN{ search(1); } function search(n,i){ if(n == 10){ 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; num2 = 0; for(i = 1; i <= 4; i++){ num1 = num1 * 10 + number[i]; } for(i = 5; i <= 9; i++){ num2 = num2 * 10 + number[i]; } if(num2 == (num1 * 2)){ print "Answer",num1,num2; } }
ここのポイントは何といってもsearch関数の引数iを必ず入れておくこと。
iを局所変数にしないと答えが出ない。
ここでかなり私も悩んだ。
広井さんのperlスクリプトをそのままawkに置き換えただけだが、最初何で答えが出ないのかわからなかった。
perlだとmyが使えるけど、awkにはそのようなものが無いので、必ず引数に使いたい局所変数を入れなければ行けないことがわかった。
勉強になった。