Einführung
Dobble / SpotIt ist ein Kartenspiel, bei dem Menschen in kürzester Zeit dasselbe Symbol auf einem Kartenpaar erkennen, darauf hinweisen und zum nächsten Paar wechseln müssen. Jede Karte hat mehrere Symbole (8 in der normalen Version), aber genau eines ist für jedes Kartenpaar gleich.
Beispiel aus physischer Kopie des Spiels:
Herausforderung
Schreiben Sie ein Programm, das aus einer Reihe von Symbolen (einzelne ASCII-Zeichen) und einer Anzahl von Symbolen auf einer einzelnen Karte eine Liste von Ausgabekarten mit Symbolen für jede Karte erstellt. Es gibt offensichtlich viele äquivalente Kombinationen. Ihr Programm muss nur eine der Kombinationen schreiben, die die größte Menge an Karten für eine bestimmte Eingabe ergeben.
Es ist ein Code-Golf, also kürzer, besser.
Es wäre auch großartig, wenn die Berechnung für den kompliziertesten Fall vor dem Hitzetod des Universums abgeschlossen wäre.
Eingang
Zwei Argumente für function / stdin (Ihre Wahl)
Als erstes handelt es sich dabei um eine Sammlung von Symbolen, wie z. B. "ABCDE" oder ["A", "B", "C", "D", "E"] - das Format Ihrer Wahl, sei es eine Zeichenfolge, eine Menge, eine Liste oder ein Stream , oder was auch immer für die Sprache der Wahl idiomatisch ist. Die Zeichen werden aus dem Satz von [A-Za-z0-9] ohne Duplikate vergeben (daher beträgt die maximale Größe des Eingabesymbolsatzes 62). Sie werden nicht notwendigerweise in ( so können Sie "yX4i9A" auch für 6-Symbol-Fall erhalten).
Das zweite Argument ist eine Ganzzahl, die die Anzahl der Symbole auf einer einzelnen Karte angibt. Es wird <= als die Größe des Symbolsatzes sein.
Ausgabe
Drucken Sie mehrere durch Zeilenumbrüche getrennte Zeilen, von denen jede Symbole für eine einzelne Karte enthält.
Beispiele
ABC
2
>>>>
AB
BC
AC
Oder
ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF
Oder
ABCDE
4
>>>>
ABCD
Hinweise
- Die Anzahl der produzierten Karten kann nicht größer als die Anzahl der unterschiedlichen Symbole sein und wird in vielen Kombinationen erheblich kleiner sein
- Möglicherweise möchten Sie einige mathematische Hintergrundinformationen lesen, wenn Sie Hilfe bei der mathematischen Seite des Problems benötigen
Dies ist meine erste Code-Golf-Herausforderung. Bitte verzeihen Sie eventuelle Probleme mit der Formatierung / dem Stil. Ich werde versuchen, Fehler zu korrigieren, wenn Sie sie in Kommentaren angeben.
quelle
('abcdefghijklmnopqrstu', 5)
->['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']
oder eine andere 21-Karten-Arbeitslösung. (Beachten Sie, dass dies die projektive endliche Ebene der Ordnung 4 ist).Antworten:
Python 2 ,
192162 BytesIch habe ein Argument, dass dies den maximalen Kartensatz für jedes Szenario erzeugt und die 3 Testfälle behandelt.
Probieren Sie es online!
Algorithmus
Nehmen Sie für ein gegebenes Alphabet
a
und eine gegebene Kartengrößes
alle Elementkombinationens
aufa
und nennen Sie esC
dann:C
, nennen Sie esC0
C0
C
, deren VereinigungC0
ungleich ist1
C
C
leer istDann drucken Sie die gespeicherten Elemente.
Streit
Eine nicht leere Teilmenge von
C
ist unsere maximale LösungK
. Da es zumindest ein Element enthält , und zwei beliebige Elemente sind nicht zu unterscheiden, wählen , ein beliebiges Element,C0
, derC
in seinK
. Für jedes Elemente
in derK
ist die Kardinalität dere
Vereinigungx
1 fürx != e
inK
; eliminieren so alle Elemente inC
deren Vereinigung mitC0
nicht über cardinallity 1. Aus den gleichen Gründen, wählen Sie ein neues beliebiges Element inC
, fügen Sie ihnK
, und zu reduzierenC
. LetztendlichC
ist die leere MengeK
die maximale Lösung, da wir zu keinem Zeitpunkt ein Element ausgewählt haben, das von anderen Elementen unterscheidbar war.Testfälle
Diese Testfälle wurden geschrieben, bevor mir klar wurde, dass das Drucken eine Anforderung war.
Aktualisieren
R
Variable ausgespieltK
Variable ausgespielt , danke an @Leo !quelle
A for A in C if len(set(A)&set(C[0]))==1
) entfernt bereits die ausgewählten Elemente, es sei denn, s == 1 (in diesem Fall len (set (C [0]) & set (C [0])) wäre 1). Sie könnten Ihre vorletzte Zeile auf Golf spielen, um:C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Haskell,
175 bis156 BytesMein erster Versuch, Golf zu spielen, lass es mich wissen, wenn ich etwas durcheinander gebracht habe.
Probieren Sie es online!
Vielen Dank an @Paul Mutser für die Verbesserung und -19 Bytes
Originalfassung
quelle
Perl 6 ,
8877 BytesProbieren Sie es online!
quelle