43 quintilioni di permutazioni


16

Possiamo rappresentare un cubo di Rubik come una rete come segue (una volta risolto):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

Ogni lettera rappresenta il colore corrispondente ( Wè bianco, Gverde ecc.)

È stato dimostrato che ci sono esattamente 43,252,003,274,489,856,000 (~ quintilioni) di permutazioni diverse in cui un cubo di Rubik può trovarsi.43

Il tuo compito è prendere un numero intero compreso tra e e generare la permutazione corrispondente, nel modo mostrato sopra. Puoi scegliere come ordinare le permutazioni, ma l'algoritmo che usi deve essere mostrato per generare una permutazione unica e corretta per ogni possibile input.143,252,003,274,489,856,000

Regole di permutazione non valide

Tratto da questa pagina

Per cominciare, il centro di ciascuna faccia 3x3 deve rimanere lo stesso, poiché il quadrato centrale su un cubo di Rubik non può essere ruotato. L'intero cubo può essere ruotato, modificando la posizione di una faccia, ma ciò non influisce sulla rete del cubo.

Se diciamo che ogni permutazione ha una parità, basata sulla parità del numero di swap per raggiungere quella permutazione, possiamo dire

  • Ogni angolo ha tre possibili orientamenti. Può essere orientato correttamente (0), in senso orario (1) o antiorario (2). La somma degli orientamenti degli angoli rimane sempre divisibile per 3

  • Ogni rotazione legale sul cubo di Rubik lancia sempre un numero pari di spigoli, quindi non può esserci un solo pezzo orientato in modo errato.

  • Considerando la permutazione di tutti gli angoli e i bordi, la parità complessiva deve essere pari, il che significa che ogni mossa legale esegue sempre l'equivalente di un numero pari di swap (ignorando l'orientamento)

Ad esempio le seguenti tre reti sono output non validi:

   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)

Regole

  • È necessario dimostrare, nel modo desiderato, che l'algoritmo è valido. Non è necessario enumerare ogni singola permutazione, purché si dimostri la validità del proprio algoritmo.
  • 143,252,003,274,489,856,000
    • 253-1253-1
    • 27,946,105,037,114,827,095
  • È necessario includere una sorta di prova di validità nella risposta. Questa prova può dimostrare la validità in qualsiasi metodo di prova accettato, ad eccezione dell'enumerazione di tutte le possibilità.
  • Se lo desideri, puoi scegliere di utilizzare un metodo di input alternativo, purché:
    • L'input è limitato
    • Ogni input corrisponde a un output univoco
    • Spieghi chiaramente il formato di input e come corrisponde a ciascun output
  • È possibile modificare i caratteri utilizzati per utilizzare 6 caratteri ASCII diversi, tra 33 ( !) e 126 ( ~), anzichéWGRBOY
  • È possibile produrre in qualsiasi modo desiderato, purché formi una chiara rappresentazione di un cubo in cui sia possibile mostrare tutte e 6 le facce, inclusa qualsiasi rete di cubi valida, una singola stringa allineata o un rendering 3D. Se non sei sicuro di un formato specifico, non esitare a chiedere nei commenti.

Questo è un quindi vince il codice più breve, in byte, in ogni lingua.

Esempio di output validi

   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)

Nel terzo esempio non valido non è solo che l'angolo si trova in una configurazione non valida, l'angolo r / y / o è un angolo impossibile a causa della r e o l'uno di fronte all'altro
fəˈnɛtɪk

Risolto il terzo esempio non valido (CC @ fəˈnɛtɪk)
Jonathan Allan,

Lo stesso problema era anche nel secondo esempio non valido, ma non me ne ero accorto.
Importa

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

1
@Shaggy Sì, una stringa a linea singola va bene
caird coinheringaahing

Risposte:


13

Carbone , 334 297 byte

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'→↑Þ³№¹”²δ≔θζ≔ηε

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Nθ

Inserisci il numero intero in variabile q.

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

Dividi qper 3⁷, inserendo il resto e. Quindi, considerato ecome un numero nella base 3, eaggiungi una cifra in modo che le sue cifre (nella base 3) si sommino a un multiplo di 3. Ciò consente edi definire le rotazioni degli angoli.

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

Dividi qper 8 !, inserendo il resto z. (8! È temporaneamente memorizzato dper salvare un byte.) Ciò consente zdi definire le posizioni degli angoli.

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

Dividi qper 2¹¹, inserendo il resto h. Quindi, considerato hcome un numero nella base 2, haggiungi una cifra in modo tale che le sue cifre (nella base 2) si sommino a un multiplo di 2. Ciò consente hdi definire i ribaltamenti dei bordi.

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

Passa sopra una rappresentazione di stringa dei centri.

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

Passa alla posizione di ciascun centro e stampalo.

≔⁰ω

Tieni traccia della parità delle posizioni d'angolo in variabile w.

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

Crea una serie di posizioni d'angolo.

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

Crea una matrice di colori d'angolo.

F²«

