2014-12-02 3 views
0

2 차원 배열의 각 열의 값이 동일한 지 확인해야하는 프로그램을 작성하고 있습니다. 열 수는 5시에도 고정되어 있습니다.열의 모든 항목이 동일한 지 테스트하는 방법

if column[0][i] == column[1][i] && column[0][i] == column[2][i] 

편집 :

현재 나는 열에 열에서 반복하고 하나 개의 거대한 체크 해당 열에있는 모든 값을 비교하는 if 문이 미안 해요, 난 혼란에 대한 의도하지 않았다. 이 어레이는 5x5 게임 보드를 만듭니다. 행은 각 개별 배열을 나타내며 열은 각 배열의 n 번째 숫자를 나타냅니다.

+0

"행"의 각 값 (실제로는 "열")과 "행"에 대해 논쟁의 여지가있는 것처럼 보이는 코드가 나타납니다. 어레이가 어떻게 생겼는지에 대한 간단한 예를 통해 명확하게 설명 할 수 있습니까? –

답변

2

귀하의 질문에 다소 혼란 스럽습니다. 왜냐하면 대부분의 코드에서 배열을 사용하여 행과 열이있는 구조를 나타내므로 "외부"배열은 행을 나타내며 "내부"배열은 열을 나타냅니다. 예를 들어 보통의 모델에서

arr = [ [ a, b ], 
     [ x, y ] ] 

(a, b) "로우"0 및 (x, y)이다하게 1 행 (a, x) 칼럼 0이고 (b, y) 1 열

하지만 코드는 구조하게 행하는데 0 (a, x)과 1 개 행의 존재 (b, y) (a, b) 칼럼 0으로 반전되는 제안 (, y) 열 1, 그래서 나는 그렇게 대답 할 것이다. 한 열의 모든 값을 동일한 열의 모든 값 (예 : a == b && x == y)과 동일하게 만들려면 매우 쉽습니다. 우리는 다음과 같은 데이터가 있다고 가정 : "열"의 모든 값이 0이 열 0의 다른 모든 값에 동일한 경우는

arr = [ [ 10, 10, 10, 10 ], # <-- Column 0 
     [ 11, 11, 11, 11 ], # <-- Column 1 
     [ 12, 0, 12, 12 ] ] # <-- Column 2 

확인하기를, 우리는이 작업을 수행 할 수 있습니다 :

arr[0].all? {|item| item == arr[0][0] } # => true 

를이 단지마다 비교 항목의 첫 번째 항목 arr[0][0]으로 이동하고 같지 않은 항목을 찾으면 즉시 false을 반환합니다 (그렇지 않은 경우 true).

모든 "행"이 작업을 수행하기 위해

, 우리는 또 다른의 첫 번째 all?을 포장 할 수 있습니다

arr.all? do |sub_arr| 
    sub_arr.all? {|item| item == sub_arr.first } 
end 
# => false 

편집 :

: 배열 보이는 경우, 대신에이 같은
arr = [ [ 10, 11, 12 ], 
     [ 10, 11, 0 ], 
     [ 10, 11, 12 ], 
     [ 10, 11, 12 ] ] 
#   │ │ └─ Column 2 
#   │ └─ Column 1 
#   └─ Column 0 

이 문제를 해결하는 한 가지 방법은 다음과 같습니다.

first_row, *rest = arr 

rest.all? do |row| 
    row.each_with_index.all? do |item, col_idx| 
    row[col_idx] == first_row[col_idx] 
    end 
end 

첫 번째 행은 첫 번째 행을 first_row에 할당하고 나머지 행은 rest에 할당합니다. 그런 다음 rest의 각 행에 대해 all?을 사용하여 각 항목을 해당 항목과 first_row으로 비교하십시오.

P.지금있는 ((예 [[a,x],[b,y]][[a,b],[x,y]] 회전)

arr.transpose.all? {|row| row.uniq.size == 1 } 

Array#transpose 단지 행과 열을 스왑하고 all?에서 우리는 각 "열"의 고유 한 값을 계산 사용하는 또 다른 방법은이 될 것입니다 해결하기 위해 행). 고유 값이 둘 이상인 경우 모두 동등하지는 않습니다. 물론, 여기에는 더 많은 오버 헤드가 있습니다. transposeuniq은 모든 값을 반복하고 새 배열을 반환하는 반면 위의 메서드는 일치하지 않는 값을 찾으면 즉시 중지합니다. 그러나 얼마나 자주 당신이 달릴 필요가 있느냐에 따라 단지 25 개의 항목 만 주어질 수 있습니다.

P.P.S. 첫 번째 방법이 두 번째 방법보다 훨씬 더 좋아 졌는지 궁금했습니다. 여기서 코드와 결과를 볼 수 있습니다 : https://gist.github.com/jrunning/7168af45c5fa5fb4ddd3 첫 번째 방법 "short-circuits"때문에 - i.e. 그것은 "잘못된"값을 발견하자 마자 멈추며, "잘못된"값의 확률이 높아질수록 더 빠릅니다. 잘못된 값이있는 행이 33 % 확률 인 경우 첫 번째 방법은 두 번째 방법보다 33 % 빠릅니다. 75 % 확률로 첫 번째 확률은 두 번째 확률보다 80 % 빠릅니다. 그게 네가 필요로하는 것보다 더 많은 정보를 알게되었지만 흥미로운 걸 알았다.

+1

죄송합니다. 나는 그 질문을 정말로 잘못 작성했습니다. (a, x)와 (b, y)가 열이라는 사실을 처음으로 가정했을 때 실제로 맞았습니다. – ZubatMan

+0

@EllBells 설명해 주셔서 감사합니다. 내 대답을 업데이트했습니다. –

관련 문제