Der Dealer war schlampig und hat den Überblick verloren, welche Karten sein Deck enthält und welche Karten fehlen. Können Sie ihm helfen?
Ein komplettes Deck besteht aus 52 Spielkarten, nämlich:
Jede Farbe im Deck (Herzen, Diamanten, Pik, Keulen) enthält:
- Die Zahlen [2 - 10]
- Ein Jack
- Eine Königin
- Ein König
- Ein Ass
Aufgabe
Ihr Programm liest den Inhalt des Decks von STDIN, bis eine neue Zeile gelesen wird. Sie können davon ausgehen, dass die Eingabe in Form von "nX nX nX nX" usw. erfolgt, wobei:
- n - eine beliebige Zahl zwischen [2 - 10] oder entweder "J", "Q", "K" oder "A". (Sie können nur Großbuchstaben für nicht numerische Zeichen annehmen.)
- X - eine der folgenden Angaben: 'H', 'D', 'S', 'C' (nur Großbuchstaben möglich)
Woher:
- 'J' = Jacks
- 'Q' = Königin
- 'K' = König
- 'A' = Ass
Und
- 'H' = Herzen
- 'D' = Diamanten
- 'S' = Pik
- 'C' = Vereine
Sie können davon ausgehen, dass die Eingabe keine Duplikate enthält.
Ihr Programm muss dann die fehlenden Karten im Deck auf die gleiche Weise wie die Eingabe ("nX nX nX") auf STDOUT drucken oder "Keine fehlenden Karten" drucken, wenn alle 52 Karten geliefert werden. Die Reihenfolge der Kartenausgabe unterliegt keiner Einschränkung.
Beispiel Eingabe:
9H AH 7C 3S 10S KD JS 9C 2H 8H 8C AC AS AD 7D 4D 2C JD 6S
Ausgabe:
3H 4H 5H 6H 7H 10H JH QH KH 2D 3D 5D 6D 8D 9D 10D QD 2S 4S 5S 7S 8S 9S QS KS 3C 4C 5C 6C 10C JC QC HC
Viel Spaß beim Golfen!
T
statt verwenden10
?J
dar10
?2 3 4 5 6 7 8 9 10 J Q K A
.J
darstellt11
.J
ist der 10. Buchstabe des Alphabets, aber darum geht es hier nicht. :)Antworten:
Windows Batch (CMD),
205204 BytesDurchlaufen Sie die Farben und Ränge, um ein vollständiges Deck zu erstellen, und löschen Sie dann die Eingabekarten. Speichern Sie 1 Byte, wenn dies
T
anstelle von zulässig ist10
. Speichern Sie 11 Byte, wenn Befehlszeilenargumente als Eingabe zulässig sind. Bearbeiten: 1 Byte dank @ user202729 gespeichert.quelle
/v
an CMD (+3 Byte?) ÜbergebenEnableDelayedExpansion
, umcall
in der for-Schleife zu eliminieren . / Scheint, dass Sie ein zusätzliches Leerzeichen zwischen(%c%)
und habendo
?Python,
147146145138131129127125120 BytesErhält alle möglichen Karten als Set und subtrahiert die Eingangskarten.
-1 Byte dank mbomb007, das auf einen zusätzlichen Platz in meinem Code hinweist.
-1 Byte dank mbomb007 für Hinweise zum Golfen mit Python 2 (-5 Bytes und +4 Bytes für
raw_
Inraw_input
)-7 Bytes durch Umschalten auf Sets und Set-Subtraktion anstelle von Listenverständnissen
-7 Bytes dank ValueInk um darauf hinzuweisen, dass ich dank Datastream nicht auf
list
die Suites-2 Bytes
angewiesen bin, um darauf hinzuweisen, dass das einfache Ausschreiben aller Werte byteeffektiver ist als das seltsame, was ich vorher dank ValueInk -2 Bytes hatte, um darauf hinzuweisen Diese Mengen können Generatoren benötigen, sodass ich sie nicht in ein Listenverständnis aufnehmen muss
-2 Bytes danke an Datastream für den Hinweis, dass ich noch mehr Golf spielen kann, wenn ich wieder auf Python 3 umsteige ... (+2 für parens after for print, -4 für
raw_
)-5 Bytes danke an Lulhum und mir für den Hinweis herauszufinden, dass ein Wechsel zurück zu Python 2 (!!!) mir helfen kann, Bytes zu sparen (Bereich wieder verwenden, Backticks anstelle von
str(
und +4 aufgrund vonraw_
)quelle
`d`
anstelle vonstr(d)
Python 2 zusätzlich zum Entfernen der Parens für verwendenprint
.for y in 'HDSC'
funktioniert auch, um alle Charaktere dort rein zu bekommen. (list('JQKA')
Für den anderen Teil benötigen Sie jedoch noch .)'1 2 3 4 5 6 7 8 9 10 J Q K A'.split()
Könnte ein paar Bytes anstatt die sparen[
dfor d in range(2,11)]+list('JQKA')
Manipulation Sie los.1
es nicht hinzugefügt werden muss. Sie können auch die äußeren Klammern für Ihr erstes Listenverständnis entfernen, da derset
Konstruktor Generatorobjekte in Ordnung bringt.05AB1E , 39 Bytes
Probieren Sie es online!
Erläuterung
quelle
CJam ,
4947 BytesProbieren Sie es online!
Erläuterung
quelle
Jelly , 39 Bytes
Probieren Sie es online!
Wie?
quelle
C #, 343 Bytes
Ich habe zum ersten Mal einen meiner Golfplätze gepostet, aber kein sehr guter Anwärter. Ich bin mir sicher, dass ich das noch weiter reduzieren kann.
Die Idee dahinter ist ein spärliches Array, in dem Kartenvorkommen gespeichert werden, wobei die Indizes aus den ASCII-Werten der verschiedenen Werte und Farben multipliziert werden (z. B. würde ein Pik-Ass (AS) im Bereich bei Index (65 *) gespeichert werden. 83 = 5395)). Auf diese Weise erhält jeder Kartentyp einen eindeutigen Index, der später im Array "map" auf Existenz überprüft werden kann.
quelle
PowerShell ,
114111110 ByteProbieren Sie es online!
Nimmt Eingaben
$n
als durch Leerzeichen oder Zeilenumbrüche getrennte Zeichenfolge an. Erstellt ein Array aus dem Bereich,2..10
mit dem es verknüpft istJQKA
(indiziert mit[0..3]
, um es zu einemchar
Array zu machen ). Dieses Array wird in eine Schleife eingespeist|%{}
, die Helfer setzt und$i
dann über die Farben führt, um die Ergebnisse zusammen mit zu verketten$i$_
. Am Ende dieser Schleife haben wir eine Reihe von Zeichenfolgen wie("2C", "2S", "2H", ... "AH", "AD")
. Dieses Array wird in einWhere-Object
(|?{}
) mit dem Filter als den Elementen eingespeist$_
,-notmatch
die die Eingabe regulieren$n
. Das Ergebnis dieser Filterung wird in gespeichert$a
.Dann verwenden wir ein Pseudoternär,
( , )[]
um auszuwählen, ob wir ausgeben'No missing cards'
oder$a
, basierend darauf, ob wir!!$a
zu einem Booleschen Wert$false
oder wechseln$true
. Wenn$a
leer ist (dh, jede Karte im Stapel befindet sich in der Eingabe),!!$a
ist0
dies der"No missing cards"
Fall , und das ist ausgewählt. Umgekehrt zur$a
Auswahl. In beiden Fällen verbleibt dies in der Pipeline, und die Ausgabe ist implizit.quelle
Bash + Coreutils, 89
E / A als Liste mit Zeilenumbrüchen.
Erläuterung
sort
Liest durch Zeilenumbrüche getrennte Eingaben aus STDIN und sortiert siecomm
printf %s\\n {10,{2..9},A,J,K,Q}{C,D,H,S}
ist eine Klammer-Erweiterung, um das gesamte Kartenspiel zu generieren. Dasprintf
druckt jede Karte in einer eigenen Zeile. Die Reihenfolge wird so angegeben, dass die Ausgabe dieselbe ist, als wäre sie weitergeleitet wordensort
comm
vergleicht das vollständige Deck mit der sortierten Eingabe und gibt die Differenz aus.-3
unterdrückt die Ausgabe von Spalte 3 (die üblichen)comm
wird zu geleitetgrep .
. Wenn es keine Ausgabe von gabcomm
(dh alle Karten waren in der Eingabe), gibt die||
"oder" -Klausel die erforderliche Nachricht aus. Ansonstengrep .
stimmt das mit allen Zeilen überein, die von ausgegeben werdencomm
.Probieren Sie es online aus .
quelle
Python 2 ,
104,93,130, 114 BytesProbieren Sie es online!
quelle
list('23456789JQKA')+['10']
ist schlau. Ich habe mir den Kopf zerbrochen10
, um die Liste der einzelnen Zeichen in der anderen Python-Antwort besser aufzuteilen , aber das funktioniert wunderbar.Ruby, 108 + 1 = 109 Bytes
Verwendet die
-p
Flagge.quelle
PHP, 143 Bytes
quelle
sed , 157 + 1 (
-r
Flagge) =170158 BytesProbieren Sie es online!
Dies generiert alle möglichen Karten und entfernt dann jede Karte in der Eingabe von den generierten Karten.
quelle
C # , 282 Bytes
Golf gespielt
Ungolfed
Ungolfed lesbar
Vollständiger Code
Releases
282 bytes
- Anfangslösung.Anmerkungen
Nichts hinzuzufügen
quelle
JavaScript (ES6),
117114111 ByteDies nutzt die Tatsache aus, dass undefinierte Einträge im Array von generiert werden
map()
zu leeren Zeichenfolgen gezwungen werden, wennjoin()
'd.Demo
Code-Snippet anzeigen
quelle
Netzhaut , 76 Bytes
Eingabe / Ausgabe ist eine Liste von durch Leerzeichen getrennten Karten. Die Ausgabe hat ein führendes Leerzeichen.
Probieren Sie es online!
Erläuterung
Der Großteil des Codes befasst sich mit der Erstellung der vollständigen Liste der Karten, die sich im Deck befinden sollten:
Zuerst stellen wir der Eingabe eine neue Zeile mit allen möglichen Kartenwerten voran, und dann erstellen wir für jedes Zeichen dieser Zeile (oder für jedes Zeichenpaar
10
) die Liste aller möglichen Farben dieser Karte.Dies ist eine Deduplizierungsphase, bei der die Zeichenfolge in Blöcke aufgeteilt wird, die aus einem Leerzeichen und einigen Nicht-Leerzeichen bestehen, und von jedem Block nur ein Vorkommen beibehalten wird. Der Modifikator bewirkt,
r
dass diese Funktion von rechts nach links ausgeführt wird, wobei das letzte Vorkommen jedes Blocks beibehalten wird.Wir behalten nur die erste Zeile, die jetzt die fehlenden Karten enthält.
Wenn das Ergebnis leer ist, ersetzen wir es durch "Keine fehlenden Karten".
quelle
Python 3, 106 Bytes
Kombination der beiden vorherigen Python-Antworten gemischt mit einigem String-Entpacken.
quelle
Julia , 116 Bytes
Probieren Sie es online!
Sehr ähnlich zu Kyle Gullions Python-Lösung. Setdiff statt - und das Lambda zum Testen der leeren Zeichenfolge machen es jedoch noch schlimmer.
quelle
Japt, 39 Bytes
Versuch es
quelle
Tcl ,
270228 Zeichen(Mit etwas Hilfe von Wît Wisarhd gekürzt)
Probieren Sie es online!
Erläuterung:
Diese Implementierung erstellt ein Wörterbuch, das aus einem Booleschen Flag für jede der Karten besteht, die durch das kartesische Produkt von HDSC und 2-durch-A dargestellt werden. Es liest die Zeile von stdin, die, wenn sie als die Spezifikation angegeben wird, tatsächlich eine wohlgeformte Tcl-Liste ist. Beim Lesen jeder Karte wird ein boolescher Wert true in das Wörterbuch für diese Karte eingegeben.
Am Ende durchläuft ein Parser das Wörterbuch und fügt einer Liste fehlender Karten eine Karte hinzu, die im Wörterbuch nicht wahr ist. Wenn die Länge der Liste der fehlenden Karten Null ist, geben Sie "Keine fehlenden Karten" aus, andernfalls geben Sie die Liste der fehlenden Karten aus.
quelle
PHP , 138 Bytes
Lief mit
-n
und-d error_reporting=0
Ich verwende wieder Code von einer alten Übermittlung, die ich gemacht habe und die darum gebeten hat, ein Kartenspiel zu erstellen
Code
Probieren Sie es online!
Erläuterung
quelle
$argv
wie das funktionieren kann, danke @ gwaughC # (.NET Core) , 197 Byte
Ohne LINQ.
Probieren Sie es online!
quelle
Perl 6 , 73 Bytes
Probieren Sie es online!
Eine ziemlich einfache Mengensubtraktion zwischen dem Kartenspiel und der Eingabe.
quelle
Python 3 , 102 Bytes
Probieren Sie es online!
quelle