Ripeti due volte, una volta per gli angoli, una per i bordi, di seguito denominati "cubi".

Fδ«

Passa sopra la gamma di colori del cubo.

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

Estrai la posizione successiva del cubo da z, aggiornando la parità in w. Utilizzare questa parità per l'ultimo ma uno spigolo. Ciò garantisce che la somma della parità dei bordi e degli angoli sia uniforme.

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

Stampa il cubo in quella posizione, regolato per la rotazione successiva o capovolgi secondo necessità.

≧÷Lκε»

Rimuovere la rotazione o capovolgere da e.

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

Crea una serie di posizioni dei bordi. Questo sarà usato la seconda volta attraverso il loop.

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

Crea una gamma di colori dei bordi.

≔θζ≔ηε

Sovrascrivi le variabili d'angolo ze econ le corrispondenti variabili dei bordi qe in hmodo che i bordi siano permutati e capovolti durante il secondo passaggio del ciclo.


Avvisami: se qualcosa da giocare a carboncino è di 330 byte, non provarlo in PHP!
Night2

@ Night2 Purtroppo 334 ora, a causa di un bugfix (calcolo errato della parità).
Neil,

8

Rubino , 570 408 byte

->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}

Provalo online!

Versione originale, con matrici di numeri magici invece di stringhe magiche

->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}

Provalo online!

Una funzione anonima che nella sua forma attuale accetta un input di due numeri interi, che sembra essere consentito: "puoi scegliere un metodo di input alternativo". Il primo è la permutazione nell'intervallo da 0 a 12!*8!/2 - 1e il secondo è l'orientamento dei pezzi nell'intervallo da 0 a 2**11 * 3*7 - 1. L'output nello stato risolto è la seguente stringa:

000
000
000
222333444555
222333444555
222333444555
111
111
111

Ulteriore golf

Ci sono circa 10 caratteri in più da salvare regolando il formato di output alla forma seguente. Ma questo ridurrebbe la leggibilità, quindi al momento non lo farò

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

Spiegazione

Permutazione

Internamente, lo stato risolto è rappresentato dalla serie di numeri ottali nella matrice a. L'input gè diviso per i numeri 12..1con il modulo utilizzato per selezionare e rimuovere un bordo ae posizionarlo z. Una volta fatto ciò, rimangono solo gli angoli a, quindi gviene diviso per i numeri 8..1con il modulo utilizzato per rimuovere un angolo ae posizionarlo z.

Poiché non vi sono informazioni sufficienti per determinare l'ordine degli ultimi due angoli, il valore di gsarà stato diviso a zero nel momento in cui li raggiunge, quindi verranno sempre aggiunti znell'ordine originale. Viene quindi effettuato un controllo per determinare se la permutazione complessiva è pari o dispari e, se necessario, gli ultimi due angoli vengono scambiati per rendere uniforme la permutazione.

Orientamento

Esistono diversi modi per decidere se un angolo o un bordo si trova nell'orientamento corretto se non si trova nella sua posizione risolta. Ai fini di questa risposta, un angolo è considerato nel suo corretto orientamento se mostra 0o 1sulla faccia superiore o inferiore. Pertanto, la rotazione della faccia superiore o inferiore non modifica l'orientamento dell'angolo. La rotazione delle altre facce modifica l'orientamento, ma in modo tale che la somma della parità complessiva rimanga invariata. I bordi sono considerati nell'orientamento corretto se mostrano a 2o 4verso la parte anteriore / posteriore o a 3o 5verso la sinistra / destra. Ciò significa che la rotazione della parte superiore o inferiore di un quarto di giro inverte i quattro bordi ma la rotazione delle altre facce lascia invariato lo stato di inversione.

L'input contiene informazioni esplicite per tutti tranne il primo bordo e l'ultimo angolo. h%2048Vengono sommati gli 11 bit meno significativi e il modulo utilizzato per determinare l'orientamento del primo spigolo. hviene moltiplicato per 2 aggiungendolo a se stesso e il valore per l'orientamento del primo spigolo viene aggiunto come il bit meno significativo. L'orientamento dell'ultimo angolo viene rilevato sottraendo progressivamente l'orientamento degli altri angoli da j. Per l'ultimo angolo (dove i/19= 1) j%3viene aggiunto il valore di h(che sarà stato ridotto a zero) e questo determina l'orientamento dell'ultimo angolo.

La stringa bviene preinizializzata con il testo per i centri delle facce. hè diviso per 2dodici volte e poi per 3otto volte, con i moduli utilizzati per determinare l'orientamento dei pezzi. In ogni caso, il numero in zviene convertito in una stringa con il numero appropriato di cifre (2 o 3) e la stringa viene quindi duplicata. Ciò consente di estrarre dalla stringa la corretta rotazione delle cifre rilevate dal modulo indicizzando e accodandob

Schermo

Infine, gli adesivi grezzi vengono copiati bin un formato più leggibile dall'uomo sutilizzando i numeri magici nella tabella degli indici.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.