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 7Alo 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 DBda 1207A 8L 0K DB 8Lda un errorUA OB DL KHda 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 ERRORsi hay una tarjeta duplicada.Explicación:
A←⍞~' ': almacenar (←) enAuna línea de entrada del usuario (⍞) sin (~) los espacios.2,⍨2÷⍨⍴A: una lista de dos elementos, que contiene la longitud de (⍴)Adividida por (÷⍨) 2, seguida de (,⍨) el número 2. (Entonces, si la entrada esUA OB DL KHla 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:∪Aes 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 ERRORdebido 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.interactno 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
indexmétodo de listas en Python genera un error si no se encuentra un elemento en lugar de devolver un valor negativo, y la importacióndefaultdictrequerirí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 (porqueKno 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.texo 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")Kno es un color válido, y al reemplazarloXen sus ejemplos elimina los errores (se bloqueaKporque esa letra tiene otro significado, King). Podría hacer que el error sea menos horrible agregando\stringantes 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