Hatena::Grouprubyist

Rubyで遊ぶよ

 | 

2009-07-02

seq

17:10

問題文引用。

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 を使う場合も考えてみて下さい。

Rubyist Magazine - るびまゴルフ 【第 6 回】

まず標準入力から受けるもの。

gets.chop=~/,/;puts *($`..$')  # 29
% echo 3,5 | ruby seq_stdin.rb
3
4
5

スペース区切りなら /,// / に。(↑自己満だけど echo a,z というのもアリだよん)

引数として与えられる場合は

a,b=$*;puts *(a..b)  # 19

puts *($*[0]..$*[1])  # 20

かな。

% ruby seq_args.rb 3 5
3
4
5

eval

他の人のを見てると、eval 系が多かった。

eval も考えたけど (puts *eval(gets.sub(',','..')) とか)、eval はやっぱ反則だと思うんですよね。

あと () 抜いて warning が出たりするのもきもい。

p もきもい。p は完成したプログラムでは使われるべきじゃない気が。


あ、この場合は括弧要らなかったんだ

gets.chop=~/,/;puts *$`..$'  # 27
a,b=$*;puts *a..b  # 17
トラックバック - http://rubyist.g.hatena.ne.jp/edvakf/20090702
 |