Inspiré par xkcd .
Votre défi est de déterminer si un nombre ferait une bonne combinaison dans le jeu 2048 . Votre entrée sera un nombre, tel que:
8224
Et la sortie sera de savoir si ce nombre ferait un bon combo 2048, qui pour cette entrée serait true
ou yes
ou 1
ou toute autre manière d'indiquer un résultat positif.
Pour ceux qui ne connaissent pas le jeu, voici une explication simple: les pouvoirs de deux sont disposés sur une grille, comme ceci: [2] [2]
. Les tuiles peuvent être déplacées dans n'importe quelle direction, et si deux tuiles identiques se rencontrent, elles deviennent la puissance suivante de deux (donc [2] [2]
lorsqu'elles sont déplacées vers la gauche ou vers la droite, elles deviennent [4]
). Ou, vous pouvez simplement essayer le jeu ici .
Que signifie "une bonne combinaison 2048"? Cela signifie n'importe quel nombre qui, s'il était dans le jeu "2048", pourrait être combiné en un seul numéro. (Un zéro signifie un espace vide et peut être ignoré si nécessaire.) Notez que les nombres peuvent éventuellement être à plusieurs chiffres! Cependant, les nombres ne doivent pas changer entre les coups. Voici quelques exemples / cas de test (avec "Bon" indiquant une bonne combinaison et "Mauvais" signifiant pas bon):
- Bon: 8224 (8224 -> 844 -> 88 -> 16)
- Bon: 2222 (2222 -> 44 -> 8)
- Bon: 22048 (22048 -> 448 -> 88 -> 16)
- Mauvais: 20482 (ne peut pas combiner les 2 extérieurs, ni combiner un 2048 et un 2)
- Bon: 20482048 (20482048 -> 4096)
- Mauvais: 210241024 (210241024 -> 22048, mais c'est maintenant [2] [2048] et ne peut pas être combiné car les nombres ne peuvent pas changer entre les mouvements)
- Bon: 2048 (c'est déjà un chiffre)
- Mauvais: 2047 (ce n'est pas une puissance de 2)
- Mauvais: 11 (il n'y a pas de 1 dans le jeu)
- Bon: 000040000000 (les zéros sont des espaces vides)
Règles diverses:
- L'entrée peut être de n'importe où raisonnable, c'est-à-dire STDIN, argument de fonction, fichier, etc.
- La sortie peut également être raisonnable, c.-à-d. STDOUT, valeur de retour de fonction, fichier, etc.
- Ignorez la taille de la grille -
22222222
devrait toujours afficher true. - Il n'y a pas de maximum à ce que pourrait être le nombre, tant qu'il s'agit d'une puissance de deux. Par conséquent, les nombres possibles sont toute puissance de deux supérieure à 0.
- Pour ceux qui s'inquiètent des ambiguïtés des zéros, ce n'est pas le cas. Par exemple,
22048
peut être analysé en tant que[2] [2048]
ou[2] [2] [0] [4] [8]
. Le premier ne fonctionne pas, mais le second fonctionne, il devrait donc afficher true. - Il s'agit de code-golf , donc le code le plus court en octets gagnera!
1
22048
devrait sortirgood
mais ce n'est pas vrai. Vous ne pouvez pas combiner2
avec2048
et la grille est4x4
si tous les nombres doivent être séparés, vous obtiendrez 5 cellules. alors peut-être que vous devriez supprimer le0
? Votre 5ème exemple semble également invalide puisque le jeu s'arrête à2048
:)Réponses:
GolfScript, 137 caractères
L'entrée doit être donnée sur STDIN. La sortie est
0
/1
pour les mauvais / bons nombres. La plupart du code est nécessaire pour analyser les entrées possibles.Cette version plus courte (113 caractères) effectue un test de décalage simple qui ne fonctionnerait pas correctement pour une entrée comme
224422
.Tous les cas de test peuvent être vérifiés en ligne .
la source
Python:
457422 caractèresLa fonction f (s) obtient une chaîne de chiffres et sort «bon» ou «mauvais» en conséquence. J'ai choisi de ne pas utiliser 0 comme espace car les espaces n'ont pas de sens dans le jeu et ils créent une ambiguïté lors de l'analyse des chaînes (22048 est-il bon ou mauvais?). Cela n'utilise que des nombres jusqu'à 2048, mais cela peut être modifié sans ajouter de caractères. Au prix de 10 caractères environ, je peux également imprimer toutes les étapes de la combinaison des chiffres. Et je me rends compte que ce code n'est pas encore assez golfé; ne vous inquiétez pas, les modifications arrivent.
la source
Haskell:
285 254 253 237 230227utilisation - il suffit de le charger dans ghci et de passer la chaîne à h.
Code:
Commentaire:
i
est le contrôle si un nombre est une puissance de 2, ce sera dépassé par les langues avec un peu de twiddling.%
génère récursivement toutes les analyses qui sont des listes de pouvoirs de 2 ou 0.c
réduit les tuiles.l
teste récursivement si les tuiles sont repliables à gauche ou bien.g
teste si les tuiles sont pliables à gauche ou à droite. Il n'y a pas de limite aux nombres sur les tuiles - par exemple,h ((show (2^200))++(show (2^200)))
retourne vrai pour 2 tuiles marquées "1606938044258990275541962092341162602522202993782792835301376".Modifié pour corriger un bug qui ne s'est pas effondré correctement "88222288888" vers la droite, mais a également trouvé plus de possibilités de golf.
la source
Perl, 175-336 octets
Garder juste l'essentiel intact:
[ 64 et 256 conduisent à des ambiguïtés mal résolues auxquelles la correspondance gourmande ne peut pas faire face ... mais ce sont de bons nombres d'octets. ]
la source
Delphi
572582 caractèresCode édité, la limite est définie sur 2 ^ 30 afin qu'elle ne dépasse pas la valeur MaxInt dans Delphi.
Golfé
Non golfé
ÉDITER
Je suis donc devenu curieux et je me suis demandé combien de ces combinaisons conviendraient au puzzle et j'en ai testé un.
Pour les autres curieux, faites aussi un test;)
Mais ok voici les résultats:
20736 combinations were tested and 1166 were great combinations
Je dois dire que des combinaisons avec 3 ou plus de zéros ont été sautées (donc un sens droit?) Les
combinaisons sont presque uniques, ce qui signifie les combinaisons
2248
,8224
,8422
et4228
ont tous été comptés comme une grande combinaison.la source
Mathematica - 218 octets
Version non golfée:
La
Internal\
magie de PartitionRagged est tirée de cette question .Cette solution gère des tailles de grille arbitraires et des nombres arbitrairement grands.
Voici une version de 195 octets qui fonctionne comme le jeu réel avec jusqu'à 4 tuiles seulement (ce qui
f[22222222]
est le casFalse
):où j'ai remplacé
avec
la source
DeleteCases
apparence semble supprimer les paires les plus à gauche, doncf[88222288888]
échouerait?DeleteCases
supprimez simplement les zéros et les nombres qui ne sont pas deux. L'effondrement réel des paires est effectué par la règle//. {a___, x_, x_, b___} :> {a, 2 x, b}
, qui fonctionne pour ce nombre et l'inverse. En fait, je ne suis pas entièrement sûr de l'ordre dans lequel Mathematica applique ces remplacements, mais cela fonctionne.Haskell - 260
263f
est la fonction. Exemples:Une petite explication:
p
renvoie toutes les façons de diviser une liste.q
filtre ceux qui se composent uniquement de puissances de 2 (à l'exclusion de 1 mais dont 0).c
essaie de réduire une chaîne.r
itère les collapsus droit et gauche jusqu'à ce qu'il ne reste plus qu'un élément, ou que la chaîne soit incollapsable.la source
c
cependant, essayez "222244442222" - il retourne vrai, mais ce n'est pas réductible dans le jeu. A besoin de recurse avec(2*x):c s
.