Golf Golf!
Dies ist meine erste Herausforderung, also sei bitte sanft! Die Herausforderung besteht darin, ein Programm zu schreiben, das die richtige Punktzahl für ein Layout im Kartenspiel "Golf" ausgibt.
Das Kartenspiel Golf hat viele Variationen. Die Hausregeln, die ich verwende, folgen mit einem kleinen Unterschied den Standardregeln für Six-Card-Golf von Pagat. Hier gibt es bereits eine ähnliche Herausforderung , aber ich denke, diese ist interessanter, da Sie die Ausrichtung der Karten berücksichtigen müssen.
Jeder Spieler hat ein 2x3 Kartenlayout. Am Ende jeder Runde werden alle Karten aufgedeckt und wie folgt gewertet:
- Jedes Ass zählt 1 Punkt.
- Jeweils zwei zählen minus zwei Punkte.
- Jede Zahlenkarte von 3 bis 10 erhält einen Nennwert.
- Jeder Jack oder jede Queen erhält 10 Punkte.
- Jeder König erhält null Punkte.
- Ein Paar gleicher Karten in derselben Spalte erhält null Punkte für die Spalte (auch wenn die gleichen Karten zwei sind).
- Ein Satz von drei gleichen Karten in derselben Reihe erhält null Punkte für die Reihe (selbst wenn die gleichen Karten zwei sind).
Eingang
Die Eingabe kann eine Zeichenfolge oder ein Array beliebiger Art sein.
Ausgabe
Eine Ganzzahl, die die Punktzahl der Golfhand darstellt.
Beispiele
Diese Beispiele verwenden die Notation, A23456789TJQK
aber Sie müssen diese Notation in Ihrer Antwort nicht verwenden.
Layout
AK3
J23
Score
9
-----------------------
Layout
25Q
25J
Score
20
-----------------------
Layout
T82
T8A
Score
-1
-----------------------
Layout
QQQ
234
Score
5
-----------------------
Layout
TJQ
QTJ
Score
60
-----------------------
Layout
888
382
Score
1
-----------------------
Layout
888
888
Score
0
Dies ist Code Golf, also gewinnt die kürzeste Antwort in Bytes!
quelle
A23456789TJQK
aber Sie müssen diese Notation nicht in Ihrer Antwort verwenden."JJJ 2J2
->-4
.Antworten:
Gelee , 9 Bytes
Probieren Sie es online aus!
-1 danke an Jonathan Allan .
[[A, B, C], [D, E, F]]
A
F
quelle
Haskell ,
10710398 BytesProbieren Sie es online aus!
Nutzt die Tatsache, dass es nur zwei Zeilen gibt. Wir iterieren doppelt über die Zeilen und nehmen eine Zeile
r
und eine Zeileo
. Wenn es sich um dieselbe Zeile handelt, ist das Ergebnis immer Null (aufgrund der Übereinstimmung der "Spalten"), sodass wir nur die beiden Iterationen berücksichtigen, in denenr
undo
auf unterschiedliche Zeilen verweisen. Ich stelle die Zeilen auf Null, indem ich zuerst prüfe, ob Einträge in der Zeile nicht den ersten entsprechen. Wenn die Zeile alle gleich ist, ist dies falsch und die Liste ist leer mit einer Summe von 0. Andernfalls zippe ich diese Zeile mit der anderen und iteriere über die Paare, die nicht gleich sind (dies setzt gleiche Spalten in einer ähnlichen Null auf Null) Weise). Schließlich indiziere ich eine Liste von Kartenrängen, beginnend mit -2 Auffüllen mit Leerzeichen nach Bedarf, um jeden Rang seiner Punktzahl zuzuordnen. Ich muss nur benutzenmin 10
Diesen Index zu klemmen, um Buben und Königinnen herzustellen, kostet 10 statt 11 und 12.EDIT: danke an @xnor für das Entfernen von 4 Bytes! Ich wusste nicht, dass Sie Bezeichner direkt nach Zahlenliteralen setzen können, was wirklich cool ist!
EDIT2: Nochmals vielen Dank an @xnor für weitere 5 Bytes! Tolle Idee, so über die Zeilen zu iterieren
quelle
10
, und es ist kürzer die wegzulassen@(a:_)
und stattdessen schreibenr!!0
zua
.a%a
undb%b
Null sind, sieht es aus wie Sie definieren könnenf
direkt durch Iteration über Linienpaare wie folgt .Holzkohle , 50 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Erläuterung:
Lesen Sie das Layout in ein Array.
Initialisieren Sie die Punktzahl auf Null.
Filtern Sie nach der Eingabe und entfernen Sie Zeichen, die allen Zeichen in der Zeile oder Spalte entsprechen.
Schalten Sie jedes verbleibende Zeichen um.
2
Partituren-2
.A
Partituren1
. (Diese 4 Bytes könnten entfernt werden, wenn1
sie zur Bezeichnung verwendet würden1
, aber meiner Meinung nach ist dies ein Missbrauch des Eingabeformats.)Tu nichts für
K
.Andernfalls erhalten Ziffern ihren Wert und andere Buchstaben Punkte
10
.Wandeln Sie die Summe für den impliziten Druck in einen String um.
quelle
J ,
3928 BytesProbieren Sie es online aus!
Dank an Erik the Outgolfer und Jonathan Allen für die Idee der Eingabecodierung.
Erläuterung
Eine sehr "J" -Lösung. Ich erkläre anhand eines Beispiels ...
Nehmen wir die Eingabe:
und wenden Sie diese Codierung an:
welches produziert:
Schauen wir uns den ersten Teil der Lösung an und lassen Sie zunächst einige Details offen:
Dies besagt, dass Sie die Eingabe
]
und ihre Transponierung nehmen|:
und eine "Multiplikationstabelle" aller Kombinationen erstellen, außer dass wir anstelle der Multiplikation das Verb in Klammern anwenden. Der Rangbezeichner"1
stellt sicher, dass alle Kombinationen von Zeilen aus beiden Argumenten übernommen werden. Da die Zeilen der Transponierten jedoch die Spalten der ursprünglichen Matrix sind, bedeutet dies, dass alle Kombinationen von Zeilen und Spalten verwendet werden. Das heißt, wir machen:Nun gilt das, was
verb
wir für jede dieser Kombinationen anwenden,+:&(1=#@~.)
und dieses Verb gibt false zurück, wenn "eines der Argumente aus einem einzelnen wiederholten Element besteht" und andernfalls true. Dies geschieht~.
, indem der Knoten oder die Einheit genommen wird , gefragt wird, ob seine Länge eins ist1=#
, und das Nor des Ergebnisses genommen wird+:
.Das heißt, dies gibt eine boolesche Maske mit derselben Form wie die Eingabematrix zurück, jedoch mit Nullen für jedes Element in einer Zeile oder Spalte aller gleichen Elemente.
Jetzt multiplizieren wir einfach die ursprüngliche Matrix mit dieser Maske und ergreifen das Wort
]<.@*
:und dann das Ergebnis davon abflachen und summieren:
+/@,
quelle
JavaScript (ES6),
97 9593 ByteNimmt die Eingabe als Array von 2 Arrays mit 3 Zeichen auf.
Probieren Sie es online aus!
Kommentiert
quelle
Japt , 22 Bytes
Versuch es
quelle
PHP ,
145109 BytesNachdem
A23456789TJQK
ich die Standardcodierung für Eingaben verwendet hatte und kein gutes Ergebnis erzielt hatte, wechselte ich zu dieser Codierung, ähnlich wie bei anderen Antworten:Die Eingabe ist ein zweidimensionales Array in diesem Format :
[[1,0,3],[10.1,-2,3]]
. Überprüft grundsätzlich die Zeile (mitmin
undmax
) und die Spalte für jede Karte, um nicht gleiche Werte zu enthalten, und addiert dann den Kartenwert zur Gesamtpunktzahl und druckt am Ende einen ganzzahligen Teil der Gesamtpunktzahl.Probieren Sie es online aus! (Hinweis: TIO für PHP ist momentan aufgrund eines falschen Versions-Upgrades defekt, sollte aber wieder in Ordnung sein.)
quelle
Python 3 , 79 Bytes
Probieren Sie es online aus!
Python 3 , 118 Bytes
Besser lesbares Eingabeformat
Probieren Sie es online aus!
quelle
Kotlin , 159 Bytes
Lambda verwendet 1.3456789TJQ0 als Eingabe. Der äußere Code verwendet A23456789TJQK als Eingabe, konvertiert das Ass, die Zwei und den König, damit die Mathematik funktioniert, und zeigt die Karten und die Punktzahl an.
Probieren Sie es online aus!
quelle