Remarque: Ceci est lié à une variante du jeu Rummikub
Contexte et règles
Rummikub est un jeu basé sur des tuiles. Il existe quatre couleurs: rouge, orange, bleu et noir. Pour chaque couleur, il y a 13 tuiles (étiquetées de 1 à 13), et il y a aussi 2 Jokers qui sont indépendants de la couleur, donc il y a 54 pièces au total. Dans cette variante de Rummikub, chaque joueur reçoit 14 tuiles et doit obtenir une tuile de plus et en déposer une autre à chaque tour, de sorte que le nombre de tuiles soit constant. Les joueurs ne se voient pas. L'objectif est de regrouper les tuiles, de sorte que toutes les pièces appartiennent à au moins un groupe (voir ci-dessous). Lorsqu'un joueur a regroupé toutes les pièces, il laisse tomber son panneau de tuiles et révèle ses pièces. Les autres vérifient ensuite si toutes les combinaisons sont valides et si elles le sont, le joueur gagne la manche.
Comment regrouper les tuiles?
Il n'y a que deux types de groupes:
Groupes multicolores :
- Ils se composent de 3 ou 4 tuiles.
- Ils ne contiennent que des tuiles portant le même numéro.
- Toutes les tuiles sont de couleurs différentes.
- Exemple:
RED 9, BLUE 9, BLACK 9
.
Couleur Mono groupes:
- Ils se composent d'au moins 3 tuiles.
- Ils ne peuvent pas contenir plus de 13 tuiles.
- Ils ne contiennent que des tuiles portant des numéros différents et consécutifs, dans l'ordre croissant.
- Toutes les tuiles ont la même couleur.
- Les carreaux étiquetés avec
1
ne peuvent pas être placés après les carreaux étiquetés13
. - Exemple:
RED 5, RED 6, RED 7
.
Attendez, que font les Jokers?
Les jokers peuvent remplacer n'importe quelle pièce du jeu. Par exemple, notre premier exemple peut devenir JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
ou RED 9, BLUE 9, JOKER
. La même chose s'applique à notre autre exemple. Cependant, on ne peut pas placer deux Jokers dans le même groupe, donc des choses comme JOKER, ORANGE 8, JOKER
sont interdites.
Tâche
Étant donné un groupe de tuiles Rummikub, déterminez s'il est valide. Vous êtes assuré qu'aucune tuile en double n'apparaîtra, à l'exception des 2 jokers et que les tuiles que vous recevez en entrée sont valides (par exemple, des choses comme 60
n'apparaîtront pas).
Entrée sortie
Vous pouvez prendre une entrée et fournir la sortie par n'importe quelle méthode standard.
Certains formats d'entrée valides: liste de chaînes, liste de tuples, listes imbriquées, chaînes ou tout autre élément que vous jugez approprié. Les couleurs peuvent être considérées comme des chaînes (par exemple:) "Blue","Red", etc.
, comme des abréviations de chaînes (veuillez distinguer les tuiles bleues et noires) ou comme des nombres entiers correspondant à une couleur. En ce qui concerne les Jokers, vous devez mentionner la façon dont votre programme les reçoit en entrée. Si vous choisissez des cordes, vous pouvez avoir quelque chose comme RED 9, JOKER, ...
, si vous choisissez des tuples que vous pouvez avoir (9,"RED"), ("JOKER")
ou quelque chose d'équivalent. Si cela vous aide, vous pouvez recevoir une couleur pour ce Joker (ce qui ne devrait pas affecter la sortie de votre programme). Par exemple, vous pouvez avoir ("JOKER","RED")
ou ("JOKER","BLUE")
, mais cela ne doit en aucun cas influencer la sortie.
En ce qui concerne la sortie, les règles standard pour un problème de décision s'appliquent.
Exemples travaillés
Prenons un exemple qui, je l'espère, faciliterait la compréhension. Étant donné un groupe comme suit, où chaque tuple représente une tuile:
[(9, "ROUGE"), (9, "ORANGE"), ("JOKER"), (9, "NOIR")]
Cela devrait renvoyer une valeur véridique, car l'entrée est valide. Dans ce cas, le Joker se substitue (9, "BLUE")
et ils forment un groupe multicolore.
Si vous receviez le groupe suivant:
[(9, "BLEU"), (9, "ORANGE"), (9, "ROUGE"), (9, "NOIR"), ("JOKER")]
Ce serait invalide, et donc votre programme devrait retourner une valeur fausse, car il n'y a plus rien à substituer au joker, car le nombre maximum de cartes dans un groupe multicolore est 4.
Cas de test supplémentaires
Ce sont pour une suite de tests étendue qui couvre presque toutes les situations possibles:
Entrée -> Sortie [(1, "BLEU"), (2, "BLEU"), (3, "BLEU"), (4, "BLEU"), (5, "BLEU"), (6, "BLEU")] - > véridique [(6, "BLEU"), (6, "ROUGE"), (6, "NOIR)] -> véridique [(5, "NOIR"), (6, "NOIR"), (7, "NOIR"), (8, "NOIR"), (9, "NOIR"), (10, "NOIR"), ( "JOKER"), (12, "NOIR")] -> véridique [("JOKER"), (3, "BLEU"), (3, "ROUGE")] -> véridique [(8, "NOIR"), (2, "ROUGE"), (13, "BLEU")] -> falsy [(4, "RED"), (3, "RED"), (5, "RED")] -> falsy [(5, "NOIR"), (6, "NOIR)] -> faux [("JOKER"), (5, "RED"), ("JOKER")] -> falsy [(4, "RED"), (5, "RED"), (6, BLUE ")] -> falsy [(4, "RED"), ("JOKER"), (5, "RED")] -> falsy [(12, "NOIR"), (13, "NOIR), (1," NOIR ")] -> faux
C'est le code-golf , donc le code le plus court en octets dans chaque langue gagne!
la source
Réponses:
APL (Dyalog) , 58 octets
Prend la liste des couleurs (1-4) comme argument de droite et la liste des nombres comme argument de gauche. Un numéro de Joker est indiqué,
(⍳4)
ce qui équivaut(1 2 3 4)
à indiquer qu'il pourrait être l'un de ceux-ci. De même, sa couleur est indiquée(⍳13)
pour indiquer qu'il pourrait s'agir de l'un des nombres de 1 à 13.Essayez-le en ligne!
Algorithme
Il y a trois conditions, dont les deux dernières ont chacune deux conditions:
ET SOIT
un seul numéro ET
couleurs uniques
OU
pour que la course soit valide.
Ordre de lecture
3≤
3 est inférieur ou égal au≢⍺
nombre de tuiles∧
ets⍵
tous les chiffres sont les mêmes∧
et⍺≡∪⍺
les couleurs sont uniques∨
ou1∊
1 parmi≢∘∪¨
le nombre de couleurs⊃,¨/
expansées uniques⍺
∧
et∨/
il existe au moins un∊
parmi tous les⊃,¨/⍵
numéros étendus en exécute⍷¨⊂
un qui se trouve dans⍳13
1 à 13Explication complète du code
{
…}
Fonction anonyme où⍺
est l'argument gauche et l'⍵
argument droit3.2.
⍳13
les chiffres de 1 à 13(
…)⍷¨
Trouvez les positions de départ de chacune des pistes suivantes:,¨/⍵
joindre chaque élément des nombres (crée une course pour chaque valeur Joker)⊃
divulguer (car/
réduit le rang)∊
ϵ nlist (aplatir)∨/
OU réduction (c.-à-d. Est-ce vrai?)(
…)∧
ET:3.1
(
…)⍺
Le résultat de l'application de la fonction suivante sur la liste des couleurs:s←{
…}
S (for s ame) qui est la fonction anonyme suivante (⍵
est son argument):,¨/⍵
joindre chaque élément à travers (crée une course pour chaque valeur Joker)⊃
divulguer (car/
réduit le rang)≢∘∪¨
le nombre d'éléments uniques dans chaque liste1∊
est-on membre? (c.-à-d. y a-t-il des listes identiques?)(
…)∨
OU:2.2.
∪⍺
les couleurs uniques⍺≡
sont identiques aux couleurs (c'est-à-dire qu'elles sont uniques)(
…)∧
ET:2.1.
s⍵
les chiffres sont les mêmes(
…)∧
ET1.
≢⍺
le nombre de couleurs (ie le nombre de tuiles)3≤
trois est inférieur ou égal à celuila source
Gelée ,
41403836 octetsEssayez-le en ligne! (livré avec un pied de page de suite de tests)
Prend l'entrée comme un tableau de
(color, value)
pour les tuiles régulières et0
pour les jokers. Les couleurs sont représentées sous forme d'entiers (même si je ne suis pas sûr que cela soit important pour le code actuel).Sorties
1
(véridiques) ou0
(fausses).Explication
la source
Python 2 ,
371 370 362 341 329325 octetsstr.split()
au lieu delist literal
len(x)-1
J O BK B R
pour lesJoker, Orange, Black, Blue, Red
littérauxEssayez-le en ligne!
la source
BK
parb
pour économiser 1 octet (TIO avec les cas de test mis à jour versb
.Javascript (ES6), 286 octets
(Notez que les cas de test ci-dessus contiennent 2 cas de test supplémentaires qui ne sont pas dans la Question: ils sont respectivement vrai et faux: voir la version non golfée pour la lisibilité).
Processus brut:
Les jokers sont indiqués en ayant un
0
comme valeur numérique (un nombre négatif fonctionnerait aussi); cela maintient la structure d'entrée cohérente (a à la fois une couleur et une valeur) et ne dépend pas de devoir vérifier sic=="JOKER"
, en économisant 7 octets.Il est possible que certaines parenthèses soient supprimées, il peut être possible de ne pas encadrer en
q
tant que tableau (je l'ai essayé et la valeur est restée à 0 ou a provoqué des démons nasaux ).Non golfé:
Version sur laquelle j'ai travaillé pour obtenir la logique correcte. Les lambdas à usage unique se sont alignés; voici leur fonction correspondante:
la source
C # (.NET Core) , 198 octets
Prend les couleurs des tuiles et les nombres sur eux comme des listes séparées d'entiers. Les spécificités de ce mappage n'ont pas d'importance tant que chaque couleur a un entier différent et que les jokers sont représentés par 0.
Le format de saisie des nombres est cependant assez spécial. Le nombre qui doit être entré pour un nombre
n
est à la place 2 ^ n, tandis que le nombre utilisé pour représenter un joker doit être (2 ^ 14) -1. Cela permet au bit etu&x
d'évaluer à u si la tuile x a une valeur égale à u ou est un joker.C # (.NET Core) , 200 octets
Une solution de 2 octets plus longue qui n'est pas éclectique sur l'entrée. Il s'avère que l'utilisation d'un cas spécial pour les jokers dans le seul endroit avec lequel ils étaient difficiles à gérer n'était pas beaucoup plus longue que l'opération intelligente au niveau du bit dont j'étais si fier. Ici, les jokers sont (0,0), les autres nombres sont comme prévu et les couleurs sont représentées par 4 valeurs distinctes les unes des autres par la comparaison par défaut de C # (en particulier, le Linq
Distinct()
opération doit considérer les valeurs de la même couleur comme `` non distinctes ''). et les valeurs pour différentes couleurs comme «distinctes»).Quelque chose qui pourrait être utile à d'autres langues,
u*=!u++^x*x
serait équivalent àu=u==x|x<1?u+1:0
dans certaines langues; u ^ x est 0 ssi u == x, et 0 fois n'importe quel entier est 0, donc u ^ x * x serait 0 pour u == x ou x == 0 si C # n'a pas rendu les opérations au niveau du bit de priorité inférieure à mathématiques. C # ne peut pas non plus interpréter les entiers comme des bools sans casting explicite. Une langue qui essaie plus difficile de faire des types de travail peut convertir les valeurs0
etnot 0
àfalse
ettrue
avant d' appliquer!
les bien, et puis quand revenir à un int interpréter!false
comme 1 et!true
0. Cela dit, je ne peux pas garantir une autre langue REELLEMENT bénéficier du reste de l'algorithme de sorte qu'il pourrait même ne pas apparaître.la source
Scala,
491477 caractères,491477 octetsCe défi était amusant; Merci.
Donc
f
à la ligne 4 est un appel récursif où j'essaie de remplacer "JOKER" par toutes les autres tuiles. Voir tio pour une vue plus claire du code. J'ai choisi de prendre en entrée une séquence de 2 tuples (Int, String) - appeléet
dans mon code, voir tio - donc "JOKER" est représenté par un 2-tuple (0, "JOKER").EDIT: 14 octets enregistrés grâce aux commentaires, je prends OB b R pour ORANGE BLACK BLUE RED.
Essayez-le en ligne!
EDIT: -2 octets, supprimés inutiles
(
autour des conditions ducase _ if
sla source
O,B,b,R
au lieu deORANGE,BLUE,BLACK,RED
pour enregistrer des octets? Je ne sais pas comment fonctionne Scala, mais je pense que vous le pouvez.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
et les appels sontO
B
b
R
, pour un total de 49 octets; oùvar c=Seq("ORANGE","BLACK","BLUE","RED")
et les appelsc(...)
totalisent 58 octets. Mais le premier cas permetfor(u<-c)
à la placefor(u<-Seq(O,B,b,R))
, de sorte que le coût n'est pas -9 mais +2. Merci d'avoir essayé.var c=Seq("O","B","b","R")
et de prendre ces caractères comme entrées plutôt que des chaînes complètes pour la couleur. Comme mentionné dans l'article d'origine, "Les couleurs peuvent être considérées comme ... Abréviations de chaînes".