Die baumsüße Sequenz (A086747 mit einem Dreh)
Nehmen Sie eine positive ganze Zahl n
und drucken Sie die ganzen Zahlen von 1 bis n, für die die Baum-Sweet-Sequenz true zurückgibt. Die Baum-Sweet-Sequenz sollte falsch zurückgegeben werden, wenn die binäre Darstellung der Zahl eine ungerade Anzahl aufeinanderfolgender Nullen irgendwo in der Zahl enthält, und ansonsten wahr . Für weitere Informationen klicken Sie auf den Link. Hier sind einige Beispiele:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Hier ist ein Beispiel n=32
Schritt 1: Die für visualisierte Baum-Sweet-Sequenz n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Also, nachdem Sie die Baum-Sweet-Folge für n berechnet haben, nehmen Sie die Zahlen, die für die Folge wahr waren, und sammeln Sie sie für das Endergebnis. Denn n=32
wir hätten:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Als endgültige Antwort.
Dies ist Code-Golf , die kürzeste Anzahl an Bytes gewinnt.
code-golf
sequence
base-conversion
binary
Magische Kraken-Urne
quelle
quelle
Antworten:
05AB1E ,
109 BytesEin Byte dank Adnan gespeichert
Probieren Sie es online!
Erläuterung
quelle
ƒ
statt>G
?.¡
;).JavaScript (ES6),
706863 BytesEtwas interessantere rekursive Lösung:
67 Bytes dank @Neil.
g
ist die aufzurufende Funktion.quelle
f
ähnelt einer Funktion, die ich gelegentlich verwende, um die Anzahl der 1-Bits in einer Zahl zu zählen.f
Scheitert nicht wannn=0
? Daf
nur 0 oder 1 zurückgegeben wird, können Sie auch zwei Bytes mit rasierenn&f(n>>1)
.n = 0
ist kein Fall;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 Bytes
Prüft
00
, ob in der Binärdarstellung ungerade Einsen vorkommen, indem aufgespalten wird und überprüft wird, ob in der Zeichenfolgendarstellung der resultierenden Liste noch Nullen vorhanden sind. Ärgerlicherweise beginnen Binärzahlen mit0b
einer Null, die entfernt werden muss, um ein falsches Positiv zu vermeiden.Die Aufzählung erfolgt durch rekursives Herunterfahren.
quelle
Bash,
5846 BytesEDITS:
Golf gespielt
Prüfung
Erklärt
Schale
sed
Probieren Sie es online!
quelle
Batch, 143 Bytes
quelle
Perl 6 , 40 Bytes
Versuch es
(
[]
werden für nicht erfassende Gruppierungen verwendet, bei<[]>
Verwendung für Zeichenklassen)quelle
PowerShell ,
7961 BytesProbieren Sie es online!
Ich hatte heute Morgen Inspiration, um zu ändern, wie ich die
-split
Operation durchführe, und dann zu sehen, dass es ähnlich ist, wie die Antwort von xnor aufgebaut ist. Also denke ich, große Köpfe denken gleich?Wir durchlaufen eine Schleife von
1
bis zur Eingabe$args[0]
und verwenden einenWhere-Object
Operator, um die entsprechenden Zahlen herauszuholen|?{...}
. Die Klausel ist eine einfache Boolesche Wert - wir sind sicher , dass0
ist-notin
das Ergebnis(...)
.Innerhalb der Parens geben wir
[convert]::
die aktuelle Zahl$_
ToString
mit der Basis an2
(dh verwandeln sie in eine binäre Zeichenkette). Wir haben dann-split
die Zeichenfolge auf der Regex1|00
- dies ist eine gierige Übereinstimmung und führt zu einer Reihe von Zeichenfolgen (zum Beispiel100010
würde sich in'','','0','','0'
und so weiter verwandeln ).Wenn also jeder Lauf von
0
s in der Binärzeichenfolge gerade ist (was bedeutet, dass die Regex sie in leere Zeichenfolgen aufgeteilt hat), ist0
dies-notin
das Ergebnis. DieWhere
Klausel ist also wahr, und die Zahl wird ausgewählt. Diese Zahlen verbleiben in der Pipeline und die Ausgabe ist implizit.quelle
Python 2 ,
6747 BytesDanke an @xnor um 20 (!) Bytes abzuspielen!
Gibt eine ungeordnete Liste zurück. Es ist sehr effizient: Die Eingabe von 100.000 dauert bei TIO ungefähr 40 ms.
Probieren Sie es online!
quelle
[1][n:]or
. Auchx-~x
für2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
vorausgesetzt, die Ausgabe kann in beliebiger Reihenfolge erfolgen.Mathematica, 59 Bytes
Mathematica Antwort Nummer 4 ...
quelle
MATL ,
1211 BytesProbieren Sie es online!
Erläuterung
Um festzustellen, ob eine Zahl gültig ist, wird diese in eine Binärzahl konvertiert, die Lauflängencodierung angewendet, nur Läufe ungerader Länge beibehalten und überprüft, ob kein Lauf von Nullen überlebt.
quelle
R, 75 Bytes
Liest die Eingabe von stdin und konvertiert mit der
bin
Funktion aus demmiscFuncs
Paket von einem Dezimal- in einen Binärvektor. Führt folglich eine Lauflängencodierung durch, um zu überprüfen, ob Werte== 0
und Längen ungerade sind.quelle
Gestapelt , 69 Bytes
Probieren Sie es hier aus!
Oder nicht konkurrierend bei 67 Bytes:
Und noch konkurrenzloser bei 49 Bytes:
Alle nehmen Eingaben als TOS und lassen Ausgaben auf TOS.
Erläuterung
Die Funktion:
Erklärung des Nichtkonkurrierens:
Es ist dasselbe wie oben, mit ein paar wesentlichen Unterschieden:
quelle
Befunge,
845149 BytesNach einigem Experimentieren stellte ich fest, dass ich mit einer Technik, die der von Neil entwickelten Batch-Antwort ähnelt, einiges besser machen konnte als meine ursprüngliche Lösung .
Probieren Sie es online!
Wie bei meiner ursprünglichen Lösung gibt es zwei Schleifen - die äußere Schleife, die über die zu testenden Zahlen iteriert, und eine innere Schleife, die die Bitsequenz für jede Zahl testet. Die Art und Weise, wie der Test funktioniert, besteht darin, zwei Bits gleichzeitig zu untersuchen (Modulo 4 des aktuellen Werts). Wenn das gleich 2 ist, haben wir eine ungerade Folge von Nullen und können die innere Schleife abbrechen und zur nächsten Zahl übergehen.
Wenn das Modulo 4 nicht gleich 2 ist, müssen wir die verbleibenden Bits weiter testen, damit wir die bereits getesteten Bits nach oben verschieben. Dies geschieht durch Teilen des Wertes, nennen wir ihn n , durch
2+2*!(n%2)
. Das heißt, wenn das erste Bit eine 1 war, teilen wir durch 2 (und lassen dieses 1-Bit fallen), aber wenn es eine 0 war, teilen wir durch 4, sodass wir immer Nullenpaare fallen lassen.Wenn wir irgendwann auf Null kommen, bedeutet das, dass es keine ungeraden Folgen von Null-Bits gab, also schreiben wir die Zahl aus.
quelle
163 Byte Visual Basic (.net 4.5)
Antworte hier zum ersten Mal, also bin ich sicher, dass ich etwas vermasselt habe. Lass es mich wissen und ich werde es reparieren. Sind Visual Basic Lambdas überhaupt erlaubt?
Vielen Dank an MamaFunRoll für die Idee, aufeinanderfolgende Nullen zu entfernen
R (32) Ausgänge
quelle
Java,
144130128 BytesDies ist nicht so gut, wie ich denke, es kann sein, aber ich dachte, es wäre eine nette Lösung, einen Regex zu verwenden, obwohl ich noch nie einen benutzt habe.
Golf gespielt:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Ungolfed:
Bearbeiten: Ich konnte 14 Bytes sparen, indem ich die Regex 00 | 1 anstelle von 00 erstellte und ".replace (" 1 "," ")" zwischen "replaceAll" und "isEmpty!" Entfernte.
Edit 2: Ich konnte 2 Bytes sparen, indem ich eine Ganzzahl machte und Integer.toString mit i.toString referenzierte.
quelle
Clojure, 103 Bytes
Ich denke nicht, dass dies der kürzeste Weg ist ...
Verwendet
re-seq
, um aufeinanderfolgende Nullen zu finden, ordnet ihre Modulo-2-Längen a zuset
, verwirft sie, wenn eine Zahl1
aus dem Satz gefunden wird.quelle
Wunder , 38 Bytes
Verwendung:
Erläuterung
Besser lesbar:
rng 1 +1 #0
: Bereich von 1 bis Eingang.fltr@ ...
: Filterbereich mit folgendem Prädikat.bn #0
: Aktuelles Element in Binär umwandeln. (Dies wird eine führende haben0b
).Rstr #["00"]
: Alle Vorkommen von rekursiv beschneiden00
in der Zeichenfolge .len iO 0
: Zähle die Mengen von0
s in der Zeichenkette.=1
: Überprüfen Sie, ob der Betrag gleich 1 ist. Befindet sich der einzige0
Rest in der Zeichenfolge nach dem Beschneiden in der ersten Zeile0b
, wird true zurückgegeben. Andernfalls wird false zurückgegeben.quelle
Rubin,
786968 BytesÄltere Versionen:
quelle
Mathematica, 81 Bytes
Berechnet für jeden Lauf aufeinanderfolgender Ziffern einer Zahl {die gemeinsame Ziffer in diesem Lauf plus (1, wenn die Länge ungerade ist, 2, wenn die Länge gerade ist)}; Wenn eine der Antworten {1} ist, ist die Nummer nicht in der Reihenfolge.
quelle
Mathematica, 75 Bytes
#~IntegerDigits~2
berechnet die Liste der Binärziffern der Eingabe#
.Split
Diese Liste wird in Reihen identischer Elemente aufgeteilt. Nehmen Sie dieCases
Übereinstimmungen{0..}
, nehmen Sie dieLength
einzelnen Elemente, nehmen SieEvenQ
die Längen und geben SieAnd
die Ergebnisse zurück.quelle
!Or@@OddQ/@...
Python 3,
8682 BytesGolfen im Gange ...
4 Bytes durch Ändern
bin(x)[2:]
in "Nur" entferntbin(x)
- dies verbleibt0b
am Anfang der Zeichenfolge, aber ich habe festgestellt, dass dies die Berechnungen nicht beeinflusst :)quelle
Python, 142 Bytes
Dies dient hauptsächlich zum Üben des Golfspiels mit meinem Python.
quelle
Gelee , 10 Bytes
Schrecklich ineffizient. Probieren Sie es online!
quelle
Ruby,
545348 BytesIch hätte nicht gedacht, dass der reguläre Ausdruck dafür so einfach sein würde.
edit 1: wurde auf ablehnen um die Negation für -1 loszuwerden.
edit 2: umgestellt
match
auf=~
-5.quelle
C #
159157155 Bytes2 x 2 Bytes dank TuukkaX gespeichert.
Hinweis: Die Angaben werden in umgekehrter Reihenfolge ausgedruckt.
Erläuterung:
quelle
c%2==0
könnte es seinc%2<1
.N
.b[i++] == '0'
könnte seinb[i++]==48
, aber da das andere mögliche Zeichen '1' (ASCII 49) ist, können Sie einfach überprüfen, obb[i++]<49
.Mathematica, 69 Bytes
Die gleiche Länge:
quelle
Rubin, 53 Bytes
quelle
Jelly,
151310 Bytessparte zwei Bytes nachdem ich andere Antworten angeschaut hatte, weitere 3 Bytes dank Dennis
Erläuterung
quelle