2次元配列の頻出パターン
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 13/56。
2次元配列の操作の中には、非常に頻繁に登場するため、名前で覚えておく価値があるものがいくつかあります。
すべてのセルの合計を求める: グリッドを1次元配列に平坦化し、sumを呼び出します:
grid = [[1, 2], [3, 4]]
puts grid.flatten.sum # 10主対角線: 行のインデックスと列のインデックスが等しいセル (matrix[i][i]):
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
(0...matrix.length).each do |i|
puts matrix[i][i]
end
# 1, 5, 9転置 (Transpose): Rubyにはこれが組み込まれています。行が列になり、その逆も同様です:
matrix.transpose
# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]これらを名前で知っておくと、同じネストされたループを書き直す手間が省けます。
チャレンジ
簡単正方形の matrix (n × n) が与えられます。理論のパターンから導き出される3つの行を出力してください:
Anti-diagonal sum: <n>、r + c == matrix.length - 1となるセルの合計。Column sums: [...]、各列の合計。ヒント:最初に転置(transpose)し、次に各行をその合計にマッピング(map)し、最後にinspectします。Symmetric: trueまたはfalse:行列はその転置行列と等しいですか?
デフォルトの行列の場合、出力は以下のようになります:
Anti-diagonal sum: 15
Column sums: [12, 15, 18]
Symmetric: falseチートシート
Rubyにおける一般的な2次元配列の操作:
すべてのセルの合計 — flattenしてからsumを実行します:
grid.flatten.sum主対角線 — 行のインデックスと列のインデックスが等しいセル (matrix[i][i]):
(0...matrix.length).each { |i| puts matrix[i][i] }
# i == 0: matrix[0][0], i == 1: matrix[1][1], ...逆対角線 — r + c == matrix.length - 1 となるセル:
(0...matrix.length).each { |i| puts matrix[i][matrix.length - 1 - i] }転置 (Transpose) — 行を列に入れ替えます:
matrix.transpose
# [[1,4,7],[2,5,8],[3,6,9]]列の合計 — 最初に転置し、各行(元の列)の合計を算出します:
matrix.transpose.map(&:sum) # [col0_sum, col1_sum, ...]対称性のチェック — 行列とその転置行列を比較します:
matrix == matrix.transpose # true or false自分で試してみよう
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# TODO: 反対角線の和、転置による列の和、対称性のチェック
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。