Il existe une prime non officielle de 500 représentants pour avoir battu la meilleure réponse actuelle .
Objectif
Votre objectif est de multiplier deux nombres en utilisant seulement un ensemble très limité d'opérations arithmétiques et d'affectation de variables.
- Une addition
x,y -> x+y
- Réciproque
x -> 1/x
( pas divisionx,y -> x/y
) - Négation
x -> -x
( pas de soustractionx,y -> x-y
, bien que vous puissiez le faire en deux opérationsx + (-y)
) - La constante
1
(aucune autre constante n'est autorisée, sauf si elle est produite par les opérations de1
) - Affectation variable
[variable] = [expression]
Scoring: Les valeurs commencent par des variables a
et b
. Votre objectif est de sauvegarder leur produit a*b
dans la variable en c
utilisant le moins d'opérations possible. Chaque opération et affectation +, -, /, =
coûte un point (de manière équivalente, chaque utilisation de (1), (2), (3) ou (4)). Les constantes 1
sont gratuites. Le moins de points solution gagne. Tiebreak est le premier post.
Allocation: Votre expression doit être arithmétiquement correcte pour les réels a
et "aléatoires" b
. Il peut échouer sur un sous - ensemble mesure zéro de R 2 , à savoir un ensemble qui n'a pas de zone si elles sont tracées dans le a
- b
plan cartésien. (Cela sera probablement nécessaire en raison de la réciproque d'expressions pouvant 0
ressembler à 1/a
.)
Grammaire:
C'est un code de code atomique . Aucune autre opération ne peut être utilisée. En particulier, cela signifie aucune fonction, condition, boucle ou type de données non numérique. Voici une grammaire pour les opérations autorisées (les possibilités sont séparées par |
). Un programme est une séquence de <statement>
s, où a <statement>
est donné comme suit.
<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
Vous n'avez pas réellement besoin de poster du code dans cette grammaire exacte, tant que ce que vous faites est clair et que le nombre d'opérations est correct. Par exemple, vous pouvez écrire a-b
pour a+(-b)
et compter comme deux opérations, ou définir des macros par souci de concision.
(Il y avait une question précédente Multiplier sans multiplier , mais cela permettait un ensemble d'opérations beaucoup plus souple.)
Réponses:
22 opérations
Essayez-le en ligne!
Les ops sont 10 additions, 7 inverses, 2 négations et 3 assignations.
Alors, comment j'ai eu ça? J'ai commencé avec le modèle prometteur de la somme de deux fractions à deux étages, un motif qui était apparu lors de nombreuses tentatives précédentes.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)
Lorsque nous limitons la somme à
x+y+z+w=0
, une belle annulation se produit, donnant:c = (x+z)*(y+z)/(x+y)
,qui contient un produit. (C'est souvent plus facile à obtenir
t*u/v
quet*u
parce que le premier a un degré 1.)Il y a une manière plus symétrique de penser à cette expression. Avec la restriction
x+y+z+w=0
, leurs valeurs sont spécifiées par trois paramètresp,q,r
de leurs sommes paires.et nous avons
c=-q*r/p
. La sommep
se distingue comme étant dans le dénominateur en correspondant aux paires(x,y)
et(z,w)
aux variables qui sont dans la même fraction.Ceci est une belle expression pour
c
inp,q,r
, mais la fraction à deux niveaux est dansx,y,z,w
, nous devons donc exprimer le premier en termes de second:Maintenant, nous voulons choisir
p,q,r
pour quec=-q*r/p
égala*b
. Un choix est:Ensuite, les valeurs doublées pour
q
etr
sont commodément divisées par deux dans:Enregistrer en
2
tant que variablet
et les brancher dans l’équationc
donne une solution à 24 opérations.Il y a 12 additions, 6 inverses, 4 négations et 2 assignations.
Beaucoup d'opérations sont consacrées à l'expression
x,y,z,w
en termes de1,a,b
. Pour enregistrer ops, au lieu d' exprimerx
dansp,q,r
(et donca,b,1
), puis écrirey,z,w
en termes dex
.Choisir
et en exprimant
c
avec une négation commec=-q*r/p
, nous obtenonsMalheureusement, diviser par deux
x
est coûteux. Cela doit être fait en inversant, en ajoutant le résultat à lui-même et en inversant à nouveau. Nous refusons également de produirenx
pour-x
, puisque c'est ce quiy,z,w
sert. Cela nous donne la solution 23-op:itx
est 1 / (2 * x) etnx
est-x
. Une optimisation finale consistant à exprimer1/x
commeitx+itx
au lieu du modèle1/(-nx)
réduit le caractère et ramène la solution à 22 opérations.la source
itx + itx
se produit deux fois, maisitx
ne se produit dans aucun autre contexte. Définissez plutôtix = (1+1)/(1+a+b)
et vous remplacez deux ajouts par un.m = -1
il est possible d'obtenir 20:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
a
etb
ne font qu'un, alors soit,a + nx = 0
soitb + nx = 0
, ce qui divise votre solution par zéro.23 opérations
preuve par explosion:
J'ai abusé de wolfram alpha pour obtenir cette belle image (wolfram alpha a essayé de me faire abonner à pro pour l'enregistrer, mais ensuite ctrl-c ctrl-v ;-)):
score (avec ajout
+
de soustraction):la source
29 opérations
Ne fonctionne pas pour l'ensemble {(a, b) ∈ R 2 | a + b = 0 ou a + b = -1 ou ab = 0 ou ab = -1}. C'est probablement la mesure zéro?
La structure de
rfc
(Reciprocal-Four-C) est plus évidente si nous définissons une macro:Faisons le calcul:
s(x)
, mathématiquement, est1/(1/x - 1/(x+1))
ce qui est après un peu d'algèbre estx*(x+1)
oux*x + x
.rfc
, c'est vraiment1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))
ce qui est juste1/((a+b)^2 - (a-b)^2)
.rfc
est1/(4*a*b)
.c
est la réciproque de 4 foisrfc
,1/(4/(4*a*b))
devient ainsia*b
.la source
s(x)
fit correspondre aux exigences de la question, du calcul, ce qui signifiait que j'avais une fonction carrée. Après un certain temps, j'ai trouvé que je pouvais obtenir una*b
terme avec le tour de différence. Une fois que j’ai eu ça, c’était une question d’essayer quelles assignations sauvaient des opérations.-1
trois foisrfc
, ne pouvez-vous pas jouer au golf en l'attribuant à une variable?27 opérations
Il n'y a pas de théorie derrière cela. J'ai juste essayé de
(const1+a*b)/const2
commencer(1/(1-a)+1/(1+b))
et avec(-1/a+1/b)
.la source
tmp
est en fait de 23, ce qui rend votre score de 27. Belle trouvaille, cependant.