Eines der vielen einzigartigen Merkmale der Programmiersprache Malbolge ist der äußerst unintuitive OP
Operator, der in der Dokumentation und im Quellcode nur als "op" bezeichnet wird, im Volksmund aber als "crazy" -Operator bezeichnet wird. Wie von Ben Olmstead, dem Schöpfer der Sprache, in seiner Dokumentation beschrieben: " Suche kein Muster, es ist nicht da ."
op ist ein "tritweiser" Operator - er bearbeitet die entsprechenden ternären Ziffern seiner beiden Argumente. Für jedes Trit (ternäres Bit) ergibt sich das Ergebnis von op aus der folgenden Nachschlagetabelle:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Um beispielsweise zu berechnen op(12345, 54321)
, schreiben Sie zuerst beide Zahlen ternär aus und schlagen dann jedes Paar von Trits in der Tabelle nach:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
Der letzte wichtige Punkt ist , dass alle Werte in Malbolge sind Trits 10 breit, so dass Eingangswerte sollten mit Nullen bis zu einer Breite von 10 aufgefüllt werden (beispielsweise op(0, 0)
ist 1111111111
in ternären.)
Ihre Aufgabe ist es, zwei Ganzzahlen 0 ≤ a
, b
<59049 als Eingabe zu verwenden und den Ganzzahlwert von auszugeben op(a,b)
.
Testfälle (im Format a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Hier ist eine Referenzimplementierung (direkt aus dem Malbolge-Quellcode kopiert).
54616_3
heißt das nicht "dieses andere Ding ist die Dezimalzahl 54616, sondern als Basis drei dargestellt". Es bedeutet "Read54616
as base 3". Was Sie natürlich nicht können (es gibt Ziffern, auf die Valve nicht zählen kann). Es wäre wahrscheinlich immer noch genauso klar, wenn Sie sich des_3
Ganzen und Genaueren entledigen würden .Antworten:
C (GCC) ,
999896 Bytes19683
zuL'䳣'
.108609
zuL''
.Probieren Sie es online!
quelle
JavaScript (ES7), 56 Byte
Probieren Sie es online!
Wie?
Mit und in berechnen wir:b [ 0..2 ]ein b [ 0..2 ]
Führen zu:
Funktionswahl
Es gibt mehrere andere mögliche Kandidatenfunktionen des Formulars:
Eine der kürzesten ist:
Das Gute an ist jedoch, dass es mit bitweisen Operatoren durchgeführt werden kann, wodurch implizit die Dezimalteile von und . Deshalb können wir sie einfach durch teilen, ohne zwischen den einzelnen Iterationen zu runden.(a+512b+8) a b 3
Kommentiert
quelle
(1581093>>b%3*2+a%3*8&3)
spart ein ganzes Byte!a/3
undb/3
ohne Rundung. Das würde daran scheitern.k = 9 ... => ~k && ...
zuk = 10 ... => k && ...
?for(k=9;k>=0;k--)
alsfor(k=10;k>=1;k--)
.05AB1E , 18 Bytes
Code:
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
Algorithmus Erklärung
Um die Zahl mit Nullen aufzufüllen , müssen wir zu beiden Zahlen 59049 addieren (weil 59049 im Ternary 10000000000 ist ). Wir müssen die führende 1 nicht als . Wir konvertieren die Zahlen von dezimal nach ternär und verbinden jedes Paar als eigene Zahl.(1,1)→0
Für die Eingaben 12345 und 54321 werden diese beispielsweise wie folgt zugeordnet:
Das gibt die folgende Liste der verbundenen ganzen Zahlen:
Diese Ganzzahlen müssen durch die angegebene Nachschlagetabelle im OP abgebildet werden. Die derzeit verwendete Formel, mit der diese Zahlen den entsprechenden Trits ( ) zugeordnet werden, lautet:0→1,10→0,…
Während die bitweise xor- Funktion bezeichnet.⊕
Nachdem wir diese Funktion in der Liste der verbundenen Ganzzahlen abgebildet haben, behandeln wir diese resultierende Liste als eine Zahl, die in der Basis 3 dargestellt ist, und konvertieren sie von der Basis 3 in eine Dezimalzahl.
Code-Erklärung
quelle
3Tm+3Bø19sm74%3%3β
man Golf spielen?R ,
6462 BytesProbieren Sie es online!
Vielen Dank an JAD für ein paar
Black MagicGolf Tricks und -2 Bytes!30801
Wenn es in eine ternäre 10-Trit-Ganzzahl konvertiert wird1120020210
, fügt es der Operationstabelle nur eine nachgestellte Null hinzu, wenn es die Spalten abliest . Dann konvertieren wir die ternären Ziffern vona
undb
elementweise in eine ganze Zahl und verwenden diese als Index für die ternären Ziffern von30801
.quelle
x
mit[.*]
. Dann%any%
passieren alle Operationen. Der lustige Teil ist, dass, wenn Sie30801%/%x%%3
als sehenf=function(x)30801%/%x%%3
, dassf(x[index]) == (f(x))[index]
. Speichern der Hosenträger :)C (gcc) ,
747271 BytesProbieren Sie es online!
Nervenzusammenbruch
Die Wahrheitstabelle
Man kann sich ein 3x3-Array vorstellen, bei dem a die Spalte und b die Zeile ist. Wenn wir das in eine eindimensionale Liste umwandeln, erhalten wir 100102221. Um Platz zu sparen, vermeiden wir Listen und Zeichenfolgen und machen es stattdessen zu einer Zahl. Dazu kehren wir die Reihenfolge um und wandeln jeden Trit in eine 2-Bit-Zahl um. Kleben Sie sie zusammen und wir haben eine Binärzahl, in die wir "indexieren" können, indem wir sie nach rechts verschieben
2 * (b * 3 + a)
und maskieren:Als nächstes massieren wir den Ausdruck unter Verwendung der Kraft der Vorrangstellung, um den obigen Gräuel zu werden.
3 ^ 9 = 19683, das ist also eine gute Schleifengrenze. Da wir den Zähler jedes Mal mit 3 multiplizieren, können wir2e4
stattdessen das Limit als schreiben . Auch ersparen wir uns die Mühepow()
oder ähnliches.Beginnen wir beim zweiten Gedanken bei 3 ^ 10 und arbeiten nach unten mit einem Divide-and-Test vor der Schleife.
quelle
Haskell , 108 Bytes
Probieren Sie es online!
quelle
APL (Dyalog) ,
4125 Bytes9 Bytes gespart dank @ Adám
Probieren Sie es online!
quelle
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Jelly ,
2318 Bytes-1 dank Erik the Outgolfer (neu anordnen
3*⁵¤
nach⁵3*
)Ein monadischer Link, der eine Liste mit zwei ganzen Zahlen akzeptiert.
Probieren Sie es online! Oder sehen Sie sich eine Testsuite an .
⁹*%733%3
ist ein Byte länger alsị⁽½Ṡb3¤
:(Wie?
Ebenfalls 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(Verwendet eine Zauberformel, nachdem die paarweisen Trits der Konvertierung von der Basis 10 erhalten wurden, und nimmt dann 19 zu dieser Potenz, Modulo 74, Modulo 3, um die erforderlichen Trits der Ausgabe zu erhalten - gefunden mit einer Suche in Python)quelle
y
0
s" eingebaut sein)Python 2 ,
79656361 Bytesdanke an arnauld für seine formel (-2 bytes).
Probieren Sie es online!
quelle
J , 37 Bytes
Erläuterung:
Letztendlich relativ gut lesbar, tbh.
quelle
Python 2 ,
9087 BytesProbieren Sie es online!
quelle
Kohle , 31 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Alternativlösung, auch 31 Bytes:
Probieren Sie es online! Link ist eine ausführliche Version des Codes.
quelle
Ruby , 70 Bytes
Probieren Sie es online!
Zerlegt
a
undb
rekursiv, bis wir jeweils 10 Stellen erhalten.6883
gibt die abgeflachte ternäre Tabelle (umgekehrt) an. Rekonstruiert von ternär zu dezimal durch Multiplikation mit3**(10-l)
.quelle
Cjam, 31 Bytes
Probieren Sie es online!
quelle
J , 43 Bytes
Es kann sicherlich weiter golfen werden.
Erläuterung:
Probieren Sie es online!
quelle
Stax , 22 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Pyth
26 2524 BytesDank @ErikTheOutgolfer 1 Byte gespeichert
Speichern Sie ein weiteres Byte, inspiriert von @ JonathanAllans Antwort
Die Eingabe ist eine Liste mit 2 Elementen
[a,b]
. Probieren Sie es hier online aus oder überprüfen Sie alle Testfälle hier .quelle
.T
kann seinC
.K (NGN / k) ,
2522 BytesProbieren Sie es online!
quelle
Japt ,
2423 BytesJapt's Lauf als Sprache des Monats zum Laufen zu bringen - ich gehe davon aus, dass ich diesbezüglich überfordert bin!
Übernimmt die Eingabe in umgekehrter Reihenfolge als ganzzahliges Array (dh
[b,a]
).Versuch es
quelle
Perl 5
-p
, 102 BytesProbieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
757260 BytesProbieren Sie es online!
Ungolf-Version:
Beide
a
undb
werden in Zehn-Trit-Listen konvertiert und dann paarweise als 2D-Index in eine Nachschlagetabelle mit Zahlen verwendet{1, 0, 0, 1, 0, 2, 2, 2, 1}
. Das Ergebnis wird erneut als Zehn-Trit-Liste interpretiert und zurück in die Ganzzahlform konvertiert.Die Nachschlagetabelle ist als codiert
IntegerDigits[6883,3]
, was kurz ist, da wir dasIntegerDigits
Symbol recyceln .quelle