Ich mag Kartenspielherausforderungen, deshalb habe ich diese für das italienische Kartenspiel Scopa gemacht. Meine Familie spielt dieses Spiel seit jeher. Es hat ein sehr interessantes Punktesystem, das Spaß am Golf machen sollte. Ich werde eine Antwort in R posten, um den Spaß zu starten, von dem ich sicher bin, dass die Leute sich verbessern werden.
Die Herausforderung: Berechnen Sie die Anzahl der Punkte, die in einer Runde von Scopa erzielt wurden, und geben Sie die Karten an, die der Spieler während der Runde als Eingabe erhalten hat.
In einem Scopa-Deck befinden sich 40 Karten. Wenn Sie ein internationales Deck verwenden, entfernen Sie die 8er, 9er und 10er und lassen A, 2,3,4,5,6,7, Q, J, K in jeder Farbe. 1 Es gibt zwei Spieler oder Partnerschaften, und nach jeder Runde werden alle Karten von dem einen oder anderen der beiden Spieler erbeutet. Die Punktzahl wird wie folgt gezählt (weitere Informationen hier ):
- Der Spieler mit den meisten Karten erhält 1 Punkt.
- Der Spieler mit den meisten Diamanten (oder Münzen, wenn er das italienische Deck verwendet) erhält 1 Punkt.
- Der Spieler mit der 7 von Diamanten (oder Münzen), die als " sette bello" oder "beautiful seven" bezeichnet wird, erhält 1 Punkt.
- Der Spieler mit der höchsten Primiera erhält 1 Punkt. Die Primiera- Punktzahl eines Spielers ist die Summe der Punkte der Karte mit dem höchsten Wert, die der Spieler in jeder Farbe erobert hat (siehe Tabelle unten). Wenn Sie nicht mindestens eine Karte in jeder Farbe haben, verlieren Sie standardmäßig, auch wenn Ihre Punktzahl die Punktzahl Ihres Gegners überschreiten würde. In dem äußerst seltenen Fall, dass keiner der Spieler mindestens eine Karte in jeder Farbe hat, erhält der Spieler mit der höheren Primiera- Summe den Punkt. 2
Tabelle der Primiera-Ergebnisse
| Rank | Value |
| ----- | ----- |
| 7 | 21 |
| 6 | 18 |
| A | 16 |
| 5 | 15 |
| 4 | 14 |
| 3 | 13 |
| 2 | 12 |
| Q,J,K | 10 |
Ein Spieler kann also höchstens 4 Punkte in einer Runde erzielen. 3 Wenn es ein Unentschieden gibt, das für Karten, Diamanten oder Primiera möglich ist, erhält niemand den Punkt.
Da jede Karte von einem der beiden Spieler erbeutet werden muss, müssen Sie wissen, welche Karten der andere Spieler genommen hat, auch wenn Sie nur wissen, welche Karten ein Spieler genommen hat. Sie müssen dies tun, um primiera richtig zu bewerten .
Herausforderungsregeln
Eingang
Ihr Code sollte die von einem einzelnen Spieler während einer Runde von Scopa erbeuteten Karten als Eingabe nehmen.
Die Eingabe muss im Zeichenfolgenformat erfolgen, wobei ein Zeichen den Rang jeder Karte und ein Zeichen ihre Farbe darstellt. Dies beseitigt die potenzielle Lücke, die Primiera- Scores direkt als Eingabe weiterzugeben . Die Umrechnung der Kartenränge in Primiera Scores muss im Programm erfolgen. Sie können jedoch eine einzelne Zeichenfolge, die durch Leerzeichen oder Kommas getrennt ist, ein Array von Zeichenfolgen oder ein anderes Format verwenden. Zum Beispielwenn Sieentscheiden zu kodieren Reihen wie76A5432QJK
und Anzügen wieDCHS
Sie Eingaben wie nutzen könnten['7D', '6H', 'QD', 'JS']
oder'7D,6H,QD,JS'
.
Ausgabe
Eine Ganzzahl von 0 bis 4, die die Punktzahl des Spielers darstellt.
Gewinnen
Kürzeste Antwort in Bytes gewinnt!
Testfälle
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "7C", "6C", "4C", "3C", "2C", "7H", "4H", "2H", "5S", "3S", "QS", "JS", "KS"]
Erzielt 4 : 1 Punkt für> 20 Karten, 1 Punkt für> 5 Diamanten, 1 Punkt für die 7 Diamanten und 1 Punkt für 78 in Primiera (7,7,7,5, wenn der Gegner 7,6,5 hat, K für 64)
["3D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "QC", "4H", "7S"]
Punktet 0 : <= 20 Karten, <= 5 Diamanten, keine 7 Diamanten, und punktet nur in Primiera mit 69 (7,7,4,3, wenn der Gegner 7,7,6, K für 70 hat)
[7D", "6D", "AD", "5D", "4D", "3D", "2D", "7C", "6C", "AC", "5C", "4C", "3C", "2C", "7H", "6H", "AH", "5H", "4H", "3H", "2H"]
Punkte 3 : 1 Punkt für> 20 Karten, 1 Punkt für> 5 Diamanten, 1 Punkt für 7 Diamanten. Die Primiera wäre 63 (7,7,7) und der Gegner kann nur 51 (7, Q, Q, Q) erzielen, aber da diese Hand keine Pik hat, verliert sie standardmäßig den Punkt.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH", "QS"]
Punktzahl 3 : <= 20 Karten, 1 Punkt für> 5 Diamanten, 1 Punkt für 7 Diamanten. Die Primiera erzielt nur 51 (7, Q, Q, Q) und der Gegner kann 63 (7,7,7) erzielen, aber da die Hand des Gegners keine Diamanten hat, gewinnt diese Hand standardmäßig den Primiera- Punkt.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "7C", "7H"]
Punktzahl 3 : <= 20 Karten, 1 Punkt für> 5 Diamanten, 1 Punkt für 7 Diamanten. Auch wenn diese Hand keine Pik hat, gewinnt sie mit einer Punktzahl von 63 zu 57 (7,7,7 versus 7,6,6), weil die Hand des Gegners keine Diamanten hat.
["7D", "6D", "AD", "5D", "4D", "3D", "2D", "QD", "JD", "KD", "QC", "QH"]
Punktzahl 2 : <= 20 Karten, 1 Punkt für> 5 Diamanten, 1 Punkt für 7 Diamanten. Diese Hand hat keine Pik und die Hand des Gegners hat keine Diamanten. Der Gegner gewinnt primiera mit einer Punktzahl von 63 zu 41 (7,7,7 gegen 7, Q, Q).
[]
(leeres Array)
Punktzahl 0
1: Zumindest in unserer Familie ist Jack in Scopa Königin, aber dies ist für die Wertung irrelevant.
2: Ich spiele dieses Spiel seit meiner Kindheit und habe das noch nie gesehen, aber Ihr Code sollte diesen Fall besser bewältigen können!
3: Es gibt Bonuspunkte für "Sweeps", die während der Runde erzielt wurden und die ich für diese Herausforderung ignoriere.
quelle
Antworten:
Ruby,
156153 BytesProbieren Sie es online!
Dies wird jeweils verwendet,
;865432000
um darzustellen76A5432QJK
, und Anzüge sind in Kleinbuchstaben. (Die Wahl der Zeichen liegt darin, dass durch Subtrahieren von 38 von jedem Zeichen der primäre Wert erhalten wird. Dies wird jedoch nie durchgeführt, da nur der relative Unterschied von Bedeutung ist.)Wir prüfen nicht, ob einem der Spieler eine Farbe fehlt, da dies unnötig ist. Da alle Karten als 38 plus deren tatsächlicher Wert gezählt werden, beträgt die Höchstpunktzahl (21 + 38) *, wenn jemand eine Farbe fehlt. 3 = 177, was weniger als (10 + 38) * 3 + 21 + 38 = 203 ist, die niedrigste Punktzahl, die der andere Spieler erzielen kann. Wir können nicht zulassen, dass den beiden Spielern eine ungleiche Anzahl von Farben ungleich Null fehlt, weil einem Spieler nur 0, 1 oder 2 Farben fehlen können, und wenn jemand 2 Farben fehlt, haben sie alle Karten der anderen 2 Farben.
quelle
R,
320298265238229224211209179 BytesDies ist eine Lösung, die hauptsächlich auf @digEmAll in Form einer Funktion zurückzuführen ist.
Probieren Sie es online!
Unten ist das Beste von meinen alten mittelmäßigen Versuchen für 209 Bytes.
Bearbeiten: Durch Aliasing einiger Funktionen nach unten spielen, dann die Idee von Doorknob übernehmen, der Partitur eine Konstante hinzuzufügen, anstatt die Farben zu überprüfen.
nächste Änderung: Einige Redundanzen wurden beseitigt und einige Verbesserungen von Giuseppe eingebaut
nächste Änderung: -2 Bytes dank digEmAll
Ich bin schrecklich, also bin ich mir sicher, dass jemand das verbessern kann, wenn er sich die Zeit nimmt. Ich fühle mich wie die
sapply
und binfunction
super lang und könnte sie loswerden, aber ich kann nicht herausfinden, wie. Eingaben sind zweistellige Zeichenfolgen in der Standardnotation.quelle
JavaScript (ES6),
171163 ByteNimmt Eingaben als Kartensatz unter Verwendung ihrer Standarddarstellung entgegen.
Probieren Sie es online!
Kommentiert
quelle
05AB1E , 41 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Anzüge
DCHS
sind jeweils vertreten durch0123
. Die Ränge7A65432KJQ
werden jeweils durch dargestellt0123456789
. Diese werden als Zeichenfolgen verwendet, nicht als Ganzzahlen, wie es die Abfrage erfordert (aber 05AB1E konvertiert sie dann trotzdem in Ganzzahlen, wenn sie benötigt werden).Wie bei anderen Lösungen fügen wir jeder Primiera-Bewertung eine große Konstante (14) hinzu, um die Prüfung auf fehlende Anzüge überflüssig zu machen.
quelle
MS SQL Server 2017 , 525 Byte
Probieren Sie es mit db <> fiddle aus .
quelle
Retina 0.8.2 , 334 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Erstellen Sie eine Liste aller 40 Karten.
Entferne die Karten, die der Spieler hält.
Ersetzen Sie jeden Rang durch seine Sortierreihenfolge, die 9 für
7
und 10 weniger als sein Wert für andere Karten ist.Sortieren Sie die Karten nach Farbe und Rang.
Zählen Sie die Anzahl der Karten in jeder Farbe und nehmen Sie die Karte mit dem höchsten Rang in jeder Farbe auf, wobei Sie den höchsten Diamanten zweimal einfangen.
Überprüfen Sie, ob der höchste Diamant die 7 war.
Löschen Sie alle höchsten Karten, wenn eine der Farben keine Karten enthält.
Wandle die höchsten Karten in ihre unäre Punktzahl um und addiere sie. Konvertieren Sie auch die Gesamtzahl der Karten und die Farbenlänge in Unär.
Erzielen Sie Punkte, wenn die Summe, die Diamanten oder die Primiera höher sind.
Gesamte die Punktzahl.
quelle
C # (Visual C # Interactive Compiler) , 193 Byte
Probieren Sie es online!
quelle
AWK , 235 Bytes
Probieren Sie es online!
Die Zuordnung der Farben zu 1234 (4 sind Diamanten) und die Zuordnung der Werte zu 0123456789. Dieses Programm wandelt die Testfälle in das akzeptierte Format um:
Mein Ziel war es, die führende Python-Implementierung zu übertreffen: D
quelle
Python 3 ,
249 245 239238 Bytes-4 Bytes dank @ovs
-6 Bytes dank @movatica
Probieren Sie es online!
quelle
int('0734569c00'[int(x[0])],13)
undif x[1]<'E'
können alsif'E'>x[1]
all(s in''.join(C)for s in S)
kann aufnot S.strip(''.join(C))
6 Bytes gekürzt werden