귀하의 질문에 다소 혼란 스럽습니다. 왜냐하면 대부분의 코드에서 배열을 사용하여 행과 열이있는 구조를 나타내므로 "외부"배열은 행을 나타내며 "내부"배열은 열을 나타냅니다. 예를 들어 보통의 모델에서
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?
에서 우리는 각 "열"의 고유 한 값을 계산 사용하는 또 다른 방법은이 될 것입니다 해결하기 위해 행). 고유 값이 둘 이상인 경우 모두 동등하지는 않습니다. 물론, 여기에는 더 많은 오버 헤드가 있습니다. transpose
및 uniq
은 모든 값을 반복하고 새 배열을 반환하는 반면 위의 메서드는 일치하지 않는 값을 찾으면 즉시 중지합니다. 그러나 얼마나 자주 당신이 달릴 필요가 있느냐에 따라 단지 25 개의 항목 만 주어질 수 있습니다.
P.P.S. 첫 번째 방법이 두 번째 방법보다 훨씬 더 좋아 졌는지 궁금했습니다. 여기서 코드와 결과를 볼 수 있습니다 : https://gist.github.com/jrunning/7168af45c5fa5fb4ddd3 첫 번째 방법 "short-circuits"때문에 - i.e. 그것은 "잘못된"값을 발견하자 마자 멈추며, "잘못된"값의 확률이 높아질수록 더 빠릅니다. 잘못된 값이있는 행이 33 % 확률 인 경우 첫 번째 방법은 두 번째 방법보다 33 % 빠릅니다. 75 % 확률로 첫 번째 확률은 두 번째 확률보다 80 % 빠릅니다. 그게 네가 필요로하는 것보다 더 많은 정보를 알게되었지만 흥미로운 걸 알았다.
"행"의 각 값 (실제로는 "열")과 "행"에 대해 논쟁의 여지가있는 것처럼 보이는 코드가 나타납니다. 어레이가 어떻게 생겼는지에 대한 간단한 예를 통해 명확하게 설명 할 수 있습니까? –