Votre tâche consiste à écrire un petit programme, qui compte les points d'une main Skat. Un deck Skat a les cartes 7 à 10, Jack, Queen, King et Ace (appelées Unter, Ober, König et Daus). Nous utilisons les costumes allemands, qui ont des glands, des feuilles, des coeurs et des cloches au lieu de clubs, piques, coeurs et diamants. Les points sont déterminés par le numéro sur la carte:
- 7, 8 et 9 sont 0 points
- Unter est 2 points
- Ober est de 3 points
- König est de 4 points
- 10 est 10 points
- Daus est de 11 points.
Entrée sortie
Le format d'entrée se compose de deux symboles, le premier représente la valeur, tandis que le second représente la combinaison:
- 7, 8 et 9 représentent eux-mêmes
- 0 (zéro) représente 10
- Unter, Ober, König et Daus sont nommés d'après leurs premières lettres (U, O et D)
- La même chose pour les glands, les feuilles, les coeurs et les ventres (A, L, H et B)
L'entrée est une seule ligne de cartes, séparée par un seul espace blanc. Vous pouvez prendre l'entrée de n'importe où, les arguments de la ligne de commande sont également corrects. La sortie est la valeur de l'aiguille, imprimée ou retournée sous forme de code de sortie. La sortie de votre programme doit afficher une erreur, si une carte apparaît deux fois dans la main. (Il 7A 0L 7A
faut donc retourner une erreur au lieu de 10
). Il est également correct de quitter avec un code de sortie de 255 au lieu d'afficher une erreur, si c'est la manière par défaut de votre programme de sortir le résultat.
Exemples
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
donne 1207A 8L 0K DB 8L
donne une erreurUA OB DL KH
donne 20
Règles
- Code golf: le code le plus court gagne
- Les règles de golf du code habituel s'appliquent
- Le programme doit fonctionner pour toutes les mains, pas seulement les exemples
- GIGO: Si l'entrée n'est pas valide, la sortie peut être arbitraire
la source
Réponses:
APL (
5448)Il doit y avoir un moyen plus court de sélectionner la valeur de la carte, mais je ne la vois pas.
Vous obtenez un
DOMAIN ERROR
s'il y a une carte en double.Explication:
A←⍞~' '
: store (←
) dansA
une ligne d'entrée utilisateur (⍞
) sans (~
) les espaces.2,⍨2÷⍨⍴A
: une liste à deux éléments, contenant la longueur de (⍴
)A
divisé par (÷⍨
) 2, suivi de (,⍨
) le nombre 2. (Donc, si l'entrée estUA OB DL KH
la liste est (4, 2)).↓A⍴⍨
: définir une matrice (⍴
), avec les dimensions de cette liste, contenant les valeurs de A. Puis joindre les éléments de ses lignes ensemble (↓
), donnant une liste de listes, par exemple['UA','OB','DL','KH']
.A←
: Stocker cette liste dans A.A≡∪A
:∪A
est la liste des éléments uniques dans A. Si cela est égal à A, il n'y a pas de doublons et cela renvoie 1, sinon 0.÷
: divisez ce qui est à gauche (qui fait le calcul réel) par le résultat du test d'égalité. Donc, s'il n'y a pas de doublons, le score est inchangé et s'il y a des doublons, vous obtenez un enDOMAIN ERROR
raison de la division par zéro.⊃¨A
: Une liste donnant le premier élément (⊃
) de chaque élément (¨
) de A. Cela laisse tomber la lettre de costume, laissant la lettre de score. (UODK
)'D0.....KOU.'⍳
: donne l'index de chacune des lettres de score de cette chaîne, renvoie 12 pour les valeurs ne figurant pas dans la chaîne. (10 9 1 8
)+/12-
: soustrayez tous ces éléments de 12, puis ajoutez-les ensemble. (2 + 3 + 11 + 4 = 20
)la source
Ruby 1.9, 52 caractères
Entrée via des arguments de ligne de commande. Je suppose que le message d'erreur lorsque des cartes en double n'a pas d'importance, il se plaint simplement d'une erreur de conversion eval / type.
Exemple d'utilisation:
la source
Scala,
8782 caractèresLève une exception sur les cartes répétées.
la source
Haskell,
122108107 caractèresla source
error""
est plus court queundefined
. Enregistrez un caractère en utilisantinteract
.interact
n'imprimera pas de nouvelle ligne, donc je ne sais pas si c'est acceptable. Cependant, j'ai pu économiser beaucoup plus en utilisant un modèle incomplet au lieu deundefined
.GolfScript
545352Modifier 1:
Je viens de découvrir une erreur dans le code. Il n'a pas détecté de cartes en double si les doublons étaient les deux premiers dans l'entrée (parce que j'utilisais l'
*
opérateur de pliage et non/
chaque opérateur pour la première boucle).Maintenant, j'ai corrigé le code et j'ai également réussi à supprimer 1 caractère dans le processus. Voici la nouvelle version:
L'entrée doit être sur la pile sous forme de chaîne, au format spécifié (exemple:)
'7A UA DA'
.Si l'entrée est valide, le programme imprime la valeur totale des cartes.
Dans le cas où il y a au moins une carte en double, le programme lève l'exception suivante:
Modifier 2:
Après avoir vu ce post sur le méta site , j'ai décidé de poster une description du code. Cela m'a également aidé à trouver et à corriger une erreur. Alors, voici:
la source
Python, 114 caractères
Malheureusement, la
index
méthode des listes en Python génère une erreur si un élément n'est pas trouvé plutôt que de renvoyer une valeur négative, et l'importationdefaultdict
nécessiterait plus de caractères qu'elle n'en enregistrerait.la source
eTeX, 201 caractères (sans compter les deux sauts de ligne non pertinents)
Utilisé comme
etex filename.tex [UA OB DL KH]
. Mettre l'argument entre crochets est nécessaire: sinon, eTeX n'a aucun moyen de déterminer que nous avons atteint la fin de la liste des arguments.EDIT: comme autorisé dans l'énoncé de la question, une entrée incorrecte peut provoquer (une) erreur. Par exemple, se
etex filename.tex [OK]
bloque horriblement (car ceK
n'est pas une couleur valide).la source
etex -v
? Quel est le message d'erreur (en gros)? Le code doit être placé dans un fichier (avec un nomfilename.tex
ou toute autre chose se terminant par.tex
) et utiliser ce nom dans la ligne de commandeetex filename.tex [<argument>]
. (désolé de republier le même commentaire, j'ai oublié "@FUZxxl
")K
n'est pas une couleur valide, et le remplacer parX
dans vos exemples supprime les erreurs (il se bloque avecK
parce que cette lettre a une autre signification, King). Je pourrais rendre l'erreur moins horrible en ajoutant\string
avant chacun##1
, mais cela coûterait 12 caractères de plus.PowerShell, 79
80Lance »Tentative de division par zéro.« Si les cartes apparaissent deux fois.
la source