Ausgewogene ternäre Logik
Ternary ist normalerweise ein anderer Name für Basis 3, das heißt, jede Ziffer ist 0
, 1
oder 2
, und jeder Ort ist im Wert von 3 - mal so viel wie der nächsten Ort.
Balanced ternäre ist eine Modifikation der ternären , die verwendeten Ziffern -1
, 0
und 1
. Dies hat den Vorteil, dass kein Schild benötigt wird. Jeder Ort ist immer noch dreimal so viel wert wie der nächste Ort. Die ersten paar positive ganze Zahlen sind daher [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
während die ersten paar negative ganze Zahlen sind [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Sie haben drei Eingänge x, y, z
. z
entweder -1
, 0
oder 1
, während x
und y
aus sein kann , -3812798742493
um 3812798742493
inklusive.
Der erste Schritt ist die Konvertierung x
und y
von dezimal nach ausgeglichen ternär. Dies sollte Ihnen 27 Triten (TeRnary-Ziffern) geben. Sie müssen dann die Triten von x
und y
paarweise mit einer ternären Operation kombinieren und das Ergebnis dann wieder in eine Dezimalzahl konvertieren.
Sie können auswählen, welche Werte der z
Karte jeweils einer dieser drei ternären Operationen zugeordnet werden sollen:
A
: Bei zwei Triten ist das Ergebnis Null, wenn entweder Null ist, andernfalls ist das Ergebnis -1, wenn sie unterschiedlich sind, oder 1, wenn sie gleich sind.B
: Bei zwei Triten ist, wenn einer von beiden Null ist, das Ergebnis der andere Trit, andernfalls ist das Ergebnis Null, wenn sie unterschiedlich sind, oder die Negation, wenn sie gleich sind.C
: Bei zwei Triten ist das Ergebnis Null, wenn sie unterschiedlich sind, oder ihr Wert, wenn sie gleich sind.
Beispiel. Angenommen, x
ist 29
und y
ist 15
. Im ausgeglichenen ternären Zustand werden diese [1, 0, 1, -1]
und [1, -1, -1, 0]
. (Die verbleibenden 23 Nulltrits wurden der Kürze halber weggelassen.) Nach jeder der jeweiligen Operationen werden sie A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Konvertieren zurück in Dezimalzahlen die Ergebnisse sind 24
, -37
und 27
jeweils. Versuchen Sie die folgende Referenzimplementierung für weitere Beispiele:
Die Referenzimplementierung folgt den oben angegebenen Schritten, aber Sie können natürlich jeden Algorithmus verwenden, der dieselben Ergebnisse liefert.
Dies ist Code-Golf , also gewinnt das kürzeste Programm oder die kürzeste Funktion, die keine Standardlücken verletzt!
z
einer von-1,0,1
drei konsistenten und unterschiedlichen Werten sein oder können wir diese auswählen? Ich habe1,2,3
in meiner Antwort ausgewählt, und es gibt einige Verwirrung darüber.Antworten:
Sauber ,
231... 162 BytesDefiniert die Funktion
@
, nimmt dreiInt
Sekunden und gibt eineInt
.Operatoren kartieren als
1 -> A, 0 -> B, -1 -> C
.Probieren Sie es online aus!
Die Funktion
$
faltet ein Lambda über die Ziffernstellen[0..26]
in eine Liste ternärer Ziffern. Es verwendet den Kopf der Liste, die es ergibt, um eine aktuelle Gesamtdifferenz von der erforderlichen Anzahl beizubehalten (weshalb es vor der Rückgabe beschnitten wird) undsign(2*t/3^p)
um die aktuelle zu ergebende Ziffer zu bestimmen. Der Vorzeichentrick entsprichtif(abs(2*t)<3^p)0(sign t)
.quelle
$n
(glaube ich) zu einem ausgeglichenen Ternär konvertiert sind . Könnten Sie eine Erklärung dafür hinzufügen?Gelee , 39 Bytes
Ein vollständiges Programm mit zwei Argumenten
[x,y]
undz
... wo
z
ist{A:-1, B:0, C:1}
das, das das Ergebnis druckt
Probieren Sie es online aus! Hinweis: Die Golfmethode macht es langsam - diese geänderte Version ist schneller (Protokolle um 3, Decken und Inkremente vor jedem kartesischen Produkt)
Wie?
quelle
R ,
190172151 BytesProbieren Sie es online aus!
Berechnet alle Kombinationen von Trits und wählt die richtige aus. Es wird tatsächlich einen Speicherfehler mit werfen
27
, da3^27
es sich um eine etwas große Zahl handelt, aber es würde theoretisch funktionieren. Die TIO-Verbindung unterstützt nur11
ganzzahlige Tits. Ich bin mir nicht sicher, zu welchem Zeitpunkt eine Zeitüberschreitung oder Speicherfehler auftreten, und ich möchte nicht, dass Dennis sauer auf mich wird, weil er TIO missbraucht hat!alte Antwort, 170 Bytes
Dieser sollte für alle Eingänge funktionieren, obwohl bei nur 32-Bit-Ganzzahlen die Möglichkeit einer Ungenauigkeit besteht, da R sie automatisch in konvertiert
double
.Probieren Sie es online aus!
Nimmt
-1
fürA
,0
fürB
und1
fürC
.Enthält den Ansatz in dieser Antwort für die Konvertierung in ein ausgeglichenes ternäres System. Da wir jedoch garantiert nicht mehr als 27 ausgeglichene Tits haben, ist es dafür optimiert.
R , 160 Bytes
Probieren Sie es online aus!
Diese Version wird extrem langsam beendet. Diese Funktion ist ein Trottel der Basiskonvertierung und wählt zufällig Trits aus, bis sie auf magische Weise (
3^-54
Wahrscheinlichkeit ihres Auftretens) die richtigen Trits füra
undb
findet und dann die erforderliche Operation ausführt . Dies wird im Grunde nie enden.quelle
z
ist beschränkt auf{-1, 0, 1}
.z
Karte jeweils einer dieser drei ternären Operationen zugeordnet werden sollen: [...]z
ist entweder-1
,0
oder1
, und ich denke, das sind die "Werte vonz
", auf die Bezug genommen wird.switch(z,...)
mit ,switch(z+2,...)
so dass es unabhängig eine triviale Änderung wäre.Gelee , 47 Bytes
Probieren Sie es online aus!
Volles Programm.
-1
=C
,0
=A
,1
=B
Argument 1:
[x, y]
Argument 3:
z
quelle
x
undy
in ausgeglichenem ternär zu nehmen: "x und y können von -3812798742493 bis einschließlich 3812798742493 sein. Der erste Schritt besteht darin, x und y von dezimal in ausgeglichenes ternär umzuwandeln."