Introducción
Su objetivo es encontrar la menor cantidad de unidades que necesita sumar o multiplicar para obtener el valor de entrada, esto es A005245 .
Entrada
Un número entero positivo N .
Salida
El número más pequeño de los que hay que sumar / multiplica para obtener N .
Entrada de muestra
7 7
Salida de muestra
6 6
Explicación
(
1
+1
+1
) * (1
+1
) +1
= 7Debido a que esto requiere
6
unos, la salida es6
Casos de prueba
1 1
2 2
3 3
5 5
10 7
20 9
50 12
Como se trata de un desafío de código de golf , gana el menor número de bytes.
code-golf
sequence
arithmetic
integer
expression-building
Spyrali Chyuu
fuente
fuente
f(x) != x.primeFactorisation().sum()
excepto 1?Respuestas:
Python 2 ,
7470 bytesPruébalo en línea!
Versión alternativa, 59 bytes (sin verificar)
Esto funciona al menos hasta n = 1,000,000 , pero todavía tengo que demostrar que funciona para todos los n positivos .
Pruébalo en línea!
fuente
n=a*j+b
conb<j
, pero ¿podríamos necesitarb>=j
?b>=j
yb>=a
. Pero tienes razón, no es obvio que esto no suceda.a*b+c*d
cona,b,c,d
todas las expresiones de suma y son muy eficientes.Jalea ,
1614 bytes¡Gracias Dennis por guardar 2 bytes!
Pruébalo en línea!
Explicación lógica
Dado un número n :
1
, la respuesta es1
. De otra manera:La representación es
a + b
oa × b
, wherea
yb
son expresiones.Considere todos los valores posibles de
a
yb
:a + b
, entoncesa
yb
están dentro del rango[1 .. n-1]
.a × b
,a
yb
son divisores propios den
mayor que1
.En ambos casos,
[[<proper divisors of n larger than 1>], [1, 2, ..., n-1]]
se calcula la lista (ÆḌḊ,Ṗ
), asigna el enlace actual sobre cada número߀€
, agrega los pares correctos (+U$
) y obtén el valor mínimo (FṂo
).Explicación del código
fuente
JavaScript (ES6),
10896 bytesMuy ineficiente;
Array(n>>1)
lo acelera ligeramente a un costo de un byte. Explicación:n%++i
no es cero sii
no es un factor, también lon%++i/0
esInfinity
(y, por lo tanto, es verdad, y definitivamente no es mínimo) sii
no es un factor, peroNaN
(y por lo tanto es falso) sii
es un factor. Editar: guardado 12 bytes con inspiración de @ edc65.fuente
f(50)
pero desafortunadamente Windows Update reinició mi PC antes de que pudiera terminar.a
matriz. ¿No puedes fusionar las evaluaciones en las 2 lambdas y tomar el min?(i+=2)
por otro,++i
así que estoy ahorrando 12 bytes en total, ¡gracias!Pari / GP , 66 bytes
Un puerto de la respuesta Python de Dennis :
Pruébalo en línea!
Pari / GP , 72 bytes
Más largo, pero más eficiente:
Pruébalo en línea!
fuente
f(n)=vecmin(concat(n,[f(j)+f(n\j)+f(n%j)|j<-[2..n-1]]))
.Pari / GP , 213 bytes
Editar: He sido severamente golpeado .
Pruébalo en línea!
fuente
Python 2 , 181 bytes
Pruébalo en línea!
fuente
f
no debe ser anónima, ya que se llama recursivamente.Wolfram Language (Mathematica) , 59 bytes
Guardado 3 bytes gracias a Martin Ender. Usando la codificación CP-1252, donde
±
hay un byte.Pruébalo en línea!
fuente
±
lugar def
guardar 3 bytes asumiendo que la fuente está codificada en CP 1252: tio.run/##y00syUjNTSzJTE78///QRkNbQ@tDG/PirWx9M/…Perl 5 , -p 78 bytes
79 bytes en conteo de estilo antiguo (
+1
para-p
)El hecho de que Perl deba usar un extra
$
para todo acceso escalar realmente perjudica la longitud de los campos de golf que hacen mucha aritmética ...Este método es principalmente como los otros ya publicados (intente la multiplicación y la suma para construir un número objetivo, tome el más barato). Sin embargo, no se repite repetidamente, por lo que puede usarse para entradas relativamente grandes.
Tampoco trata de minimizar el costo de construir un número mediante la suma o la multiplicación porque perl 5 no tiene incorporado
min
y la ordenación numérica es muuuuuuy larga (como se ve en la ordenación aún en el código). En cambio, supongo que si un número es un factor del objetivo, usaré la multiplicación. Eso es seguro ya que si, por ejemplo,3
es un factor de12
(por lo tanto, suma el costo de3
y12/3
) más adelante en el ciclo, considerará9=12-3
cuál no será un factor, por lo que9+3
con el mismo costo que se3+9
probará de todos modos. Sin embargo, eso puede fallar para los objetivos<= 4
(solo lo hace para1
y2
). Agregar$_
a la lista para minimizar las correcciones que. Lo cual es lamentable ya que en realidad no lo necesito para los casos base porque ya lo inicializo@;
con los valores iniciales adecuados, por lo que cuesta 3 bytes.Pruébalo en línea!
fuente