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 a
y b
. Su objetivo es guardar su producto a*b
en la variable c
utilizando 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 1
son 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 a
y "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
- b
plano cartesiano. (Es probable que esto sea necesario debido a los recíprocos de expresiones que podrían ser 0
similares 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-b
para 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/v
quet*u
porque 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,r
de sus sumas por pares.y tenemos
c=-q*r/p
. La sumap
se 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
c
inp,q,r
, pero la fracción de dos pisos está en,x,y,z,w
así que debemos expresar la primera en términos de la segunda:Ahora, queremos elegir
p,q,r
para que seac=-q*r/p
iguala*b
. Una opción es:Luego, los valores duplicados para
q
yr
se dividen convenientemente en dos:Guardar
2
como una variablet
y conectarlos a la ecuación parac
da 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,w
en términos de1,a,b
. Para guardar operaciones, en lugar de expresarx
enp,q,r
(y por lo tantoa,b,1
) y luego escribiry,z,w
en términos dex
.Elegir
y expresando
c
con una negación comoc=-q*r/p
, obtenemosDesafortunadamente, reducir a la mitad
x
es costoso. Debe hacerse invirtiendo, agregando el resultado a sí mismo e invirtiendo nuevamente. También negate a producirnx
para el-x
, ya que es loy,z,w
uso. Esto nos da la solución de 23 operaciones:itx
es 1 / (2 * x) ynx
es-x
. Una optimización final de la expresión1/x
como enitx+itx
lugar de la plantilla1/(-nx)
corta un carácter y reduce la solución a 22 operaciones.fuente
itx + itx
ocurre dos veces, peroitx
no ocurre en ningún otro contexto. Defina en su lugarix = (1+1)/(1+a+b)
y reemplace dos adiciones con una.m = -1
es posible obtener 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
a
yb
están separados uno por uno, entoncesa + nx = 0
ob + 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)
.rfc
es1/(4*a*b)
.c
es 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*b
término con el truco de diferencia de cuadrados. Una vez que tuve eso, fue cuestión de probar qué tareas guardaban operaciones.-1
tres 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)/const2
y empecé con(1/(1-a)+1/(1+b))
y(-1/a+1/b)
.fuente
tmp
es en realidad 23, haciendo que tu puntaje sea 27. Sin embargo, es un buen hallazgo.