Einführung
Für diese Herausforderung müssen Sie die nachgestellten Nullen einer Ganzzahl-Binärdarstellung auf setzen 010101…
. Dies wird am besten anhand eines Beispiels erläutert:
In Anbetracht der Ganzzahl 400
besteht der erste Schritt darin, sie in eine Binärzahl umzuwandeln:
110010000
Wie wir sehen können, ist das fünfte Bit das niedrigstwertige 1
Bit. Von dort aus ersetzen wir die unteren Nullen durch 0101
:
110010101
Zuletzt konvertieren wir das zurück in dezimal: 405
Herausforderung
Bei einer positiven Ganzzahl wird der entsprechende Ergebniswert des oben definierten Prozesses zurückgegeben / ausgegeben.
Regeln
- Diese Sequenz ist nur für Ganzzahlen mit mindestens einem
1
Bit definiert, sodass die Eingabe immer ≥ 1 ist - Sie können die Eingabe stattdessen als Zeichenfolge und als Liste von Dezimalstellen vornehmen
- Sie müssen keine ungültigen Eingaben verarbeiten
Testfälle
Hier sind einige weitere Testfälle mit den Zwischenschritten (Sie müssen diese nicht ausdrucken / zurücksenden):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
die maximale Potenz von 2 die Eingabe teilt, lautet die Antwort einfach(input) + ceil((2^n - 2)/3)
Antworten:
Python 3 , 20 Bytes
Probieren Sie es online!
Erläuterung
Nehmen Sie
192
als Beispiel. Seine binäre Form ist11000000
, und wir müssen es konvertieren11010101
.Wir stellen fest, dass wir
10101
die Zahl ergänzen müssen . Dies ist eine geometrische Reihe (4^0 + 4^1 + 4^2
), die eine geschlossene Form als hat(4^3-1)/(4-1)
. Dies ist das Gleiche wie4^3//3
bei der//
Ganzzahldivision.Wenn es
101010
so wäre, dann wäre es immer noch eine geometrische Reihe (2×4^0 + 2×4^1 + 2×4^2
),2×4^3//3
aus den oben genannten Gründen.Wie auch immer,
4^3
und2×4^3
wäre nur das am wenigsten signifikante Bit, das wir erhalten durchn&-n
:Wir bemerken, dass das Komplement von
n
ist00111111
. Wenn wir eins hinzufügen, wird es01000000
und überschneidet sich nur mitn=11000000
der niedrigstwertigen Ziffer. Beachten Sie, dass "ergänzen und eins hinzufügen" nur Negation ist.quelle
lambda n:(n&-n)//3+n
auch? Besteht alle Beispiel-Testfälle , sollte aber meiner Intuition nach nicht gültig sein, oder?Gelee , 5 Bytes
Probieren Sie es online!
Diesmal eine Portierung von Leaky Nuns Herangehensweise (zumindest habe ich ihm geholfen, ein bisschen Golf zu spielen: P)
Gelee , 7 Bytes
Probieren Sie es online!
Nutzt den fantastischen Ansatz von JungHwan Min mit indirekter Hilfe von Martin Ender .
quelle
&N:3|
. Herzliche Glückwünsche; Du hast Dennis in Jelly geschlagen! (Aber nicht ganz out-golfed.)Wolfram Language (Mathematica) ,
36282624 Bytes-8 Bytes dank @MartinEnder und -2 Bytes dank @ Mr.Xcoder
Probieren Sie es online!
Wir müssen nur die Anzahl der nachgestellten Nullen in der Eingabe finden und die Zahl mit abwechselnden
0
s und1
s mit einer Länge von eins weniger finden und zur Eingabe hinzufügen.So,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
Die explizite Formel für die
n
Zahl mit abwechselndem1
s und0
s wurde in A000975 auf OEIS angegeben. Wir können dien
th-Zahl verwenden, da keine zwei verschiedenen Zahlen die gleiche Länge in binären Zahlen haben und alternierende Ziffern haben können.quelle
2^#~IntegerExponent~2
ist(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
stattdessen verwenden.J ,
19-18BytesProbieren Sie es online!
Schnelle Erklärung
Dies ist eine alte Antwort, aber sie ist der aktuellen sehr ähnlich. Sie zählt die nachgestellten Nullen nur unterschiedlich. In den Kommentaren finden Sie einen Link, der erklärt, wie es funktioniert.
Andere Antwort:
Vorherige Antwort (19 Bytes).
Länger als es sein sollte, weil von
\
rechts nach links geht.quelle
+(2|-.i.@#.-.)&.#:
#.~
zählt die Anzahl der nachgestellten Wahrheiten , also müssen wir#.~ -. #:
die Anzahl der nachgestellten Nullen zählenJulia 0,6 , 12 Bytes
Probieren Sie es online!
quelle
((!n=(n|n))&-n)/3
, oder!n=(((n|n)&(-n))/3)
, etc.|
ist , wie+
und&
ist wie*
. Dahern|n&-n÷3
wird analysiert alsn | ((n&-n) ÷3)
.JavaScript (ES6),
40 bis39 ByteÜbernimmt die Eingabe als 32-Bit-Ganzzahl.
Testfälle
Code-Snippet anzeigen
quelle
05AB1E ,
1385 Bytes5 Bytes dank Mr. Xcoder und JungHwan Min's netter Formel
gespart Weitere 3 dank Mr. Xcoder gespart
Probieren Sie es online!
Erläuterung
quelle
(<bitwise and here>3÷+
sollte für ~ 5 Bytes arbeiten.R ,
7158 Bytesdanke an nofp für -6 bytes
Probieren Sie es online!
Angenommen, die Eingabe ist eine 32-Bit-Ganzzahl. R hat
double
ohnehin nur 32-Bit-Ganzzahlen mit Vorzeichen (Umwandlung in, wenn eine Ganzzahl überläuft) und keine 64-Bit- oder vorzeichenlosen Ints.quelle
which.max(n):1-1
um!cumsum(n)
eine bekommen 65 Bytes LösungBrainfuck , 120 Bytes
Probieren Sie es online!
Beginnt mit dem Wert in der aktuellen Zelle und endet mit der Zelle mit dem Ausgabewert. Funktioniert natürlich nicht bei Zahlen über 255, da dies die Zellenbegrenzung für typisches Brainfuck ist, funktioniert aber, wenn Sie eine unendliche Zellengröße annehmen.
quelle
PowerShell , 168 Byte
Probieren Sie es online!
Autsch. Die Konvertierung von / nach Binär- und Array-Slicing ist nicht die Stärke von PowerShell.
Nimmt die Eingabe
$n
als Zahl an. Wir sofortconvert
die binäre Basis2
und speichern das in$a
. Als nächstes haben wir ein if / else Konstrukt. Die if-Klausel prüft, ob aregex
Match
gegen 1 oder mehr0
s am Ende der Zeichenfolge ('0+$'
)index
an einer Stelle steht, die größer ist als0
(dh der Anfang der Binärzeichenfolge). Wenn dies der Fall ist, müssen wir mit etwas arbeiten,else
wir geben nur die Nummer aus.Innerhalb von
if
schneiden wir diex
ersten Ziffern und verknüpfen+
sie mit den restlichen Ziffern. Für die verbleibenden Ziffern durchlaufen wir sie jedoch und wählen entweder a0
oder1
, um stattdessen ausgegeben$i++%2
zu werden. Dies bringt uns das010101...
Muster anstelle von0
s am Ende. Wir fassen das dann-join
wieder zu einem String zusammen und$c
wandeln es wieder in einenInt32
from base um2
.In beiden Fällen bleibt die Nummer in der Pipeline und die Ausgabe ist implizit.
quelle
APL + WIN, 43 Bytes
Fordert zur Eingabe des Bildschirms auf
quelle
PowerShell ,
4136 BytesProbieren Sie es online! oder Überprüfen Sie alle Testfälle
Port of Leaky Nuns Python Antwort .
5 Bytes dank Leaky Nun gespeichert
quelle
PHP , 47 Bytes
Probieren Sie es online!
Wirklich nur ein weiterer Port von @Leaky Nuns Lösung
quelle
Perl 5 , 54 Bytes
Probieren Sie es online!
quelle
Python 3 , 56 Bytes
Probieren Sie es online!
Ich bin noch nicht sehr zufrieden damit, aber ich wollte die Formel wirklich nicht verwenden ... -2 danke an Rod . -1 Danke an Jonathan Frech .
quelle
eval(...)
stattint(...,2)
könnte ein Byte speichern.Rubin , 15 Bytes
Ein weiterer Hafen von Leaky Nuns Annäherung.
Probieren Sie es online!
quelle
Rost , 18 Bytes
Ein Hafen von Leaky Nuns Annäherung
Probieren Sie es online!
quelle
AWK , 24 Bytes
Ein Hafen der Mathmatica-Antwort von JungHwan Min
Probieren Sie es online!
quelle
JavaScript ES6, 13 Byte
quelle
C 56 Bytes
Probieren Sie es online!
C (gcc), 50 Bytes
Probieren Sie es online!
5148 Bytes mit Arnauld's Lösung :Vielen Dank an @ l4m2 für das Speichern von drei Bytes!
Probieren Sie es online!
43 mit gcc:
Probieren Sie es online!
quelle
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 Bytes
Ein Hafen von Leaky Nuns Annäherung.
Probieren Sie es online!
quelle
Gelee , 13 Bytes
Probieren Sie es online!
Erläuterung
Nehmen Sie als Beispieleingabe 24.
quelle