問題(和訳)

Problem 38 「パンデジタル倍数」
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2038

回答例

(awk 'BEGIN{for(i=5000;i<=9999;i++)print i*1,i*2,i*1 i*2}';awk 'BEGIN{for(i=100;i<=333;i++)print i*1,i*2,i*3,i*1 i*2 i*3}';awk 'BEGIN{for(i=25;i<=33;i++)print i*1,i*2,i*3,i*4,i*1 i*2 i*3 i*4}';awk 'BEGIN{for(i=5;i<=9;i++)print i*1,i*2,i*3,i*4,i*5,i*1 i*2 i*3 i*4 i*5}';awk 'BEGIN{for(i=3;i<=9;i++)print i*1,i*2,i*3,i*4,i*5,i*6,i*1 i*2 i*3 i*4 i*5 i*6}';) |awk 'length($NF)==9{print $NF}' |grep 1 |grep 2 |grep 3 |grep 4 |grep 5 |grep 6 |grep 7 |grep 8 |grep 9 |sort -r |head -n 1

実行結果

932718654

real    0m0.032s
user    0m0.000s
sys     0m0.000s

解説

n > 1 で 9桁の連結積を作ることが出来る数字の桁数の組み合わせは、実は少ない

例えば n=2 場合、

という風に、1つめの数字の範囲を絞り込む

あとは素直に全組み合わせを出力し、連結積がパンデジタル数になるものを抽出、
さらにその中で最大のものを抽出する

# n=2..6までの連結積を生成する
(
awk 'BEGIN{for(i=5000;i<=9999;i++)print i*1,i*2,                i*1 i*2}';
awk 'BEGIN{for(i=100; i<=333 ;i++)print i*1,i*2,i*3,            i*1 i*2 i*3}';
awk 'BEGIN{for(i=25;  i<=33  ;i++)print i*1,i*2,i*3,i*4,        i*1 i*2 i*3 i*4}';
awk 'BEGIN{for(i=5;   i<=9   ;i++)print i*1,i*2,i*3,i*4,i*5,    i*1 i*2 i*3 i*4 i*5}';
awk 'BEGIN{for(i=3;   i<=9   ;i++)print i*1,i*2,i*3,i*4,i*5,i*6,i*1 i*2 i*3 i*4 i*5 i*6}';
) |
# 連結積が9桁のもののみ抽出
awk 'length($NF)==9{print $NF}' |
# 連結積がパンデジタル数のもののみ抽出
grep 1 |
grep 2 |
grep 3 |
grep 4 |
grep 5 |
grep 6 |
grep 7 |
grep 8 |
grep 9 |
# 最大のパンデジタル数を出力
sort -r | head -n 1

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-03-24 (日) 07:44:02