Code Golf (コードゴルフ)

| | コメント(6) | トラックバック(0)

Code Golf というものに参加してみた。
ある問題が出されて、それをどれだけサイズの小さいプログラムで解決するかを競うゲーム。使用できる言語は、Perl, PHP, Python, Ruby。この中で自分が使えるのはPerlしかないので、選択の余地無くPerlで挑戦。

まずは、このHome On The Range という問題に挑戦。
"1 2 3"の様に連続した数値を入力したときは"1-3."と '-' で連続値を表し最後に'.'(ピリオド)をつける。
"1 3 5"と不連続な数値を入力した場合は、"1, 3, 5."の様に ', ' で区切る。
つまり "1 2 3 5 7 8" を入力した場合は、"1-3, 5, 7-8." と出力するプログラムを作るのである。


↓自分の作ってみたのはこれ。2つのバージョンを作ってみた。サイズを小さくするために、変数名を一文字にしてあるので読みにくいかも。(ここでは見やすくインデントしてるけど、提出時はスペース、改行とか余分なものを全て削除した。)

まずは、一時的に配列に貯めていくという操作はせずに、直接プリントしていくバージョン。
合計156バイト


@x=split" ",<STDIN>;
print$a=$b=shift@x;
foreach(@x){
if($_==$b+1){
$c="-"
}else{
print$a!=$b?"$c$b, $_":", $_";
$a=$_;$c=""
}
$b=$_
}
print"-$b"if($c eq"-");
print".";



そして、これは一時的に配列に貯めておいて、最後にまとめてprintするバージョン。
合計133バイト


@x=split" ",<STDIN>;
push @y, ($x[$_] == $x[$_+1]-1) ?
"$x[$_]-" : "$x[$_], " for(0 .. $#x);
$y[-1]=~s/,/./;
foreach(@y){
print if!( /-/ && $t );
$t=/-/
}

無駄なところが多々あることはわかっていますが、普段からPerlでバリバリプログラムを書くことは無く、道具(とった実験データ等の処理、解析のために)としてしか使ってないヘタレな自分にとってはこれが限界。....と言い訳を。。
Perl独自の表記法とか知ってる人ならさらに短くできるのだろう。
どこをどう修正したらいいというアドバイスあれば是非お願いします。
今後の勉強にもなりますし。

結果は、サイズ133バイトで今のところ全言語で117位、Perl限定で55位。。。ショボすぎる orz... (chill って名前で登録してみた。=> 順位表)
1位の人は、53バイトって。ありえん。これの1/2以下のサイズで実現できてしまうとは。
どんなコードなんだろ。

良い脳トレになったが、普段絶対にこんなコードは書かないな。
後で見たときに、読みにくすぎる。

また、時間があるときに別の問題にも挑戦してみようかな。
パズル感覚で面白いので、興味のある方はやってみては?

(裏技?紹介)
linux環境からcodeをアップするよりもwindows環境からアップした方が、1バイトほど小さくカウントされる。それ知ってから、windowsでアップしなおした。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Code Golf (コードゴルフ)

このブログ記事に対するトラックバックURL: http://www.chillout.in/blog/mt/mt-tb.cgi/659

コメント(6)

裏技なんですが、改行コードがCR+LFかLFのみかの違いかなあと思ったんですが、それだとWindowsの方が1byte多くなりそうです。
謎ですね。

codeを保存したときのファイル事態の大きさがすでに違うんですよね。windows上でcodeを記述したメモ帳のサイズをプロパティで見たのと、linux上でcodeファイルをdu -b で確認したときに。アップしたときにその差がそのまま出てしまいます。知識不足のため何が原因かはっきりわかりませんが、自分の書いたcode以外にファイルに何か付属しているのかも知れませんね。

あ、そうゆうことでしたか。
それは簡単です。
エディタによるのかもしれませんが、Linux上でviなどを使用すると、明示的に改行を入れなくても行が存在すれば、最後にLFが付加された状態で保存されます。
つまりaとだけ入力しても保存されるのはa+LF。
一方Windowsでメモ帳などで保存すると改行しない限り改行コードは入れられません。
具体的にはaとだけ入力し保存すると、保存されるのはaのみです。
昔のviなんかを使っているとWindowsで作成したファイルをLinuxに何も変換せず持ってくると行末が不完全ですというエラーが出たことがあります。
最初はなんのことかわかんなかったんですが、テストデータでこれをやって、はまった記憶がありますです。

そういうことですか。viで保存したときも、メモ帳で保存したときも、可能な限りスペースと改行をすべて削除したはずなのに、不思議に思ってました。
今emacsの方で改行を1つもいれずに保存して、それを開いてみると確かに改行が追加されてました。viで開いたときに自動で追加された最後の改行は見えないんですね。気がつきませんでした。
本当に勉強になりました。
ありがとうございます!

ちなみにEmacs 22.0.90.1の場合はrequire-final-newline変数でこの挙動を制御できます。

情報ありがとうございます。
自分にとっては、特に自動的に改行を入れる必要がなさそうなのでrequire-final-newlineの設定をしておきます。