이 코드 도전에 대한 아이디어 는 간단합니다. 정수 행렬이 주어지면 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)? 그것은 매우 빠르기 때문에 알고리즘이나 구현을 보는 데 매우 관심이 있습니다. 편집 : 우리는 '스크램블 된'행렬을 입력하고 움직임을 출력한다는 것을 알고 있습니까? 다른 방법은 아닙니다.