LoginSignup
0
1

More than 5 years have passed since last update.

ブロックを90度回す

Posted at

「オフラインリアルタイムどう書くF05の問題」の解答
問題:http://nabetani.sakura.ne.jp/hena/ordf05rotblo/

オンラインだけども・・・ちょっぴり頭の体操します。

  1. 中心関係なく、90度時計回りに回転させる。
  2. 中心も一緒に回転してるので、中心が元の位置になるように全体をズラして補正する。 ズラす際に足りない部分は"0"を埋め、5*5マスから漏れる要素は捨てる。
  3. 回転前と回転後のブロックの数が同じなら回転成功。
#!/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,-
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1