Computer >> Máy Tính >  >> Lập trình >> Ruby

Chuyển các hàng thành cột với phương pháp chuyển đổi Ruby

Hôm nay, bạn sẽ học cách xử lý các lưới trong Ruby bằng phương pháp chuyển vị Ruby.

Hãy tưởng tượng rằng bạn có một lưới hoàn hảo, giả sử là một hình vuông 3 × 3, ở dạng một mảng nhiều chiều.

Và bạn muốn lấy các hàng và chuyển đổi chúng thành cột .

Tại sao bạn muốn làm điều đó?

Một công dụng dành cho trò chơi cổ điển:tic-tac-toe.

Bạn lưu trữ bảng của mình dưới dạng lưới. Sau đó, để tìm một nước đi chiến thắng, bạn phải kiểm tra hàng , cột & đường chéo .

Vấn đề là nếu bạn đang lưu trữ lưới của mình dưới dạng một mảng, bạn chỉ có quyền truy cập trực tiếp vào các hàng.

Cột Con đường Khó khăn

Bằng cách “truy cập trực tiếp”, ý tôi là bạn có thể xem qua mảng của mình (với each , map , v.v.) mà không cần phải sử dụng nhiều lập chỉ mục mảng hơn mức cần thiết.

Hãy xem một ví dụ!

Đây là lưới :

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

Đây là hình ảnh tôi đã tạo cho bạn :

Chuyển các hàng thành cột với phương pháp chuyển đổi Ruby

Bạn có thể lấy các cột bằng cách tham chiếu các chỉ mục.

Ví dụ:cột đầu tiên sẽ là :

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

# [1, 4, 7]

Nhưng hàng đầu tiên chỉ là thế này :

grid[0]

# [1, 2, 3]

Làm cách nào chúng ta có thể làm việc với các cột dễ dàng như làm việc với các hàng?

Các cột một cách dễ dàng

Cách dễ dàng để thực hiện việc này là sử dụng phương thức chuyển vị Array #.

Ví dụ :

columns = grid.transpose

Vâng, đó là tất cả những gì bạn phải làm!

Bây giờ bạn có thể nhận được cột đầu tiên như sau:

columns[0]

# [1, 4, 7]

Như bạn có thể thấy, biết nhiều phương pháp có thể giúp bạn tiết kiệm rất nhiều công việc 🙂

Tic-Tac-Toe

Tôi sẽ không giải thích toàn bộ. Tôi chỉ muốn cho bạn thấy phương pháp này có thể áp dụng cho một dự án thực tế như thế nào.

Để giành chiến thắng trong trò chơi tic-tac-toe, bạn cần điền vào một hàng, một cột hoặc một đường chéo.

Đây là mã để kiểm tra hàng :

def check_rows
  @board.each { |row| return row.first if all_equal?(row) }
end

Và đây là mã cho các cột :

def check_columns
  @board.transpose.each { |row| return row.first if all_equal?(row) }
end

Lưu ý sự khác biệt duy nhất là transpose phương pháp!

Đây là all_equal? phương pháp:

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

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

Bạn có thể tìm hiểu thêm về phương thức each_cons đó bằng cách đọc bài đăng này về phương thức Enumerable.

Tóm tắt

Bạn đã học về phương pháp chuyển vị.

Với một lưới hoàn hảo, hoán vị cho phép bạn chuyển đổi các hàng thành cột để dễ dàng truy cập.

Nếu bạn thích bài đăng này, bạn có thể muốn xem xét mua một bản sao cuốn sách Ruby Deep Dive của tôi.