이 코드 도전에 대한 아이디어 는 간단합니다. 정수 행렬이 주어지면 Rubik 스타일의 움직임을 적용하여 정렬하십시오. 즉, 단일 행 또는 열을 선택하고 해당 요소를 원하는 방향으로 회전 할 수 있습니다.
[1, 3, 2, 4] => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4] => [4, 1, 3, 2] (rotate right for rows/down for columns)
따라서 모든 차원의 정수 행렬이 주어지면 이러한 Rubik 스타일 변환 만 적용하여 요소를 정렬하십시오. 매트릭스
요소가 다음 제한 사항을 준수하는 경우 정렬 된 것으로 간주됩니다.
I / O
- 입력 값은 반복되는 값이없는 양의 정수 행렬입니다.
- 출력은 정렬에 필요한 움직임입니다. 이 코드 골프 도전이 아니므로이 길이에 대해 걱정할 필요가 없습니다로서, 모든 움직임에 대한 제안 형식은
#[UDLR]
어디#
이동 (0 인덱스)에 행 또는 열 수이고[UDLR]
있다는 점에서 하나의 문자입니다 이동이 위 / 아래 (열) 또는 왼쪽 / 오른쪽 (행)인지 지정하는 범위입니다. 따라서1U
"1 번째 열을 위로 이동"을 의미하지만1R
"1 번째 열을 오른쪽으로 이동"을 의미합니다. 움직임은 쉼표로 구분되므로 솔루션은 다음과 같이 표현됩니다1R,1U,0L,2D
.
채점
행렬을 이런 식으로 정렬하려고하면 가능한 많은 이동 조합이있을 수 있으며, 정렬 할 수있는 많은 이동 목록도 있으므로 N *을 정렬하는 코드를 작성하는 것이 목표입니다. 아래의 N 행렬. 점수는 오류없이 합리적인 시간 1 에서 해결할 수있는 가장 큰 크기 N이됩니다 (행렬의 크기가 클수록 클수록 좋습니다). 동점의 경우 동점 차단기는 찾은 경로의 이동 횟수가됩니다 (경로가 짧을수록 좋습니다).
예 : 사용자 A가 N = 5에 대한 해를 찾고 B가 N = 6에 대한 해를 찾으면 B는 두 경로의 길이에 관계없이 승리합니다. 둘 다 N = 6에 대한 해를 구하지 만 A에서 찾은 해는 50 단계이고 B의 해는 60 단계이면 A가 이깁니다.
코드 작동 방식에 대한 설명을 적극 권장하며 찾은 솔루션을 게시하여 테스트 해보십시오 . 솔루션이 너무 큰 경우 Pastebin 또는 유사한 도구를 사용할 수 있습니다 . 또한 솔루션을 찾기 위해 코드에서 사용한 시간을 평가 해 주시면 감사하겠습니다.
테스트 사례
이미 정렬 된 행렬부터 10K 임의의 Rubik 스타일의 움직임으로 스크램블하여 다음 행렬 ( 보다 복사하여 붙여 넣기 가능한 버전의 Pastebin 링크 )을 만들었습니다.
일반 텍스트 테스트 사례 :
[[8, 5, 6], [11, 10, 1], [3, 15, 13]]
[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]
[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]
[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]
[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]
[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]
[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]
당신이 그들 모두를 해결하는 경우 더 요청하십시오. :-) 그리고 샌드 박스에있는 동안이 문제를 해결하는 데 도움을 준 사람들에게 감사합니다 .
1 합리적인 시간 : 솔루션을 테스트하는 동안 인내심을 손상시키지 않는 시간. TIO는 60 초 동안 만 코드를 실행합니다.이 제한을 초과하면 시스템에서 코드를 테스트하게됩니다. 예 : 다소 비효율적 인 알고리즘은 3x3 및 4x4 차수의 행렬을 해결하는 데 몇 밀리 초가 걸리지 만 5x5 행렬로 방금 테스트했으며 그것을 해결하는 데 317 초가 걸렸습니다 (5 백만 회 이상 이동하면 매우 재미 있습니다. 해결 매트릭스 스크램블 된 전용 ) 10,000 배. 이동 횟수를 10K 미만으로 줄이려고 시도했지만 30 분 동안 코드를 실행 한 후 항복했습니다.
O(input size)
? 5x5 매트릭스의 경우 O(25)
? 그것은 매우 빠르기 때문에 알고리즘이나 구현을 보는 데 매우 관심이 있습니다. 편집 : 우리는 '스크램블 된'행렬을 입력하고 움직임을 출력한다는 것을 알고 있습니까? 다른 방법은 아닙니다.