「オフラインリアルタイムどう書くF05の問題」の解答
問題:http://nabetani.sakura.ne.jp/hena/ordf05rotblo/
オンラインだけども・・・ちょっぴり頭の体操します。
- 中心関係なく、90度時計回りに回転させる。
- 中心も一緒に回転してるので、中心が元の位置になるように全体をズラして補正する。 ズラす際に足りない部分は"0"を埋め、5*5マスから漏れる要素は捨てる。
- 回転前と回転後のブロックの数が同じなら回転成功。
#!/usr/bin/env ruby
def f05(line)
point, data = line.chomp.split(":")
blocks = data
.split("/").map{|row| row.split("")}
.reverse.transpose
if point == "a"
blocks.pop
blocks.unshift(["0"] * 5)
blocks.map do |row|
row.shift
row.push("0")
end
else
blocks.map do |row|
row.shift
row.push("0")
end
end
if data.count("1") == blocks.flatten.count("1")
blocks.map{|row| row.join("")}.join("/")
else
"-"
end
end
DATA.each.with_index do |line, no|
data, expected = line.chomp.split(",")
actual = f05(data)
if expected != actual
puts "NG No.%d %s (%s == %s)" % [no, data, expected, actual]
exit
end
end
puts "OK"
__END__
a:00000/00110/00100/00100/00000,00000/00000/00000/11100/00100
b:00000/00000/00000/00011/00011,-
a:00000/00000/00000/00011/00011,-
b:00000/00000/00100/00000/00000,00000/00000/01000/00000/00000
a:00000/00000/00100/00000/00000,00000/00000/00000/01000/00000
b:00000/00110/00100/00100/00000,00000/00000/11100/00100/00000
b:00000/00000/00011/00011/00000,00000/00000/00000/11000/11000
a:00000/00000/00011/00011/00000,-
a:01110/00100/00000/00000/00000,00000/00000/00010/00110/00010
b:01110/00100/00000/00000/00000,00000/00010/00110/00010/00000
a:00000/11110/00000/00000/00000,00000/00100/00100/00100/00100
b:00000/11110/00000/00000/00000,00100/00100/00100/00100/00000
a:00000/00011/00110/00000/00000,-
b:00000/00011/00110/00000/00000,00000/00000/01000/01100/00100
a:00000/11100/11100/11100/00000,00000/11100/11100/11100/00000
b:00000/11100/11100/11100/00000,11100/11100/11100/00000/00000
a:01000/00000/00101/10010/10001,-
b:01000/00000/00101/10010/10001,-
b:10000/00000/10010/00000/00000,01010/00000/00000/01000/00000
a:10000/00000/10010/00000/00000,00000/01010/00000/00000/01000
a:00000/10101/11010/11010/01000,-
b:00000/10101/11010/11010/01000,-
b:01101/00011/01101/00000/00000,00000/01010/01010/00100/01110
a:01101/00011/01101/00000/00000,-
a:00001/00000/00000/00100/00010,-
b:00001/00000/00000/00100/00010,-
b:00100/00000/00100/01000/00000,00000/10000/01010/00000/00000
a:00100/00000/00100/01000/00000,00000/00000/10000/01010/00000
a:00010/00100/00000/10000/00000,00000/10000/00000/00100/00010
b:00010/00100/00000/10000/00000,10000/00000/00100/00010/00000
b:11010/00011/10101/00001/00001,-
a:11010/00011/10101/00001/00001,-
a:00100/00010/00000/11000/00000,00000/10000/10000/00010/00100
b:00100/00010/00000/11000/00000,10000/10000/00010/00100/00000
b:01010/00000/00000/01000/00000,00000/10010/00000/00010/00000
a:01010/00000/00000/01000/00000,00000/00000/10010/00000/00010
a:00000/00000/00100/10100/00000,00000/10000/00000/11000/00000
b:00000/00000/00100/10100/00000,10000/00000/11000/00000/00000
b:10000/01101/01000/01100/10011,-
a:10000/01101/01000/01100/10011,-
a:00010/00000/00110/01000/10001,-
b:00010/00000/00110/01000/10001,-
b:00000/01000/01100/00000/00000,00000/01100/01000/00000/00000
a:00000/01000/01100/00000/00000,00000/00000/01100/01000/00000
a:01000/00000/00000/10000/00000,00000/10000/00010/00000/00000
b:01000/00000/00000/10000/00000,10000/00010/00000/00000/00000
b:00000/01101/00000/01010/11010,-
a:00000/01101/00000/01010/11010,-
a:00110/00101/00000/10100/00100,-
b:00110/00101/00000/10100/00100,-
b:11000/10110/00000/00110/00000,00110/00010/10100/10100/00000
a:11000/10110/00000/00110/00000,00000/00110/00010/10100/10100
a:00000/00000/00000/00001/00110,-
b:00000/00000/00000/00001/00110,-
b:01011/10001/00000/00000/00000,00100/00010/00000/00010/00110
a:01011/10001/00000/00000/00000,-