Manteniendo este desafío corto.
Te dan 4 números: p1, p2, p3 y p4.
La suma mágica de los números se define de la siguiente manera:
magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|
Solo puede cambiar uno de los valores enteros anteriores (p1, p2, p3 o p4). Debe cambiar el valor de modo que la suma mágica de los valores alcance su valor mínimo.
Por ejemplo:
p1, p2, p3, p4 = 17, -6, 15, 33. El valor de la suma mágica es 78 en este caso.
Puede cambiar el -6 aquí a 16, y el valor de la suma mágica se convertirá en 36, que es el valor mínimo alcanzable.
Tenga en cuenta que los números pueden ser enteros positivos o negativos.
Este es el código de golf, por lo que gana menos bytes en el código. Brownie apunta por usar un lenguaje práctico sobre un lenguaje recreativo. Que el 4 de mayo esté contigo.
Reiterar:
Muestra 1
Entrada 1
17 -6 15 33
Salida 1
36
Explicacion 1
El -6 puede ser reemplazado por 16 y eso nos da la mínima suma mágica posible.
Muestra 2
Entrada 2
10 10 10 10
Salida 2
0 or 2
cualquiera es aceptable
Explicacion 2
La suma mágica mínima alcanzable es 0 ya que la suma mínima de 4 enteros positivos es 0. Si se debe cambiar un número, entonces uno de los 10 se puede cambiar a un 9 y, por lo tanto, producir la salida 2.
Muestra 3
Entrada 3
1 2 3 4
Salida 3
4
Explicación 3
La entrada por sí sola produce 6 como su suma mágica. Cambiando el 4 a 1 y se obtiene la suma mágica mínima, que es 4.
fuente
+1
de mi parte.Respuestas:
Jalea , 6 bytes
Pruébalo en línea!
Un puerto de mi respuesta Python .
fuente
Python 2 , 44 bytes
Pruébalo en línea!
Ordena la entrada como
a,b,c,d,
en orden ascendente, toma la menor dec-a
yd-b
, y la duplica. ¿Por qué funciona esto?Primero, tenga en cuenta que cuando cambiamos un elemento para maximizarlo a la suma cíclica total de distancias, es óptimo (o empatado para óptimo) cambiarlo para que sea igual a un vecino, como
17, -6, 15, 33 -> 17, 17, 15, 33
. Esto se debe a que su nueva distancia total a sus vecinos cíclicos izquierdo y derecho es al menos la distancia entre esos vecinos, por lo que hacer que estos sean iguales es lo mejor que podemos hacer.Ahora, eliminar una de las dos copias adyacentes de un número da la misma suma cíclica de distancias. En el ejemplo, esto es
17, 15, 33
, dar distancias2 + 18 + 16
. Entonces, en lugar de reemplazar uno de los cuatro números, es equivalente a eliminarlo dejando tres números y usar la suma de sus distancias cíclicas.Observe que con 3 números, la distancia más grande es la suma de los dos más pequeños. Esto se debe a que si clasificamos los números a tener
a ≤ b ≤ c
, entonces|a - c| = |a - b| + |b - c|
. En otras palabras, viajamos entre el número más grande y el más pequeño dos veces, utilizando el número medio como parada en boxes una de las veces. Entonces, la suma de las tres distancias es solo el doble de la distancia entre el mínimo y el máximo, entonces(c-a)*2
.Entonces, la pregunta es qué número eliminamos para obtener la distancia más pequeña entre el mínimo y el máximo de los tres números restantes. Claramente eliminamos el más pequeño o el más grande de los números. Al llamarlos
a, b, c, d
en orden ordenado, eliminara
hojasd - b
y eliminard
hojasc - a
, y el resultado final es el doble, el que sea más pequeño.fuente
p1
a travésp5
, y aún así sólo se permite el cambio de un número? El caso de cuatro números parece demasiado fácil (solo después de ver su respuesta).R ,
6633 bytesPruébalo en línea!
Mucho más corto con el algoritmo de xnor (¡lee su explicación y vota tu publicación!).
Versión antigua:
R , 66 bytes
Pruébalo en línea!
Toma la entrada como un vector de 4 enteros.
Hay 4 formas de elegir qué número cambiamos; para cada uno de estos, solo tenemos que calcular la suma de 3 diferencias absolutas.
rbind
fuente
Jalea ,
1110 bytesPruébalo en línea!
Un enlace monádico que toma una lista si son enteros como entrada. Debería funcionar para un tamaño de lista arbitrario. Funciona sobre la base de que se puede obtener la suma mínima mediante la prueba de eliminar cada número de la lista, calcular la suma mágica y tomar el mínimo.
fuente
Jalea , 8 bytes
Un enlace monádico que acepta una lista de enteros * que produce un entero
* puede ser cualquier número siempre que haya más de 1; usando la misma fórmula mágica de estilo que resume las diferencias entre vecinos.
Pruébalo en línea!
¿Cómo?
fuente
Japt
-Q
, 11 bytesUtiliza el algoritmo de @ xnor, que me ahorró 4 bytes.
Guardado 5 bytes gracias a @Shaggy
Intentalo
fuente
ÃÃ
con una nueva línea.J ,
24201817 bytesversión alternativa usando el algoritmo xnor:
cómo
Dos veces
2 *
el mínimo de[:<./
la segunda fila restado de la primera fila[:-/
de la matriz 2x2 formada al dar forma a2 2$
la entrada ordenada\:~
Pruébalo en línea!
respuesta original: J , 24 bytes
Pruébalo en línea!
Usando la idea de Nick Kennedy.
1(...)\.]
aplicar el verbo en parens a todos los outfixes de longitud 1 (un outfix de longitud n es una lista con n elementos contiguos eliminados, por lo que esto produce todas las listas posibles con 1 olmo eliminado)(1 #. 2 |@-/\ ] , {.)
esto calcula la suma mágica agregando el primer olmo a la entrada] , {.
y aplicando la diferencia de abs|@-/
a los infijos de longitud 22 ...\
, y sumando el resultado1 #.
.[:<./
devuelve el minfuente
05AB1E ,
117 bytesRespuesta de Port of @xnor 's Jelly .
-4 bytes gracias a @Emigna y @Grimy .
Pruébalo en línea.
Alternativa de 7 bytes que solo funciona en la versión heredada de 05AB1E (requeriría un
€
antes¥
de la versión nueva):Pruébalo en línea.
Explicación:
fuente
{2ôø¥W·
u 8 con€
en la reescritura.{2ô`αW·
C ++ (gcc)
programa completo: 138 bytes
Pruébalo en línea!
función principal: 84 bytes
Pruébalo en línea!
También usando el algoritmo xnor explicado en su publicación de Python 2.
fuente
Carbón de leña , 20 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Resulta que estoy usando la idea de @ NickKennedy. Explicación:
fuente
JavaScript (ES6), 51 bytes
Usando el método mucho más inteligente de xnor :
Pruébalo en línea!
Respuesta original, 96 bytes
Toma la entrada como una matriz de 4 enteros.
Probablementeno sea el enfoque más corto.Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 29 bytes
Un puerto del algoritmo de @ xnor
Pruébalo en línea!
fuente
Java 8 , 235 bytes
Un puerto de respuesta y algoritmo Python de @ xnor
Pruébalo en línea!
Java 10 , no probado, 222 bytes
Con Java 10, debería poder reemplazar el lado izquierdo de la declaración del escáner
var
, aunque no pude compilarlo en línea y, por lo tanto, solo puedo agregarlo como una trivia. Lo siento.fuente