Problema
¡Tengo un GRAN programa nuevo que cambiará la forma en que pensamos sobre las matemáticas en la informática, tomando cadenas de funciones algebraicas y haciendo cosas INCREÍBLES con ellas! El único problema es que solo soy capaz de analizar álgebra específica, de lo contrario, el universo se pliega en sí mismo, lo cual es malo. Afortunadamente, solo necesito algunas operaciones básicas en la increíble entrada de este nuevo programa, ¡pero todavía necesito que se expanda!
Reglas
Una respuesta debe poder simplificar las siguientes expresiones
2+2
debería reducir a4
(5+x)+6
debería reducir ax+11
(x+2)^2
debería reducir ax^2+4*x+4
(x-5)*(3+7*x)
debería reducir a7*x^2-32*x-15
5*x+9*x
debería reducir a14*x
(2*x^2)*x^3
debería reducir a2*x^5
Las respuestas deben poder COMPLETAMENTE eliminar el paréntesis, lo que implica que toda la distribución debe tener lugar.
Las respuestas deberían poder manejar todos los siguientes operadores y tokens estándar:
+
(La función de suma)-
(La función de resta)*
(La función de multiplicación)(
(El paréntesis izquierdo, usado para indicar un grupo))
(El paréntesis derecho, usado para indicar el final del último grupo iniciado)x
(La variable estándar)[0-9]+
(números literales no negativos)
Las respuestas deben ser capaces de al menos cuadrar, usando la notación expr ^ 2, incluyendo (expr) ^ 2 recursivamente, ya que (expr) es en sí misma una expresión;)
Una solución debe estar en una notación infija estándar, ¡ninguna de las tonterías RPN!
No hay funciones de biblioteca como Mathematica
Simplify
para hacer esto por usted.La solución debe ser una función que tome un solo argumento y devuelva la versión expandida
Como se trata de código de golf, la respuesta con la menor cantidad de golpes (clave) gana, 1 semana desde OP.
Notas
¡No hay espacios en este mundo de las matemáticas, por supuesto! Solo paréntesis.
Por lo tanto, no se requiere división para salvar del factoring
Se aplica el orden estándar de operaciones.
Soy consciente de que parte de lo que estoy pidiendo es simplificación (por ejemplo 2+2=4
) donde otras partes son realmente lo opuesto, como expandirse (x+1)^2
para ser x^2+2x+1
. Esto es intencional :)
-25 trazos para una solución que puede hacer (expr) ^ n en lugar de solo (expr) ^ 2
-15 trazos para una solución capaz de evaluar la multiplicación yuxtapuesta, como 4x+5x
== 9x
o 4(x+1)
=4x+4
-5 trazos para una solución capaz de manejar múltiples variables (una variable es exactamente un carácter minúsculo del alfabeto)
-5 golpes para una solución capaz de eliminar los ceros a la izquierda ( 007
a solo 7
[¡No hoy, Bond!] [Por Dios, ahora siento que estoy escribiendo Lisp])
Respuestas:
J - 350 caracteres - 25 = 325 pts
Perdóname, Roger Hui, porque he pecado.
La monstruosidad anterior define una serie de variables, de las cuales la variable
f
es una función que satisface las restricciones en la pregunta anterior. Reclamo el bono "expr ^ n" por 25 puntos.Aquí está el golf en acción en el J REPL.
Aquí está la esencia de lo que está sucediendo.
'()'...@([-.~;@]<@(p^:(1<#));.1~1,0=2*/\[:+/\(*0,}:@)1 _1 0{~i.)&;:
- Descomponga recursivamente la expresión en función de sus subexpresiones entre paréntesis y evalúelas (el...
bit, que se describirá a continuación) cuando estén listas.;:
realiza la tokenización.(([^:(''-:])". ::])&.>)
- Evaluar átomos. Si el átomo es numérico, se convierte en un número escalar. Si el átomo es un operador, se deja como está. Si el átomo es la variablex
, se convierte en el vector0 1
. (Es por eso que definimosx=:0 1
al principio). En general, almacenamos el polinomioa*x^n + b*x^(n-1) + ... + c*x + d
como lan+1
lista de elementosd c ... b a
.e=:2 :'(<@; ::({:u/&.>{.)/.~i.@#([->+>:){.@i.&(<,v))^:_'
- Esta curiosa conjunción toma un verbo a la izquierda y un carácter a la derecha. Encuentra la primera instancia de ese personaje en su entrada tokenizada, sin par, y la evalúa con los argumentos a su alrededor, y se repite hasta que no haya más caracteres para encontrar. Por lo tanto, simplificamos iterativamente la expresión, con el orden de las operaciones controlado por el orden de aplicación dee
.rplc
es una función de biblioteca estándar para el reemplazo de subcadenas. Podemos guardar otros tres caracteres si se nos permite poner primero los términos de grado más bajo en lugar de los más altos, eliminando el@|.
.Sinceramente, no estoy seguro de si puedo sacar más personajes de este golf. No puedo pensar en ningún otro enfoque que no requiera una cantidad similar de ingeniería excesiva, pero eso no significa que no haya ninguno. De cualquier manera, estoy bastante seguro de que he exprimido a todos los personajes obvios de esta versión.
fuente
-
token solo se anota como la función de resta. :)(2*x+3)^(2+3)*2^3
debería dar256x^5+1920x^4+5760x^3+8640x^2+6480x+1944
o me falta algo?JavaScript (EcmaScript 6) 698 (748-50 bonus) 725780
1951Para jugar al golf. Pero estoy orgulloso de que funcione.(Edición: corrección de errores, problemas con paréntesis y menos)
(Edición2: golf más, error corregido en la salida)
(Edición3: golf una vez más, la última vez lo prometo)
Comentario
Básicamente, la función X es una calculadora infija que opera en polinomios literales.
Cada polinomio se almacena como un objeto js, la clave es el término (x ^ 3y ^ 2) y el valor es el coeficiente numérico. Las funciones A, M y E son sumar, multiplicar y exponente.
Código de golf
(Probablemente no se pueda jugar más al golf ...) Nota: sin contar las nuevas líneas agregadas para (ehm ...) legibilidad
Prueba en la consola FireFox
Salida
Bonos
Código sin golf
fuente
for(i1,i2,i3; c1,c2; s1,s2,s3)
. Solo tengo un punto y coma en colde golf para cerrar una declaración dentro de un for (función O). ¿Por qué comas? dos stamenents se deben agrupar con {}, mientras que dos o más expresiones se pueden enumerar simplemente.Mathematica: 56 - 25 - 15 - 5 - 5 = 6
Por supuesto, ninguna biblioteca funciona como
Expand
oDistribute
, solo reemplazo de patrones. Mathematica hace casi todo por nosotros (¡hax!), Lo que queda son solo reglas de distribución y expansión de poder. Los únicos ejemplos no triviales, por lo tanto, son(x-5)*(3+7*x)
y(x+2)^2
.Ejemplos
fuente