ケブンリッジ問題
#! /usr/bin/env ruby
cambridge = <<EOF.chomp
こんにちは みなさん おげんき ですか ? わたしは げんき です 。 この ぶんしょう は イギリス の ケンブリッジ だいがく の けんきゅう の けっか にんげん は もじ を にんしき する とき その さいしょ と さいご の もじさえ あっていれば じゅんばん は めちゃくちゃ でも ちゃんと よめる と いう けんきゅう に もとづいて わざと もじの じゅんばん を いれかえて あります 。 どうです ? ちゃんと よめちゃう でしょ ? ちゃんと よめたら はんのう よろしく
EOF
if $0 == __FILE__
puts cambridge
end
- 最初と最後以外を滅茶苦茶に
def cambridge(s)
s[0] +
s[1...-1].chars.shuffle.join +
s[-1]
end
s = "cambridge" # => "cambridge"
cambridge(s) # => "cidmbagre"
しかし "cidmbagre" を "cambridge" とは読めない。
- 最初と最後以外を 2文字ずつ入れ換える
def cambridge(s)
s[0] +
s[1...-1].chars.each_slice(2).map(&:reverse).join +
s[-1]
end
s # => "cambridge"
cambridge(s) # => "cmarbdige"
どでうす ? ちんゃと よちめゃう でしょ ?
- オープンクラスを利用して、
String
クラスにcambridge!
とcambridge
メソッドと追加する。- refinements を利用して、影響範囲を限定する。
- まず、破壊的メソッドを作成し、非破壊メソッドから破壊的メソッドを呼び出す。
- 破壊的メソッドは、値が変化しない場合は
nil
を返す。
- 破壊的メソッドは、値が変化しない場合は
- 元の文字列はヒアドキュメントで作成。
- 空白 (タブ, 改行) で分割して、その全てに cambridge を呼び出す。