るびまゴルフ第6回に挑戦
RubyKaigi2008以来のコードゴルフに挑戦してみた。コードゴルフは、必要な処理をいかに少ない文字数(バイト数)で実装してのけるかを競う紳士のスポーツである。
お題は次の通り。
seq という Unix コマンドがあります。このコマンドを使うと、数値を2つ引数にして、その間にある数を出力することができます。例えば 3 と 5 を引数として実行すると
% seq 3 5 3 4 5というような実行結果になります。
今回はこのコマンドを実装してみて下さい。入力はコンマで区切られて標準入力から与えられるものとします。例えば
3,5という入力に対して
3 4 5と出力するようにして下さい。例えば
a,b=gets.split(',').map{|v|v.to_i} a.upto(b){|i|puts i}というようなコードと同じ出力が得られるようにして下さい。パーは 50Bytes とします。
また余力があれば、入力が
3 5と空白区切りで与えられる場合、 seq のように引数として与えられる場合、つまり ARGV を使う場合も考えてみて下さい。
るびま
ちなみに、Ruby 1.8.7使ってます。
標準入力:カンマ区切り版
eval"p *%d..%d"%gets.split(',') #31Bytes
map使ってto_iしてまわるのと、表示用のループを省略した結果、こうなった。CやJavaで食ってきているせいか、なかなかevalを使うという発想がでてこなくていけない。gets.splitあたりが長くてイヤな感じだが、短縮する方法が思いつかない。
標準入力:空白区切り版
eval"p *%d..%d"%gets.split #26Bytes
基本は変わらない。ただ、splitはデフォルトのデリミタとしてnil(=先頭を除く空白文字)を使うため、省略できるぶん短くなっている。
ARGV版
eval"p *%d..%d"%$* #18Bytes
ARGVは最初から配列なので、splitする必要すらなくなり、さらに短くなる。$*はARGVの別名。
記事を読んでいると、どうもpを使うのは反則扱いなのか、putsにした場合のサイズ数が併記してある。上記のコードはpを単純にputsに置き換えれば動くので、+3Bytesすればputs版のサイズになる。つまり、34, 29, 21Bytes。
とりあえずパーはクリアしたぞっと。しかしプロゴルファーのみなさんはさらに縮めてくるんだろうなぁ。コードを見るのが楽しみだ。