Aufgabe
Suchen Sie den Satz von Zahlen, sodass die Binärdarstellung zwei oder mehr 1
durch mindestens einen getrennte Reihen enthält 0
.
Zum Beispiel für die Zahlen, die 4 Bits lang sind:
0 0000 (no ones)
1 0001 (only one run)
2 0010 (only one run)
3 0011 (only one run)
4 0100 (only one run)
5 0101 Valid
6 0110 (only one run)
7 0111 (only one run)
8 1000 (only one run)
9 1001 Valid
10 1010 Valid
11 1011 Valid
12 1100 (only one run)
13 1101 Valid
14 1110 (only one run)
15 1111 (only one run)
Eingang
Eine Ganzzahl, die der Anwendung über eine Eingabe im Bereich bereitgestellt wird 3 .. 32
. Dies stellt die maximale Anzahl von Bits dar, bis zu der gezählt werden kann.
Die Eingabe von n
gibt an, dass die Zahlen überprüft werden müssen.0 .. 2n-1
Ausgabe
Eine begrenzte Liste (Ihrer Wahl) aller Nummern, die die Kriterien erfüllen. Die Nummern sind in numerischer Reihenfolge anzugeben. Ein zusätzliches abschließendes Trennzeichen ist zulässig. Datenstrukturumschließungen (z. B. []
und ähnliche) sind ebenfalls zulässig.
Beispiel
Input: 3
Output: 5
Input: 4
Output: 5, 9, 10, 11, 13
Input: 5
Output: 5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29
Das ist Code-Golf - die Antwort mit der geringsten Anzahl von Bytes gewinnt.
\n
abgrenzt und ein\n
in die letzte Zeile setzt, dann sollte,
ein,
Abschluß auch akzeptabel sein. Aktualisiert.[1, 2, 3]
?Antworten:
Pyth, 12 Bytes
Probieren Sie es online aus.
Idee
Die binäre Darstellung einer positiven Zahl beginnt immer mit einem Lauf von 1 s, möglicherweise gefolgt von anderen abwechselnden Läufen von 0 s und 1 s. Wenn es mindestens drei separate Läufe gibt, sind zwei davon garantiert Läufe von 1 s.
Code
quelle
Python, 48
Ich hatte das sehr überlegt. Wir müssen nur überprüfen, ob die binäre Erweiterung enthält
'01'
.Damit es zwei Durchgänge von einem gibt, muss dem einen rechts ein vorangestellt werden
0
. Wenn es nur einen Lauf gibt, wird es keine Führenden geben0
, also wird das nicht passieren.Alte Antwort:
Die Python-Binärdarstellung funktioniert hier sehr gut. Eine Binärzahl wird wie folgt geschrieben
bin(9)=='0b10110'
. Aufteilen auf'0'
Ergebnisse in einer Liste von0
, zwischen zwei aufeinanderfolgenden Zeichenfolgen0
, und rechts von einem Finale0
b
gefolgt von einem oder mehreren führenden1
's, die nicht führenDie ersten beiden Kategorien existieren immer, aber die letzte existiert nur, wenn es eine Lauf-Kategorie gibt,
1
die die führende nicht enthält'1'
, und daher nur, wenn es mehr als eine Lauf- Kategorie gibt1
. Es reicht also zu prüfen, ob die Liste mehr als2
unterschiedliche Elemente enthält.Python 3.5 spart 2 Zeichen durch Auspacken
{*_}
anstelle vonset(_)
.quelle
/01/
anstelle von zu verwenden/10+1/
. Das habe ich in Perl ausgenutzt .Ruby,
444038 Zeichendurchgestrichen 44 ist immer noch regulär 44; (
Eine anonyme Funktion (proc), die eine Ganzzahl annimmt und ein Array zurückgibt.
Verwendet den regulären Ausdruck@histocrat weist darauf hin, dass/10+1/
: a1
, mindestens einer0
und dann ein anderer1
.01
sich irgendwo in der Zeichenfolge ein Irgendwo davor befinden muss1
.quelle
/10+1/=~'%b'%x
. Sie können ein Zeichen auch mit einem inklusiven Bereich (0..2**n
) speichern, da2**n
es nie mehrere Läufe gibt.=~
. Vielen Dank!/01/
funktioniert der reguläre Ausdruck genauso gut. Wenn es eine01
gibt, muss irgendwo links eine 1 sein.Julia,
4341 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl akzeptiert und ein Array zurückgibt. Es wird der Regex-Trick der Histokraten verwendet (in der Antwort von Doorknob verwendet), bei dem
01
nur dann eine Übereinstimmung erzielt wird, wenn es eine vorangestellte 1 gibt.Ungolfed:
quelle
Matlab,
79 68 6459Die Idee ist, die Binärzahl als Array von Nullen und Einsen zu interpretieren und dann die absolute Differenz zwischen jedem Paar von Nachbarn zu berechnen. Wenn wir zwei oder mehr Male einen Unterschied von 1 haben, dann haben wir offensichtlich einen Lauf von zwei oder mehr. Beachten Sie, dass dies nur funktioniert, wenn wir die Binärzahl ohne führende Nullen darstellen.
Alte Versionen:
quelle
JavaScript (ES7),
8985726962 ByteHeilige Kuh, das Erstellen von Bereichen in JS ist nicht einfach.
Vielleicht wäre es mit einer tatsächlichenNein, ich habe gelogen. es ist eigentlich ein bisschen länger. Naja. Ich denke, ich muss mich nur mit 27 gesparten Bytes zufrieden geben. (7 dank Mwr247!)for
Schleife kürzer .Funktioniert ordnungsgemäß in den neuesten Versionen von Firefox, wahrscheinlich jedoch in keinem anderen Browser. Versuch es:
(Ausschnitt aus dieser Seite )
Vorschläge willkommen!
quelle
.keys()
anstelle von.fill()
unda
anstelle von verwendeni
, um meine für 62 zu binden:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Haskell,
686153 BytesVerbesserung von Damien
Geschichte:
Dies behebt den Fehler (Switched == und =, und Quadrat statt Potenz von zwei). Und ersetze true durch 2> 1 und false durch 1> 2. Auch danke, darauf hinzuweisen, dass 2 ^ x immer ausfällt. Danke an Thomas Kwa und nimi
Ursprünglich
Wenn es volles Programm sein muss,
quelle
1..(2^x-1)
das kann einfach sein1.. (2^x)
da 2 ^ x immer ausfällt.False
undTrue
durch1>2
und ersetzen1<2
. Die Klammern sind nicht erforderlich2^x-1
. (Übrigens: Sie haben einen Tippfehler: es muss sein4==1=True
).mod
4 == 1 = x> 4 | 2> 1 = g $ xdiv
2APL,
3427 BytesDadurch wird eine unbenannte monadische Funktion erstellt, die eine Ganzzahl auf der rechten Seite akzeptiert und ein Array zurückgibt.
Erläuterung:
7 Bytes gespart dank Dennis!
quelle
R,
5547 Bytes(mit etwas Hilfe von @ Alex.A)
R hat keine eingebaute Funktion, um konvertierte Zahlen auf bequeme Weise anzuzeigen. Ich verwende
R.utils::intToBin
diese Funktion, während der Rest so gut wie nur die Position des übereinstimmenden regulären Ausdrucks angibt und an STDOUT druckt, während er durch ein getrennt ist Platz.quelle
cat
ist ein Leerzeichen, so dass Sie,sep=","
vollständig weglassen und 7 Bytes sparen könnten .CJam, 14
3 Bytes kürzer dank Dennis. Probieren Sie es online aus
quelle
2be`,2>
.2be`2>
und2,#)
sollte auch funktionieren. Außerdem hat das OP klargestellt, dass die Ausgabe in Listenform gedruckt werden kann.JavaScript (ES6),
69686762 ByteHeute habe ich einen neuen, kürzeren Weg gefunden, um Arrays ohne Verwendung von Fill oder Map dynamisch zu füllen. Dadurch
x=>[...Array(x).keys()]
wird ein Array von 0 bis x zurückgegeben. Wenn Sie Ihren eigenen Bereich / Werte definieren möchten, verwenden Siex=>[...Array(x)].map((a,i)=>i)
, da dieser nur einige Bytes länger ist.quelle
Java,
214165155154148141110 BytesDiese Übermittlung nutzt die Tatsache aus, dass eine binäre Zeichenfolgendarstellung einer Zahl in Java niemals eine führende Null hat. Wenn der String "01" in der Binärdarstellung einer Zahl erscheint, muss das sein das zweite Vorkommen der Zahl "1" markieren.
Golf gespielt:
Ungolfed:
Programmausgabe (denken Sie daran, abschließende Trennzeichen sind akzeptabel):
quelle
int
für die Zählervariable verwenden ?long
Wert erforderlich. Darüber hinausint
würde die Verwendung von a die Größe des Codes erhöhen, da auf dieInteger
Wrapper-Klasse verwiesen wird, die die Zahlenanalyse durchführt. Ich denke, der wahrscheinlichste Ort, um Platz zu sparen, wäre der.*
Long
Wrapper mit verwendenint
? (Nun, nicht in diesem Fall, aber im Allgemeinen?)int
wirdlong
bei Verwendung als Parameter mit zu befördernLong
. In diesem Fall gibt es jedoch keine Möglichkeit, ein "int
wegen des Vorzeichens" -Bit zu verwenden, und esInteger
ist länger alsLong
. Trotzdem habe ich ein paar Möglichkeiten gefunden, um mehr Platz in einer Sprache zu schaffen, die so ausführlich ist wie Java.new Long()
anstelle von verwendenLong.parseLong()
?C (GCC) ,
11199 BytesProbieren Sie es online!
Dank @ceilingcat 12 Bytes rasiert!
Ungolfed:
Die Funktion ffsl () gibt den Index des ersten Bits an, das in einer langen Ganzzahl gesetzt ist. Also schleifen wir von
i = 1
zu 2 ^ number_of_bits. Wir setzenx
aufi
nach rechts verschoben , bis wir alle aufeinanderfolgenden Null - Bits auf dem am wenigsten signifikanten Ende entfernt haben. Dannx
bewegen wir uns nach rechts, bis wir alle aufeinanderfolgenden 1-Bits am Ende mit der geringsten Signifikanz entfernt haben. Wenn das Ergebnis immer noch nicht Null ist, haben wir eine Übereinstimmung gefunden.quelle
if (popcount(i ^ (i*2))>3)
:, und popcount () zu einer Reihe bitweiser UND-Verknüpfungen und Verschiebungsoperationen erweitern. Das würde aber zu recht langem Code führen.JavaScript (ES6) 76
quelle
,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
K5, 19 Bytes
Dies funktioniert nach ähnlichen Prinzipien wie die Lösung von Dennis, jedoch mit weniger integrierten Funktionen.
Generieren Sie zunächst eine Reihe von binären x-Tupeln (
+!x#2
), und suchen Sie dann für jedes Tupel jeden Punkt, an dem eine Ziffer nicht mit der vorherigen übereinstimmt, wenn wir das -1. Element der Liste zu diesem Zweck als 0 behandeln (~0=':'
). Bei unseren Lösungen sind zwei weniger als die Summe jeder Auflagenanzahl. (&2<+/'
).Das Anzeigen der einzelnen Zwischenschritte ist klarer:
Und alles zusammen:
quelle
Pip, 13 + 1 = 14 Bytes
Übernimmt Eingaben von der Befehlszeile und verwendet das
-s
Flag für Leerzeichen zwischen Ausgabenummern.Ganz einfach: Bauen
range(2**a)
und Filternlambda _: "01" in toBinary(_)
. Ich war ziemlich glücklich darüber, die01
Idee selbstständig auszudenken. Es sind keine Anführungszeichen erforderlich,01
da die Suche als numerisches Literal ausgeführt wird (Zahlen und Zeichenfolgen sind in Pip vom gleichen Typ).quelle
Julia, 40 Bytes
Dies verwendet einen etwas anderen Ansatz als die andere Julia-Lösung - anstatt eine Zeichenfolgensuche nach "01" in der Bitfolge durchzuführen, verwendet es eine gewisse Mathematik, um zu bestimmen, ob die Zahl die Bedingung erfüllt.
i$i>>1
wird Einsen nur an den Stellen haben, an denen sich die Ziffer von Null auf Eins oder von Eins auf Null ändert. Aus diesem Grund müssen mindestens drei Einsen vorhanden seini
, damit zwischen Null und Eins ausreichend oft hin und her gewechselt werden kann.count_ones
Findet die Anzahl von Einsen undfilter
entfernt dann diejenigen, die nicht genug Einsen haben.quelle
C ++,
197188141 BytesHinweis: Dies wurde mit MSVC ++ 2013 geschrieben und getestet. Es scheint, dass
#include
ing<iostream>
alle erforderlichen C-Header enthält, damit dies funktioniert. Es scheint auch, dass der Code nicht mehr wirklich C ++ ist, aber das Kompilieren mit C ++ ermöglicht den Headertrick, der die Codegröße im Vergleich zum Einbeziehen einiger C-Header verringert.Mit
printf
stattcout
spart man auch ein paar Bytes.Golf gespielt:
Ungolfed:
quelle
'\n'
anstelle von std :: endl (im Allgemeinen) verwenden, oder','
da ein beliebiges Trennzeichen gültig ist und ein nachfolgendes in Ordnung ist.strstr(c,"01")
.1<<atol(b[1])
sollten sein1L<<atol(b[1])
, sonst ist das Ergebnis dieses Ausdrucks eine vorzeichenbehaftete 32-Bit-Ganzzahl, was bedeutet, dass der Code nur bis zu 2 ^ 30 ausgeführt wird. Mit printf sollten%ld
Zahlen zwischen 2 ^ 31 und 2 ^ 32 korrekt gedruckt werden.Perl 5,
5553494741 Bytes5452484640 Bytes plus eins für das-E
Flag anstelle von-e
.Danke an xnor für den Hinweis ,
/01/
stattdessen/10+1/
zwei Bytes gespart zu haben.Vielen Dank an Dennis für den Rat, der
<>
stattdessen$ARGV[0]
sechs Bytes gespart hat.quelle
C
8481 BytesDies basiert auf den Kommentaren, die ich zu einer anderen C-Antwort auf diese Frage bezüglich der Möglichkeit der Verwendung einfacher bitweiser Operatoren abgegeben habe. Es funktioniert, indem alle nachfolgenden 0-Bits in der Anweisung i | (i-1) auf 1 geschaltet werden. Dann werden alle nachfolgenden 1-Bits mit k & (k + 1) auf 0 geschaltet. Dies führt zu einer Null, wenn es nur einen Lauf von Einsen gibt und ansonsten ungleich Null. Ich gehe davon aus, dass long 64-Bit ist, aber ich könnte dies auf Kosten von drei Bytes korrigieren, indem ich stattdessen int64_t verwende.
Ungolfed
quelle
int64_t
ist nur bei dir definiert#include<stdint.h>
. Um den 64-Bit-Betrieb zu gewährleisten, ist einlong long
Typ mit 5 Byte erforderlich .long i
als%d
Format übergeben wird. Beachten Sie auch, dass dies()
für die Operatoren&
und überflüssig ist|
. Das Beheben dieses Problems spart 3 Bytes!long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
Pyth,
201716 BytesLive-Demo.
quelle
"01"
. Mit Ausnahme von 0 wird die binäre Repr. wird immer mit einer 1 beginnen.Python 2.7, 89 Bytes
Ich denke, das könnte ein bisschen golfen werden.
quelle
0
in der Ausgabe.print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]
zwei Bytes kürzer. Aber mit dem Fix für0
wäre die Länge gleich (89), wenn du benutztrange(1,2**input())
.TI-BASIC,
343230 BytesFür einen Taschenrechner der Serie TI-83 + / 84 +.
Damit eine Zahl zwei 1er-Läufe enthält, muss sie zwei
10
s enthalten, wenn wir eine nachgestellte Null in die Binärdarstellung einfügen.Anstatt die Binärdarstellung zu generieren und nach a zu
10
suchen, testen wir Bitpaare mathematisch, indem wir den Rest mit 4 (int(4fPart(
) verwenden, was ergibt,2
wo es a gibt10
. Da uns die Reihenfolge egal ist,randIntNoRep(
ist dies der kürzeste Weg, um die Liste der Exponenten zu erstellen.Wir verwenden
log(
, um die Anzahl der Läufe zu überprüfen:Wenn es mindestens 2 Durchläufe gibt,
log(
ist der positiv und die Nummer wird angezeigt.Wenn es einen Durchlauf gibt, ist der
log(
Wert 0 und die Nummer wird nicht angezeigt.Wenn es keine Läufe gibt (was zuerst bei X = 2 ^ Ans passiert), wird
log(
ein ERR: DOMAIN ausgelöst, wodurch die Ausgabe genau am richtigen Punkt gestoppt wird.Wir verwenden es
e^(Ans
als Endargument derFor(
Schleife - es ist immer größer als2^Ans
, aber ese^(
ist ein einzelnes Token, also ein Byte kürzer.Eingabe / Ausgabe für N = 4:
Dann gibt der Rechner einen Fehler aus; Der Fehlerbildschirm sieht folgendermaßen aus:
Wenn 1 gedrückt wird, wird der Startbildschirm erneut angezeigt:
TI-Taschenrechner speichern alle Zahlen in einem BCD-Gleitkomma mit einer Genauigkeit von 14 Stellen, kein Int- oder Binär-Gleitkomma. Daher kann eine Division durch Potenzen von mehr als zwei
2^14
nicht genau sein. Während ich , dass die kniffligsten Zahlen überprüft haben,3*2^30-1
und2^32-1
werden korrekt behandelt, habe ich nicht die Möglichkeit der Rundungsfehler ausgeschlossen. Es würde mich jedoch wundern, wenn es bei der Eingabe Fehler gäbe.quelle
matlab
(90)(70)Ausführung
4
ans =
ans =
ans =
Prinzip
Eine beliebige Zahl aus dem Intervall] f (n, l), f (n, l) + 2 ^ (l-1) [wobei l> 1 diese Bedingung überprüft, sodass das Ergebnis aus der Negation dieser Reihe in resultiert Begriffe von n.
x = 1
x = x + 1 =
01
,x = x + 2 ^ 0 =
11
,x = x + 1 =
001
,x = x + 2 ^ 1 =
011
,x = x + 2 ^ 0 =
111
,x = x + 1 =
0001
,x = x + 2 ^ 2 =
0011
,x = x + 2 ^ 1 =
0111
,x = x + 2 ^ 0 =
0111
,x = x + 1 =
1111
...x + 1, x = x + 2 ^ n, x = x + 2 ^ (n-1) ... x = x + 2 ^ 0
Mein Programm druckt den Bereich zwischen zwei Zeilen (falls vorhanden)
Nach einer Zeit des Kampfes gelang es mir, eine mathematische Darstellung für diese Reihe zu finden:
2 ^ l (0 + 1 + 2 ^ 1 + ... 2 ^ k) mit l + k <n
= 2 ^ l (2 ^ k-1)
Punktzahl = 90
quelle
C,
103102 BytesErweitern (tatsächlich verkleinern) des G.Sliepen-Eintrags, wobei xnicht auf das
01
Muster in der Binärdarstellung hingewiesen wird , sondern nur Standardfunktionen und etwas Twiddling verwendet werden.Ungolfed-Version:
Die innere Schleife sucht
i
nach dem binären Muster,01
indem sie iterativx
nach rechts verschoben wird , solange noch 3 Bits übrig sind.printf
gibt die Anzahl der gedruckten Zeichen zurück, also niemals0
. Der Test der inneren Schleife schlägt nach dem fehl, sodassprintf
keinebreak
Anweisung erforderlich ist .C ++,
129128 BytesIn Anlehnung an dieselbe Idee ist die C ++ - Variante hier:
Technisch gesehen sollte ich
i
einelong long
64-Bit-Operation sicherstellen und bis2^32
zu 5 zusätzliche Bytes berechnen , aber moderne Plattformen haben 64-Bit-Ints.quelle
JavaScript ES6, 60 Byte
Code
Probieren Sie es online!
Erläuterung
quelle
C (Art - Kompiliert mit Warnungen in GCC) - 103
Dies verwendet keinerlei Bibliotheksfunktionen außer printf. Dies zeigt, dass keine Anstrengungen unternommen wurden, um die Standards zu erfüllen oder UB zu vermeiden.
Um es kompatibel zu machen, müssten Sie viele Dinge tun, wie z. B. stdio.h, was gegen den Geist wäre, es so klein wie möglich zu machen.
Wenn jemand Vorschläge zur Verkürzung hat, lass es mich wissen.
quelle
PowerShell, 80 Byte
quelle
Python, 44 Bytes
Okay, das könnte wahrscheinlich kürzer sein, aber es ist mein erster Codegolf:
Denken Sie, dies beantwortet die Frage, bitte stimmen Sie nicht ab, wenn dies nicht der Fall ist.
quelle
input()
ist ideal), um eine Endlosschleife zu erhaltenn
, und dann nur bis zu zählen2^n-1
. Außerdem können Sie anstelle von 4 und 8 1 und 2 Leerzeichen für die Verschachtelung verwenden, und die Verwendung vonmap
oder eines Listenverständnisses würde Ihren Code wahrscheinlich erheblich verkürzen.Eine weitere andere Matlab-Antwort von guter Punktzahl.
matlab
60(57)Ausführung
ans =
>> ans(5)
ans =
1
Beispiel:
0000111
wird abgelehnt, weil ~ x =1111
, ~ x + 1 =00001
eine Ziffer = 1 enthält0100111
wird akzeptiert, weil ~ x =1011
, ~ x + 1 =0111
viele Einsen enthältquelle