Rubyで遊んだ日々の記録。あくまで著者視点の私的な記録なので、正確さを求めないように。
Rubyと関係ない話題にはその旨注記しているはず。なので、一見関係無いように見える話題もどこかで関係あるのかもしれません。または、注記の書き忘れかもしれません...
_ 数日前から始まってるshinhさんとこのGolf。
楽しませていただいてます。ありがとうございます(って遊んでる場合じゃない気はかなりするんだが)。
_ 某御大と二人で酷い技で一部の問題を荒らしまくってます。ごめん。
しかしawkは奥が深いね。御大と答え合わせしても同じ長さで全然違ってたりする。
_ ぐは、問題によってはexec
封印か!
まあしかたないか。
_ example_com、抜かれたので悔しさのあまり限界を突破してしまった。いいのかこんなんで。
_ hello worldにいろいろ取り組んでみる。
処理系なしで書いたのは、PHP、Io、Lua、Tcl、Smalltalk、BASIC、Ada、ObjC、Java、Pascal、Fortran、C#。つーか人のマシンで試すな>おれ
このうち、生まれて初めて書いたのは... LuaとAdaかな。
まあ、ほとんどの言語は書いたうちに入らんわけですが。
それはそれとしてnazo氏すごすぎ。
_ 焼き芋屋が怖いらしい。
車が遠ざかって「いしや〜きいも〜」が聞こえなくなるまで泣いてた。
_ Hamming Numbers、ちょっと手を出してみたらいきなり最短だった。
いつもインチキしてるわけだが、たまに真面目にやって人に勝ってると嬉しい。
_ hello worldのFortranがnazo氏に抜かれていた。
Fortran界最強を目指していたのに!(嘘
_ ultimate problem、御大がネ申すぎて、もう何も言うことがない。
scoreは42点でお願いします。
_ Hamming NumbersをPythonで書こうとして、そっちはうまく書けなかったけど、代わりにRubyでもっと短く書けることに気付く。
_ さらにCでも書いてみたが、書いている間になんか凄いスコアが。
90Bっていったい...
勝てる気がしないから現状を晒しとこう。
a[9999],i;main(){scanf("%d",a+1);while(a[1]--){while(!a[++i]);a[i*2]=a[i*3]=a[i*5]=printf("%d\n",i);}}
_ 上のCのアルゴリズムはRuby版を元に思いついたんだけど、Ruby版がこういうアルゴリズムなわけではない(これをそのままRuby化すると、えーと、70B前後かな?)。
あと、bash版は56B+9Bで行けるわけだが、もう卑怯はしないと心に誓ったのでやめておこう。
_ Dancing Kids、dan5さんが頑張っていたのでおいらも頑張って抜いてみた。
... 約20分後には抜き返されていた。
うえーん、今の仕組みじゃもう無理だよぅ...
"%c"%0
とかやると75Bになったのだが、見た目はOKでもチェック機構には許してもらえなかった。くすん。
_ Dancing Kidsは打倒dan5さんを目指してかなり考えたがわからない。
_ Dancing KidsだけでなくSmileys Triangleもdan5さんに抜かれていたことに気付いたので、こっちは頑張って追いついておいた。
これは意外とあっさりだった、というか、以前の40Bのコードはもう消えた後だったので、それを思い出すほうが大変だった。
_ echoでズルしないで8Bの件。ヒントはto_a
。
_ 道を歩いていてHamming Numbersをさらに短くできることに気付く。53B。
なんか実行時間が3倍くらいになったが、本質的にアルゴリズムは変わっていないはずなので、たぶんサーバ側の負荷の影響もあるのだと思う。
_ even lines。awkで御大に勝つとかなり爽快。
その後追いつかれたが、それは想定内。
そんなことより、ふと気付くとrubyとperlでダントツビリです orz
あと、Cで35Bとかありえないと思います...
_ sort characters、Cで参加してる人たちは絶対何かおかしい。
というか、この問題に限らず、Cで異常な数字の人はみんなフォースの暗黒面に落ちているに違いない。
_ あと、sedでsortを自前で実装するのも割とありえないと思った。すげー。
ズルしてもっと短いのをupろうかとかチラっと脳裏をよぎったけど、敬意を表してやめておく。
_ 実はYARV化されてからまたスレッドがふん詰まるようになってたのだが、昨夜のささださんのcommitでとりあえず直ったようだ。
すばらしい。
_ こっちの日付感覚が狂ってるのかと思ったら、あっち(6個目の段落)だった。
ちなみにr11662。
_ スタックの話はko1さんと二人でうだうだ言いながら調べてたのだけど、CreateThread()
の第2引数(スタックサイズ)が予約スタックサイズじゃなくてコミットスタックサイズであることを初めて知った。割と大ショック。
なおXP以降ならフラグ指定によってこれを予約スタックサイズと解釈させることもできる。
さらに64bit WindowsかVista以降なら各スレッドで実行中にスタックサイズを拡大方向に変更することができるらしい。いつもできるわけじゃないだろうが。
_ OSのバージョン限定の話はとりあえず置いておくが、なんにせよ、各スレッドのスタックの深さと生成可能なスレッド数とがトレードオフになっていて、しかもそれがコンパイル時(というかリンク時)に決定されるパラメータで左右されちゃうのはちょっと悲しい。
ただ、YARV化rubyではマシンスタックの消費量は格段に減っているので、従来のように32MBものメモリ空間をスタックに奢ってやる必要はない。
いろいろ実験した結果から2MBか4MBくらいがいいんじゃないかということになったのだが、実装者のko1さんの顔を立てて2MBにしておくという妥協に達した(つまり私は4MBを主張)。
この辺は暫定的な合意なので、またいろいろ変わってくる可能性はある。
リンカにはもっと小さい値を指定しておいて実行時にフレキシブルに各スレッドへのスタックサイズ指定を変更するとか。
_ ところで、誰もが知っている(?)ように通常の32bit Windowsでは4GBの仮想メモリ空間のうちユーザプロセスが利用するのは2GBだけなのだが、最近のWindowsを使ってるならboot.iniに/3GB
オプションを追加することによってこれを3GBに拡張できる。
不用意にこのオプションを指定すると困ったことが起きる可能性もゼロではないので誰にでもお勧めするわけではないが、現実に実行時のメモリ不足で困ってる人は試してみるといいかもしれない。
_ また新しい問題が。
出力結果がなんか特定の言語処理系びいきなのではないかという気がするのだが、気のせいかもしれない(よく知らないので)。
_ というわけで、正攻法はとりあえず置いておいて、sedでやろうと思ってまずはRubyで習作を作ってみる。
無駄に長いのだが、その時点では誰もupってなかったので一応up。
_ それではこれをベースにsedにとりかかってみる。でもsed難しい。
そうこうする間に御大もsedでやってたので、以降は抜きつ抜かれつのデッドヒート。
最終的に250Bでお互い限界に達したような、もう数B削れるような...
_ sedはこれくらいにしておいて、Rubyのはさすがに酷い数字なので恥ずかしくない程度まで縮めておく。
_ 寝付けなかったのでawkもやっておく。
もうちょっと短くできるような気もするのだが、まあこんなもんでいいか。
printf"%.9f","+inf"
がinf
になればちょっと素敵だったのだが、nawkと違ってmawkはきっちり+inf
にしやがるらしい。
ちなみにgawkは0.000000000
。
_ 特にawkでの知見が役に立ったわけでもないが、Rubyのも短くする方法を思いついたので短くしておく。
最初350Bくらいのを出してた人とは思えん数字になったな。てゆか最初から真面目にやれ。
しかし、eval"-0"
が0
になるのがとてもとても悲しい。
_ Language RankingでPerlに抜かれてる(06:38現在)。
がんばれRubyist。
どうでもいいけど、あなごるサーバは2分ほど時計が進んでいる。
_ しかし、元々awkがわかんなくてPerlを覚えた人なのだが、今はPerlよりawkの方がずっとすらすら書けるな。
Ruby使うようになってPerlを全然使わなくなったのだが、Perlは覚えてないと書けないという面が結構あるということかもしれない。
awkは仕様が小さいくてmanに全部書いてあるからどうにかなる、と。
被捕捉アンテナ類
[Ant]
[Antenna-Julia]
[Rabbit's Antenna]
[Ruby hotlinks]