Inspirado en /puzzling//q/626
En tus aventuras llegas a una serie de 7 puentes que tienes que cruzar. Debajo de cada puente vive un troll. Para cruzar el puente, primero debes darle al troll una cantidad de pasteles como porcentaje del número de pasteles que llevas. Debido a que estos son trolls amables, te devolverán una cierta cantidad de pasteles.
Al comienzo de cada día, el rey troll local establece el porcentaje de impuesto a la torta que cada viajero debe pagar, y el reembolso de la torta troll: la cantidad de tortas que cada troll debe devolver a los viajeros.
Su trabajo es calcular la cantidad mínima de pasteles necesarios para pasar los 7 puentes troll para las condiciones dadas en ese día.
Asumir:
- Dos parámetros de entrada: porcentaje de impuesto a la torta (entero de 0 a 100) y reembolso de la torta de trol
- Nadie, ni siquiera los trolls, quiere un pastel parcialmente comido por otro troll. Si te queda una fracción de pastel, el troll lo consigue.
- Si un troll acepta un impuesto sobre los pasteles, pero luego tiene que devolverle todos los pasteles (se queda con los mismos o menos pasteles que antes), se enojará y se comerá a usted y sus pasteles.
- Cada troll debe conservar al menos un pastel completo.
- Solo puedes llevar un máximo de 100 pasteles.
- Debe finalizar el día en el que se encuentra actualmente o al otro lado de los 7 puentes.
Desafío:
Escriba un programa completo para generar el número mínimo de pasteles para viajar para el día actual o cero si no es posible viajar hoy con seguridad; esperará para ver cuáles son los números mañana.
La entrada debe pasarse como stdin, argumentos de línea de comando o entrada de archivo.
El código más corto (recuento de bytes) gana.
Ejemplo:
25% de impuesto sobre la torta, reembolso del pastel de 2 troll.
comience con 19 pasteles
antes del troll 1: (19 * 0.75) = 14.25
después del troll 1: (14 + 2) = 16
antes del troll 2: (16 * 0.75) = 12
después del troll 2: (12 + 2) = 14
etc.
19 pasteles -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 pasteles -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (regla 3)
Para 18 pasteles, el último troll no podría quedarse con ningún pastel. Por lo tanto, el número mínimo de pasteles para un 25% / 2 días es 19.
input: 25 2
output: 19
Ejemplo 2
90% de impuesto sobre la torta, 1 reembolso de la torta troll
100 pasteles -> 11 -> 2 -> 1 (regla 4)
El tercer troll no pudo quedarse con ningún pastel. Por lo tanto, no es posible viajar en un 90% / 1 día incluso comenzando con el número máximo de pasteles.
input: 90 1
output: 0
Datos
Prepare un gráfico rápido de valores de entrada y salida. Me sorprendió que esto no fuera "suave" (como una curva de campana o similar); Hay varias islas notables.
Datos para los interesados. Las columnas se dividen en intervalos de 5%, las filas son unidades de intervalos de reembolso de 1 torta (Excel rotó la imagen). Puede ver que no puede haber un reembolso superior a 28 tortas.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
caso de 11 pasteles, le das al troll 2,75 pasteles y obtienes 2 para que el troll mantenga 0,75 (+. 25) y sobrevivas. En el90 1
caso de 2 pasteles, le das al troll 1.8 y regresas 1 para que el troll mantenga .8 (+. 2) pero mueres.Respuestas:
CJam,
46434139383633 bytesEntrada a través de ARGV.
Hay un intérprete en línea, pero desafortunadamente no admite argumentos de línea de comandos. Para probar, puedes imitarlo desde STDIN con esta versión:
Explicación de la versión basada en ARGV:
El contenido de la pila se imprime automáticamente al final del programa.
fuente
55 2
(en0
lugar de100
) y56 5
(en98
lugar de94
). Esto se debe a que100_0.55*-i
y25_0.56*-i
son víctimas de la imprecisión de punto flotante. Por lo que puedo decir, los pares también31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
dan resultados incorrectos.CJam,
44 40 38 3735 bytesO al usar argumentos y
{}#
trucos de la línea de comandos , 33 bytes :No poner este como mi
{}#
enfoque principal se inspira en la respuesta de Martin.Ejemplo de ejecución:
Entrada:
Salida:
Otro:
Entrada:
Salida:
Cómo funciona
Pruébalo en línea aquí
fuente
]W=
truco, pero hasta ahora, cada vez que trato de usarlo termino con el mismo número de caracteres.APL (39)
Explicación:
T R←⎕
: lea dos números desde el teclado y guárdelos enT
(impuesto) yR
(devolución).Z←⍳M←100
: almacena el número100
enM
, y todos los números de1
a100
enZ
.{
...}⍣7¨
: para cada elemento enZ
, ejecute la siguiente función 7 veces:R+⌊1-T÷M
: calcular cuántos pasteles hay que pagar,⍵(⊢×>)
: multiplica esa cantidad por 1 si el troll termina con más torta de la que comenzó, o por 0 si no.⊃Z/⍨
: para cada elementoZ
, repítalo por el número que le dio esa función. (De modo que todos los números para los que la función regresó0
desaparecen). Luego, seleccione el primer elemento de esa lista. Si la lista terminó vacía, esto da0
.fuente
C, 83 bytes
Si funciona, funciona para todos los pasteles de inicio posibles, no solo del 1 al 100.
EDITAR: funciona. Golfizado:
Con el límite 'máximo de 100 pasteles':
91 bytes.
fuente
CJam, 36 bytes
fuente
C ++ - 202 caracteres
Como de costumbre, mi C ++ hizo lo peor:
fuente
APL, 36
Explicación
Tenga en cuenta que hay un "umbral de pastel". Para la tasa de impuestos
x
y el reembolsoy
, necesitará estrictamente más quey÷x
pasteles para pasar el próximo puente.x y←⎕
tomar entrada y asignar ax
(impuesto) yy
(retorno)⍳x÷←100
dividirx
por 100, y luego generar una matriz de 1 a 100{y+⍵-⌈⍵×x}⍣6
llame a la función "pasar puente" 6 veces:⌈⍵×x
la cantidad de pasteles que tiene, la tasa de impuestos multiplicada por el redondeo (la cantidad que paga)⍵-
Reste de la cantidad de pasteles que tieney+
Agregue el reembolsoLuego obtienes una matriz de 100 elementos que muestra la cantidad de pasteles que te quedan después de cruzar 6 puentes si comienzas con 1 ~ 100 pasteles. Para ver si puede cruzar el último puente, verifique si está por encima del umbral
y÷x
. Alternativamente:x×
multiplique la matriz porx
y<
verificación si es mayor quey
Finalmente,
1⍳⍨
encuentre el índice de la primera aparición de1
(verdadero), devuelve101
si no se encuentra101|
mod 101fuente
C 128
Bastante similar a la otra solución C pero creo que es inevitable. El truco principal es salir del bucle interno con diferentes valores dependiendo de si se completa o no. Esto me permite usar?: Cuando no podía si usaba break;
Sin golf
fuente