さすがにいろんな人から怒られることが多くなってきたのでいいかげん comjong.comの更新をしようかと。
前に書いたソースを見たら、手牌の先読みルーチンを書いてて、あまりの動作の遅さに投げ出したところで止まってました。なので、高速化するべくキャッシュ化をしてみたのでその覚え書き。断片コードだけなんだけど、雰囲気ね。
手牌を解析するときに、
def combination( t )
max = {}; max.default = 0
s = separate(t)
return max if s == []
if s.size > 1
a = []
s.each{|i| a << combination(i)}
return merge_combination(a)
else
b = s.first
end
b.shift while b.first == 0
b.pop while b.last == 0
return @@cache[b].dup if @@cache[b] != nil
c = {}; c.default = 0
for i in 0...b.size
# sequence
if b[i+2] != nil and b[i] >= 1 and b[i+1] >= 1 and b[i+2] >= 1
t = b.dup; t[i] -= 1; t[i+1] -= 1; t[i+2] -= 1
c = combination(t)
c["sets"] += 1;
c["headed_sets"] = if c["headed_pairs"] == 0 then 0 else c["headed_sets"] + 1 end
max = max_combination( c, max )
end
# triplet
if b[i] >= 3
t = b.dup; t[i] -= 3
c = combination(t)
c["sets"] += 1;
c["headed_sets"] = if c["headed_pairs"] == 0 then 0 else c["headed_sets"] + 1 end
max = max_combination( c, max )
end
....
_ な感じにして、今までの結果を最大限に生かしつつ、そこからの差分だけ読むようにしてやればいい感じかも。ちなみに [3, 1, 1, 1, 0, 1] を読ませたときのキャッシュの中身はこんな感じになります (Hash の default は 0 ね) 。
{[3, 1, 1]=>{"headed_pairs"=>1, "sets"=>1, "pairs"=>1, "headed_sets"=>1},
[2, 1]=>{"headed_pairs"=>1, "pairs"=>1},
[1, 1, 1, 0, 1]=>{"headed_pairs"=>0, "sets"=>1, "pairs"=>0},
[1]=>{},
[1, 1, 1, 1, 0, 1]=>{"headed_pairs"=>0, "sets"=>1, "pairs"=>1},
[2, 1, 0, 1, 0, 1]=>{"headed_pairs"=>2, "pairs"=>2},
[2, 0, 1]=>{"headed_pairs"=>1, "pairs"=>1},
[1, 1]=>{"headed_pairs"=>0, "pairs"=>1},
[3, 1]=>{"headed_pairs"=>2, "sets"=>1, "pairs"=>0, "headed_sets"=>0},
[3, 0, 1]=>{"headed_pairs"=>2, "sets"=>1, "pairs"=>0, "headed_sets"=>0},
[3]=>{"headed_pairs"=>1, "sets"=>1, "pairs"=>0},
[3, 1, 1, 1, 0, 1]=>{"headed_pairs"=>2, "sets"=>2, "pairs"=>0, "headed_sets"=>1},
[1, 0, 1, 0, 1]=>{"headed_pairs"=>0, "pairs"=>1},
[1, 1, 1]=>{"headed_pairs"=>0, "sets"=>1, "pairs"=>0},
[2, 0, 1, 1, 0, 1]=>{"headed_pairs"=>2, "pairs"=>2},
[2]=>{"headed_pairs"=>1, "pairs"=>1},
[1, 1, 0, 1]=>{"headed_pairs"=>0, "pairs"=>1},
[1, 0, 1]=>{"headed_pairs"=>0, "pairs"=>1}}
昼休みに実家の母から電話があった。普段、昼に電話がくることなどないので何事かと思ったら、新種のオレオレ詐欺と思われる電話がかかってきたので念のために確認の電話をしてきたらしい。
上ではオレオレ詐欺と書いたが、「オレオレ」ではなく私の本名を名乗ったようなので厳密にはオレオレ詐欺ではないかもしれない。しかし、手口は本質的には同じで、「友人の保証人として肩代わりすることになった借金180万円を払えなくて困っているので振り込んで欲しい」というストーリーだったそうだ (fukumoto母談) 。
最近ではそういう名前と家族構成付きの名簿も出回ってたりするのだろうか。これは従来のオレオレ詐欺よりもかなり成功率が高そうな気がする。祖母には一応気をつけろと電話しておいた方がいいかも。
複数の媒体に発表した原稿をまとめた本なので、雑多な印象があるが、主張はきちんと一本通っている。
従来の教育論争で取り上げられている、ゆとり対詰め込みや、右対左といった対立軸にとらわれ過ぎることなく、社会階層による教育格差の問題をあぶり出している点がすばらしい。
ToDo/ToBuy