小町算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

あっという間に出来てしまった。