Ruby

はじめてのQuineリレー

概要 昨日、自分自身を出力するHaskellプログラムを生成するOCamlプログラムを生成するSchemeプログラムを生成するRubyプログラムを生成するJavaScriptプログラムを生成するCプログラムを書いた。 #include<stdio.h> int main(){char*g="var p=print;p('puts %%^(form</stdio.h>…

Hello, polyglot!

きっかけ: るびま これを読んでpolyglotするかーって思った. 今回のコンセプトは 初めてなのでやさしくHello, world! 好きな言語を盛り込む 140文字以下 以下,Schemeと言いつつGauche決め打ちである. ソースコード できあがったのがこれ. ;(#)={-"^<"v '…

Ruby2.0.0をインストール

Ruby2.0.0-p195をインストール. makeすると gcc: installation problem, cannot exec '/usr/local/bin/i686-apple-darwin9-gcc-4.0.1': No such file or directory dtrace: failed to compile script probes.d: Preprocessor failed to process input progr…

Hash#selectとHash#rejectの意外な相違点

rejectはデフォルト値を受け継ぐが,selectは受け継がない. Hash.new(42).select { nil }[0] # => nil Hash.new(42).reject { nil }[0] # => 42 リファレンスマニュアルの説明の微妙な違いは,この挙動の違いから来るものなのか? key, value のペアについ…

lambdaメソッドがlambda?でないProcを返す

def f(&b) lambda(&b) end f {}.lambda? # => false フンギャー

Ruby挙動クイズ(5)

(1) module A def a 42 end end module B include A end class C include B end p C.new.a (2) module A def a 42 end end module B end class C include B end module B include A end p C.new.a

deadlineまで1秒未満

http://golf.shinh.org/p.rb?Modular+Exponentiation 危うく31Bのまま1位タイが取れないところだった.しかも短くなったのがpidという基本技だったという…るびまゴルフのおかげで思い出して助かった. setpid後一発で通らなかったら死んでた. setpidの後,…

Binding#evalにブロックを渡したい

binding.eval("self") より binding.eval { self } よね.Object#instance_evalとかはできるのに,なんでこっちはできないんだろう.

maze solving縮めた

100切ってる人も居る中,353bytesだったので久々にやってみたら213までいった.それでも上位陣との差は歴然.なんか根本的にやり方が違う気がするのだが,真面目に解くのが間違ってるのか?

コマンドライン引数パーザのインタフェース

getoptとかって言語(やライブラリ)によってかなり使い方が違っていて,いつも困る.しかも,どれも(慣れるまで)それなりに分かりにくくて,どう書くのがその言語 "らしい" のかよくわからないことが多い.特にOCamlのArg.parseは何故か副作用ばりばりでやり…

Quineしてみた

RubyでQuineでgolfしてみた.

ruby1.9.2-preview1入れてみた

NEWSに書いてあるメソッドが入ってない気がするんだけど気のせいだろうか. <

themeを書く

themeは,タイトルスライドで theme を指定して選択する.例: : theme rabbit自分でthemeを書く場合は,theme名がhogeなら rubyの$LOAD_PATH/rabbit/theme/hoge/hoge.rb のように配置する. この間使ったthemeの一部. include_theme("rabbit") include_the…

ruby-indent-commandがエラー

define_method(:"#{x}") { 2行目でtab押すとこんなエラーメッセージが出てインデントされない. ruby-forward-string: Search failed: #("[^\\]\\(\\\\\\\\\\)*[\"]" 0 14 nil 14 15 (selection-face nil candidate-face nil action nil fontified t face fo…

1.9にはTest::Unit::AutoRunnerがない

どうやら,1.9のtest/unitは1.8のそれとは別物で,中身はminitest/unitらしい.AutoRunner.runを使おうとしたらなかった.代替手段は示されてないように見える.というかそもそもリファレンスマニュアルがry 1.9.1が出たからにはここら辺は揃ってるのかと思…

Schemeの数値リテラルにマッチする正規表現(6)

部分式呼び出しを使って短くしてみた.一度treeを作ってから再帰的に正規表現を構成する戦略. naiveな実装で1124bytes,頑張って探索して11141110bytes.名前付きグループがあると括弧の意味が変わる問題がなければ909bytes(Gオプションが使えれば910bytes…

名前付きグループがあると括弧の意味が変わる

この前から気になってたんだけど,名前参照と番号参照を同時にしたくて困った. http://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt 名前付きキャプチャがあるかないかで()の意味が変わってしまう.今,プログラムで正規表現を生成してて,人間が付け…

Schemeの数値リテラルにマッチする正規表現(5)

昨日までの正規表現にバグがあった. /\.#{digit}+#+\.#*#{suffix}/ は /#{digit}+#+\.#*#{suffix}/ が正解.短い方は1957bytesに,長い方は2793bytesになった.

Schemeの数値リテラルにマッチする正規表現(4)

鬼車の,名前付きキャプチャがあると()がキャプチャしなくなるのを利用して1969bytes.これ以上は部分式呼び出しを使わないと大幅な削減は厳しそう. いろいろキャプチャするバージョンは3061bytesになった.強欲マッチを止めれば2805bytes. 部分式呼び出し…

Schemeの数値リテラルにマッチする正規表現(3)

テストの仕方に問題があって,ある文字列にきっちりマッチするかどうかで確かめてたんだけど,トークンとして抜き出してくるにはそれでは不適切なことがわかった.そこで肯定先読みを使って,区切り文字が続いてるかどうかを調べるようにした. それから,問…

Schemeの数値リテラルにマッチする正規表現(2)

短くしてたんだけど,\dが使えない所為で1割伸びた.2217bytes. /(?:(?:#b(?:#[ei])?|(?:#[ei])?#b)(?:(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*)) )|(?:[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[01]+#*))@[+-]?(?:(?:[01]+#*)|(?:[01]+#*\/[ 01]+#*)))|(?:[+-…

UTF8で\dが全角数字にマッチ

irb:0> /\d/ =~ "5" => 0 irb:0> /\d/.encoding => #<Encoding:US-ASCII> irb:0> /\d/n.encoding => #<Encoding:US-ASCII> irb:0> re = Regexp.new(/\d/.source.force_encoding(Encoding::ASCII_8BIT)) => /\d/ irb:0> re.encoding => #<Encoding:US-ASCII>ぎゃーす. irb:0> /\d(?:\x80(?!))?/n =~ "5".force_encodin</encoding:us-ascii></encoding:us-ascii></encoding:us-ascii>…

StringScannerからMatchDataがとれない(2)

indexでは参照できるけど名前では参照できなかったので,参照できるようにしてみた. (2009-10-25修正):マッチしてない部分の名前での参照がバグってたので修正. --- orig_strscan.c 2009-10-18 18:39:10.000000000 +0900 +++ strscan.c 2009-10-25 00:26:…

Schemeの数値リテラルにマッチする正規表現

3839bytes.もっと短くしたいなぁ.見辛いので適当に改行を挿入. /(?:(?:(?:#b)(?:(?:#[ei])?)|(?:(?:#[ei])?)(?:#b))(?:(?:(?:(?:[+-])?)(?:(?:(?:[01 ])+#*)|(?:(?:(?:[01])+#*)\/(?:(?:[01])+#*))|(?:(?!))))|(?:(?:(?:(?:[+-])?)(?:(?: (?:[01])+#*)|(?…

Schemeのブロックコメントにマッチする正規表現(2)

開き括弧と閉じ括弧から,正規表現を生成. def charsetq(c) case c when "[", "-", "]", "\\" "\\#{c}" else c end end def _rec_regexp(str) Array.new(str.length) {|i| [Regexp.quote(str[0, i]), charsetq(str[i, 1])] } end def rec_regexp(s1, s2) a1…

Schemeのブロックコメントにマッチする正規表現

自信はない. re = /(?<block>#\|(?:(?:[^#|]|#[^|]|\|[^#])++|\g<block>)*+\|#)/ str = <</block></block>

ruby1.9のrequire_relative

ところで,require_relativeっていいよね.1.9から入ったのかな. なんかhttp://svn.ruby-lang.org/repos/ruby/trunk/NEWSに書いてあるけど,1.9.1の途中から入ったのかな?

parser generator書いてみた(5)

実行速度測ってみた. CPUは,2 GHz Intel Core 2 Duo. $ ruby19 -v ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-darwin9.8.0] $ time ./sample/calc2.rb 19985 real 0m1.085s user 0m1.066s sys 0m0.014srequire_relative '../rdpg.rb' Lexer = Par…

parser generator書いてみた(4)

構文規則(の左辺)を文字列リテラルでも書けるようにした. Lexer = ParserGenerator::Lexer.new(/[ \t\n\r\v]+/) { token(:operator, /[+-]/) {|ma| ma[0].to_sym } token(:operator2, /[*\/]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0]…

parser generator書いてみた(3)

度重なる仕様変更でこんな感じに書くようになった. Lexer = ParserGenerator::Lexer.new(/[ \t\n\r\v]+/) { token(:operator, /[+-]/) {|ma| ma[0].to_sym } token(:operator2, /[*\/]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0].to_i …