Hinweis: Dies hängt mit einer Variation des Spiels Rummikub zusammen
Hintergrund & Regeln
Rummikub ist ein auf Kacheln basierendes Spiel. Es gibt vier Farben: Rot, Orange, Blau und Schwarz. Für jede Farbe gibt es 13 Kacheln (von 1 bis 13 beschriftet) und es gibt auch 2 Joker, die farbunabhängig sind, daher gibt es insgesamt 54 Teile. In dieser Variante von Rummikub erhält jeder Spieler 14 Plättchen und muss in jeder Runde ein weiteres Plättchen erhalten und ein weiteres fallen lassen, so dass die Anzahl der Plättchen konstant ist. Die Spieler sehen sich nicht gegenseitig. Ziel ist es, die Kacheln so zu gruppieren, dass alle Teile zu mindestens einer Gruppe gehören (siehe unten). Wenn ein Spieler alle Teile gruppiert hat, lässt er sein Kachelbrett fallen und legt seine Teile frei. Die anderen prüfen dann, ob alle Kombinationen gültig sind, und wenn dies der Fall ist, gewinnt der Spieler die Runde.
Wie können die Kacheln gruppiert werden?
Es gibt nur zwei Arten von Gruppen:
Mehrfarbige Gruppen:
- Sie bestehen aus 3 oder 4 Kacheln.
- Sie enthalten nur Kacheln mit derselben Nummer.
- Alle Fliesen sind in verschiedenen Farben.
- Beispiel :
RED 9, BLUE 9, BLACK 9
.
Einfarbige Gruppen:
- Sie bestehen aus mindestens 3 Kacheln.
- Sie dürfen nicht mehr als 13 Kacheln enthalten.
- Sie enthalten nur Kacheln mit unterschiedlichen fortlaufenden Nummern in aufsteigender Reihenfolge.
- Alle Fliesen haben die gleiche Farbe.
- Mit gekennzeichnete Kacheln
1
dürfen keine Stellen nach gekennzeichneten Kacheln sein13
. - Beispiel :
RED 5, RED 6, RED 7
.
Warten Sie, was machen die Joker?
Joker können jedes Stück im Spiel ersetzen. Zum Beispiel kann unser erstes Beispiel werden JOKER, BLUE 9, BLACK 9
, RED 9, JOKER, BLACK 9
oder RED 9, BLUE 9, JOKER
. Gleiches gilt für unser anderes Beispiel. Man darf jedoch nicht zwei Joker in dieselbe Gruppe einordnen, so dass Dinge wie JOKER, ORANGE 8, JOKER
verboten sind.
Aufgabe
Bestimmen Sie anhand einer Rummikub-Kachelgruppe, ob diese gültig ist. Sie werden garantiert, dass keine doppelten Kacheln angezeigt werden, mit Ausnahme der 2 Joker, und dass die Kacheln, die Sie als Eingabe erhalten, gültig sind (z. B. Dinge wie 60
werden nicht angezeigt).
Input-Output
Sie können Eingaben vornehmen und die Ausgabe mit einer beliebigen Standardmethode bereitstellen.
Einige gültige Eingabeformate: Liste der Zeichenfolgen, Liste der Tupel, verschachtelte Listen, Zeichenfolgen oder alles andere, was Sie für geeignet halten. Die Farben können als Zeichenfolgen (z. B. "Blue","Red", etc.
:), als Zeichenfolgenabkürzungen (bitte machen Sie blaue und schwarze Kacheln unterscheidbar) oder als Ganzzahlen entsprechend einer Farbe verwendet werden. Wenn es um Joker geht, sollten Sie als Eingabe angeben, wie Ihr Programm sie empfängt. Wenn Sie Strings wählen, haben Sie möglicherweise etwas wie RED 9, JOKER, ...
, wenn Sie Tupel wählen, die Sie haben können, (9,"RED"), ("JOKER")
oder etwas Äquivalentes. Wenn es hilft, erhalten Sie möglicherweise eine Farbe für diesen Joker (die die Ausgabe Ihres Programms nicht beeinflussen sollte). Zum Beispiel haben Sie vielleicht ("JOKER","RED")
oder ("JOKER","BLUE")
, aber das sollte die Ausgabe in keiner Weise beeinflussen.
In Bezug auf die Ausgabe gelten Standardregeln für ein Entscheidungsproblem .
Arbeitsbeispiele
Nehmen wir ein Beispiel, das hoffentlich das Verständnis erleichtert. Geben Sie eine Gruppe wie folgt an, wobei jedes Tupel eine Kachel darstellt:
[(9, "ROT"), (9, "ORANGE"), ("JOKER"), (9, "SCHWARZ")]
Dies sollte einen wahrheitsgemäßen Wert zurückgeben, da die Eingabe gültig ist. In diesem Fall ersetzt der Joker (9, "BLUE")
und sie bilden eine mehrfarbige Gruppe.
Wenn Sie die folgende Gruppe erhalten würden:
[(9, "BLAU"), (9, "ORANGE"), (9, "ROT"), (9, "SCHWARZ"), ("JOKER")]
Es wäre ungültig, und daher sollte Ihr Programm einen falschen Wert zurückgeben, da der Joker nichts mehr ersetzen kann, da die maximale Anzahl von Karten in einer mehrfarbigen Gruppe 4 beträgt.
Zusätzliche Testfälle
Diese sind für eine erweiterte Testsuite vorgesehen, die nahezu alle möglichen Situationen abdeckt:
Eingabe -> Ausgabe [(1, "BLAU"), (2, "BLAU"), (3, "BLAU"), (4, "BLAU"), (5, "BLAU"), (6, "BLAU")] - > wahr [(6, "BLAU"), (6, "ROT"), (6, "SCHWARZ)] -> wahr [(5, "SCHWARZ"), (6, "SCHWARZ"), (7, "SCHWARZ"), (8, "SCHWARZ"), (9, "SCHWARZ"), (10, "SCHWARZ"), ( "JOKER"), (12, "BLACK")] -> wahr [("JOKER"), (3, "BLAU"), (3, "ROT")] -> wahr [(8, "SCHWARZ"), (2, "ROT"), (13, "BLAU")] -> falsch [(4, "ROT"), (3, "ROT"), (5, "ROT")] -> Falschheit [(5, "SCHWARZ"), (6, "SCHWARZ)] -> falsch [("JOKER"), (5, "RED"), ("JOKER")] -> falsch [(4, "ROT"), (5, "ROT"), (6, BLAU ")] -> falsch [(4, "ROT"), ("JOKER"), (5, "ROT")] -> Falschheit [(12, "SCHWARZ"), (13, "SCHWARZ), (1," SCHWARZ ")] -> falsch
Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes in jeder Sprache!
quelle
Antworten:
APL (Dyalog) , 58 Bytes
Nimmt die Liste der Farben (1-4) als rechtes Argument und die Liste der Zahlen als linkes Argument. Die Nummer eines Jokers wird angegeben,
(⍳4)
was(1 2 3 4)
bedeutet, dass es sich um eine dieser Nummern handeln kann . Ebenso wird seine Farbe(⍳13)
angegeben, um anzuzeigen, dass es sich um eine der Zahlen von 1 bis 13 handeln kann.Probieren Sie es online aus!
Algorithmus
Es gibt drei Bedingungen, von denen die letzten beiden jeweils zwei Bedingungen haben:
UND ENTWEDER
eine einzelne Zahl UND
einzigartige Farben
ODER
damit der Lauf gültig ist.
Lesereihenfolge
3≤
3 ist kleiner oder gleich der≢⍺
Anzahl der Kacheln∧
unds⍵
Alle Zahlen sind gleich∧
und⍺≡∪⍺
Die Farben sind einzigartig∨
oder1∊
1 gehört≢∘∪¨
zur Anzahl der einzigartigen⊃,¨/
erweiterten⍺
Farben∧
und∨/
∊
Unter allen⊃,¨/⍵
erweiterten Nummernläufen gibt es mindestens einen⍷¨⊂
, der in⍳13
1 bis 13 zu finden istVollständige Code-Erklärung
{
…}
Anonyme Funktion, bei der⍺
es sich um ein linkes und⍵
ein rechtes Argument handelt3.2.
⍳13
die Zahlen 1 bis 13(
…)⍷¨
Finden Sie die Startpositionen für jeden der folgenden Läufe:,¨/⍵
Verbinden Sie jedes Element der Zahlen (erstellt einen Lauf für jeden Joker-Wert)⊃
offenlegen (weil/
Rang reduziert)∊
ϵ nlist (abflachen)∨/
ODER Reduktion (dh sind irgendwelche wahr?)(
…)∧
UND:3.1
(
…)⍺
Das Ergebnis der Anwendung der folgenden Funktion auf die Liste der Farben:s←{
…}
S (für s ame) ist die folgende anonyme Funktion (⍵
ist ihr Argument):,¨/⍵
Verbinden Sie jedes Element über (erstellt einen Lauf für jeden Joker-Wert)⊃
offenlegen (weil/
Rang reduziert)≢∘∪¨
die Anzahl der eindeutigen Elemente in jeder Liste1∊
ist man ein Mitglied? (dh gibt es alle gleichen Listen?)(
…)∨
ODER:2.2.
∪⍺
die einzigartigen Farben⍺≡
sind identisch mit den Farben (dh sie sind einzigartig)(
…)∧
UND:2.1.
s⍵
Die Zahlen sind alle gleich(
…)∧
UND1.
≢⍺
die Anzahl der Farben (dh die Anzahl der Kacheln)3≤
drei ist kleiner oder gleich demquelle
Gelee ,
41403836 BytesProbieren Sie es online aus! (kommt mit einer Test-Suite Fußzeile)
Nimmt die Eingabe als Array
(color, value)
für normale Kacheln und0
für Joker auf. Farben werden als Ganzzahlen dargestellt (obwohl ich nicht sicher bin, ob dies für den aktuellen Code überhaupt von Bedeutung ist).Ausgaben
1
(wahr) oder0
(falsch).Erläuterung
quelle
Python 2 ,
371 370 362 341 329325 Bytesstr.split()
stattlist literal
len(x)-1
J O BK B R
fürJoker, Orange, Black, Blue, Red
LiteraleProbieren Sie es online aus!
quelle
BK
mitb
zu speichern 1 Byte (TIO mit Testfällen aktualisiertb
.Javascript (ES6), 286 Bytes
(Beachten Sie, dass die obigen Testfälle zwei zusätzliche Testfälle enthalten, die nicht in der Frage enthalten sind: Sie sind wahr bzw. falsch: Informationen zur Lesbarkeit finden Sie in der ungolfed-Version.)
Grober Prozess:
Joker werden durch a
0
als numerischen Wert angezeigt (eine negative Zahl würde auch funktionieren); Dies hält die Eingabestruktur konsistent (hat sowohl eine Farbe als auch einen Wert) und muss nicht überprüft werdenc=="JOKER"
, ob 7 Bytes eingespart werden.Es ist möglich, dass einige Klammern entfernt werden könnten, es könnte möglich sein, nicht
q
als Array zu boxen (ich habe es versucht und der Wert blieb entweder entweder 0 oder verursachte Nasendämonen ).Ungolfed:
Version, an der ich gearbeitet habe, um die Logik korrekt zu machen. Einweg-Lambdas wurden in die Reihe gestellt; Hier ist ihre entsprechende Funktion:
quelle
C # (.NET Core) , 198 Bytes
Nimmt die Farben von Kacheln und Zahlen als separate Listen von ganzen Zahlen auf. Die Besonderheiten dieser Zuordnung spielen keine Rolle, solange jede Farbe eine andere Ganzzahl hat und Joker als 0 dargestellt werden.
Das Format für die Eingabe von Zahlen ist jedoch ziemlich speziell. Die Zahl, die für eine Zahl eingegeben werden muss,
n
ist stattdessen 2 ^ n, während die Zahl, die zur Darstellung eines Jokers verwendet wird, (2 ^ 14) -1 sein sollte. Dies ermöglicht das bitweise undu&x
Auswerten von u, ob die Kachel x einen Wert gleich u hat oder ein Joker ist.C # (.NET Core) , 200 Byte
Eine 2 Byte längere Lösung, die bei der Eingabe nicht vielseitig ist. Es stellte sich heraus, dass die Verwendung eines Sonderfalls für Joker an dem Ort, an dem sie schwer zu handhaben waren, nicht viel länger dauerte als die clevere bitweise Operation, auf die ich so stolz war. Hier sind Joker (0,0), andere Zahlen sind wie erwartet und Farben werden durch 4 Werte dargestellt, die sich durch den Standardvergleich von C # voneinander unterscheiden (insbesondere muss die Linq-
Distinct()
Operation Werte für dieselbe Farbe als "nicht verschieden" berücksichtigen. und Werte für verschiedene Farben als "verschieden").Etwas, das für andere Sprachen von Nutzen sein könnte,
u*=!u++^x*x
wäreu=u==x|x<1?u+1:0
in einigen Sprachen gleichwertig ; u ^ x ist 0, wenn u == x, und 0 mal jedes int ist 0, also wäre u ^ x * x entweder für u == x oder x == 0 0, wenn C # keine bitweisen Operationen mit niedrigerer Priorität als mathematische. C # kann Ints auch nicht ohne explizites Casting als Bools interpretieren. Eine Sprache , die versucht härter Arten Arbeit machen könnten die Werte konvertieren0
undnot 0
zufalse
undtrue
vor der Anwendung ,!
obwohl ihnen, und dann , wenn sie einem int interpretieren zurück!false
als 1 und!true
als 0 Alles , was gesagt, ich kann nicht eine andere Sprache würde garantieren , tatsächlich Profitieren Sie vom Rest des Algorithmus, sodass er möglicherweise nicht einmal angezeigt wird.quelle
Scala,
491477 Zeichen,491477 BytesDiese Herausforderung hat Spaß gemacht; Vielen Dank.
In
f
Zeile 4 steht also ein rekursiver Aufruf, bei dem ich versuche, "JOKER" durch jede andere Kachel zu ersetzen. Siehe tio für eine klarere Ansicht des Codes. Ich habe als Eingabe eine Folge von 2-Tupeln (Int, String) gewählt -t
in meinem Code aufgerufen , siehe tio -, sodass "JOKER" durch ein 2-Tupel (0, "JOKER") dargestellt wird.EDIT: 14 Bytes dank Kommentaren gespeichert, ich nehme OB b R für ORANGE BLACK BLUE RED.
Probieren Sie es online aus!
EDIT: -2 Bytes, gelöscht nutzlos
(
um Bedingungen dercase _ if
squelle
O,B,b,R
anstattORANGE,BLUE,BLACK,RED
Bytes zu speichern? Ich habe keine Ahnung, wie Scala funktioniert, aber ich denke, Sie können.var (O,B,b,R)=("ORANGE","BLACK","BLUE","RED")
und Anrufe sindO
B
b
R
für insgesamt 49 Bytes; wovar c=Seq("ORANGE","BLACK","BLUE","RED")
und Aufrufec(...)
summieren sich auf 58 Bytes. ABER der erste Fall erlaubtfor(u<-c)
esfor(u<-Seq(O,B,b,R))
, also betragen die Kosten nicht -9, sondern +2. Danke, dass du es versucht hast.var c=Seq("O","B","b","R")
, diese Zeichen als Eingaben zu verwenden und zu verwenden, anstatt vollständige Zeichenfolgen für Farbe. Wie im ursprünglichen Beitrag erwähnt, "Die Farben können als ... Zeichenfolgenabkürzungen verwendet werden".