Un temps de passage vénéré des pédants est de souligner que les images de "Rubik's Cubes" (sur des t-shirts, des affiches, etc.) ne sont pas réellement résolables.
La première chose à vérifier est que le cube est composé des bonnes pièces. Pour être résoluble, un cube a besoin de six couleurs chacune avec neuf carrés. Le cube a également besoin que chaque unité de bord et de coin (ce sont les plus petits cubes qui composent le cube) soit unique. Non seulement ils doivent être uniques, mais si deux pièces centrales sont opposées, aucune pièce de bord ou d'angle ne peut contenir ces deux couleurs.
Une fois que vous avez un cube composé de toutes les bonnes pièces, vous devez toujours vérifier qu'il peut être résoluble. Il y a quelques règles ici, je vais donc m'en remettre à un expert pour les expliquer, le spoiler ci-dessous explique comment nous pouvons le faire. Si vous souhaitez résoudre le problème par vous-même, vous n'avez pas besoin de visiter le site pour comprendre ou participer à ce défi.
Votre tâche consiste à prendre un modèle en entrée et à déterminer s'il s'agit en fait d'un cube Rubik résoluble. Pour être résoluble, il doit y avoir un moyen d'effectuer des mouvements valides sur un cube afin que le cube n'ait qu'une seule couleur sur chaque face (et que les différentes faces aient des couleurs différentes). La plupart des cubes de Rubik ont une coloration standard (le blanc est opposé au jaune, etc.), vous ne pouvez pas supposer que l'état de résolution suit cette coloration particulière.
Un mouvement valide est la rotation dans le sens horaire ou anti-horaire d'une seule face du cube. Avec la rotation de la face du cube, tous les carrés bordant le visage sont également tournés, restant connectés au visage qu'ils touchaient auparavant.
IO
Vous pouvez prendre le cube de toute manière raisonnable. Si votre langue a un type de "cube-face" intégré, bon pour vous, c'est bien comme entrée, sinon vous pouvez prendre un tableau 2D du filet, du cube, 1 3 par 3 listes pour chaque face. Soyez juste raisonnable. Si vous voulez savoir si un format spécifique est un commentaire acceptable ou envoyez-moi un ping dans le chat et j'ajouterai au défi d'indiquer sa validité.
Votre format d'entrée ne doit prendre en charge que jusqu'à 9 couleurs possibles.
Pour la sortie, c'est un problème de décision, vous devez donc sortir une valeur constante pour "Oui, c'est un cube Rubik valide" et une valeur constante différente pour "Non, ce n'est pas un cube Rubik valide".
Il s'agit de code-golf donc les réponses seront notées en octets avec moins d'octets étant meilleurs.
Cas de test
Voici des cas de test. Ils sont formatés comme le filet d'un cube avec chaque carré comme une seule lettre. Différentes lettres représentent différentes couleurs. D'autres tests peuvent être ajoutés sur demande.
Soluble
RRR
RRR
RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
YYY
YYY
YYY
GRR
GRR
ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
WYO
YYB
YYB
Insoluble
RRR
RRR
RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
YWY
YYY
YYY
RRR
RRR
RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
YWY
YYY
YYY
RRR
RRR
GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
BBB
YWY
YYY
RRW
RRW
GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
BBB
YYW
YYO
la source
Réponses:
Cubiquement ,
166416311089 octetsSortie si résoluble:
Solved!
Sortie si insoluble: (vide, pas de sortie)
L'entrée doit être formatée en tant que vidage de cube cubique (voir la
Debug
section). Cela a été explicitement autorisé par le PO.Explication
Ce programme utilise l'approche d'un algorithme du diable pour parcourir tous les états possibles du cube dans le même groupe que le cube résolu. Si le cube est résoluble, il sera résolu à un moment donné avant la fin de l'algorithme (en supposant que l' algorithme que j'ai utilisé fonctionne correctement).
Chaque ligne commençant par
⇒
(0x84 dans la page de code de Cubically) est une définition de fonction; ces fonctions s'appuient les unes sur les autres pour constituer l'algorithme du diable réel. La première ligne à exécuter est la dernière:r
lit un cube depuis stdin et y définit le cube mémoire.s
met l'interpréteur en «solvemode», ce qui signifie qu'il se ferme et s'imprimeSolved!
si le cube est résolu (après avoir été non résolu) à tout moment. Les autres commandes (qui se répètent simplementf36f71
8 fois) correspondent à l'algorithme final en bas de la page liée:Comment puis-je l'exécuter?
Vous pouvez l' essayer en ligne , mais ce lien ne fonctionne pas. TIO expirera presque définitivement avant la fin de cet algorithme (le temps d'exécution maximum pour un interprète est de 60 secondes). Si le cube n'est pas résoluble, cet algorithme prendra jusqu'à 11 millions d'années pour que Cubically se termine (à ~ 15,2 millions de mouvements par seconde, ce que mon IDE Cloud9 obtient).
De plus, vous avez besoin de beaucoup de mémoire pour effectuer 3 mouvements de sextillion. Cubically peut effectuer environ 4 millions de mouvements par seconde, mais le processus sera probablement tué en raison d'une mémoire surchargée . Il meurt après 15 secondes sur ma machine virtuelle avec 512 Mo de mémoire.Pourquoi les déplacements sur une baie plate déjà allouée devraient-ils coûter de la mémoire? Trouvé une fuite de mémoire (ou vingt) et corrigé .Voici une version beaucoup plus lisible qui se comporte de la même manière.
Mais je veux vraiment voir que ça marche!
Le premier mouvement réel qui est exécuté dans l'algorithme de ce diable est
F2
, donc le cube le plus rapide à résoudre serait brouillé avecF2
:Cela s'exécute en effet en 0,007 secondes sur TIO .
Comment ça pourrait être amélioré?
Il y a certainement plus d'algorithmes du diable; J'en ai trouvé un qui utilise moins d'un trentième des mouvements de celui-ci. Cependant, cela coûterait plusieurs milliers d'octets (environ 100 Mo de plus) et plusieurs dizaines d'heures de conversion d'un circuit hamiltonien complexe en code cubique.
Il est également possible de supprimer certaines des fonctions et de les mettre directement dans la boucle en bas. Cependant, je vais sacrifier quelques octets pour une certaine lisibilité.
De plus, j'envisage une modification du comportement de bouclage de Cubically afin que je puisse plus facilement répéter les algorithmes 7 ou 8 fois (au lieu de simplement les coder en dur avec les appels de fonction répétés 7 ou 8 fois dans la source). Ou je vais faire de la magie avec le bloc-notes, et jouer au golf en utilisant plus de boucles.
Notez que je continuerai d'optimiser tout ce qui est possible dans l'interpréteur, donc cela peut fonctionner sur un PC moyen dans le futur!
Cubiquement, 2 octets
J'aime mieux la réponse ci-dessus, donc j'ajoute cela comme une solution alternative. Cela prend moins d'une seconde, contre quelques millions d'années.
Sortie si le cube est résoluble: (rien)
Sortie si le cube est insoluble:
Error: The cube has reached an unsolvable state.
la source
APL (Dyalog Classic) ,
190174 octetsEssayez-le en ligne!
L'argument est une matrice 3x2 (rangée0: avant arrière, rangée1: gauche droite, rangée2: haut en bas) de matrices de caractères 3x3. Renvoie 1 pour un cube Rubik résoluble, 0 sinon.
Dans le lien TIO, la fonction
t
, qui n'est pas incluse dans le nombre de caractères, lit 9 lignes d'entrée, les convertit du format d'entrée par défaut (un réseau) en la matrice 3x2 x 3x3 requise, appelle la solution et imprime OK si le résultat est comme prévu.L'algorithme divise le cube donné en 26 cubes - des chaînes de longueur 3 (coins), 2 (bords) et 1 (centres). Il génère également les 26 cubes d'un cube résolu avec les mêmes 6 cubes centraux. Tous les critères suivants doivent être remplis:
il n'y a pas de doublons parmi les 6 centres
les ensembles de cubes donnés / résolus correspondent, jusqu'à la rotation - par exemple, considérez
'WBR'
et'BRW'
le même cube, mais pas'BWR'
les parités de la permutation de coin et de la permutation de bord sont égales
la somme modulo-3 des indices de rotation d'angle (par exemple , en prenant la lettre « plus petit »
B
comme point de référence , nous avons:'BRW'→0
,'WBR'→1
,'RWB'→2
) match entre les cubes donnés et résolus; idem pour les coins modulo 2la source