Hay una recompensa no oficial de 500 repeticiones por vencer a la mejor respuesta actual .
Gol
Su objetivo es multiplicar dos números usando solo un conjunto muy limitado de operaciones aritméticas y asignación de variables.
- Adición
x,y -> x+y - Recíproco
x -> 1/x( no divisiónx,y -> x/y) - Negación
x -> -x( no restax,y -> x-y, aunque puede hacerlo como dos operacionesx + (-y)) - La constante
1(no se permiten otras constantes, excepto las producidas por operaciones de1) - Asignación variable
[variable] = [expression]
Puntuación: Los valores comienzan en variables ay b. Su objetivo es guardar su producto a*ben la variable cutilizando la menor cantidad de operaciones posible. Cada operación y asignación +, -, /, =cuesta un punto (de manera equivalente, cada uso de (1), (2), (3) o (4)). Las constantes 1son gratis. La solución con menos puntos gana. Tiebreak es la primera publicación.
Permiso: su expresión tiene que ser aritméticamente correcta para reales ay "aleatorios" b. Se puede fallar en un subconjunto medida en cero de R 2 , es decir, un conjunto que no tiene área si trazada en el a- bplano cartesiano. (Es probable que esto sea necesario debido a los recíprocos de expresiones que podrían ser 0similares 1/a).
Gramática:
Este es un código de golf atómico . No se pueden utilizar otras operaciones. En particular, esto significa que no hay funciones, condicionales, bucles o tipos de datos no numéricos. Aquí hay una gramática para las operaciones permitidas (las posibilidades están separadas por |). Un programa es una secuencia de <statement>s, donde a <statement>se da de la siguiente manera.
<statement>: <variable> = <expr>
<variable>: a | b | c | [string of letters of your choice]
<expr>: <arith_expr> | <variable> | <constant>
<arith_expr>: <addition_expr> | <reciprocal_expr> | <negation_expr>
<addition_expr>: <expr> + <expr>
<reciprocal_expr>: 1/(<expr>)
<negation_expr>: -<expr>
<constant>: 1
En realidad, no tiene que publicar código en esta gramática exacta, siempre que esté claro lo que está haciendo y su recuento de operaciones sea correcto. Por ejemplo, puede escribir a-bpara a+(-b), y considero como dos operaciones, o definir macros para mayor brevedad.
(Hubo una pregunta anterior Multiplicar sin Multiplicar , pero permitió un conjunto de operaciones mucho más flexible).

Respuestas:
22 operaciones
Pruébalo en línea!
Las operaciones son 10 adiciones, 7 inversas, 2 negaciones y 3 asignaciones.
Entonces, ¿cómo conseguí esto? Comencé con la prometedora plantilla de la suma de dos fracciones de dos pisos, un motivo que había aparecido en muchos intentos anteriores.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)Cuando restringimos la suma a
x+y+z+w=0, ocurre una hermosa cancelación, dando:c = (x+z)*(y+z)/(x+y),que contiene un producto (A menudo es más fácil de obtener
t*u/vquet*uporque el primero tiene un grado 1.)Hay una forma más simétrica de pensar sobre esta expresión. Con la restricción
x+y+z+w=0, sus valores se especifican mediante tres parámetrosp,q,rde sus sumas por pares.y tenemos
c=-q*r/p. La sumapse distingue por estar en el denominador correspondiente a los pares(x,y)y(z,w)a las variables que están en la misma fracción.Esta es una buena expresión para
cinp,q,r, pero la fracción de dos pisos está en,x,y,z,wasí que debemos expresar la primera en términos de la segunda:Ahora, queremos elegir
p,q,rpara que seac=-q*r/piguala*b. Una opción es:Luego, los valores duplicados para
qyrse dividen convenientemente en dos:Guardar
2como una variablety conectarlos a la ecuación paracda una solución de 24 operaciones.Hay 12 adiciones, 6 inversas, 4 negaciones y 2 asignaciones.
Se gastan muchas operaciones expresándose
x,y,z,wen términos de1,a,b. Para guardar operaciones, en lugar de expresarxenp,q,r(y por lo tantoa,b,1) y luego escribiry,z,wen términos dex.Elegir
y expresando
ccon una negación comoc=-q*r/p, obtenemosDesafortunadamente, reducir a la mitad
xes costoso. Debe hacerse invirtiendo, agregando el resultado a sí mismo e invirtiendo nuevamente. También negate a producirnxpara el-x, ya que es loy,z,wuso. Esto nos da la solución de 23 operaciones:itxes 1 / (2 * x) ynxes-x. Una optimización final de la expresión1/xcomo enitx+itxlugar de la plantilla1/(-nx)corta un carácter y reduce la solución a 22 operaciones.fuente
itx + itxocurre dos veces, peroitxno ocurre en ningún otro contexto. Defina en su lugarix = (1+1)/(1+a+b)y reemplace dos adiciones con una.m = -1es posible obtener 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))aybestán separados uno por uno, entoncesa + nx = 0ob + nx = 0, lo que hace que su solución se divida por cero.23 operaciones
prueba por explosión:
Abusé de wolfram alpha para obtener esta hermosa imagen (wolfram alpha intentó que me suscribiera a pro para guardarla, pero luego ctrl-c ctrl-v ;-)):
puntuación (con suma
+en la resta):fuente
29 operaciones
No funciona para el conjunto {(a, b) ∈ R 2 | a + b = 0 o a + b = -1 o ab = 0 o ab = -1}. Eso probablemente mide cero?
La estructura de
rfc(Reciprocal-Four-C) es más evidente si definimos una macro:Hagamos los cálculos:
s(x), matemáticamente, es lo1/(1/x - 1/(x+1))que está después de un poco de álgebra esx*(x+1)ox*x + x.rfc, es realmente lo1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))que es justo1/((a+b)^2 - (a-b)^2).rfces1/(4*a*b).ces el recíproco de 4 vecesrfc, por lo que se1/(4/(4*a*b))conviertea*b.fuente
s(x)los requisitos de la pregunta se ajustaban al cálculo, por lo que eso significaba que tenía una función cuadrada. Después de algunas dudas, descubrí que podía obtener una*btérmino con el truco de diferencia de cuadrados. Una vez que tuve eso, fue cuestión de probar qué tareas guardaban operaciones.-1tres vecesrfc, ¿no podrías jugar golf a un personaje asignándolo a una variable?27 operaciones
No hay ninguna teoría detrás de esto. Sólo traté de conseguir
(const1+a*b)/const2y empecé con(1/(1-a)+1/(1+b))y(-1/a+1/b).fuente
tmpes en realidad 23, haciendo que tu puntaje sea 27. Sin embargo, es un buen hallazgo.