オフラインリアルタイムどう書く18回の参考問題を、rubyで


第18回 http://atnd.org/events/47025
の、参考問題「山折り谷折り」
http://nabetani.sakura.ne.jp/hena/ord18mafovafo/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd
から辿れます。

で。

def solve( x )
  return "" if x.empty? || ! x
  r=solve( x[1..-1] )
  i=r.tr("mV", "Vm").reverse
  case x[0]
  when "L"; i+"V"+r
  when "J"; r+"V"+i
  when "Z"; r+"m"+i+"V"+r
  when "S"; r+"V"+i+"m"+r
  when "U"; i+"V"+r+"V"+i
  else; raise "#{x}"
  end
end

$stdout.sync=true

DATA.map{ |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
  ok
}.tap{ |x| p x.all? }

__END__
0 JZ  mVVmV

いつも通り、テストデータの大半は省略。

方針としては、順当な再帰処理というつもり。
L なら、まんなかは谷折り。
谷折りの左側は逆になって、右側はそのまま。

紙を折る問題は、話が理解できてもパッと書き始められないことが多いみたいで、ちょっと面白い(と、思ってるんだけど、どうだろう)。