Entonces, la tarea es simple, dada la matriz de números y resultados, debe encontrar qué operaciones necesita usar en los números de la matriz, para obtener el resultado solicitado.
Hagámoslo simple para comenzar, y permitamos solo operaciones básicas como: suma, resta, multiplicación y división.
Ejemplo:
Input : [5,5,5,5,5] 100
Output : 5*5*5-5*5
Para dar alguna ventaja a lenguajes como Java, la solicitud es implementar la función, no el programa completo, y el resultado puede ser devuelto a través de parámetros o imprimir en la consola.
El código se califica en función de la cantidad de bytes y, como es un desafío de código de golf, gana el puntaje más bajo.
Otro requisito es que puede obtener -10 puntos adicionales si para la matriz contiene solo dígitos, soluciones de soporte donde podría construir números a partir de los siguientes dígitos. Es decir
Input : [1,2,3,4,5] 0
Output : 12-3-4-5
Tenga en cuenta que, si las salidas son salidas propuestas, algunos casos pueden tener más de una solución. Depende de usted proporcionar una o más soluciones para una tarea determinada.
EDITAR: El resultado debe ser válido desde el punto de vista matemático, por lo tanto, la división es una división racional, no un número entero, y la precedencia de la operación es la misma que en las matemáticas clásicas (primero multiplicación y división, luego suma y resta).
fuente
*
y/
tiene precedencia sobre+
y-
? Sus dos ejemplos se contradicen entre sí.Respuestas:
Pyth, 23 bytes
Debido a razones de seguridad,
*
y/
no evaluarán en línea, pero en teoría funcionan.Conjunto de pruebas con solo
+
y-
.fuente
Oracle SQL 11.2,
322304270 bytes: 1 es la lista de dígitos
: 2 es el resultado buscado
Sin golf:
fuente
TSQL (sqlserver 2016)
310294280 bytesQué maravillosa oportunidad para escribir código feo:
Golfizado:
Pruébalo en línea
Legible: (la inserción del punto decimal (.) Y la eliminación de la misma es necesaria para que sql acepte que 4/5 no es 0; la eliminación del pozo es para las personas que lo prueban)
Esta solución también puede manejar estos tipos de entrada:
fuente
JavaScript (ES6),
165147 bytesAnidado
eval
... encantador.fuente
Python 3,
170155 bytesCree un generador con todas las órdenes posibles de los operadores, combine eso con los números, luego evalúe hasta obtener la respuesta.
https://repl.it/C2F5
fuente
['+','-','*','/']
con'+-*/'
; comostring
s son iterables, lo tratará como si fuera unarray
elemento con cada carácter de cada carácterstring
, por lo que actuará tal como lo proporcionó con la matriz que tiene actualmente.Pitón,
195186 bytesAquí hay una forma atroz de hacerlo.
La función
x
acepta un argumento de alist
y aresult
,x([1,2,3,4,5], 15)
por ejemplo.El programa comienza un ciclo donde comenzamos a seleccionar aleatoriamente si debemos agregar
"+", "-", "*", or "/"
entre cada número, o si debemos concatenarlos juntos. Esto parecía una opción más concisa que pasar por permutaciones e intentar cada combinación para encontrar cada resultado, y aunque lleva más tiempo ejecutarlo y es mucho menos eficiente. (¡Afortunadamente eso no es una preocupación en este contexto!)También agrega "." a cada número para evitar realizar operaciones de redondeo entero como
6/4 = 1
. Entonceseval
es nuestra expresión y determina si el resultado es igual a lo que esperamos, y si es así, genera la expresión.Este programa nunca se cierra; seguirá produciendo resultados continuamente hasta que se elimine.
EDITAR 1 : Eliminar nuevas líneas innecesarias donde
if
se pueden usar declaraciones de una línea .fuente
Matlab, 234
238258bytesSupongo, basado en las limitaciones de las otras respuestas, que el orden de números de la matriz de entrada se mantiene mediante fiat.
Este código toma una cadena de números
x
, por ejemplox = '12345'
y un resultador
, dicenr = 15
y regresa todas las cadenas de expresiones que puede evaluar para obtenerr
a partirx
el uso de los cuatro operadores.He usado dos formas diferentes de longitud equivalente para evitar el uso de expresiones
ones(length())
-type orepmat(length())
-type:~~p(1,:)
que devuelve valores not-not enp
(es decir, una lista de1
s de la misma longitud que la primera dimensión dep
) y0|p(:,1)
que devuelve 0 o is-there -a-value-inp
(es decir, una lista de1
s de la misma longitud que la segunda dimensión dep
).Matlab no tiene un método de
nchoosek
reemplazo , así que dupliqué a los operadores la cantidad correcta de veces, calculé todo el espacionchoosek
para esa selección más grande de operadores y luego usé unaunique
llamada para reducir el resultado a lo que debería ser (eliminando combinaciones equivalentes como '*** +' y '*** +'). Agrego un espacio final para que coincida con la longitud del vector de entrada con fines de concatenación y luego compongo las cadenas del operador con las cadenas de entrada en las columnas de una matriz. Luego evalúo las expresiones en columnas para obtener resultados y encontrar el orden de los operadores que corresponde a esas columnas con resultados que coinciden con nuestra entradar
.Probar:
x = '12345'
,r = 15
:Si tuviera que tomar una matriz de valores de doble precisión, necesitaría
x = num2str(x,'%d');
para convertir los dígitos en una cadena, agregando 21 (20 sin el;
) a mi puntaje. * Los bytes adicionales eran punto y coma que dejé simplemente para que cualquiera que ejecute este código no vea su símbolo del sistema explotar con matrices largas. Dado que mi edición produce una pila gigante de advertencias sobre lógicas y operandos de dos puntos de todos modos, he eliminado los puntos y comas en la nueva versión.Edición 2: Olvidé reemplazar un
2*n+2
conk
.Vieja respuesta:
fuente
JavaScript (ES6), 88 bytes
Lanzó un poco de aleatoriedad a la mezcla. Mucho más fácil que iterar sistemáticamente a través de las combinaciones.
Banco de pruebas
fuente
PHP, 108 bytes
toma la entrada de los argumentos de la línea de comando en orden inverso. Corre con
-r
.Descompostura
fuente
Perl 5 con
-pa
46 bytesPruébalo en línea!
fuente