Su tarea es escribir un pequeño programa que cuente los puntos de una mano Skat. Una baraja Skat tiene cartas 7 a 10, Jack, Reina, Rey y As (llamadas Unter, Ober, König y Daus). Utilizamos los trajes alemanes, que tienen bellotas, hojas, corazones y campanas en lugar de palos, espadas, corazones y diamantes. Los puntos están determinados por el número en la tarjeta:
- 7, 8 y 9 son 0 puntos
- Unter es 2 puntos
- Ober es de 3 puntos
- König es de 4 puntos
- 10 es 10 puntos
- Daus tiene 11 puntos.
De entrada y salida
El formato de entrada consta de dos símbolos, el primero representa el valor, mientras que el segundo representa el palo:
- 7, 8 y 9 representan ellos mismos
- 0 (cero) representa 10
- Unter, Ober, König y Daus llevan el nombre de sus primeras letras (U, O y D)
- Lo mismo para Bellotas, Hojas, Corazones y Vientre (A, L, H y B)
La entrada es una sola línea de tarjetas, separadas por un solo espacio en blanco. Puede tomar la entrada desde cualquier lugar, los argumentos de la línea de comandos también están bien. El resultado es el valor de la mano, ya sea impreso o devuelto como un código de salida. La salida de su programa debe mostrar un error, si alguna tarjeta aparece dos veces en la mano. (Por 7A 0L 7A
lo tanto, debe devolver un error en lugar de 10
). También está bien salir con un código de salida de 255 en lugar de mostrar un error, si esta es la forma predeterminada de su programa para generar el resultado.
Ejemplos
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
da 1207A 8L 0K DB 8L
da un errorUA OB DL KH
da 20
Reglas
- Código de golf: el código más corto gana
- Se aplican las reglas habituales de golf de código
- El programa tiene que funcionar para todas las manos, no solo para los ejemplos.
- GIGO: si la entrada no es válida, la salida puede ser arbitraria
fuente
Respuestas:
APL (
5448)No tiene que haber una manera más corta de seleccionar el valor de la tarjeta, pero no lo ven.
Obtienes un
DOMAIN ERROR
si hay una tarjeta duplicada.Explicación:
A←⍞~' '
: almacenar (←
) enA
una línea de entrada del usuario (⍞
) sin (~
) los espacios.2,⍨2÷⍨⍴A
: una lista de dos elementos, que contiene la longitud de (⍴
)A
dividida por (÷⍨
) 2, seguida de (,⍨
) el número 2. (Entonces, si la entrada esUA OB DL KH
la lista es (4, 2)).↓A⍴⍨
: define una matriz (⍴
), con las dimensiones de esa lista, que contiene los valores de A. Luego une los elementos de sus filas (↓
), dando una lista de listas, por ejemplo['UA','OB','DL','KH']
.A←
: Almacene esta lista en A.A≡∪A
:∪A
es la lista de elementos únicos en A. Si es igual a A, no hay duplicados y esto devuelve 1, de lo contrario 0.÷
: divide lo que está a la izquierda (que hace el cálculo real) por el resultado de la prueba de igualdad. Entonces, si no hay duplicados, el puntaje no cambia y si hay duplicados, obtienes un resultadoDOMAIN ERROR
debido a la división por cero.⊃¨A
: Una lista que da el primer elemento (⊃
) de cada elemento (¨
) de A. Así que esto deja caer la letra del palo, dejando la letra del puntaje. (UODK
)'D0.....KOU.'⍳
: da el índice de cada una de las letras de puntuación en esta cadena, devuelve 12 para los valores que no están en la cadena. (10 9 1 8
)+/12-
: restar todo esto de 12, y luego sumarlos. (2 + 3 + 11 + 4 = 20
)fuente
Ruby 1.9, 52 caracteres
Entrada a través de argumentos de línea de comando. Supongo que el mensaje de error cuando tener tarjetas duplicadas no importa, por lo que solo se queja de un error de conversión eval / type.
Ejemplo de uso:
fuente
Scala,
8782 caracteresLanza una excepción en tarjetas repetidas.
fuente
Haskell
122108107 caracteresfuente
error""
es más corto queundefined
. Ahorra un personaje usandointeract
.interact
no imprimirá una nueva línea, por lo que no estoy seguro de si eso es aceptable. Sin embargo, pude ahorrar mucho más usando un patrón incompleto en lugar deundefined
.GolfScript
545352Editar 1:
Acabo de descubrir un error en el código. No detectó tarjetas duplicadas si los duplicados eran los dos primeros en la entrada (porque estaba usando el
*
operador de plegado y no el/
operador de cada uno para el primer bucle).Ahora arreglé el código y también logré quitar 1 carácter en el proceso. Aquí está la nueva versión:
La entrada debe estar en la pila como una cadena, en el formato especificado (ejemplo:)
'7A UA DA'
.En caso de que la entrada sea válida, el programa imprime el valor total de las tarjetas.
En caso de que haya al menos una tarjeta duplicada, el programa genera la siguiente excepción:
Edición 2:
Después de ver esta publicación en el meta sitio , decidí publicar una descripción del código. Esto también me ayudó a encontrar y corregir un error. Entonces, aquí va:
fuente
Python, 114 caracteres
Desafortunadamente, el
index
método de listas en Python genera un error si no se encuentra un elemento en lugar de devolver un valor negativo, y la importacióndefaultdict
requeriría más caracteres de los que ahorraría.fuente
eTeX, 201 caracteres (sin contar los dos saltos de línea irrelevantes)
Usado como
etex filename.tex [UA OB DL KH]
. Es necesario poner el argumento entre paréntesis: de lo contrario, eTeX no tiene forma de determinar que llegamos al final de la lista de argumentos.EDITAR: según lo permitido en la declaración de la pregunta, una entrada incorrecta puede causar (un) error. Por ejemplo, se
etex filename.tex [OK]
bloquea horriblemente (porqueK
no es un color válido).fuente
etex -v
? ¿Cuál es el mensaje de error (aproximadamente)? El código debe colocarse en un archivo (con el nombrefilename.tex
o cualquier otra cosa que termine en.tex
) y usar ese nombre en la línea de comandoetex filename.tex [<argument>]
. (perdón por volver a publicar el mismo comentario, lo olvidé "@FUZxxl
")K
no es un color válido, y al reemplazarloX
en sus ejemplos elimina los errores (se bloqueaK
porque esa letra tiene otro significado, King). Podría hacer que el error sea menos horrible agregando\string
antes de cada uno##1
, pero eso costaría 12 caracteres más.PowerShell, 79
80Lanza »Intentó dividir por cero.« Si las cartas aparecen dos veces.
fuente