Creo que todos están familiarizados con los dardos, algunas personas no entienden los puntajes, por lo que para esas personas aquí hay un enlace útil sobre eso.
El tablero
Un tablero de dardos se puede comparar con un pastel cortado en 20 piezas. Cada pieza está dividida en 4 secciones.
- un pequeño anillo externo llamado doble (puntos x2)
- un gran anillo llamado single (puntos x1)
- otro pequeño anillo llamado triple (puntos x3)
- otro gran anillo llamado single (puntos x1)
En el centro del tablero hay 2 anillos más, uno verde y rojo (tablero clásico)
- Anillo rojo, centro del tablero llamado diana o doble toro y es bueno por 50 puntos. Este cuenta como un doble y por eso está permitido pagar con él.
- Anillo verde, llamado toro, toro simple o simplemente 25 y cuenta como un solo.
Desafío
Encuentra todas las posibilidades de pago con 3 dardos o menos.
El usuario puede ingresar un número entero y deberá verificar si es posible obtener el puntaje a 0 con 3 dardos (o menos).
Ejemplos
Ejemplo 1:
Input: 170
Output: T20, T20, Bullseye
Ejemplo 2
Input: 6
Output: D3;
S3,S1,D1;
S2,D2;
S2,S2,D1;
D2,D1;
S4,D1;
D1,D1,D1;
S1,S1,D2;
T1,S1,D1;
Ejemplo 3
Input: 169
Output: No possible checkout!
Reglas
- Regla básica de dardos, debes terminar con un doble (anillo exterior del tablero o diana)
- Sin uso de recursos externos.
- Se permite la codificación dura de posibles pagos, pero recuerde que esto es codegolf, no obtendrá su código corto;)
- Las celdas para golpear se mostrarán en formato C + N donde C = T para Triple, D para doble y S para simple.
- bullseye puede llamarse bullseye o DB, DBull o algo similar.
Posibles pagos
Para comenzar, el pago más alto posible es 170.
169,168,166,165,163,162,159 no son posibles en 3 dardos.
El pago más bajo posible es 2.
Adicionalmente
Esto no es un requisito, agregue la posibilidad de mostrar todos los pagos posibles para todos los puntajes. Básicamente porque me pregunto cuántas combinaciones son posibles: P
El ganador será el que tenga el código más corto.
Feliz codificación
Respuestas:
C ++
248/228230/214 caracteresRev 0:
Rev 1. Guardado algunos caracteres declarando todas las variables a la vez y eliminando corchetes innecesarios. Resulta que en C ++ toda lógica y bit a bit y / o tienen menor prioridad que las comparaciones.
Hice una función en lugar de un programa, como lo han hecho otros. Devuelve el número total de posibilidades encontradas. Se puede reducir de 230 a 214 caracteres eliminando la función de totalización.
Salida de muestra, puntaje 6:
Cuento diferentes dardos primero y segundo como la misma combinación, como lo ha hecho el OP (ejemplo:
T1 S1 D1 = S1 T1 D1) aunque esto cuesta 7 caracteres adicionales. Siempre enumero el puntaje más alto primero (haciendo caso omiso de duplicar y triplicar) ya que creo que esto es más relevante para el jugador (que puede cambiar su estrategia si falla con el primer dardo). Por la misma razón, enumero los dardos en orden de acuerdo con El segundo dardo. Considero que el tercer dardo es completamente diferente a los otros dos, por lo tanto, considero que D1 D2 y D2 D1 son casos diferentes, mientras que el OP los enumera como iguales.
Con este sistema de conteo obtengo 42336 posibilidades totales , lo mismo que mmumboss. Contando diferentes dardos primero y segundo como combinaciones diferentes, esto va hasta 83349.
No he usado un bucle for con conjuntos como lo han hecho otros (soy bastante nuevo en C ++ y ni siquiera sé si es posible). En cambio, abuso de un condicional en el incremento del bucle para saltar de 20 a 25 Utilizo la variable de un solo bucle para codificar todas las puntuaciones posibles para un solo dardo, así: S1 D1 T1 S2 D2 T2, etc. con módulo y división para decodificar. Esto ahorra la verbosidad de declarar más para bucles, aunque hace que las expresiones sean más complicadas.
El resultado de esto es que un dardo no utilizado se muestra como T0, pero creo que está claro lo que significa, especialmente porque (al considerar diferentes dardos primero y segundo como la misma combinación) he podido agruparlos todos al principio de mi salida
Versión sin golf aquí. Algunas otras características son el uso selectivo de los operadores & y && con | de manera tal de dar el orden de precedencia que quiero sin paréntesis.
fuente
MATLAB (
299249241 caracteres)Este es mi primer juego de golf serio. Mi primer intento (136 caracteres) da el resultado correcto, pero no con el formato correcto. Da todas las posibilidades mirando el número de puntos para cada dardo. Esto significa que solo 20 y doble 10 tienen una entrada separada, sin embargo, ambos se muestran como 20. Por supuesto, el último dardo siempre es un doble.
En el segundo intento, se mejora el formato, que por supuesto ha aumentado el número de caracteres:
Mejorado de 299 a 249 caracteres, al mismo tiempo que incluso mejora el formato de salida. Para esta versión mejorada, la salida para los casos de ejemplo es:
f (170):
f (6):
f (169):
Adicional:
Según mis habilidades de cálculo, hay un total de 42336 posibilidades para finalizar el juego de dardos.
fuente
60 60 50
debería serT20 T20 Bullseye
. Dejaré esto más claro en la pregunta. Bien hecho, casi allí :)Rubí (260 caracteres)
"El último debería ser un doble" fue la pieza que faltaba; no podía entender por qué 168 no debería tener resultados ...:
c. (170)
c. (6)
fuente
Python 2.7 (270 caracteres)
No estoy seguro de que Python permita una línea, pero él está en tres.
O más de 278 caracteres con un mensaje apropiado de 'No pago' (por ejemplo, 290 aquí):
Aquí vamos:
f (170)
f (6)
f (169)
Cosas con las que no estoy contento:
Esto es más del 10% del total. ¿Existe una forma más compacta sin itertools, etc.?
Esto se utiliza para evitar duplicados en el caso de un acabado de dos dardos (por ejemplo, ['', 'S1', 'D1'] y ['S1', '', 'D1']). Considero que el orden es importante (oye, el último dardo tiene que ser doble, así que claramente el orden es importante), pero el no lanzamiento es un caso especial.
fuente
05AB1E , 43 bytes
Bastante lento. Se muestra como una lista de listas o una lista vacía si no es posible finalizar. Mis toros son
S25
yD25
; Si esto no está permitido, puedo cambiarlo.Pruébelo en línea o verifique algunos casos de prueba a la vez .
Explicación:
Hay un par de pasos:
1) Cree una lista de todos los posibles dardos simples, dobles y triples:
2) Obtenga todos los finalizadores posibles (que terminan con un doble) de hasta 3 dardos:
3) Solo mantenga aquellos para los cuales la puntuación total es igual al entero de entrada:
4) Convierta los datos a la lista de resultados impresa (es decir, se
[[20,3],[5,1],[1,2]]
convierte en["T20","S5","D2"]
):fuente
Kotlin , 254 bytes
Nota: el algoritmo se basa en la respuesta C ++ de Level River St.
Pruébalo en línea!
fuente