こんにちは、シェルスクリプト大喜利司会のもっと吹く編集長でございます。秋ですね。「*の秋」と呼ばれる季節……、だからなのかわかりませんが。USP友の会もイベントが続いています。
おっと、今日(10/27)夜6時からは、友の会カイチョーがシェルスクリプト/Tukubaiでよそ様のイベントに殴り込みを掛けるらしいです。で、その様子をUst中継する(かもしれない)といいます。もし中継が実施されるならアタクシは、その様をシカと見守る事にシマス。
さて、USP MAGAZINE最新号(2012autumn)のシェルスクリプト大喜利はもうご覧になりましたか? えぇと、このコーナーは無料で読めますので是非暇つぶしに読んでください。
前回のお題に寄せられた解答も載ってますよ。幸運数を求めるのに「AWKだけ」とか「sedだけ」に拘った解答が来たり、「catコマンド作者の遺言」のお題には、よくまぁそこまで発想を巡らせてくれましたな~という解答が来たりもしました。
というところで次は第七回です。またまた三つのお題を用意しとります。今回は特に、いかに適材適所なコマンドを知っているかが問われる回ですぞ。締め切りまで残り一か月切りましたが、まだまだ挑戦待っております。
Linux JMに載っているコマンド(および仕様)と、USP研究所がリリースした拡張コマンドセットOpen usp Tukubaiだけで解答に挑んでもらい、厳密な正解よりも解答の面白さ、美しさ、はたまたしょーもなさを重視するというこのコーナー。本で読んだ方、より抜き版(無料版)で読んだ方、このブログ記事を読んだ方、誰でも参加できますので投稿お待ちしております。
1~n(nは引数で指定)の自然数の中の完全数を全て求めるシェルスクリプトを書いてください。
前回に引き続き、再び整数数列ネタです。今度は完全数を求めよというお題です。もちろんシェルスクリプトでですよ。
完全数は、リンク先にもありますように、全約数(但しそれ自身を除く)の総和がそれ自身になる自然数ということで、まずは約数を列挙することが必要でしょう。そうしたら総和を求めて、その総和が元の数に等しいかを判定する……と。
実際にコード書いてみるとそれほど複雑にならずに書けてしまうことでしょう。だから普通に解ければいいってもんじゃありません。このお題の腕の見せ所は、いかに鮮やかなコードを書けるかですよ。ループ文とか条件分岐とかそういうのをいかに使わず解くか、というのも鮮やかさの一つの審査ポイント!
ループや分岐を取り除くには、幅広いコマンドへの造詣が欠かせませんよ。もちろん、Tukubaiコマンドも大いに役立ててください。
与えられた文字列をURLエンコード(RFC3986)するシェルスクリプトを作ってください。勿論使っていいのはLinux JMに載っているコマンドとTukubaiコマンドだけですよ。
URLエンコードについてですが、この処理の施された文字列は、Webブラウザのアドレス入力欄でよく見かけることができます。パーセント記号"%"やプラス記号"+"等が入ったアレです。URLとして使える文字は限られているため、それ以外の文字列をエスケープするための変換ルールがURLエンコードというわけです。
さて、これはなかなか複雑ですよ。全ての文字をパーセント文字でエスケープすりゃいいってわけじゃありません。変換不要な文字は変換してはいけません。実際のプログラミングではそれでもいいでしょうが、それではお題として面白くありませんからね。それと、スペース(0x20)は、"%20"ではなくプラス記号"+"に置換するというルールにも注意してください。
長くなるのは止むを得ません。でもなるべく綺麗なコードをお願いしますよ。
"a"というテキストファイルがあります。この中身を画面に表示する方法(一番簡単なのは恐らくcat a)を、いろいろ教えてください。とにかく知っているだけ列挙し、数で勝負するもよし。珍しい方法を披露して勝負するもよし。
「あれ?このお題、どこかで見たような……」はい、見たことある方にとってはボーナス問題ですね。
ただし、アタクシもそのお題には見覚えがありますからねー。そんなアタクシに「これは見覚えないぞ」という方法を列挙してくれる方が当然評価は高いです。だから例えば……
cat < a
sed '' a
tac a | tac
なーんてぐらいじゃ驚きませんよ。
それに、当時と違って今はTukubaiコマンドというのもありますからね。さらに方法は増えることでしょう。さあ、頭をやわらかくしてこのお題に挑んでください。
笑いをとるのは苦手だけど、魅せるコードを書くのなら自信あり!そんな貴方の投稿を大募集。あとこの連休、エクストリーム巣ごもりをしたい人もね!
大事な大事な今回の締め切りは、
です。尚、この締め切り内であれば、何度投稿しても構いません。つまり、修正投稿もOKですよ。
出題したお題が「なんだそんな程度か!」と物足りなさを感じるかもしれないです。そうお思いのそこのシェル通の貴方! 是非ともお題を出してみませんか!
もしくは「お題ではないけれども、自分で作った自慢のコードがある」という人は、自慢したいポイントの解説を添え、それを送ってくれるのも大歓迎。そしたらこちらでお題化しちゃいまずぞ。
そしてお題として採用させていただいた方にも段位を進呈。
宛先は解答と同じく mag(あっと)usp-lab.com (アットマークに読み替えてください)へ!
今回もまた、熱い(いゃ熱くなくてもいいです)投稿お待ちしております。