Publicación de sandbox (eliminada)
Las antiguas formaciones del ejército romano son muy famosas en todo el mundo. En estas formaciones, los legionarios romanos se agruparon en una forma geométrica (generalmente un rectángulo) protegiendo los flancos y la parte superior utilizando sus escudos. Los legionarios en posiciones interiores cubrían la parte superior colocando su escudo sobre sus cabezas, los legionarios en los flancos llevaban 2 o más escudos: uno para proteger la parte superior y uno o más escudos para proteger los flancos (si alguien estaba en la esquina tenía 3 escudos, si alguien estaba solo en una formación tenía 5 escudos Sí, sé que es imposible que un humano lleve 5 escudos, pero de alguna manera lo hicieron ). Usando esta formación, todos los legionarios romanos se protegieron y fueron el oponente más duro en ese momento.
La historia cuenta que hubo un general romano que declaró que la mejor forma de formación era el cuadrado (el mismo número de legionarios en filas y columnas). El problema era averiguar cuántas formaciones (y el tamaño) debía dividir su ejército para:
- No dejó ningún legionario fuera de una formación (aunque admitió formación de legionario único)
- Reduce la cantidad de escudos necesarios
El general, después de hacer algunos cálculos y matemáticas, descubrió que la mejor manera de lograr estas 2 condiciones es comenzar con el cuadrado más grande posible y luego repetir hasta que no quede ningún legionario .
Ejemplo:
Si 35 legionarios en su ejército, la formación consistía en
- Un cuadrado de legionarios de 5x5 (este es el cuadrado más grande posible).
Con los legionarios restantes (10)
- Un cuadrado de 3x3
Con los legionarios restantes (1)
- Un cuadrado de 1x1.
Al final se verá más o menos así:
5x5
* * * * * 3x3
* * * * * * * * 1x1
* * * * * * * * *
* * * * * * * *
* * * * *
Los legionarios en posiciones interiores cubrían la parte superior colocando su escudo sobre sus cabezas . Solo necesitaban 1 escudo.
* * * * *
* 1 1 1 * * * *
* 1 1 1 * * 1 * *
* 1 1 1 * * * *
* * * * *
Los legionarios en los flancos llevaban 2
* 2 2 2 *
2 1 1 1 2 * 2 *
2 1 1 1 2 2 1 2 *
2 1 1 1 2 * 2 *
* 2 2 2 *
Si alguien estaba en la esquina, tenía 3 escudos.
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 *
2 1 1 1 2 3 2 3
3 2 2 2 3
Si alguien estaba solo en una formación, tenía 5 escudos.
3 2 2 2 3
2 1 1 1 2 3 2 3
2 1 1 1 2 2 1 2 5
2 1 1 1 2 3 2 3
3 2 2 2 3
Esta formación requirió un total de 71 escudos.
Reto
- Calcule la cantidad de escudos necesarios para una cantidad X de legionarios
Entrada
- Cantidad de legionarios en el ejército.
Salida
- Cantidad de escudos necesarios.
Casos de prueba
35 => 71
20 => 44
10 => 26
32 => 72
- Aplican reglas estándar de código de golf
Amazon.com : Best-selling Nipple Shield Carrying Case, Perfect...
así que supongo que nunca lo sabré realmente. ¿Realmente llevaban 5 escudos, o era para que la pregunta funcionara: P?Respuestas:
Python 2 ,
605048 bytesPruébalo en línea!
¡Nuevo en el código de golf, pero dando mi mejor swing!
Método:
Suma
n^2 + 4n
dónden
está cada uno de los números cuadrados más grandes que suman a la entrada.Editar 1
¡Reducido a 50 bytes gracias a @Jonathan Frech!
Editar 2
Se cambió
int(s**.5)
as**.5//1
para guardar 2 bytes gracias a @ovsfuente
n*n
es más corto quen**2
ahorrarte dos bytes; más que eso no puedo decir ya que no escribo python ...int(s**.5)
se puede acortar as**.5//1
.//
Esta división de piso en Python 2 y 3. se3**.5//1
evalúa1.0
en ambas versiones.R ,
5150 bytesPruébalo en línea!
Un cuadrado de longitud lateral debe tener exactamente escudos. Reducimos por el cuadrado más grande menor o igual que hasta que sea cero, acumulando el número de escudos a medida que avanzamos.y y2+ 4 y X X
Prueba:
Dado un cuadrado perfecto de longitud lateral , necesitamos precisamente 1 escudo para cada miembro del cuadrado. A continuación, para cada miembro en el borde, necesitamos un escudo adicional. Hay miembros que no están en los bordes, por lo que hay miembros en los bordes. Finalmente, para cada esquina, necesitamos un escudo adicional. Además del caso donde , podemos sumar 4. Esto se simplifica a que afortunadamente también produce el valor correcto de cuando , lo que nos permite usarlo para todo .y ( y- 2 )2 y2- ( y- 2 )2 y=1 y2+4y 5 y=1 y
fuente
JavaScript (ES7), 34 bytes
Pruébalo en línea!
¿Cómo?
La fórmula es válida para , ya que .s 1 = 5w=1 s1=5
fuente
Jalea , 13 bytes
Pruébalo en línea!
-1 gracias a Jonathan Allan .
fuente
Julia 0.6 , 36 bytes
Pruébalo en línea!
Utiliza el mismo método que la respuesta R de @ Giuseppe, aunque mi método para llegar allí implicaba un pensamiento menos significativo y una inspección visual más justa: el cuadrado interno de 1s tiene dimensiones por , entonces eso tiene escudos. Alrededor de eso, hay 4 muros de soldados cada uno, cada uno con 2 escudos, por lo que agrega escudos. Finalmente, hay cuatro 3 en las cuatro esquinas, por lo que agrega 12 escudos.n2+4n (n−2) (n−2) (n−2)2 n−2 4∗(n−2)∗2
Sin golf:
(Esto también se puede hacer en 35 bytes con
n>0?(s=isqrt(n))*s+4s+f(n-s*s):0
, pero escribí esto para Julia 0.7 quería evitar las nuevas advertencias de desaprobación (los espacios que requieren son?
y:
).fuente
Stax , 15 bytes
Ejecutar y depurarlo
fuente
Brachylog , 26 bytes
Pruébalo en línea!
fuente
Retina 0.8.2 , 28 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte a decimal.
Empareja números impares. El primer paso por el grupo
\1
aún no existe, por lo que solo\G1
puede coincidir, que coincide con 1. Las coincidencias posteriores no pueden coincidir,\G1
ya que\G
solo coinciden al comienzo del partido, por lo que tenemos que hacer coincidir el11\1
que es 2 más que El partido anterior. Emparejamos tantos números impares como podamos y, por lo tanto, la coincidencia total es un número cuadrado, mientras que la última captura es uno menos del doble de su lado.$&
$1
Suma y convierte a decimal.
fuente
05AB1E , 17 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Solución temporal porque
ΔDtïÐns4*+Šn-}O
( 15 bytes ) no parece funcionar ... Pruébelo en línea en modo de depuración para ver a qué me refiero. Esperaría que fuera de[45,'35',25]
a[45,10]
después de la-
siguiente iteración deΔ
, pero aparentemente borra la pila excepto por el último valor y se convierte en[10]
, dando como resultado 0 al final ... No estoy seguro de si este es el comportamiento previsto o un error ... (EDITAR: está destinado, ver abajo).Explicación:
EDITAR: Aparentemente, el comportamiento que describí anteriormente
Δ
está destinado. Aquí hay dos alternativas de 17 bytes proporcionadas por @ Mr.Xcoder que se usanΔ
colocando valores en global_array (con^
) y recuperándolos nuevamente después (con¯
):Pruébelo en línea o verifique todos los casos de prueba .
Pruébelo en línea o verifique todos los casos de prueba .
fuente
dc , 25 bytes
Pruébalo en línea!
Calcula los escudos como
sum(n^2)
(el número original) más4*sum(n)
empujando una copia de cada longitud del lado cuadrado en el registro de la pila aa
medida que avanza, luego agrega todos los valores del registro aa
medida que la recursión se "desenrolla".fuente
Casco , 17 bytes
Pruébalo en línea!
Alternativa
Pruébalo en línea!
fuente
APL (Dyalog Unicode) ,
3130 bytesPruébalo en línea!
-1 byte gracias a @jslip
fuente
Ruby , 45 bytes
Pruébalo en línea!
fuente
PHP , 67 bytes
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
Usando la
-R
opción, esta versión es de 60 bytes :Ejemplo:
(en Linux, reemplace
"
con'
)Nota: Esto está usando la excelente fórmula de respuesta de Arnauld , no pude encontrar nada más corto que eso.
fuente
Pyth , 19 bytes
Una función recursiva, que debe llamarse usando
y
(ver el enlace).Pruébalo aquí!
Pyth , 21 bytes
El historial de revisiones es bastante divertido, pero asegúrese de visitarlo si desea una versión mucho más rápida :)
Pruébalo aquí!
Explicación
fuente
Swift 4 ,
111 99 8478 bytesPruébalo en línea!
Esa sensación al implementar manualmente la raíz cuadrada entera es mucho más corta que la incorporada ...
No golfista y explicado
fuente