LLTVチケット2009/07/01

チケット販売について

Tシャツ付きで予約した。

今年はLoppiじゃないのね。 Ruby会議も今年からPayPalになってたし(予約失敗したけど)、何かあったのかな?

あと、販売開始からまる1日は経っているのに、整理番号が2桁なのはちょっと不安です。

るびまゴルフ 【第 6 回】2009/07/01

るびまゴルフ 【第 6 回】

今回の問題
seq という Unix コマンドがあります。
このコマンドを使うと、数値を2つ引数にして、その間にある数を出力することができます。
例えば 3 と 5 を引数として実行すると
 % seq 3 5
 3
 4
 5
というような実行結果になります。

今回はこのコマンドを実装してみて下さい。

入力のセパレータは ','

題意

「Range objectをいかに短い記述で生成するか」だと思う 多分それはeval

適当にeval

適当に eval してみる

puts eval(gets.sub(',','..')).map

33bytes、パーは50らしいのでクリアはしてるけど、なんか無駄が多い。

末尾の map は * に交換できる(場合がある)のは、出題ページにある通り。

puts *eval(gets.sub(',','..'))

すると、puts の引数がArrayではなく、任意個のNumericになるので p に置換できる

p *eval(gets.sub(',','..'))

あとは、省略可能な括弧を削って

p *eval(gets.sub',','..')

25bytes、だいぶ短かくなった。

おまけ

入力セパレータが 空白文字の場合

String#split が引数なしで使えるようになるので

p *eval(gets.split*'..')

24bytes

Array#*(String) は Array#join(String) の Alias

ARGVを使う

p *eval($**'..')

16bytes

$* は ARGVの別名

','.join() か Array#join か2009/07/01

','.join() がなぜキモイのか

Array#join が

  • 暗示的な型変換を行う
  • Enumerable#join ではなく Array#join

の点においてキモいって指摘については反論の余地は無いと思うけど。

その他の点は言い掛かりの類じゃないのかなあ。 と、つらつら書いていたら、kwatch氏のエントリの方がはるかにまとまっていたので、駄文は大幅に減らした。

でも、気になったのはこの辺

それに対して、Rubyだとメモリ効率はあまり気にせずバンバン一時Arrayを作る。Arrayのメソッドチェーンを作ってキモチイイと悦ぶ。RubyにとってArrayは特別であり、列の汎用型は Array だ。Array以外をjoinしたかったら、 to_a.join すれば良い。

この文化の違いはお互いに理解しにくく、Pythonista から見ると「Arrayしかjoinできないなんてキモイ」し、Rubyistから見ると「Arrayで何が悪い」になってやはり結論はでない。

「Rubyだとメモリ効率はあまり気にせずバンバン一時Arrayを作る。」ってことはないし、 (array.map.map.map なんてメッソッドチェーンがキモチイイとか言う輩は居ないんじゃないかなあ) 「Arrayしかjoinできないなんてキモイ」ってのは普通に感じます。

あと、Pythonistaの人は split が分割される側の文字列のメソッドであることには、むず痒さを感じたりはしないのでしょうか?

でも、別の視点で「連結する側とされる側」というように分類すると、「区切り文字 join 連結される文字」が素直な能動態で、「連結される文字列 (is) join(ed by) 連結される文字」だと無理やりな受動態になるので、''.join() の方が素直だ。

の主張を受け入れるとすると

'sep'.split('string')

の方が素直ってことになるような気がするのですが?

以上、Ruby厨のたわごと。