LLTVチケット ― 2009/07/01
Tシャツ付きで予約した。
今年はLoppiじゃないのね。 Ruby会議も今年からPayPalになってたし(予約失敗したけど)、何かあったのかな?
あと、販売開始からまる1日は経っているのに、整理番号が2桁なのはちょっと不安です。
るびまゴルフ 【第 6 回】 ― 2009/07/01
今回の問題 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
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厨のたわごと。
mongoDB ― 2009/07/03
あとで試す。
mongoDB via RDB終了のお知らせ-ヽ( ・∀・)ノくまくまー
ドキュメント指向DBの新作らしい。
ようやくCouchDBを試したところなのに……。 時間の流れが速すぎます。
そういえば、CouchDB 0.9は、0.8から要求するErlangのバージョンが上っているので、Ubuntu 8.04では、Erlangを自分でビルドしないといけないみたい?
#面倒臭くなって、CouchDB 0.8に逃げたので、検証はしていない。
(続)るびまゴルフ 【第 6 回】 ― 2009/07/06
23Bとか20Bとかいけるという噂なので
マジっすか?
入力の数字が共に1桁を仮定して良いなら、25Bの別解(evalなし)を見付けたので、 25Bよりは縮みそうな予感はあるのですが……。
(追記)上記別解の先で、23Bは判った。(evalは復活したけど、1桁でなくても動く)
eval"A,B="+gets;p *A..B
A,Bが大文字(Constant)なのは、evalの内側のローカル変数をtop levelから参照できない事への対処。
しかし、20Bは判らない……。 入力はeval(かto_i)してIntegerに落としておかないと、開始、終了の桁数が異なる場合にRangeの挙動がおかしくなるのでevalは外せないと思うのだけど、何か抜け道があるのかなあ。
最近のコメント