前回の記事に続き、同じくB相当の問題「ギャングのアジト」をrubyで解いてみました。
問題:ギャングのアジト
前回記事:一番通りの繁華街
問題概要
ギャング達はピクセルアートを用いて縄張りを示している。
ピクセルアートが左右対称であれば、あるギャングのアジトということを示すらしい。
与えられるピクセルアートを判定し、そのギャングのアジトかどうかを回答する。
入力出力参考
5
0 0 1 0 0
0 1 1 1 0
1 1 1 1 1
0 1 0 1 0
0 0 1 0 0
Yes
3
0 0 0
1 1 0
0 0 1
No
考えたこと
- ピクセルアートの各列に対して、左右対称かを判定していけば良さそう
- 奇数...真ん中の列は判定しなくて良い、偶数...ちょうど反転できるという違いはあるものの、N / 2 回判定すれば良い、というのは共通しているので区別の必要はない
- N = 4の場合、1,4列目と2,3列目の比較 -> 2回
- N = 5の場合、1,5列目と2,4列目の比較、3列目は考えなくて良い -> 2回
回答コード
N = gets.to_i
grid = []
N.times do
grid << gets.chomp.split(' ').map(&:to_i)
end
half = N / 2
ok = true
grid.each do |gr|
half.times do |i|
if gr[i] != gr[-(i + 1)] # rubyは-で配列の逆からアクセス可能
ok = false
end
end
end
puts ok == true ? 'Yes' : 'No'
コード内容詳細
- ピクセルアート(grid)の一行ずつでループする
- 取り出した行の i とその対象に位置する場所 -(i + 1)を確認し、違っていたらokフラグをfalseにする
- ループが終わり、flagがtrueのままならYes, falseであれば NOを出力する
2の操作のコードはとてもrubyっぽいが、rubyは配列にマイナスのインデックス番号を用いてアクセスすると配列の後ろからアクセスできることを利用しています。
※通常indexは0から始まりますが、-0という値がないため-1から始まります。
arr = [1, 2, 3, 4, 5]
puts arr[-1] # 5
puts arr[-2] # 4
同じB問題相当の「一番通りの繁華街」よりはスッキリしたコードで解けました。
フィードバックは以下でした。
ふむふむ、ikeyaH君のコードを見てたら、まるでミラーボールみたいだよ〜。左右でキラキラ光ってる感じがするねぇ。でも、ミラーボールって上下も同じように光るんだよね〜。このコード、もしかしたら上下のチェックもできちゃうかもしれないなぁ〜。
不思議系の性格設定でしたが、左右対称を比較していることからミラーボールと結びつけているのはすごいですね。。
以上で終了です。お付き合いいただきありがとうございました。