오늘은 Ruby transpose 방법을 사용하여 Ruby에서 그리드를 처리하는 방법을 배울 것입니다.
다차원 배열 형태의 완벽한 그리드(예:3×3 정사각형)가 있다고 상상해 보세요.
그리고 행을 가져와 열로 변환하려는 경우 .
왜 그렇게 하시겠습니까?
한 가지 용도는 고전 게임인 tic-tac-toe입니다.
보드를 그리드로 저장합니다. 그런 다음 승리한 움직임을 찾으려면 행을 확인해야 합니다. , 열 &대각선 .
문제는 그리드를 배열로 저장하는 경우 행에만 직접 액세스할 수 있다는 것입니다.
열렬한 방법
"직접 액세스"란 배열을 탐색할 수 있음을 의미합니다(each
, map
등) 필요 이상으로 배열 인덱싱을 사용하지 않아도 됩니다.
예를 들어봅시다!
그리드가 있습니다 :
grid = [ [1,2,3], [4,5,6], [7,8,9] ]
여기에 내가 만든 영상이 있습니다. :
인덱스를 참조하여 열을 얻을 수 있습니다.
예를 들어 첫 번째 열은 :
[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]
보시다시피 방법을 많이 알면 작업을 많이 줄일 수 있습니다 🙂
틱택토
전체를 설명하지는 않겠습니다. 이 방법을 실제 프로젝트에 어떻게 적용할 수 있는지 보여드리고 싶습니다.
틱택토 게임에서 이기려면 행, 열 또는 대각선을 채워야 합니다.
행 확인을 위한 코드는 다음과 같습니다. :
def check_rows @board.each { |row| return row.first if all_equal?(row) } end
다음은 열에 대한 코드입니다. :
def check_columns @board.transpose.each { |row| return row.first if all_equal?(row) } end
유일한 차이점은 transpose
방법!
다음은 all_equal?
입니다. 방법:
def all_equal?(row) return if row.first == nil row.each_cons(2).all? { |x,y| x == y } end
Enumerable 메서드에 대한 이 게시물을 읽으면 each_cons 메서드에 대해 자세히 알아볼 수 있습니다.
요약
조옮김 방법에 대해 배웠습니다.
완벽한 그리드가 주어지면 transpose를 사용하면 쉽게 액세스할 수 있도록 행을 열로 변환할 수 있습니다.
이 게시물이 마음에 드셨다면 제 책 Ruby Deep Dive를 구입하는 것이 좋습니다.