Es gibt eine inoffizielle Belohnung für 500 Wiederholungen, um die aktuell beste Antwort zu schlagen .
Tor
Ihr Ziel ist es, zwei Zahlen mit nur einem sehr begrenzten Satz von Rechenoperationen und Variablenzuweisungen zu multiplizieren.
- Zusatz
x,y -> x+y
- Reziproke
x -> 1/x
( nicht Divisionx,y -> x/y
) - Negation
x -> -x
( keine Subtraktionx,y -> x-y
, obwohl Sie es als zwei Operationen tun könnenx + (-y)
) - Die Konstante
1
(keine anderen Konstanten erlaubt, außer wie durch Operationen von erzeugt1
) - Variablenzuordnung
[variable] = [expression]
Wertung: Die Werte beginnen in Variablen a
und b
. Ihr Ziel ist es, das Produkt mit so wenig Operationen wie möglich a*b
in der Variablen zu speichern c
. Jede Operation und Aufgabe +, -, /, =
kostet einen Punkt (entsprechend jede Verwendung von (1), (2), (3) oder (4)). Konstanten 1
sind frei. Die Lösung mit den wenigsten Punkten gewinnt. Tiebreak ist der früheste Beitrag.
Erlaubnis: Ihr Ausdruck muss für "zufällige" Reals a
und arithmetisch korrekt sein b
. Es kann auf einer Teilmenge von R 2 mit dem Maß Null fehlschlagen , dh auf einer Menge, die keine Fläche hat, wenn sie in der a
- b
kartesischen Ebene geplottet wird . (Dies ist wahrscheinlich erforderlich, da sich Ausdrücke möglicherweise 0
wie folgt umkehren 1/a
.)
Grammatik:
Dies ist ein Atomic-Code-Golf . Andere Operationen dürfen nicht verwendet werden. Dies bedeutet insbesondere, dass keine Funktionen, Bedingungen, Schleifen oder nicht numerischen Datentypen vorhanden sind. Hier ist eine Grammatik für die erlaubten Operationen (Möglichkeiten sind durch getrennt |
). Ein Programm ist eine Folge von <statement>
s, wobei a <statement>
wie folgt angegeben ist.
<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
Sie müssen tatsächlich keine Postleitzahl in dieser genauen Grammatik eingeben, solange klar ist, was Sie tun und Ihre Anzahl der Vorgänge richtig ist. Sie können beispielsweise a-b
für a+(-b)
zwei Operationen schreiben und diese zählen oder Makros definieren, um sie zu verkürzen.
(Es gab eine frühere Frage Multiplizieren ohne Multiplizieren , aber sie erlaubte eine viel lockerere Reihe von Operationen.)
Antworten:
22 Operationen
Probieren Sie es online!
Die Operationen bestehen aus 10 Additionen, 7 Inversen, 2 Negationen und 3 Zuweisungen.
Also, wie habe ich das bekommen? Ich begann mit der vielversprechend aussehenden Vorlage aus der Summe von zwei Doppeldecker-Brüchen, ein Motiv, das in vielen früheren Versuchen aufgetaucht war.
c = 1/(1/x + 1/y) + 1/(1/z + 1/w)
Wenn wir die Summe auf einschränken
x+y+z+w=0
, kommt es zu schönen Stornierungen, die Folgendes ergeben:c = (x+z)*(y+z)/(x+y)
,welches ein Produkt enthält. (Es ist oft einfacher zu bekommen,
t*u/v
alst*u
weil der erste Grad 1 hat.)Es gibt eine symmetrischere Art, über diesen Ausdruck nachzudenken. Mit der Einschränkung
x+y+z+w=0
werden ihre Werte durch drei Parameterp,q,r
ihrer paarweisen Summen angegeben.und wir haben
c=-q*r/p
. Die Summep
wird als Nenner bezeichnet, indem sie den Paaren(x,y)
und(z,w)
Variablen entspricht, die sich im selben Bruch befinden.Dies ist ein netter Ausdruck für
c
inp,q,r
, aber der Doppeldecker-Bruch ist in,x,y,z,w
also müssen wir den ersteren in Bezug auf den letzteren ausdrücken:Nun wollen wir so wählen
p,q,r
, dass esc=-q*r/p
gleich ista*b
. Eine Wahl ist:Dann werden die verdoppelten Werte für
q
undr
zweckmäßigerweise halbiert in:Speichern
2
als Variablet
und Einfügen in die Gleichung fürc
ergibt eine 24-op-Lösung.Es gibt 12 Additionen, 6 Inverse, 4 Negationen und 2 Zuweisungen.
Viele Ops werden
x,y,z,w
in Bezug auf ausgedrückt ausgegeben1,a,b
. So speichern ops, ausdrücken stattx
inp,q,r
(und damita,b,1
) und schreiben danny,z,w
in Bezug aufx
.Auswahl
und
c
mit einer Verneinung ausdrücken, wiec=-q*r/p
wir bekommenLeider ist eine Halbierung
x
teuer. Dies muss durch Invertieren, Hinzufügen des Ergebnisses zu sich selbst und erneutes Invertieren erfolgen. Wir negieren auch produzierennx
für-x
, da das ist , was deny,z,w
Einsatz. Dies gibt uns die 23-op-Lösung:itx
ist 1 / (2 * x) undnx
ist-x
. Eine abschließende Optimierung auszudrücken ,1/x
wieitx+itx
anstelle der Templat1/(-nx)
schneidet einen Charakter und bringt die Lösung auf 22 ops.quelle
itx + itx
tritt zweimal auf,itx
tritt aber in keinem anderen Kontext auf. Definieren Sie stattdessenix = (1+1)/(1+a+b)
und ersetzen Sie zwei Ergänzungen durch eine.m = -1
es möglich, 20 zu erhalten:nx = (1+a+b)/(m+m); c = m/(m/nx + 1/(1+nx)) + m/(1/(a+nx) + 1/(b+nx))
a
undb
nur eins sind, dann entwedera + nx = 0
oderb + nx = 0
, wodurch Ihre Lösung durch Null geteilt wird.23 Operationen
Beweis durch Explosion:
Ich habe Wolfram Alpha missbraucht, um dieses wunderschöne Bild zu bekommen (Wolfram Alpha hat versucht, mich dazu zu bringen, Pro zu abonnieren, um es zu speichern, aber dann Strg-C Strg-V ;-)):
Punktzahl (mit hinzugefügter
+
Subtraktion):quelle
29 Operationen
Funktioniert nicht für die Menge {(a, b) ∈ R 2 | a + b = 0 oder a + b = -1 oder ab = 0 oder ab = -1}. Das ist wahrscheinlich Null?
Die Struktur von
rfc
(Reciprocal-Four-C) wird deutlicher, wenn wir ein Makro definieren:Lass uns rechnen:
s(x)
Mathematisch ist1/(1/x - 1/(x+1))
das , was nach ein bisschen Algebra istx*(x+1)
oderx*x + x
.rfc
, ist es wirklich1/((a+b)*(a+b) + a + b - (a-b)*(a-b) - a + b + (-b) + (-b))
das, was gerecht ist1/((a+b)^2 - (a-b)^2)
.rfc
ist1/(4*a*b)
.c
ist der Kehrwert der 4 - malrfc
, so1/(4/(4*a*b))
wirda*b
.quelle
s(x)
den Anforderungen der Frage aus der Analysis entsprechen, was bedeutete, dass ich eine quadratische Funktion hatte. Nach einigem Hin und Her stellte ich fest, dass ich einena*b
Begriff mit dem Unterschied der Quadrate bekommen konnte. Sobald ich das hatte, ging es darum, herauszufinden, welche Aufgaben Operationen retteten.-1
dreimal verwendenrfc
?27 Operationen
Dahinter steckt keine Theorie. Ich habe gerade versucht,
(const1+a*b)/const2
mit(1/(1-a)+1/(1+b))
und zu beginnen(-1/a+1/b)
.quelle
tmp
sind tatsächlich 23 und erzielen Ihre Punktzahl 27. Ein guter Fund.