Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

すべての桁に $1$ から $n$ が一度だけ使われている数を$n$桁の数がパンデジタル (pandigital) であるということにしよう: 例えば$5$桁の数 $15234$ は$1$から$5$のパンデジタルである.

$7254$ は面白い性質を持っている. $39 × 186 = 7254$ と書け, 掛けられる数, 掛ける数, 積が$1$から$9$のパンデジタルとなる.

掛けられる数/掛ける数/積が$1$から$9$のパンデジタルとなるような積の総和を求めよ.

HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが$1$回だけ数え上げよ.

解答

seq 9876 |
awk -v FS= '{s=1;for(i=1;i<=NF;i++){s*=gsub($i,$i)};if(s==1){print}}' |
factor |
awk 'NF!=2{print $1*1}' |
awk '{for(i=1;i<=$1;i++){if($1%i==0){print i"@"$1/i,$1}}}' |
grep -v "0" |
awk -v FS= 'length==11{s=1;for(i=1;i<=NF;i++){s*=gsub($i,$i)};if(s==1){print}}' |
uniq -f1 |
awk '{s+=$2}END{print s}'
45228

factorみたいに約数を出力するコマンドないかなあ。

スタートのseqを$98765$から$9876$に変更したところ、実行時間が$11$分から$12$秒へと劇的に改善した!

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/032.html

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.