La situación:
Varios ( M
) enanos han encontrado un cofre de duende con N
monedas de oro y tienen que dividirlos. Debido a las antiguas reglas que rigen la asignación del botín a los piratas en orden de antigüedad, el enano más viejo debería obtener una moneda más que el siguiente enano más antiguo, y así sucesivamente, de modo que el enano más joven obtenga M-1
menos monedas que el enano más viejo. Además, ningún enano tiene que lanzar ninguna moneda (es decir, no hay monedas negativas para ningún enano)
Ayuda a los enanos a dividir las monedas de esta manera, o diles que esto es imposible.
El código del ganador siempre debe responder correctamente (este desafío es determinista) y seguir las reglas generales del código de golf .
Entrada
Se le da un número entero N (3 ≤ N ≤ 1000) para el número de monedas y un número entero M (3 ≤ M ≤ N) para el número de enanos, separados por espacios.
Salida
Si es imposible dividir las monedas de la manera que los enanos quieren, imprima -1 (menos uno). De lo contrario, imprime el número de monedas que recibirá cada enano, del más antiguo al más joven. Separa los números con espacios.
Muestras :
entrada
3 3
salida
2 1 0
entrada
9 3
salida
4 3 2
entrada
7 3
salida
-1
entrada
6 4
salida
3 2 1 0
Respuestas:
J -
32292825Nomás corto que otra solución J,peroy usa una idea diferenteLa respuesta para la cantidad de monedas que obtiene el gnomo de mayor rango es simplemente
N/M+(M-1)/2
(si es un número entero), construimos lo negativo de esto-:@-.@]-%
. Luegoi:
crea una matriz como esa2 1 0 _1 _2
para el argumento_2
y tomamos M elementos de ella.fuente
i:
. Puede guardar otros tres caracteres escribiendo en%
lugar de[%]
y usando en-.@]
lugar de(1-])
.J - 30 char
Muy divertido para el golf. Muchas cosas salieron bien.
Explicación:
/
- Tome los enteros separados por espacios como argumento y deslice la función entre ellos. Es decir, considere N el argumento izquierdo de la función entre paréntesis(...)
y M el argumento correcto.i.&-
- Negate (-
) y luego tomar enteros (i.
). Normalmente, cuando haces algo como loi.5
haces0 1 2 3 4
.i.
Sin embargo, cada vez que recibe un número negativo, invierte esa lista de salida. Entonces, por ejemploi._5
, dará4 3 2 1 0
.s=.+/&
- Realice la acción anterior en cada argumento (&
) y luego haga una tabla de suma (+/
) de estas matrices. Ahora tenemos una tabla donde cada fila es una posible distribución de monedas a M enanos, aunque tal vez no cuando hay N monedas. Finalmente, este verbo de creación de tablas es tan útil que lo llamaremoss
y lo usaremos más tarde.+/@s~
- Ahora, usamoss
nuevamente, pero intercambiamos (~
) el orden de los argumentos, de modo que transponemos la tabla. Esta es una forma de golf de tomar la suma de cada fila después de crear la tabla (+/@
), teniendo que ver con la forma en que J resume las listas multidimensionales.i.[
- En esta lista de sumas, buscamos el argumento izquierdo del verbo, es decir, N. Si N es un elemento, obtenemos ese índice; de lo contrario, obtenemos la longitud de la lista, que en particular es un índice no válido.{ ::_1:
- Ahora intentamos usar el índice para extraer una fila de la tablas
.{
arrojará un error de dominio si el índice no es válido, por lo que en ese caso detectaremos el error (::
) y devolveremos -1 (_1:
). Esto maneja todo. Como usamosi.&-
anteriormente, la distribución de monedas será en orden descendente, como se requería.Uso:
fuente
9 3
debe volver4 3 2
, no-1
. Parece que hay una transposición en su uso de ejemplo?9 3
da4 3 2
y7 3
da_1
, como se esperaba.R -
7170676665 caracteresSin golf:
Solución:
Si M es el número de enanos, entonces la secuencia de oro pagado puede descomponerse en dos series singulares. Primero una serie que termina en cero: M-1, ..., 2, 1, 0 y una serie constante de c, c, ..., c. La suma de la primera serie es siempre M * (M-1) / 2. Entonces, si el resto (x = N - M * (M-1) / 2) podría dividirse sin residuo (módulo igual a 0), cada enano obtiene x / M más la parte de la serie decreciente.
Uso:
fuente
m*(m+1)/2
consum(1:m)
PHP (187)
Es mi primer intento de jugar al golf, y sé que podría ser mejor, pero aún así :)
Golfizado:
Sin golf:
Ejecutar en un shell
Idea básica:
Las monedas se pueden separar por estas reglas, si una de estas es verdadera:
Si es así, tomamos como base las monedas promedio por enano (ACPD). Pero tenemos que comenzar desde lo más alto y la producción hasta llegar a lo más bajo. Así que hacemos un bucle con contador a partir de ACPD + la cuenta del resto de los enanos hacia el extremo superior, y continuamos hasta llegar a la ACPD, la cuenta del resto de los enanos hacia el extremo inferior.
Básicamente es lo mismo si los enanos son impares (es decir, 5 enanos: el del medio es 3 y en ambos extremos quedan 2), pero no si son pares, por eso confiamos en el piso Y en la ronda.
Problemas hasta ahora: funciona con un número de monedas demasiado bajo, lo que significa que algunos enanos serán golpeados y despojados de sus preciosas ganancias. Y esto es triste. O al menos si te gustan los enanos.
Solución :
Solución más inteligente :
Las monedas son de metal. Haz que los enanos los derrita a todos, y luego lánzalos en una cantidad menor / mayor de monedas, para que sean divisibles en cualquier caso.
La solución más inteligente :
Roba su montaña, renómbrate a Smaug y quédatelo todo para ti. Después de todo, ¿por qué tienes que molestarte con enanos gruñones?
fuente
Python 3 (100)
Usando la misma idea que @Geobits pero conforme a los requisitos de entrada y salida.
fuente
Python 3 -
1091071031029093Usando la misma idea que Evpok, pero con una serie de mejoras.
Las mejoras son:
fuente
[::-1]
es mejor que mi solución. +1Python 3 - 114
Funciona comprobando si
N-(M*(M-1)/2)
es divisible porM
. Nuevo en python, por lo que cualquier consejo es apreciado.Ejemplo de Ideone.com
fuente
print
estilo de declaración de Python 2 ? ¿O cómo la última línea (else:print -1
) no produce un error?C # - 322
Puntuación horrible pero tomé un enfoque diferente y pude usar
goto
:)Lo acortaré más tarde.
fuente
Convert.ToInt16
llamadas a soloint.Parse
. Puede declarar cualquier variable preasignada convar
(en lugar de, por ejemploint[]
). Sus parámetros de línea de comandos no necesitan ser llamadosargs
. Y puede alias tipos de uso frecuente comousing C = Console
. También creo que para una solución tan larga, es mejor presentar el espacio entre líneas intacto en lugar de guardar solo un par de caracteres. Ah, y tampoco estoy muy seguro de por quégoto
es mejor que las alternativas aquí ...Java 210
fuente
class A{public static void main(String[]a)
es válida y le ahorra 3 caracteres. Después de cada unoif
, y alrededor de cada unofor
, elimine el espacio en blanco ... etc.R:
777370 caracteresCree un vector que vaya de (M-1) a 0 y agregue 1 a cada número hasta que la suma ya no sea inferior a N. Si es superior, la salida -1 o la salida del vector.
Sangrado y un poco sin golf:
Ejemplo de uso:
fuente
Julia, 45
Solo un poco de álgebra, me llevó mucho más tiempo del que debería.
fuente
JavaScript - 76
Probablemente podría haber escrito esto más corto en otro idioma, pero aún no había una solución JS, así que aquí está:
Ejecutar en la consola.
Entrada de ejemplo:
Salida:
Entrada:
Salida:
Entrada:
Salida: -1
Lástima que console.log sea tan largo deletrear :) Desafortunadamente, declararlo
l=console.log.bind(console)
no lo hace más corto, y simplementel=console.log
no funciona.Entrada:
Salida:
fuente
c=console
yc.log()
acortarlo.Golfscript, 35
Cómo funciona
En el siguiente ejemplo, la entrada es
9 3
.fuente
Delphi XE3 (176)
Cómo funciona.
Lee 2 enteros, monedas y enanos.
Resta la diferencia por enano.
Si el resto mod enanos> 0 es imposible.
De lo contrario, obtenga la misma participación por enano en un bucle de enanos-1 a 0 e imprime dwarfIndex + igual participación
Sin golf
fuente
Mathematica 65
La función,
g
genera todas las secuencias de aumento por uno, de longitud m, de 0 a n y comprueba si alguna de ellas suma m. Si tiene éxito, se devuelve la secuencia; de lo contrario, se devuelve -1.Las secuencias se realizan
Partition
incorporando la lista {0,1,2,3 ... m} en todas las sublistas posibles de n enteros contiguos.Por supuesto, hay formas más eficientes de lograr el mismo efecto, pero las que he encontrado requieren más código.
Ejemplos
fuente
C 131
Sin golf
Esto se compila con una advertencia porque main no tiene tipo. Si esto no es válido en las reglas del golf, tendría que agregar cinco caracteres.
fuente
Cobra - 198
Sitio web de Cobra
Explicado:
Requerido para que se ejecute el código
Toma datos y los almacena como
a
yb
Inicializa la lista de salida
l
e inicializa el dinero total requeridot
y el número de monedas para agregar a cada pila de enanosn
Encuentra el valor monetario más bajo posible que dará como resultado que todos los enanos tengan un número permitido de monedas en su pila
Determina cuántas monedas agregar a cada pila para que el dinero total requerido sea> = al dinero total disponible
Llena la lista con montones de dinero de diferentes tamaños.
Salidas
-1
ol
dependiendo de si el dinero total requerido es igual al dinero total disponiblefuente
Perl 5 , 78 + 1 (-n) = 79 bytes
Pruébalo en línea!
fuente
Python (
1009694):Una buena respuesta de puntaje redondo.Ya no más, pero ahora es más corto.Sin golf:
Salida:
fuente