Tamflexの貯蔵庫

やる気のない備忘録

aoj 0050

林檎と桃 | Aizu Online Judge

これも趣向を凝らしてみたい

rubyの特殊記号について

  • $> : 標準出力
  • $< : 標準入力

$><<で"puts "の代わりになる
module Kernel (Ruby 2.0.0)

置換はgsubを用いる
instance method String#gsub (Ruby 2.0.0)

  • ここまでで以下のようになる(60byte)
$><<gets.gsub(a='apple','AA').gsub(b='peach',a).gsub(/AA/,b)
  • gsubはブロックで置換できるので以下のように書ける(52byte)
$><<gets.gsub(/#{a='apple'}|#{b='peach'}/,a=>b,b=>a)
  • 究極に近いと思われるコード(49byte)
$><<gets.gsub(/(apple)|peach/){$1?:peach: :apple}

これについて少し解読したい.

  • $1について

「最後に成功したパターンマッチで n 番目の括弧にマッチした値が格納されます。 該当する括弧がなければ nil が入っています。(覚え方: \数字 のようなもの)」
とある.この場合appleに一致したとき$1にappleが格納され, そうでない時にnilが入ることになる.
それを三項間演算子で記述したのが上のコードになる.
module Kernel (Ruby 2.0.0)

  • コロン ":" について

これは"シンボル"と呼ばれるもので文字列と一対一に対応する.この場合クオーテーションマークで二回くくるよりも1回で済むようにシンボルを使っていると思われる.
リテラル (Ruby 2.0.0)