読者です 読者をやめる 読者になる 読者になる

くんすとの備忘録

プログラミングや環境設定の覚え書き。

ゴールデンウイークシェル芸問題を解きました

FreeBSD シェル芸

何日か経ちましたし、もういいですよね……

課題

お題:ゴールデンウイークシェル芸問題 | 上田ブログ

1から100まで数字が書いてあるansというファイルを作り、ansの中から素数でない数をワンライナーだけで消し去ってください。(ansの中身を書き換えるということです。forもwhileもなしで、コマンドはパイプでつないで。)

% seq 100 > ans

はじめの回答

% cat ans | factor | sed 's/://g' | awk 'NF==2{print $1}' | cat > ans

課題

awkのバッファリングに依存しており、問題の100件程度では問題ないのですが、件数が多くなると壊れます。

% seq 100000 > ans
% tail ans
13367
13381
13397
13399
13411
13417
13421
13441
13451
13

また、Cシェル系(csh/tcsh/zsh)ではうまくいきましたが、Bシェル系(sh/Bash)ではうまくいきませんでした。

別解

TL上には様々な解が出ていましたが、自分はヒアドキュメントを生成して評価する、という手法で解決しました。

cat ans | factor | sed 's/://g' | awk 'BEGIN{print "cat <<EOS>ans"}NF==2{print $1}END{print "EOS"}' | sh

こちらはcsh/tcsh/zsh/sh/Bashで確認済みです。


※模範解答は moreutilsの sponge コマンド使うやつですよね

広告