Ihre Aufgabe ist es, ein kleines Programm zu schreiben, das die Punkte einer Skat-Hand zählt. Ein Skat-Deck hat Karten 7 bis 10, Jack, Queen, King und Ace (genannt Unter, Ober, König und Daus). Wir verwenden die deutschen Anzüge, die Eicheln, Blätter, Herzen und Glocken anstelle von Keulen, Pik, Herzen und Diamanten haben. Die Punkte werden durch die Nummer auf der Karte bestimmt:
- 7, 8 und 9 sind 0 Punkte
- Unter ist 2 Punkte
- Ober ist 3 Punkte
- König ist 4 Punkte
- 10 ist 10 Punkte
- Daus ist 11 Punkte.
Input-Output
Das Eingabeformat besteht aus zwei Symbolen, wobei das erste den Wert darstellt, während das zweite für die Farbe steht:
- 7, 8 und 9 stehen für sich selbst
- 0 (Null) steht für 10
- Unter, Ober, König und Daus sind nach ihren Anfangsbuchstaben (U, O und D) benannt.
- Gleiches gilt für Eicheln, Blätter, Herzen und Bauch (A, L, H und B)
Die Eingabe ist eine einzelne Kartenzeile, die durch ein einzelnes Leerzeichen getrennt ist. Sie können die Eingabe von überall übernehmen. Befehlszeilenargumente sind ebenfalls in Ordnung. Die Ausgabe ist der Wert der Hand, der entweder ausgedruckt oder als Exit-Code zurückgegeben wird. Die Ausgabe Ihres Programms muss einen Fehler anzeigen, wenn eine Karte zweimal in der Hand erscheint. ( 7A 0L 7A
Muss also einen Fehler zurückgeben statt 10
). Es ist auch in Ordnung, mit einem Exit-Code von 255 zu beenden, anstatt einen Fehler anzuzeigen, wenn dies die Standardmethode Ihres Programms ist, um das Ergebnis auszugeben.
Beispiele
7A 8A 9A UA OA KA 0A DA 7L 8L 9L UL OL KL 0L DL 7H 8H 9H UH OH KH 0H DH 7B 8B 9B UB OB KB 0B DB
gibt 1207A 8L 0K DB 8L
gibt einen FehlerUA OB DL KH
gibt 20
Regeln
- Code Golf: Der kürzeste Code gewinnt
- Es gelten die üblichen Code-Golfregeln
- Das Programm muss für alle Hände funktionieren, nicht nur für die Beispiele
- GIGO: Wenn die Eingabe ungültig ist, kann die Ausgabe beliebig sein
quelle
Antworten:
APL (
5448)Es muss eine kürzere Möglichkeit geben, den Kartenwert auszuwählen, aber ich sehe ihn nicht.
Sie erhalten eine,
DOMAIN ERROR
wenn es eine doppelte Karte gibt.Erläuterung:
A←⍞~' '
: store (←
) inA
einer Zeile mit Benutzereingaben (⍞
) ohne (~
) Leerzeichen.2,⍨2÷⍨⍴A
: Eine Liste mit zwei Elementen, die die Länge von (⍴
)A
geteilt durch (÷⍨
) 2, gefolgt von (,⍨
) der Zahl 2 enthält. (Wenn die Eingabe alsoUA OB DL KH
die Liste ist, ist (4, 2)).↓A⍴⍨
: Definieren Sie eine Matrix (⍴
) mit den Abmessungen dieser Liste, die die Werte von A enthält. Fügen Sie dann die Elemente ihrer Zeilen zusammen (↓
) und geben Sie beispielsweise eine Liste mit Listen an['UA','OB','DL','KH']
.A←
: Speichern Sie diese Liste in A.A≡∪A
:∪A
ist die Liste der eindeutigen Elemente in A. Wenn dies gleich A ist, gibt es keine Duplikate und dies gibt 1 zurück, andernfalls 0.÷
: Teilen Sie, was links ist (was die eigentliche Berechnung durchführt), durch das Ergebnis des Gleichheitstests. Wenn also keine Duplikate vorhanden sind, bleibt die Punktzahl unverändert, und wenn Duplikate vorhanden sind, erhalten SieDOMAIN ERROR
aufgrund der Division durch Null eine.⊃¨A
: Eine Liste mit dem ersten Element (⊃
) jedes Elements (¨
) von A. Dadurch wird der Anzugbuchstabe gelöscht und der Punktebuchstabe belassen. (UODK
)'D0.....KOU.'⍳
: Gibt den Index aller Punktebuchstaben in dieser Zeichenfolge an und gibt 12 für Werte zurück, die nicht in der Zeichenfolge enthalten sind. (10 9 1 8
)+/12-
: subtrahieren Sie alle diese von 12 und addieren Sie sie dann. (2 + 3 + 11 + 4 = 20
)quelle
Ruby 1.9, 52 Zeichen
Eingabe über Befehlszeilenargumente. Ich gehe davon aus, dass die Fehlermeldung bei doppelten Karten keine Rolle spielt, und beschwert sich daher nur über einen Fehler bei der Auswertung / Typkonvertierung.
Anwendungsbeispiel:
quelle
Scala,
8782 ZeichenWirft eine Ausnahme auf wiederholte Karten.
quelle
Haskell,
122108107 Zeichenquelle
error""
ist kürzer alsundefined
. Speichern Sie ein Zeichen mitinteract
.interact
es verwenden, wird keine neue Zeile gedruckt, daher bin ich mir nicht sicher, ob dies akzeptabel ist. Ich konnte jedoch viel mehr sparen, indem ich stattdessen ein unvollständiges Muster verwendeteundefined
.GolfScript
545352Bearbeiten 1:
Ich habe gerade einen Fehler im Code entdeckt. Es wurden keine doppelten Karten erkannt, wenn die doppelten Karten die ersten beiden in der Eingabe waren (weil ich den
*
Falzoperator und nicht/
jeden Operator für die erste Schleife verwendet habe).Jetzt habe ich den Code korrigiert und dabei auch 1 Zeichen entfernt. Hier ist die neue Version:
Die Eingabe muss sich als Zeichenfolge im angegebenen Format auf dem Stapel befinden (Beispiel :)
'7A UA DA'
.Wenn die Eingabe gültig ist, druckt das Programm den Gesamtwert der Karten.
Falls mindestens eine doppelte Karte vorhanden ist, löst das Programm die folgende Ausnahme aus:
Bearbeiten 2:
Nachdem ich diesen Beitrag auf der Meta-Site gesehen hatte , beschloss ich, eine Beschreibung des Codes zu veröffentlichen. Dies hat mir auch geholfen, einen Fehler zu finden und zu beheben. Also, hier geht's:
quelle
Python, 114 Zeichen
Leider
index
löst die Listenmethode in Python einen Fehler aus, wenn ein Element nicht gefunden wird, anstatt einen negativen Wert zurückzugeben, und für den Importdefaultdict
wären mehr Zeichen erforderlich als gespeichert.quelle
eTeX, 201 Zeichen (ohne die beiden irrelevanten Zeilenumbrüche)
Verwendet als
etex filename.tex [UA OB DL KH]
. Das Argument in Klammern zu setzen ist notwendig: Andernfalls kann eTeX nicht feststellen, dass wir das Ende der Argumentliste erreicht haben.BEARBEITEN: Wie in der Erklärung der Frage zulässig, kann eine falsche Eingabe (einen) Fehler verursachen. Zum Beispiel
etex filename.tex [OK]
stürzt schrecklich ab (weilK
keine gültige Farbe ist).quelle
etex -v
? Was ist die Fehlermeldung (ungefähr)? Der Code sollte in eine Datei eingefügt werden (mit Namenfilename.tex
oder irgendetwas anderem, das auf endet.tex
), und diesen Namen in der Befehlszeile verwendenetex filename.tex [<argument>]
. (Entschuldigung, den gleichen Kommentar erneut zu veröffentlichen, ich habe "@FUZxxl
" vergessen )K
ist keine gültige Farbe, und wennX
Sie sie in Ihren Beispielen durch ersetzen, werden die Fehler behoben (es stürzt ab,K
weil dieser Buchstabe eine andere Bedeutung hat, König). Ich könnte den Fehler weniger schrecklich machen, indem ich ihn\string
vor jedem hinzufüge##1
, aber das würde 12 weitere Zeichen kosten.PowerShell, 79
80Wirft »Versuch, durch Null zu teilen.«, Wenn die Karten zweimal erscheinen.
quelle