Gaußsche Ganzzahlen sind komplexe Zahlen der Form a+bi
wobei a
und b
beide Ganzzahlen sind. In der Basis -1 + i können alle Gaußschen Ganzzahlen mit den Ziffern 0
und eindeutig dargestellt werden 1
, ohne dass ein Symbol für das Vorzeichen erforderlich ist.
Zum Beispiel steht 1100
in der Basis -1 + i für die Dezimalzahl 2, da
1*(-1+i)^3 + 1*(-1+i)^2 + 0*(-1+i)^1 + 0*(-1+i)^0
= (2+2i) + (-2i) + 0 + 0
= 2
Die Eingabe besteht aus zwei Gaußschen Ganzzahlen zur Basis -1 + i, die anhand der Ziffern dargestellt werden 01
. Dies kann eine der folgenden Formen annehmen:
- Zwei getrennte Ziffernfolgen,
- Zwei Dezimalzahlen, die aus der
01
Darstellung der Zahlen zur Basis -1 + i bestehen (z. B.1100
für 2 zur Basis -1 + i), - Zwei binäre Ganzzahlen, die die Basis-1 + i-Zahlen darstellen (z. B. dezimal
12
oder0b1100
für 2 in Basis-1 + i) - Eine einzelne Zeichenfolge, die zweistellige Zeichenfolgen / binäre Ganzzahlen durch ein einzelnes nicht-alphanumerisches Trennzeichen trennt (z. B.
1100 1100
oder12,12
für 2 + 2)
Geben Sie die Summe der beiden Gaußschen Ganzzahlen aus, ebenfalls in der Basis -1 + i und mit den Ziffern dargestellt 01
(in einem der als Eingabe zulässigen Formate, nicht unbedingt die gleiche Wahl). Die Ausgabe darf eine endliche Anzahl führender Nullen enthalten.
Ihre Funktion oder Ihr Programm muss bei Eingaben mit jeweils höchstens 30 Stellen innerhalb von 2 Sekunden beendet sein.
Zusätzliche Klarstellungen
- Sie können davon ausgehen, dass die Eingabe keine führenden Nullen enthält. Für den Sonderfall 0 können Sie entweder eine
0
oder eine leere Zeichenfolge als Darstellung auswählen .
Testfälle
0, 0 => 0 # 0 + 0 = 0
0, 1 => 1 # 0 + 1 = 1
1, 1 => 1100 # 1 + 1 = 2
1100, 1100 => 111010000 # 2 + 2 = 4
1101, 1101 => 111011100 # 3 + 3 = 6
110111001100, 1110011011100 => 0 # 42 + (-42) = 0
11, 111 => 0 # i + (-i) = 0
11, 110 => 11101 # i + (-1-i) = -1
10101, 11011 => 10010 # (-3-2i) + (-2+3i) = (-5+i)
1010100101, 111101 => 1110100000100 # (-19+2i) + (3-4i) = (-16-2i)
Längere Testfälle:
11011011010110101110010001001, 111100010100101001001010010101 => 0
111111111111111111111111111111, 111111111111111111111111111111 => 100100100100100100100100100100
101101110111011101110111011101, 101101110111011101110111011101 => 11101001010001000100010001000100011100
100100010101001101010110101010, 100010011101001011111110101000 => 110000110010101100001100111100010
quelle
-1+i
umi-1
in dem Titel.Antworten:
Python 2,
98979184 BytesDies führt E / A dezimal aus. Die Ganzzahlen müssen durch nicht alphanumerische Zeichen getrennt werden
+
.Vielen Dank an @xnor für das Golfen mit 2 Bytes!
Probieren Sie es auf Ideone .
Wie es funktioniert
In Arithmetic in Complex Bases zeigt der Autor, wie komplexe Zahlen in Basen der Form -n + i addiert und multipliziert werden .
Für die Basis -1 + i erfolgt die Addition ähnlich wie bei der regulären binären Addition mit Übertrag, mit zwei Unterschieden:
Anstatt 1 zur nächsthöheren Position zu tragen, tragen wir 110 zu den nächsten drei.
Carry Digits können sich unbegrenzt ausbreiten. Ohne führende Nullen hat die Summe a + b höchstens acht Stellen mehr als das Maximum von a und b .
Wir gehen wie folgt vor.
Zuerst fügen wir a und b so hinzu, als ob ihre Ziffern Dezimalstellen wären.
Für a = 10101 und b = 11011 ergibt dies 21112 .
Als nächstes bilden wir eine neue Zahl, indem wir die Ziffern größer als 1 durch eine 1 ersetzen , andere durch eine 0 . 1
Für die Summe 21112 ergibt dies 10001 .
Für jede Ziffer, die größer als 1 ist , müssen wir 2 von dieser Ziffer abziehen und 110 zu den nächsten drei höheren Stellen befördern. Da 1098 = 10 * 110 - 2 , können wir dies erreichen, indem wir das Ergebnis aus Schritt 2 mit 1098 multiplizieren und dieses Produkt dann zur Summe addieren. 2
Für die Summe 21112 ergibt sich 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Wir wiederholen die Schritte 2 und 3 insgesamt 8 Mal, wobei d die Anzahl der Stellen von a + b ist . 3
Für die Anfangssumme 21112 lauten die Ergebnisse
Wir nehmen die Endsumme modulo 10 d + 8 und verwerfen alle bis auf die letzten d + 8 Ziffern.
Für die Anfangssumme 21112 lautet das Endergebnis 10010 .
1 Dies wird mit translate erreicht . Das 64-fache Wiederholen der Zeichenfolge 0011 bewirkt, dass eine Wiederholung mit der Folge der ASCII-Zeichen 0123 übereinstimmt und die gewünschte Ersetzung erzielt wird.
2 anzumerken , dass die Ziffern dieser Summe können nicht überschreiten 3 (Anfangswert 1 plus zwei 1 ‚s aus trägt).
3 Dies funktioniert ansonsten für d = 1 und d * 8> d + 8 . Der Code kann die Schritte (d + 1) * 8 Mal wiederholen , da s ein nachgestelltes L hat, wenn s eine lange Ganzzahl ist.
quelle
input()
erwartet Sie? (Ich bekomme,21112
wenn ich10101, 11011
d+8
und nicht sagend+9
? Wie????Pyth, 34 Bytes
Probieren Sie es online aus: Demo oder Test Suite (dauert eine Weile). Es sollte die zeitliche Beschränkung allerdings problemlos erfüllen, da der Online-Compiler im Vergleich zum normalen (Offline-) Compiler recht langsam ist.
Erläuterung:
Mein Algorithmus ist im Grunde eine Implementierung der Addition mit dem Tragen. Aber anstatt zu tragen
1
, muss ich tragen110
(1100
in der Basis-1+i
ist das gleiche wie2
in der Basis-1+i
). Dies funktioniert meistens gut, aber Sie können in einer Endlosschleife stecken bleiben und Nullen drucken. Zum Beispiel , wenn Sie hinzufügen ,1
mit ,11
und haben zur Zeit den Übertrag110
. Also füge ich im Grunde hinzu, bis ich in einer Schleife stecke und dann aufhöre. Ich denke, dass eine Schleife, die eine Schleife immer Nullen drucken wird und daher sollte dies in Ordnung sein.quelle
Python 2,
6967 BytesDie Ein- / Ausgabe erfolgt mit Ganzzahlen zur Basis 2.
-2 Danke @Dennis.
quelle
a*a+b*b^58==0
wanna
undb
sind invers? Wie funktioniert das?a*a+b*b==58
wenn einer von ihnen 3 ist und der andere 7.(3,7)
ist nicht klar, dass dies das einzige Paar ist, das einen Zyklus gibt und eine spezielle Hülle benötigt. Wenn dies zutrifft, müssen Sie(a,b)==(3,7)
diese Reihenfolge nur einchecken , da dies(7,3)
wiederholt(3,7)
wird. Vielleicht gibt es dafür einen kürzeren Ausdruck.^
XOR ist, keine Potenzierung, oder (b) XOR hat eine niedrigere Priorität als+
.Retina , 100 Bytes
Dies nimmt die Eingabe mit einem Komma getrennt. Die Ausgabe beginnt immer mit drei führenden Nullen.
Probieren Sie es online!
Ich frage mich wirklich, ob es eine kürzere Lösung für die erste Stufe gibt ...
quelle
Jelly,
292826242120 BytesDies führt E / A dezimal aus. Die Ganzzahlen müssen durch nicht alphanumerische Zeichen getrennt werden
+
.Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
In Arithmetic in Complex Bases zeigt der Autor, wie komplexe Zahlen in Basen der Form -n + i addiert und multipliziert werden .
Für die Basis -1 + i erfolgt die Addition ähnlich wie bei der regulären binären Addition mit Übertrag, mit zwei Unterschieden:
Anstatt 1 zur nächsthöheren Position zu tragen, tragen wir 110 zu den nächsten drei.
Carry Digits können sich unbegrenzt ausbreiten. Ohne führende Nullen hat die Summe a + b höchstens acht Stellen mehr als das Maximum von a und b .
Wir gehen wie folgt vor.
Zuerst fügen wir a und b so hinzu, als ob ihre Ziffern Dezimalstellen wären.
Für a = 10101 und b = 11011 ergibt dies 21112 .
Für jede Ziffer, die größer als 1 ist , müssen wir 2 von dieser Ziffer abziehen und 110 zu den nächsten drei höheren Stellen befördern. Wir können dies erreichen , indem jede Dezimalziffer in binärer Umwandlung, die sie ergebenden binäre Arrays von der Basis 1100 zu ganzer Zahl und interpretiert die resultierende Liste von 0 's, 1 s, 1100 s und 1101 ' s als eine nicht-kanonischen Basen 10 Nummer. 1
Für die Summe 21112 ergibt sich 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Wir wiederholen die Schritte 2 a insgesamt 8 Mal, wobei d die Anzahl der Stellen von a + b ist .
Für die Anfangssumme 21112 lauten die Ergebnisse
Wir verwerfen alle bis auf die letzten d + 8 Ziffern des Endergebnisses. Dies wird erreicht, indem alles nach den letzten 2 verworfen wird . 2
Für die Anfangssumme 21112 lautet das Endergebnis 10010 .
Wie es funktioniert
1 anzumerken , dass die Ziffern dieser Summe nicht überschreiten können 3 (Anfangswert 1 plus zwei 1 ‚s aus trägt).
2 Dies funktioniert, weil die letzte Ziffer, die gelöscht wird, keine 3 sein kann .
quelle
Python 3, 289 Bytes
Dies führt eine ziffernweise Addition von der niedrigsten zur höchstwertigen Ziffer durch (mit anderen Worten, der exakt gleiche Algorithmus, den Sie in der Grundschule unterrichtet haben). Die Unterschiede bestehen darin, dass (a) es sich um eine Binärzahl und nicht um eine Dezimalzahl handelt. Sie tragen also immer dann, wenn eine Ziffer 2 oder mehr ist, und (b)
1 + 1 = 1100
nicht10
.Tatsächlich ist es auch notwendig zu beachten, dass
11 + 111 = 0
andernfalls Summen, die Null werden sollten, niemals enden.Mehr Golfen ist sicher möglich.
quelle
Retina,
157151134133124123 BytesDank an Martin Büttner 1 Byte weg.
Probieren Sie es online!
Konvertiert nach Unary und wiederholt dann die folgenden Ersetzungen (hier in Dezimalzahl):
Grundsätzlich gilt: Wenn größer als zwei, nehmen Sie zwei weg, fügen Sie nichts zur vorherigen Ziffer hinzu, fügen Sie eine zur vorherigen Ziffer hinzu und fügen Sie dann eine zur vorherigen Ziffer hinzu.
Im Pseudocode:
Unäre Implementierung:
Jede Ziffer (z. B.
3
) wird als Anzahl vonx
s (z. B. ) angezeigtxxx
und mit einem Präfix versehen0
.Zum Beispiel
1234
würde ausgedrückt als0x0xx0xxx0xxxx
.Dies bleibt
0
unverändert, wie101
durch ausgedrückt werden würde0x00x
.Da es anfangs und schließlich nur
0
und gibt1
, könnte die Konvertierung leicht von1->0x
und durchgeführt werden0x->1
.Klicken Sie hier, um alle Schritte anzuzeigen .
quelle
JavaScript (ES6),
146126 Bytesg
wandelt eine Gaußsche ganze Zahl (Real- und Imaginärteil) in der Basisi-1
, währendr
undi
wandelt einei-1
Basisganzzahl in eine Gaußsche ganzen Zahl (Real- und Imaginärteil bzw.). Sobald die Konvertierungen abgeschlossen sind, muss ich nur noch rechnen.Bearbeiten: Durch getrennte Berechnung von Real- und Imaginärteil werden 20 Byte gespeichert.
quelle
C ++ 416 Bytes plus
#include <vector>\n#include <algorithm>\n
(weitere 40)oder mit mehr Leerzeichen:
Kaum Golf gespielt. Es nimmt Eingaben als Vektor von Ints entgegen und gibt einen Vektor von Ints zurück.
Live-Beispiel .
quelle