43 квінтиліонні перестановки


16

Ми можемо представити кубик Рубіка як мережу, як це відбувається (коли це вирішено):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

Кожна літера представляє відповідний колір ( Wбілий, Gзелений тощо)

Було показано, що існує рівно (~ квінтільйона) різних перестановок, якими може бути куб Рубіка.43,252,003,274,489,856,00043

Ваше завдання - взяти ціле число між і і вивести відповідну перестановку, як показано вище. Ви можете вибрати спосіб упорядкування перестановок, але алгоритм, який ви використовуєте, повинен бути показаний для створення унікальної та правильної перестановки для кожного можливого введення.143,252,003,274,489,856,000

Недійсні правила перестановки

Зібрано з цієї сторінки

Для початку центр кожної грані 3x3 повинен залишатися однаковим, оскільки центральну площу на кубі Рубіка не можна обертати. Весь куб можна обертати, змінюючи місце, де виглядає обличчя, але це не впливає на сітку куба.

Якщо ми скажемо, що кожна перестановка має парність, виходячи з паритету кількості свопів, щоб досягти цієї перестановки, ми можемо сказати

  • Кожна кутова деталь має три можливі орієнтації. Він може бути орієнтований правильно (0), за годинниковою стрілкою (1) або проти годинникової стрілки (2). Сума кутових орієнтацій завжди залишається діленою на 3

  • Кожне правове обертання куба Рубіка завжди перевертає рівну кількість країв, тому не може бути лише одна деталь, орієнтована неправильно.

  • Враховуючи перестановку всіх кутів і країв, загальний паритет повинен бути рівним, що означає, що кожен законний хід завжди виконує еквівалент парної кількості замінів (ігнорування орієнтації)

Наприклад, наступні три нетто є недійсними результатами:

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

Правила

  • Ви повинні довести, як би ви хочете, що алгоритм дійсний. Вам не доведеться перераховувати кожну перестановку, доки ви докажете чинність свого алгоритму.
  • Поки ваша програма теоретично буде працювати на всі цілі числа від до , вам не доведеться турбуватися про практичність фактичного отримання вхідних даних, більших ніж ваша мова. 143,252,003,274,489,856,000
    • Це означає, що якщо ваша мова / тип / що завгодно може обробляти лише числа до , сама програма може вийти з ладу, якщо вхід більше , але алгоритм, який ви використовуєте не слід.253-1253-1
    • Наприклад, якщо у вашій програмі Javascript не введено виключно через те, що це число виходить за межі, це добре. Однак, якщо ваш алгоритм був перенесений на мову з цілими числами довільного розміру і не вдався до цього вводу, програма не була б дійсною.27,946,105,037,114,827,095
  • Ви повинні включити у відповідь якийсь доказ достовірності. Цей доказ може підтвердити справедливість у будь-якому прийнятому способі доказування, за винятком перерахування всіх можливостей.
  • Ви можете вибрати альтернативний метод введення, якщо бажаєте, якщо:
    • Вхід обмежений
    • Кожному входу відповідає унікальний вихід
    • Ви чітко пояснюєте формат введення та як він відповідає кожному виводу
  • Ви можете замінити символи, які використовуються для використання 6 різних символів ASCII, між 33 ( !) та 126 ( ~)WGRBOY
  • Ви можете виводити будь-яким способом, доки він формує чітке зображення куба, де можуть бути показані всі 6 граней, включаючи будь-яку дійсну кубичну сітку, одну вишиковане рядок або 3D-рендерінг. Якщо ви не впевнені в конкретному форматі, не соромтесь запитати в коментарях.

Це тому найкоротший код у байтах на кожній мові виграє.

Приклад дійсних результатів

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)

У третьому недійсному прикладі справа не лише в тому, що кут у недійсній конфігурації, кут r / y / o - неможливий кут, оскільки r і o знаходяться один проти одного
fəˈnɛtɪk

Виправлено третій недійсний приклад (CC @ fəˈnɛtɪk)
Джонатан Аллан

Ця ж проблема була і у другому недійсному прикладі, але я цього не помічав. Тут важливо менше, тому що кольори все-таки
заплутані

(а1,а2,а3,а4)а18!а237а312!/2а4211

1
@Shaggy Так, однорядковий рядок чудово
caird coinheringaahing

Відповіді:


13

Деревне вугілля , 334 297 байт

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Введіть ціле число в змінну q.

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

Розділіть qна 3⁷, залишок залиште e. Потім, розглядаючи eяк число в базі 3, суфікс розрядіть eтак, щоб його цифри (в базі 3) склали кратне 3. Це дозволяє eвизначити обертання кутів.

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

Розділіть qна 8!, Залишивши решту z. (8! Тимчасово зберігається в, dщоб зберегти байт.) Це дозволяє zвизначити положення кутів.

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

Розділіть qна 2¹¹, залишивши залишки h. Потім, вважаючи hчисло в базі 2, суфіксом цифру є hтак, щоб його цифри (у базі 2) склали кратне значення 2. Це дозволяє hвизначити перевертання ребер.

