Ідея цього кодового виклику проста: маючи матрицю цілих чисел, давайте сортуємо її, застосовуючи рухи в стилі Рубіка. Це означає, що ви можете вибрати один рядок або стовпець і обертати його елементи в будь-якому напрямку:
[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)
Отже, задавши матрицю цілих чисел будь-якого виміру, сортуйте її елементи, застосовуючи лише ці перетворення у стилі Рубіка. Матриця
буде вважатися відсортованим, якщо його елементи відповідають наступному обмеженню:
I / O
- Введенням буде матриця натуральних чисел без повторних значень.
- Виходом будуть рухи, необхідні для їх сортування. Оскільки це не код гольф виклику і вам не потрібно турбуватися про його довжині, пропонований формат для кожного руху ,
#[UDLR]
де#
це число рядків або стовпців для переміщення (0 індексованих) і[UDLR]
являє собою один символ в тому , що діапазон, який визначає, чи є рух вгору / вниз (для стовпців) або вліво / вправо (для рядків). Так1U
би означало "переміщення 1-го стовпчика вгору", але1R
було б "переміщення 1-го ряду вправо". Рух буде відокремлено коми, тому рішення буде виражатися наступним чином:1R,1U,0L,2D
.
Оцінка балів
Спроба сортування матриці таким чином може бути дорогою, оскільки існує маса можливих комбінацій ходів, а також існує безліч можливих списків ходів, які можуть її сортувати, тому мета полягає в тому, щоб написати якийсь код, який сортує N * N матриць нижче. Оцінка буде найбільшим розміром N, який ви зможете вирішити за розумну кількість часу 1 без помилок (чим більше розмір вирішеної матриці, тим краще). У випадку зрізання краваткою краватки буде кількість рухів у знайденому шляху (чим коротший шлях, тим краще).
Приклад: якщо користувач A знаходить рішення для N = 5 і B знаходить рішення для N = 6, B виграє незалежно від довжини обох шляхів. Якщо вони обидва знаходять рішення для N = 6, але рішення, знайдене A, має 50 кроків, а рішення B - 60 кроків, A виграє.
Пояснення щодо того, як працює ваш код, дуже наполегливо рекомендується розмістити знайдені рішення, щоб ми могли їх перевірити . Ви можете використовувати Pastebin або подібні інструменти, якщо рішення занадто великі. Крім того, буде оцінено час, витрачений вашим кодом, щоб знайти рішення.
Тестові справи
Наступні матриці ( посилання Pastebin для більш копіюваної версії) були створені, починаючи з вже відсортованих матриць, розшифровуючи їх до 10К випадкових рухів у стилі Рубіка:
Plaintext Test Cases:
[[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]]
Please ask for more if you solve them all. :-) And many thanks to the people who helped me refine this challenge while in the sandbox.
1 Доцільна кількість часу: будь-яка кількість часу, яка не підриває наш терпіння під час тестування вашого рішення. Зауважте, що TIO запускає код лише 60 секунд, будь-яка кількість часу, що перевищує цю межу, змусить нас перевірити код на наших машинах. Приклад: мій досить неефективний алгоритм потребує декількох мілісекунд, щоб вирішити матриці порядку 3х3 та 4х4, але я лише перевірив його матрицею 5х5 і на її вирішення знадобилось 317 секунд (більш ніж 5 мільйонів рухів, дуже смішно, якщо вважати, що матриця для розв’язання була скремблірована лише в 10 К разів). Я спробував зменшити кількість рухів до менше 10 К, але я здався через 30 хвилин, виконуючи код.
O(input size)
тоді? Для матриці 5x5 це було б O(25)
? Це здається надзвичайно швидким, тому мені було б дуже цікаво побачити цей алгоритм чи його реалізацію. EDIT: Ви розумієте, що ми вводимо «скремблированную» матрицю і виводимо рухи, правда? Не навпаки.