るびまゴルフ第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。

とりあえずパーはクリアしたぞっと。しかしプロゴルファーのみなさんはさらに縮めてくるんだろうなぁ。コードを見るのが楽しみだ。