F⪪”B"↷:μêKO″KW#})”³

Петля над рядком представлення центрів.

«J⌕α§ι⁰I§ι¹§ι²»

Перейдіть до місця кожного центру та роздрукуйте його.

≔⁰ω

Слідкуйте за парністю кутових позицій у змінній w.

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

Створіть масив кутових позицій.

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

Створіть масив кутових кольорів.

F²«

Два рази петлю, один раз за кути, один раз для країв, далі - «кубики».

Fδ«

Проведіть петлю над масивом кольорів куба.

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

Витягніть наступну позицію куба з z, оновивши паритет у w. Використовуйте цей паритет для останнього, але одного краю. Це забезпечує рівність пари парностей країв і кутів.

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

Надрукуйте куб у такому положенні, відрегульований для наступного обертання або переверніть у відповідних випадках.

≧÷Lκε»

Зніміть обертання або переверніть e.

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

Створіть масив крайових позицій. Це буде використано вдруге через цикл.

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

Створіть масив кольорів ребер.

≔θζ≔ηε

Перезапис кутовий змінних zі eз відповідним крайовим змінними qі hтак, щоб краю переставляються і перевернутими в другому проході циклу.


Порадьте себе: Якщо щось у гольфі на вугіллі 330 байтів, не спробуйте цього в PHP!
Ніч2

@ Night2 На жаль 334 через помилку (неправильний розрахунок паритету).
Ніл

8

Рубі , 570 408 байт

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

Спробуйте в Інтернеті!

Оригінальна версія, з масивами магічних чисел замість магічних рядків

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

Спробуйте в Інтернеті!

Анонімна функція, яка у своєму поточному вигляді приймає введення двох цілих чисел, що, здається, дозволено: "Ви можете обрати альтернативний метод введення". Перша - перестановка в діапазоні від 0 до, 12!*8!/2 - 1а друга - орієнтація частинок у діапазоні від 0 до 2**11 * 3*7 - 1. Виведенням у вирішеному стані є наступний рядок:

000
000
000
222333444555
222333444555
222333444555
111
111
111

Подальше гольф

Є ще близько 10 символів, які потрібно зберегти, налаштувавши вихідний формат на наступну форму. Але це зменшить читабельність, тому я зараз не буду це робити

      #########
      #########
      #########
#########
#########
#########

Пояснення

Перестановка

Внутрішньо розв’язаний стан представлений рядом восьмеричних чисел у масиві a. Вхід gділиться на числа, 12..1з модулем, який використовується для вибору та вилучення краю aта розміщення його z. Як тільки це буде зроблено, залишаються лише кути a, тому gділиться на числа, 8..1з модулем, який використовується для вилучення кута aта його розміщення z.

Оскільки для визначення порядку двох останніх кутів недостатньо інформації, значення gволі було поділено до нуля до моменту їх досягнення, тому вони завжди додаватимуться до zвихідного порядку. Потім проводиться перевірка, щоб визначити, чи загальна перестановка є парною чи непарною, і, якщо необхідно, останні два кути поміняються, щоб перестановка була рівною.

Орієнтація

Існують різні способи вирішити, чи кут або край правильної орієнтації, якщо він не знаходиться у своєму вирішеному місці. Для цієї відповіді, кут розглядається в його правильної орієнтації , якщо він показує 0або 1на верхньої або нижньої поверхні. Тому обертання верхньої або нижньої грані не змінює орієнтацію кута. Обертання інших граней змінює орієнтацію, але таким чином, що загальна сума паритету залишається незмінною. Краї вважаються правильними, якщо вони показують a 2або 4спереду / ззаду або a 3або 5зліва / справа. Це означає, що обертання верхньої або нижньої частини на чверть обороту перевертає чотири ребра, але обертання інших граней залишає стан відкидання незмінним.

Вхід містить чітку інформацію для всіх, крім першого краю та останнього кута. Підсумовуються 11 найменш значущих бітів h%2048і використовується модуль для визначення орієнтації першого ребра. hмножиться на 2, додаючи його до себе, а значення для орієнтації першого ребра додається як найменш значущий біт. Орієнтація останнього кута виявляється шляхом поступового віднімання орієнтації інших кутів від j. Для самого останнього кута (де i/19= 1) значення j%3додається h(яке буде зменшено до нуля), і це визначає орієнтацію останнього кута.

Рядок bнадходить попередньо з текстом для центрів граней. hділиться на 2дванадцять разів, потім на 3вісім разів, причому модулі використовуються для визначення орієнтації частин. У кожному випадку число в zперетворюється на рядок з відповідною кількістю цифр (2 або 3) і рядок потім дублюється. Це дозволяє правильне обертання цифр, виявлене за модулем, витягувати з рядка шляхом індексації та додавати доb

Дисплей

Нарешті, неочищені наклейки скопіюються з bформату, який читається в людині, з sвикористанням магічних чисел у таблиці покажчиків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.