#author("2017-08-17T01:17:34+09:00","default:nobuoki","nobuoki")
#author("2017-08-17T01:22:02+09:00","default:nobuoki","nobuoki")
* Q02 数列の四則演算 [#s957877f]
from &htmlinsert(amazontext,asin=B016QEE30G,text=プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問);

* 回答 [#kf6013a2]
seq 1000 9999 | sed '/0$/d' | sed 's/./& /g' | awk 'BEGIN{a[1]="*";a[2]=""}{for(i=1;i<=2;i++)for(j=1;j<=2;j++)for(k=1;k<=2;k++){b=$1 a[i] $2 a[j] $3 a[k] $4;print "print \""b"\","b";"}}' | grep -F '*' | sed '1iBEGIN{' | sed '$a}' | awk -f - | awk '$2>1000{a=$1;gsub("\*","",a);b="";for(i=4;i>0;i--)b=b substr(a,i,1);print a,$0,b}' | awk '$3==$4'

#pre{{{
5931 5*9*31 1395 1395

real    0m0.234s
user    0m0.270s
sys     0m0.040s
}}}

* 解説 [#t12198bc]
- 演算子 -+/ を使うと4桁にならないので除外
-- 演算子 + だけは、3桁(99[1-9])+1桁([1-9])=4桁 になりうるが、
生成される4桁は 100[0-8] となり(下2桁が99じゃないので)回文にならない
よって 演算子 * だけ考えれば良い
- awk には eval が無いので、(awkを使って)awkスクリプトを生成し、awkに読ませる

#prism(bash){{{
# 探索対象の数を生成
seq 1000 9999 |

# 末尾が0のものは回文になり得ないので除外
sed '/0$/d' |

# 1桁ずつ分解
sed 's/./& /g' |

# 演算子 * を入れ込み、
# (awkにevalが無いので)
# 後段でawkで計算させるためのawkスクリプトを生成する                                                                                   awk '
# 後段でawkで計算させるためのawkスクリプトを生成する
awk 'BEGIN{
  # 演算子 * の有無を示す配列
  a[1]="*";
  a[2]=""
}
{
  # 数値の区切りに演算子 * を埋め込む
  for(i=1;i<=2;i++)
    for(j=1;j<=2;j++)
      for(k=1;k<=2;k++){

# 演算子 * を埋め込んだ式を生成                                                                                                        b=$1 a[i] $2 a[j] $3 a[k] $4;
        # 演算子 * を埋め込んだ式を生成
        b=$1 a[i] $2 a[j] $3 a[k] $4;

        # print "a*b*cd",a*b*cd;
        # のようなawkスクリプトを生成
        print "print \""b"\","b";"
      }
}' |

# 演算子 * を含まないものを除外
grep -F '*' |

# (awkにevalが無いので)
# awkスクリプトの生成(先頭に BEGIN{ を入れる)
sed '1iBEGIN{' |

# (awkにevalが無いので)
# awkスクリプトの生成(末尾に } を入れる)
sed '$a}' |

# (awkにevalが無いので)
# 上記で生成した awk スクリプトを実行
awk -f - |

# 元の数の回文を生成
awk '

# 計算結果が4桁の場合
$2>1000{

    # 元の4桁の数値を生成(演算子を削除する)
    a=$1;
    gsub("\*","",a);

    # 元の4桁の回文を作成
    b="";
    for(i=4;i>0;i--)
      b=b substr(a,i,1);

    # 元の数, 計算式, 計算結果, 元の数の回文
    # というフォーマットで出力
    print a,$0,b

}' |

# 計算式=元の数の回文 であるものが答え
awk '$3==$4'
}}}

* 備考 [#l2e71aa3]
javascript があまり早くない
#pre{{{
nobuoki@b2522ea6f79c:~/math-puzzle$ time node q02.js
5*9*31 = 1395

real    0m6.091s
user    0m3.630s
sys     0m2.460s
}}}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS