Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby転置法を使用して行を列に変換する

今日は、Ruby転置法を使用してRubyでグリッドを処理する方法を学習します。

多次元配列の形をした完璧なグリッド、たとえば3×3の正方形があると想像してみてください。

そして、行を取得して列に変換する

なぜあなたはそれをしたいのですか?

1つの用途は、古典的なゲームであるtic-tac-toeです。

ボードをグリッドとして保存します。次に、勝利の動きを見つけるには、を確認する必要があります 、対角線

問題は、グリッドを配列として格納している場合、行に直接アクセスすることしかできないことです。

コラムズザハードウェイ

「直接アクセス」とは、配列を(eachで)調べることができることを意味します 、map など)必要以上に配列のインデックスを使用する必要はありません。

例を見てみましょう!

これがグリッドです

grid = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

これが私があなたのために作ったビジュアルです

Ruby転置法を使用して行を列に変換する

インデックスを参照することで列を取得できます。

たとえば、最初の列は

[grid[0][0], grid[1][0], grid[2][0]]

# [1, 4, 7]

しかし、最初の行はこれだけです

grid[0]

# [1, 2, 3]

行の操作と同じくらい簡単に列の操作を行うにはどうすればよいですか?

コラム簡単な方法

これを行う簡単な方法は、Array#transposeメソッドを使用することです。

columns = grid.transpose

はい、それがあなたがしなければならないすべてです!

これで、次のような最初の列を取得できます:

columns[0]

# [1, 4, 7]

ご覧のとおり、多くのメソッドを知っていると、多くの作業を節約できます🙂

Tic-Tac-Toe

全部を説明するつもりはありません。この方法を実際のプロジェクトにどのように適用できるかをお見せしたいと思います。

三目並べのゲームに勝つには、行、列、または対角線を埋める必要があります。

行をチェックするためのコードは次のとおりです

def check_rows
  @board.each { |row| return row.first if all_equal?(row) }
end
の場合はrow.firstを返します

これが列のコードです

def check_columns
  @board.transpose.each { |row| return row.first if all_equal?(row) }
end
の場合はrow.firstを返します

唯一の違いがtransposeであることに注意してください メソッド!

これがall_equal?です 方法:

def all_equal?(row)
   return if row.first == nil

   row.each_cons(2).all? { |x,y| x == y }
 end

列挙可能なメソッドに関するこの投稿を読むことで、each_consメソッドの詳細を知ることができます。

概要

転置法について学習しました。

完全なグリッドが与えられると、転置により、行を列に変換して簡単にアクセスできるようになります。

この投稿を楽しんだら、私の本RubyDeepDiveのコピーを購入することを検討してください。


  1. RubyでN-Queensの問題を解決する

    N-Queensは、 N*NボードにN個のクイーンを配置する必要がある興味深いコーディングチャレンジです。 。 次のようになります: 女王はすべての方向に移動できます: 垂直 水平 対角線 解決策(多くの場合があります)は、すべてのクイーンをボードに配置する必要があります。 &すべての女王は他のすべての女王の手の届かないところにいる必要があります。 この記事では、私がどのようにして解決策を思いついたのかを学びます。 計画 この種の課題を解決するときは、まず、計画を平易な英語で書き留めることから始めるのがよいでしょう。 これは、問題が何であるか、およびそれを解決するための手

  2. Ruby Enumerable Moduleの基本ガイド(+私のお気に入りの方法)

    列挙可能とは何ですか? 列挙可能は反復法のコレクションです 、Rubyモジュール、そしてRubyを優れたプログラミング言語にする大きな部分です。 列挙可能には次のような便利なメソッドが含まれます : マップ 選択 注入 列挙可能なメソッドは、ブロックを与えることで機能します。 そのブロックで、すべての要素で何をしたいのかを伝えます。 例 : [1,2,3].map { |n| n * 2 } すべての数値が2倍になった新しい配列を提供します。 正確に何が起こるかは、使用する方法、 mapによって異なります。 すべての値を変換するのに役立ちます、 select リス