Peut-être connaissez-vous le jeu de Set (un jeu merveilleux pour les enfants) un jeu de cartes avec 81 cartes, où chaque carte a une figure avec 4 attributs différents (forme, nombre, couleur et remplissage). Chaque attribut a 3 valeurs différentes:
form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.
12 cartes sont posées sur la table et le défi consiste maintenant à indiquer les sets. Un ensemble se compose de trois cartes où chaque valeur d'attribut se produit 0, 1 ou 3 fois. avoir 2 cartes avec des chiffres rouges, ou opaques, ou 1 numéro n'est pas bon. Voir le lien fourni pour une explication plus visuelle.
J'envisage un code pour une carte où tous les attributs sont encodés de manière
"WP2N"
signifie
2 Purple Waves with No fill
Avec par exemple OR1N
etDG3N
et
c'est un ensemble (3 formes différentes, 3 couleurs différentes, 3 numéros différents, 1 remplissage).
L'entrée est une chaîne délimitée par des espaces de codes uniques (choisis au hasard parmi 81 codes possibles) représentant des cartes.
"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"
La solution doit indiquer tous les ensembles possibles dans la collection donnée. Donc
OR1N, WP2N, DG3N
doit faire partie de la solution avec tous les autres ensembles.
Réponses:
Ruby,
104988180 caractèresExemple d'exécution (en utilisant vos données d'exemple):
Il sort
WP2N,DR1D,OG3O
deux fois parce que vous avez deuxDR1D
s dans vos données d'échantillon.Explication:
$*.combination(3).map{|c|
- chaque combinaison de 3 cartesputs c*?,if
- sortez l'ensemble, si ...(0..3).all?{|i|
- si tous les nombres de 0 à 3 (les indécis des propriétés dans la chaîne) évaluenttrue
quand ils sont passés dans ce blocc.map{|x|x[i]}
- prenez l'i
index e de chaque chaîne.uniq.size!=2}
- si le nombre de propriétés uniques (forme, couleur, etc.) n'est pas 2 (donc 1 ou 3)la source
end
plusieurs sauts de ligne: se transformerif ... puts ... end
enputs ... if ...
b) tous peuvent prendre un bloc, doncx.map{}.all?
est égal àx.all?{}
if
.Mathematica
93 92 93 82 7673La logique
StringSplit@#~Subsets~{3}
produit une liste de sous-ensembles de 3 cartes. Chaque triple tel que:{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "O"}}
ou
est ensuite transposé,
et
Tally/@(Characters@#^T)
correspond au nombre d'éléments distincts dans chaque ligne.3 correspond à "tous différents"; 1 correspond à "tout de même".
FreeQ[...,2]
détermine si 2 cartes du même type ou dans le triple. Si 2 ne fait pas partie des décomptes, alors les trois cartes sont un "set", selon les règles du Game of Set.Usage
la source
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
La sortie sera{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
Usage
la source
Brachylog , 12 octets
Essayez-le en ligne!
Prend l'entrée via la variable d'entrée et génère la sortie via la variable de sortie.
Deuxième cas de test tiré d'un doublon récemment fermé dans son encodage, car cette solution ne se soucie pas vraiment de ce que signifie réellement.
la source
GolfScript, 53 caractères
L'entrée doit être fournie sur STDIN, par exemple en ligne :
Code commenté:
la source
0\zip{.&,2=|}/!
peut être raccourci àzip{.&,}%2&!
javascript
323313c'est une fonction qui prend un tableau d'objets et renvoie un tableau d'objets.
DEMO violon (avec rangement).
la source
APL (IBM), 76
Je n'ai pas IBM APL, mais je pense que cela fonctionnera.
Exemple d'exécution (émulation d'IBM APL dans Dyalog APL)
la source
Sauge, 71
Si
C
est une chaîne, par exemple"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, exécutezobtenir
[{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]
Et voici une approche très différente utilisant l'interprétation selon laquelle un ensemble est une ligne projective
GF(3)^4
:J'étais un peu ennuyé d'avoir
D
été utilisé deux fois ... jusqu'à ce que je comprenne comment abuser de ça. Mais encore mieux, j'abuse aussi de lafind
méthode.str.find
renvoie -1 si aucune lettre n'est trouvée. Depuis-1 = 2 mod 3
, la lettreS
est traitée correctement car elle ne se produit pas dans'WODRPG123N'
.la source
Python 2 , 99 octets
Essayez-le en ligne!
la source