〜2006年10月中旬〜
&test_name.method(:to_s)というのがなんかわかりにくいので、
自分なりに変更。
module Test::Unit def self.define(test_name = caller.first.sub(/ in `.*'\z/, ''), &block) Class.new(Test::Unit::TestCase) do class << self; attr_reader :name end @name = test_name.to_s class_eval(&block) end end end Test::Unit.define do def test_foo assert true end end
要するに無名クラスのクラスメソッドにnameが定義されればどんな方法でもいいわけで。
uniqの反対というお題。
a = ["a", "a", "a", "b", "c", "d", "d"] a.select{|i| a.grep(i).size > 1}
と
書いたが、数が多いときは2つ見つかった時点で
grepをやめたいところだ。でもなんかそれは無理っぽいので高速化は
h = {} a.select{|i| h[i] ||= a.grep(i).size > 1}
ぐらいでお茶を濁す。
1.9ならEnumerable#countがあるのでgrepせずに
a.select{|i| a.count(i) > 1}
と書ける。
USBでPCへつなぐと直るので充電が切れたのかと思ったら、やたらと頻発する。
2ヶ月しか経ってないのにもう故障と思ったら、
どうも0バイトのOggファイルがいけないらしい。
しばらく原因がわからなかったが、
特定の曲のあとというか途中で死ぬのでやっと気づいた。
たしかに転送してたらディスクフルになってそのままにしてたんだった。
しかしいきなり電源切れてそのままなにもできないってのは困るな。
なかださんとこに見たかとメールが来たらしい。
とりあえず長いので後で読むかも。
一昨日から参戦。99 Bottlesで200切るまでは他をやらないと決めたが、
それどころか一昨日から1歩も進んでないあたりがだめだめだ。
なんとか200バイトまで来た。このままだともう縮みそうもない。
今までは
99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 98 bottles of beer on the wall.
というかたまりで処理していたが、
Take one down and pass it around, 98 bottles of beer on the wall. 98 bottles of beer on the wall, 98 bottles of beer.
というかたまりで処理すればいいのかなと予想。
こうすると数字が全部同じになるわけで。あと
99.downto(1){|i|}
よりも
("1".."99").map{|i|}.reverse
でブロック変数を文字列として扱うとひょっとして短くなるのかなと思ったり。
golfの影響だろうか 変な方法を思いついた。
Dir.entries(dirname).join == "..."
でよさげ。一見 [ruby-talk:220052]でいいような気もするが順番は決まってない。
% mkdir tmp % ruby -ve 'p Dir.entries("tmp")' ruby 1.8.5 (2006-10-13) [i386-linux] ["..", "."] 別のマシン % mkdir tmp % ruby -ve 'p Dir.entries("tmp")' ruby 1.9.0 (2006-07-13) [x86_64-netbsd] [".", ".."]
誰だか忘れちゃったんだけど、はてぶで教えてもらった。
:a!とか:i!みたいに!をつければいいようだ!
すばらしい。
- :{range}a[ppend][!]
- Insert several lines of text below the specified line. If the {range} is missing, the text will be inserted after the current line. Adding [!] toggles 'autoindent' for the time this command is executed.
考えてみると変更は無料なんだから悩む必要もなく、郵便に変更して試す。
土曜日も休日扱いかと思ったら違ったようだし。
そういえば1.9だとmap_with_indexというか、 map.with_indexがありだったんだなと思い出した。
% ruby-1.9 -e 'p %w(a b c d).map.with_index{|x| x}' [["a", 0], ["b", 1], ["c", 2], ["d", 3]]
enum_with_indexなら1.8でも可能
% ruby-1.8 -renumerator -e 'p %w(a b c d).enum_with_index.map{|x| x}' [["a", 0], ["b", 1], ["c", 2], ["d", 3]]
先日書いた方法でかたまりの単位を変更して194バイトまで縮めた。
最終的には
$*<<$*.shift
でrotateしたわけだが、なかださん、
これちゃんとコミットしといてよー。
あれ?でもこの仕様だと
$*.rotate(1)
なのか?それじゃあまり意味ないな。同じ長さだよ。
と思ったら、さすがうささんだ。
ちゃんと今日のことを考えて引数を省略した場合は1とみなそうと
提案してる。
$*も$"どちらも[]で初期化された配列として使えるはずだが、
CodeGolfはセキュリティチェックのためにsecure.rbというファイルをrequireしてるらしく、
$"をその用途には使えない。残念。