inspiriert von Countdown aus der Unendlichkeit
Bei einer nicht negativen ganzen Zahl N
die Anzahl der Wiederholungen der folgenden Schritte aus, die erforderlich sind, um 0 zu erreichen:
- Konvertieren
N
Binärdatei (4812390 -> 10010010110111001100110
) - Flip jedes Bit (
10010010110111001100110 -> 01101101001000110011001
) - Trimmen Sie führende Nullen (
01101101001000110011001 -> 1101101001000110011001
) - Zurück in Dezimalzahl konvertieren (
1101101001000110011001 -> 3576217
)
Regeln
- Die Ein- und Ausgabe kann in jedem eindeutigen, konsistenten Format erfolgen
- Die Eingabe liegt innerhalb des systemeigenen darstellbaren Ganzzahlbereichs für Ihre Sprache (wenn Ihre Sprache beliebig große Ganzzahlen unterstützt, gibt es keine Begrenzung).
Testfälle
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Diese Sequenz ist A005811 im OEIS.
~(~a) == a
Antworten:
Gelee ,
64 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Sei n eine nicht negative ganze Zahl.
Schritte 2 und 3 des Verfahrens in der beschriebenen spec können alternativ als das Entfernen aller führenden festgestellt werden , 1 ‚s und Hin- und Herschalten der verbleibenden Bits.
Dies bedeutet, dass wir in jeder Iteration genau eine Gruppe benachbarter und gleicher Binärziffern entfernen, sodass die binäre Countdown-Länge von n nur die Anzahl dieser Gruppen in der Binärdarstellung von n ist . Stellen Sie sich für diese Herausforderung vor, dass 0 keine Ziffern enthält.
Für n = 8675309 sieht der Prozess in binärer Form wie folgt aus.
Anstatt diese Gruppen zu zählen (was bei Randfall 0 fehlschlagen würde ), gehen wir wie folgt vor.
n und n: 2 haben die folgenden binären Darstellungen.
Beachten Sie, dass die Binärdarstellung von n: 2 einfach n ist und um ein Bit nach links verschoben ist.
Wenn wir n und n: 2 XOREN, erhalten wir eine 1 (MSB) und eine zusätzliche 1 für jedes Paar verschiedener benachbarter Ziffern. Die Anzahl der Gruppen ist also gleich der Anzahl der gesetzten Bits in n ≤ n: 2 .
Wie es funktioniert
quelle
Python 2, 30 Bytes
Testen Sie es auf Ideone .
Hintergrund
Sei n eine nicht negative ganze Zahl.
Schritte 2 und 3 des Verfahrens in der beschriebenen spec können alternativ als das Entfernen aller führenden festgestellt werden , 1 ‚s und Hin- und Herschalten der verbleibenden Bits.
Dies bedeutet, dass wir in jeder Iteration genau eine Gruppe benachbarter und gleicher Binärziffern entfernen, sodass die binäre Countdown-Länge von n nur die Anzahl dieser Gruppen in der Binärdarstellung von n ist . Stellen Sie sich für diese Herausforderung vor, dass 0 keine Ziffern enthält.
Für n = 8675309 sieht der Prozess in binärer Form wie folgt aus.
Anstatt diese Gruppen zu zählen (was bei Randfall 0 fehlschlagen würde ), gehen wir wie folgt vor.
n und n: 2 haben die folgenden binären Darstellungen.
Beachten Sie, dass die Binärdarstellung von n: 2 einfach n ist und um ein Bit nach links verschoben ist.
Wenn wir n und n: 2 XOREN, erhalten wir eine 1 (MSB) und eine zusätzliche 1 für jedes Paar verschiedener benachbarter Ziffern. Die Anzahl der Gruppen ist also gleich der Anzahl der gesetzten Bits in n ≤ n: 2 .
quelle
Python 2, 29 Bytes
Zählt die Anzahl der Wechsel zwischen 0 und 1 in der binären Erweiterung und zählt die führende 1 als Wechsel. Dies geschieht, indem geprüft wird, ob die letzten beiden Binärziffern unterschiedlich sind, und dann die Zahl mit der letzten entfernten Ziffer wiederholt wird. Die letzten beiden Ziffern unterscheiden sich genau, wenn
n%4
1 oder 2 ist, was überprüft werden kann als-n%4/2
.quelle
JavaScript (ES6), 26 Byte
Funktioniert durch Zählen der Übergänge zwischen 0 und 1. Funktioniert nur bis zu 31 Bit. 29 Bytes zur Unterstützung von 53 Bits:
quelle
Haskell, 34 Bytes
quelle
05AB1E ,
75 Bytes2 Bytes gespart dank Dennis .
Ohne den Flankenfall 0 könnten dies 3 Bytes sein
bÔg
.Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
CJam , 14 Bytes
Probieren Sie es online!
Grundsätzlich ein Abbruch meiner Antwort auf die andere Frage.
quelle
Java 7,
112 108 100 9073 BytesGrundidee
quelle
j=j/2
kann auf gekürzt werdenj/=2
. Ansonsten eine tolle Antwort!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 Bytes ). Ich würde Ihre aktuelle Antwort jedoch trotzdem hinterlassen, da sie ursprünglicher ist und die Ports anderer Benutzer das genaue Gegenteil von Original sind. :)J, 14 Bytes
Zählt die Anzahl der Läufe in den Binärziffern von n, wobei der Sonderfall 0 für n = 0 zurückgibt.
Verwendung
Erläuterung
quelle
CJam ,
1110 BytesVielen Dank an @Dennis für das Speichern eines Bytes!
Probieren Sie es online!
Erläuterung
quelle
e&
(logisches UND) speichert ein Byte\g*
.Schläger 349 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
tl
undib
in 1-Byte-Namen ändern .MATL , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
Vim,
6259 Bytes-3 Bytes dank DJMcMayhem
Hier ist die xxd-Ausgabe mit intakten nicht druckbaren Zeichen:
Probieren Sie es online!
Erläuterung
quelle
:s/^0*
Ist ein Byte kürzer als:s/^0\+
, und während Sie sich im Register "eval" befinden, können Sie dies nurpr<S-tab>'%b',<C-r>")
für die automatische Vervollständigung tun . (:s/^0*
da es mit einer leeren Zeile übereinstimmt und ich brauche es, um eine leere Zeile nicht zu füllen, um dem rekursiven Makro zu entkommen.Ruby, 26 Bytes
Inspiriert von der Python-Antwort von xnor.
quelle
PHP, 64 Bytes
basierend auf meiner Countdown-Lösung
Gibt
1
Zeichenzeiten ausk
, wobeik
die Anzahl der Iterationen angegeben wird.+4 Bytes für Ganzzahlausgabe: (leere Ausgabe für
0
)quelle
JavaScript (ES6), 44
Rekursive Funktion
Beschränkt auf eine positive Ganzzahl mit Javascript, 31 Bit:
Verwaltung von Zahlen mit doppelter Genauigkeit bis zu 53 signifikanten Bits - 59 Bytes:
Auf eine andere Weise: Verwenden Sie den erstaunlichen Algorithmus von @Dennis, eine nicht rekursive Funktion, die 53 Bits und 43 Bytes verwaltet:
quelle
PHP, 51 Bytes
Verwendet einen regulären Ausdruck, um die Anzahl der Durchläufe von 1 oder 0 zu zählen. Leider erfordert dies einen Sonderfall für die Eingabe
0
, der 3 zusätzliche Bytes erfordert (und einen Hinweis gibt).quelle
o
, um den Hinweis zu vermeiden. b) Sie können 3 Bytes mit dem-F
Flag und$argn
anstelle von speichern$argv[1]
. c)/1+|0+/
sollte für den regulären Ausdruck ausreichen.Java 7, 71 Bytes
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Ich weiß, dass dies von Geobits '
split
Lösung (die irgendwann veröffentlicht wird) übertroffen wird, aber das Schreiben hat trotzdem Spaß gemachtquelle
Oktave, 47 Bytes
Laut dem OEIS-Beitrag ist der Wert, den wir als Lösung für diese Herausforderung suchen, auch der Anzahl von
1
s im Gray-Code für die angegebene Ganzzahl.Wikipedia sagt mir, dass der Gray-Code als x ^ (x >> 1) berechnet werden kann. In der obigen Funktion berechne ich den Gray-Code als solchen, konvertiere ihn in eine Binärzeichenfolge und zähle, wie viele Stellen diese Zeichenfolge enthält
1
.quelle
Java 7, 64 Bytes
Ich weiß, dass dies von einer der besseren Antworten übertroffen werden könnte, aber ich habe es mir im Chat ausgedacht, und ich kann es nicht posten, nachdem Poke etwas darüber gesagt hat :)
quelle
C 76 Bytes
Funktioniert für alle Testfälle (so weit ich das Wort unsigned oder last test case nicht einschließen möchte) ...
quelle
Bash, 57 Bytes
Pakete: Core Utililities, grep, sed, vim (für
xxd
)Angenommen, die Zahl ist im Binärformat angegeben. Jede Länge ist akzeptabel :)
quelle
Perl 5 , 31 + 1 (
p
) = 32 BytesProbieren Sie es online!
Verwendung der @ Dennis-Methode.
quelle
Tcl , 119 Bytes
Probieren Sie es online!
Für meinen Geschmack immer noch sehr ungolfed
quelle