Lassen Sie uns eine einfache, surjektive Zuordnung von positiven Ganzzahlen zu Gaußschen Ganzzahlen erstellen , bei denen es sich um komplexe Zahlen handelt, bei denen der Real- und Imaginärteil Ganzzahlen sind.
Wenn Sie zum Beispiel eine positive Ganzzahl haben 4538
, drücken Sie sie in Binärform ohne führende 0
Zeichen aus:
4538 base 10 = 1000110111010 base 2
Entfernen Sie alle folgenden 0
Elemente:
100011011101
Ersetzen Sie alle Läufe von einem oder mehreren 0
durch einen einzigen +
:
1+11+111+1
Ersetzen Sie alle 1
durch i
's:
i+ii+iii+i
Bewerten Sie den resultierenden komplexen Ausdruck und geben Sie die vereinfachte Gaußsche Ganzzahl aus:
i+ii+iii+i = i+i*i+i*i*i+i = 2i+i^2+i^3 = 2i+(-1)+(-i) = -1+i
Die Ausgabe kann auf herkömmliche mathematische Weise ausgedrückt oder als zwei separate Ganzzahlen für den Realteil und den komplexen Teil angegeben werden. Für das 4538
Beispiel wäre eines dieser Beispiele in Ordnung:
-1+i
i-1
-1+1i
(-1, 1)
-1 1
-1\n1
Für Eingänge , wie 29
, mathy formatiert Ausgänge wie 0
, 0i
oder 0+0i
sind alle in Ordnung.
Verwenden j
(oder etwas anderes) anstelle von i
ist in Ordnung, wenn dies für Ihre Sprache natürlicher ist.
Der kürzeste Code in Bytes gewinnt.
quelle
4+2j
->100+10j
...Antworten:
MATL , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
Betrachten Sie
4538
zum Beispiel die Eingabe .quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2, 53 Bytes
Ich habe versucht, dies zu golfen, und es scheint golfen zu können, aber ich habe keine A ...
quelle
(k or 1)
scheint nicht optimal zu sein, aber das einzige,(k+0**k)
0**k
nicht für komplexek
...Mathematica,
4438 BytesErläuterung
Konvertiere die Eingabe in Basis 2. (
4538
wird{1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
)Multiplizieren mit
I
({1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0}
wird{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
)Nach Läufen
{I, 0, 0, 0, I, I, 0, I, I, I, 0, I, 0}
aufteilen ( wird{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
)Finde das Produkt auf Stufe 2. (
{{I}, {0, 0, 0}, {I, I}, {0}, {I, I, I}, {0}, {I}, {0}}
wird{I, 0, -1, 0, -I, 0, I, 0}
)Summiere das Ergebnis. (
{I, 0, -1, 0, -I, 0, I, 0}
Wird-1 + I
)quelle
Tr[Times@@@(I*Split@RealDigits[#,2][[1]])]&
I
, benutzt,IntegerDigits
bin aber kürzer geworden.Python 2 ,
777671 BytesVielen Dank an @ZacharyT für das Golfen ab 1 Byte!
Probieren Sie es online!
quelle
JavaScript (ES6),
6764 BytesAusgabe als 2-Element-Array.
Erläuterung
Da JavaScript keine imaginären Zahlen hat, müssen wir die Real- und Imaginärteile in separaten Variablen verfolgen. Der einfachste Weg, dies zu tun, ist ein einzelnes Array, wobei der Realteil an erster Stelle steht. i wird als [0,1] , i 2 (oder -1 ) als [-1,0] , i 3 (oder -i ) als [0, -1] und i 4 (oder 1 ) als [1] dargestellt , 0] .
Erstens teilen wir die Zahl wiederholt durch 2 und sammeln jeden Lauf von Einsen in seiner binären Darstellung. Jeder Lauf von n Einsen entspricht i n . Dies entspricht dem Hinzufügen von 1 - (n & 2) zu dem Element am Index n & 1 im Array mit zwei Elementen. Das machen wir also.
Ich sollte wahrscheinlich mehr Erklärungen hinzufügen, aber ich kann mir nicht vorstellen, was noch zu erklären ist. Wenn Sie Fragen haben, können Sie diese gerne kommentieren.
quelle
Python,
1991291241169490716361 BytesDie Eingabe ist nur die Zahl selbst.
Die Ausgabe erfolgt in dem Format
(a+bj)
, in demj
sich die imaginäre Einheit befindet.0j
wird ausgegeben statt(0+0j)
Zuerst ins Binäre konvertieren. Abschneiden
'0b'
. Töte die nachgestellten Nullen. Teilen mit einem Block von Null (en) als Trennzeichen. Ordnen Sie jeden Block zu1j ** len
. Dann nimm die Summe des Ganzen.-70 Bytes, indem nicht in Plus konvertiert wird.
-5 Bytes Regex ist kürzer.
-8 Bytes, indem die beiden unnötigen Variablen entfernt werden, die nur einmal aufgerufen wurden.
-22 Bytes durch die Verwendung komplexer Zahlen anstelle meiner seltsamen Sache. Vielen Dank an @Dennis 'Antwort, die mich über komplexe Zahlen informiert hat!
-4 Bytes durch die Erkenntnis, dass dies
map
nur eine ausgefallene Art ist, Listenverständnisse zu erstellen, außer länger.-19 Bytes durch Umschalten auf eine leicht arkane Methode zur Vermeidung von Fehlern
j ** 0
und zur Vermeidung von Regex. Inspiriert von @ Griffins Kommentar. Vielen Dank! :)-8 Bytes durch Verschieben des
if
Teils an das Ende.-2 Bytes Vielen Dank an @Griffin für das Speichern von 2 Bytes durch Entfernen der eckigen Klammern, damit es stattdessen ein Generator-Ausdruck wird!
quelle
sum(1j**x.count('1')for x in bin(input()).split('0')if x)
1
Blöcke verwendet und nicht wie ich Regex verwendet. Außerdem möchte ich Ihnen den Code nicht stehlen, da er viel besser ist als meine Version. :)1
s die Länge gezählt wird, der0x
Teil zuerst von vorne entfernt wird. Vielen Dank für die Idee, dieif
zum Ende zu bewegen ; Ich hätte nie gewusst, dass das anders funktioniert!MATLAB, 58 Bytes
Lassen Sie uns
285
den Prozess veranschaulichen:Zum Glück
1+++1
verhält es sich genauso wie1+1
in MATLAB1+111+1
.Jetzt ist dieser
strrep
Anruf der wahre Schatz! Durch Einsetzeni*1
für1
uns etwas wirklich schön bekommen. Wenn es nur einen gibt1
, bekommen wir einfachi*1
deni
. Wenn es mehr ist , als man danni*1
in eine Sequenz wiederholt und verkettet wird:i*1i*1i*1i*1
. Dai==1i
in MATLAB und das1i*1==i
ist einfach:i*i*i*i
.Das Anhängen
.0
erscheint hier unnötig, wird aber benötigt, wenn das letzte Zeichen von atemp3
ist+
. Wir können nicht einfach eine Null anhängen, da diesi*10
im obigen Fall zu einem falschen Ergebnis führen würde.Und schlussendlich:
Dies funktioniert in Octave aus mehreren Gründen nicht.
strrep
ASCII-Werte können nicht als Eingabe verwendet werden, es werden die tatsächlichen Zeichen ('0'
anstelle von48
) benötigt. Auch+++
wird nicht nur+
in Oktave ausgewertet , da dies die Inkrement / Dekrement-Verknüpfungenx++
und stören würdex--
.quelle
eval
:-P Können Sie nicht1i
anstelle von verwenden1*i
?i*1
Teil ...Pyth - 15 Bytes
Frustrierend lang.
Test Suite .
quelle
Mathematica, 84 Bytes
Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine komplexe Zahl als Ausgabe zurück.
quelle
Mathematica, 75 Bytes
Independent hat sich fast dieselbe Lösung ausgedacht, die LegionMammal978 vor 23 Minuten gepostet hat! Ersetzen
1
durchI
(das interne Symbol von Mathematica für die Quadratwurzel von -1) funktioniert, weil Leerzeichen als Multiplikation benachbarter Ausdrücke behandelt werden. Der Platz, den ich bei der anderen Lösung gespart habe, nämlich indem ich das Erfordernis vermieden habeStringTrim
, besteht darin, immer anzuhängen-0
: Wenn die Binärzahl auf endet1
, endet dieser Ausdruck,...I-0
der seinen Wert nicht beeinflusst; Wenn die Binärzahl mit '0' endet, endet dieser Ausdruck,...+-0
der als "negative 0 hinzufügen" analysiert wird und somit das nachfolgende Pluszeichen beseitigt.quelle
Matlab, 99 Bytes
Testfälle:
quelle
Haskell,
102918987 BytesDividiert wiederholt durch zwei und überprüft das Bit. Behält einen Akkumulator bei,
i^(number of odds)
in dem angegebena+b*i
ist, wie[a,b]
und wie er*i
ist[a,b]↦[-b,a]
(Drehung um 90 Grad). Die Initiale(*2)
besteht darin, eine Suche nach dem ersten Bit zu vermeiden.Verwendung (Danke an @OwenMorgan für die Beispiele):
quelle
Java, 172 Bytes
quelle
Clojure, 183 Bytes
Darf ich das tun?
Verwenden Sie die Funktion wie folgt:
quelle
Eigentlich 35 Bytes
Probieren Sie es online!
Erläuterung:
Etwa gleichwertiger Python 3-Code:
Probieren Sie es online!
quelle
'0@s
und mit``░
teilen, um alle nachgestellten leeren Zeichenfolgen abzuschneiden, sparen Sie vier Bytes.Gelee , 10 Bytes
Dies ist nicht besser als Dennis 'Gelee-Antwort, aber ich wollte mich trotzdem an einer Gelee-Antwort versuchen. Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
1 => 1 => 1j
ist dies äquivalent zu2 => 10 => 1 => 1j
.Eigentlich 15 Bytes
Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing:
quelle
Axiom,
140, 131, 118,108 Bytes% i ist der imaginäre Costant.Ungolfed
Ergebnisse
quelle
Perl 6 ,
4046 BytesDas habe ich mir ziemlich schnell ausgedacht
Leider ist es derzeit in der Rakudo- Implementierung auf MoarVM ungenau .
say i ** 3; # -1.83697019872103e-16-1i
Also musste ich das nächstbeste machen:
Erweitert:
Prüfung:
quelle
PHP, 87 Bytes
Fast wie die Lösung von ETHproductions; nur iterativ statt rekursiv.
Übernimmt Eingaben von der Kommandozeile, setzt Variablen
${0}
und${1}
.quelle
TI-Basic (TI-84 Plus CE), 70 Byte
Es gibt keinen eingebauten Code zum Konvertieren in eine Binärzeichenfolge (und auch keinen zum Parsen einer Zeichenfolge). Daher teilt dieses Programm manuell durch 2, inkrementiert N jedes Mal, wenn es eine 1 sieht, und fügt i ^ N zu S (N> 0) hinzu und setzt zurück N, wenn eine Null angezeigt wird.
quelle
Java , 100 Bytes
Probieren Sie es online!
quelle
R , 54 Bytes
Probieren Sie es online!
n%/%2^(0:log2(n))%%2
berechnet einen Vektor der Binärziffern. Unter Verwendung der Lauflängencodierung verwenden wir dencomplex
Typ von R , um die entsprechende Summe zu berechnen, und multiplizieren sie mitx$values
, um Nullen zu entfernen.Gibt einen
complex
Vektor eines Elements zurück.quelle