introduction
Dobble / SpotIt est un jeu de cartes, où les gens doivent repérer le même symbole sur une paire de cartes dans les plus brefs délais, l'indiquer et passer à la paire suivante. Chaque carte a plusieurs symboles (8 en version normale), mais exactement un est commun à chaque paire de cartes.
Exemple d'une copie physique du jeu:
Défi
Écrivez un programme qui, compte tenu de l'ensemble de symboles (caractères ascii simples) et du nombre de symboles sur une seule carte, produira des cartes de liste de sortie avec des symboles pour chaque carte. Il existe évidemment de nombreuses combinaisons équivalentes, votre programme n'a qu'à écrire l'une des combinaisons qui produit le plus grand nombre de cartes pour une entrée donnée.
C'est un code-golf, donc plus court le code, mieux c'est.
Il serait également formidable que le calcul se termine avant la mort thermique de l'univers pour le cas le plus compliqué.
Contribution
Deux arguments pour fonctionner / stdin (votre choix)
Le premier étant une collection de symboles, quelque chose comme «ABCDE» ou [«A», «B», «C», «D», «E»] - votre choix de format, que ce soit une chaîne, un ensemble, une liste, un flux , ou tout ce qui est idiomatique pour la langue de votre choix. Les caractères seront donnés à partir de l'ensemble de [A-Za-z0-9], pas de doublons (donc la taille maximale de l'ensemble de symboles d'entrée est 62). Ils ne seront pas nécessairement classés dans vous pouvez donc également obtenir "yX4i9A" pour le boîtier à 6 symboles).
Le deuxième argument est un entier, indiquant la quantité de symboles sur une seule carte. Ce sera <= que la taille du jeu de symboles.
Production
Imprimez plusieurs lignes séparées par des retours à la ligne, chacune d'entre elles contenant des symboles pour une seule carte.
Exemples
ABC
2
>>>>
AB
BC
AC
Ou
ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF
Ou
ABCDE
4
>>>>
ABCD
Conseils
- Le nombre de cartes produites ne peut pas être supérieur au nombre de symboles distincts et dans de nombreuses combinaisons, il sera considérablement plus petit
- Vous voudrez peut-être lire un peu de fond en mathématiques si vous avez besoin d'aide avec le côté mathématique du problème
Ceci est mon premier défi de golf de code, alors veuillez pardonner les éventuels problèmes de formatage / style - je vais essayer de corriger les erreurs si vous les pointez dans les commentaires.
la source
('abcdefghijklmnopqrstu', 5)
->['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']
ou une autre solution de travail à 21 cartes. (Notez que c'est le plan fini projectif d'ordre 4).Réponses:
Python 2 ,
192162 octetsJ'ai un argument selon lequel cela produit le jeu de cartes maximum pour chaque scénario et il gère les 3 cas de test.
Essayez-le en ligne!
Algorithme
Étant donné un alphabet
a
et une taille de cartes
, prenez toutes les combinaisons d's
élémentsa
et appelez-leC
, puis:C
, appelez-leC0
C0
C
dont l'union est différenteC0
de1
C
C
soit videImprimez ensuite les éléments enregistrés.
Argument
Certains sous - ensemble non vide de
C
notre solution maximale,K
. Puisqu'il contient au moins un élément et que deux éléments sont indiscernables, choisissez un élément arbitraire,,C0
ofC
to be inK
. Pour tout élémente
de laK
, la cardinalité de l'e
unionx
est 1 pourx != e
inK
; Éliminez donc tous les élémentsC
dont l'union avecC0
n'a pas de cardinallité 1. Par le même raisonnement, choisissez un nouvel élément arbitraire dansC
, ajoutezK
-le et réduisezC
.C
Est finalement l'ensemble vide etK
sera la solution maximale car à aucun moment nous n'avons choisi un élément qui se distingue de tout autre élément.Cas de test
Ces cas de test ont été écrits avant que je réalise que l'impression était une exigence.
Mise à jour
R
variableK
variable grâce à @Leo !la source
A for A in C if len(set(A)&set(C[0]))==1
) supprime déjà les éléments choisis, à moins que s == 1 (dans ce cas, len (set (C [0]) & set (C [0])) soit 1). Vous pouvez jouer votre avant-dernière ligne sur:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Haskell,
175156 octetsMa première prise au golf, faites-moi savoir si j'ai foiré quelque chose.
Essayez-le en ligne!
Merci à @Paul Mutser pour l'amélioration et -19 octets
Version originale
la source
Perl 6 ,
8877 octetsEssayez-le en ligne!
la source