info

Ruby

「プログラミング作法」のマルコフ連鎖アルゴリズムをRubyに翻訳してMeCabを使って日本語対応してみた

日本語版 分かち書きのみ、コードゴルフ版 lambda_driverでうまくmapにシンボルを渡せなかったのでgive4eachを使った メソッドチェーンのワンライナーはうまく改行してDSLっぽくすると読みやすいかも

隙あらばinject、inject小技集

ruby 2.0.0p5981から10の数を足し合わせた時、途中の状態の数列が欲しい。 (1..10).inject(nil) do |(acc, arr), i| #引数マッチング next [i, [i]] if arr.nil? #injectの初期化 [acc + i, arr << acc + i] #次の(acc,arr)に入る end [55, [1, 3, 6, 10, 15…

書籍「7つの言語7つの世界」Rubyの章の最後の問題

method_missingテクニックを使って、CSVの一行目にある物をメソッド名にしてあとの二行をその列にある物を表示させる、attr_accessorもこんなふうに実現してるのかなあgithubにリポジトリつくったよ http://github.com/yppp/sevenlang # -*- coding:utf-8 -*…

書籍「7つの言語7つの世界」でRubyの章を読み飛ばそうと思ったけど、一部の問題だけ解く

配列をハッシュにしろ [1,2,3].zip([[4, 5, 6],5,6]).inject(Hash::new){|x, y| x[y[0]] = y[1]; x} 配列が入れ子じゃなかったら Hash[*[1,2,3].zip([4,5,6]).flatten] 16個と4個の配列を4個と1個づつで表示させろ eachを使って te = Array::new(16){|x| x} …

RubyでBrainfuck処理系作ってみた

意味無いと思うけどジャンプテーブル構築時についでに命令文字をシンボルにコンパイルするようにしてる https://github.com/yppp/brainf_ck # -*- encoding:utf-8 -*- class Brainfuck class ProgramError < StandardError end def initialize(src) @souce =…

RubyKaigi2011に行ったかんそう

こころにのこったはっぴょう、いくつか parse.yは簡単に改造できる Rubyでなんでも使いこなせると思うには 1.標準ライブラリをさわる 2.きれいなコードを書くこころがけ(副作用がある操作のおすすめはeachよりmap!らしい) 3.gemやRuby本体を改造する matz曰…

Rubyのメモ化をメタプログラミングを使わずにやる

一度は諦めたこの方法でできた def memoize(f) dp = {} lambda {|*arg| dp[arg] || dp[arg] = f.call(*arg)} end def ack(m, n) if m == 0 then n + 1 elsif n == 0 then ack(m - 1, 1) else ack(m - 1, ack(m, n - 1)) end end ack = memoize(lambda{|*arg|…

アッカーマン関数+メモ化をいろいろな言語で

wikipediaから数式見て書いた http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%83%E3%82%AB%E3%83%BC%E3%83%9E%E3%83%B3%E9%96%A2%E6%95%B0 Scheme(Gauche) (ack 4 2)でメモリ1Gほど使ってアロケートエラー(スタックオーバーフローかもしれないけど、わからな…

クロージャーの何がうれしいの?

http://practical-scheme.net/trans/icad-j.html ここの、アキュームレータージェネレーターのコードを見てもイマイチ理解できない人へ参照を意識すれば、遠くの所の変数に副作用をおよぼすことができる、クラスでは大袈裟だと思う所に作るのが吉? ツッコミ…

ライブドアインターンに受かったポーカーのRubyスクリプトを貼ってみる

自分の動作環境 $ruby -v ruby 1.9.1p243 (2009-07-16 revision 24175) [i686-linux] #!/usr/bin/env ruby # -*- coding: utf-8 -*- class Game def initialize @deck = Deck::new #山札 @playerA = Player::new("A") #プレイヤー @playerB = Player::new("B…