Visión general
Dada una lista de dígitos, encuentre la menor cantidad de operaciones para hacer 100
Entrada
Una cadena de dígitos, que puede o no estar en orden numérico. El orden de los dígitos no se puede cambiar, sin embargo, se pueden agregar operadores más (+) o menos (-) entre cada uno para que la suma total sea igual a 100.
Salida
El número de operadores agregados, seguido de la secuencia completa de dígitos y operadores. Los dos pueden estar separados por un espacio, una pestaña o una nueva secuencia de línea.
Ejemplos
válido
Entrada: 123456789
Salida:3 123–45–67+89
Entrada no válida: 123456789
Salida:
6
1+2+34-5+67-8+9
(Hay formas de resolver esto con menos operaciones)
code-golf
integer
integer-partitions
expression-building
CyberJacob
fuente
fuente
+
y-
? ¿Podemos suponer que siempre podremos hacer100
desde la entrada?299399
, ¿-299+399
sería válido?Respuestas:
JavaScript (ES6),
153176 bytesEDITAR: en modo no estricto, JS interpreta las expresiones numéricas con prefijo 0 como octales (por ejemplo,
017
se analiza como 15 en decimal). Esta es una versión fija que admite ceros a la izquierda.fuente
2-017-2+117
. Pero017
es una notación octal en JS, que da 15 en decimal. Entonces mi código actual solo se encuentra2-0-17-2+117
. Trataré de abordar ese problema más tarde hoy.3**(l=s.length,l-1)
=>3**~-(l=s.length)
MATL ,
3736 bytesEl caso de prueba tarda unos 6 segundos en TIO.
Pruébalo en línea!
Cómo funciona
fuente
299399
no tiene solución y, por lo tanto, no es una entrada válida (los operadores fueron especificados para ir "entre" los dígitos, esa entrada requeriría-299+399
donde-
no está entre los dígitos).-299+399
, y en ese caso necesito un pequeño cambio en mi código . Le pedí una aclaración al OP123456789
debería tener un recuento de operadores de4
no3
.299399
es una entrada no válida porque, como el OP también ha aclarado, cada entrada debe tener al menos una solución[Python 2],
164158bytesPruébalo en línea!
Tome N como una cadena de dígitos; devuelve una tupla (numOps, expressionString).
Básicamente el mismo enfoque que otros; usa itertools.product para construir los "casos" individuales, por ejemplo, para N == '1322', un "caso" sería
('-','','+')
y evaluaría '1-32 + 2'.Lanza un ValueError si la entrada no es válida (pero creo que OP no garantizó entradas no válidas).
fuente
PHP,
166171 bytesEjecutar como tubería con
-nR
o probarlo en línea .utiliza números formateados para ordenar los resultados ->
puede imprimir espacios en blanco iniciales (y puede fallar para la entrada con más de 99 dígitos; aumente el número
%2d
para corregir).no más de 10 dígitos, 161 bytes
Descompostura
fuente
Jalea , 32 bytes
Un programa completo que se muestra utilizando los operadores Jelly (en
_
lugar de-
).Nota: Para mostrar
-
en la salida en lugar de_
(no es un requisito), agregue⁾_-y
entreF
yṄ
(⁾_-
es un par de caracteres literal['_','-']
yy
es el átomo "traducir" diádico).¿Cómo?
Pruébalo en línea!
fuente
Mathematica, 136
146149156165166bytesDevoluciones
{3, 123-45-67+89}
por ejemplo.El caso de prueba tarda aproximadamente 0,09 segundos en completarse.
fuente
Python 2 ,
256230208205172171170165 bytes, método iterativolen(a)
porw
z-=1;d=z
pord=z=z-1
Pruébalo en línea!
Pequeña explicación Usando la representación en la base 3, el código intercala los dígitos con los operadores {'+', '-', concatenación} de acuerdo con todas las combinaciones posibles.
Python 2 , 167 bytes, método recursivo
Pruébalo en línea!
Algunas salidas
fuente
list(input())
con soloinput()
, ya que una cadena ya es iterable para guardar 6 bytes; reemplazarb.count('+')+b.count('-')
conlen(b)-len(a)
para guardar 12 bytes; y reemplacechr(r+43)
conchr(r+43)*(d>0!=r-1)
y luego puede eliminar la líneab=b[:-1].replace(',','')
para ahorrar 15 bytes netos ((d>0!=r-1)
es equivalente a(d>0 and 0!=r-1)
).Brachylog , 36 bytes
Pruébalo en línea!
Sin embargo, más de la mitad de esto es obtener el formato de salida correcto. La lógica central real es solo:
15 bytes
Pruébalo en línea!
Esto devuelve una lista como [123, –45, –67,89]. La expresión es la suma de los elementos, y el número de operadores es 1 menor que la longitud de la lista.
~cLhℕ∧100~+L
casi funciona para 12 bytes (¡ Pruébelo en línea! ), pero es demasiado lento para manejar la entrada completa de 9 dígitos en TIO y, lo que es más importante, falla para entradas como10808
: Brachylog es demasiado inteligente para dividir números para tener ceros a la izquierda, así que no t vea la partición [108, -08].fuente
Haskell ,
180178 bytesPruébalo en línea! Uso:
g "123456789"
rendimientos(3,"123-45-67+89")
.#
crea una lista de todos los términos posibles,?
evalúa un término yg
filtra los términos que evalúan a 100 y devuelve el que tiene el número mínimo de operandos.fuente
Jalea , 27 bytes
Pruébalo en línea!
No puedo decir que no tomé algunas pistas de la respuesta anterior de Jonathan Allan. ;-)
En comparación con su respuesta, esta es solo dos bytes más corta (30), no cinco, si hacemos la comparación justa debido a las actualizaciones de idioma:
Si comparamos a la inversa (la versión más nueva en lugar de la anterior), la diferencia es la misma (se convierte en 29 bytes, como se ve a continuación):
fuente