Tor
Erstellen Sie bei einer nicht negativen Ganzzahl eine Funktion, die die Startposition der Anzahl der größten aufeinanderfolgenden Einsen im Binärwert dieser Ganzzahl zurückgibt.
Wenn Sie eine Eingabe erhalten 0
, kehren Sie zurück 0
.
Wenn die Zahl mehrere gleich lange Streifen aufweist, müssen Sie die Position des letzten Streifens zurückgeben.
Eingang
Eine ganze Zahl größer oder gleich 0.
Ausgabe
Eine Ganzzahl, die wie unten erläutert berechnet wird.
Regeln
- Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes in jeder Sprache.
- Standardlücken sind verboten.
Beispiele und Testfälle
Beispiel 1
- Ihrer Funktion wird die Ganzzahl 142 übergeben
- 142 entspricht 10001110 im Binärformat
- Die längste Serie ist "111" (eine Serie von drei)
- Der Streifen beginnt an der Position 2 ^ 1
- Ihre Funktion gibt als Ergebnis 1 zurück
Beispiel 2
- Ihrer Funktion wird die Ganzzahl 48 übergeben
- 48 entspricht 110000 in binär
- Die längste Serie ist "11" (eine Serie von zwei)
- Der Streifen beginnt an der Position 2 ^ 4
- Ihre Funktion gibt als Ergebnis 4 zurück
Beispiel 3
- Ihrer Funktion wird die Ganzzahl 750 übergeben
- 750 entspricht 1011101110 im Binärformat
- Die längste Serie ist "111" (eine Serie von drei)
- Da es zwei gleich lange Streifen gibt, geben wir den späteren Streifen zurück.
- Die spätere Serie beginnt an der Position 2 ^ 5
- Ihre Funktion gibt als Ergebnis 5 zurück
0
. Das ist ein wichtiger Testfall.Antworten:
Gelee ,
108 BytesProbieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
41403634 Byte4 Bytes dank @ThePirateBay gespart
Testfälle
Code-Snippet anzeigen
Wie?
Allgemeiner Fall x> 0
Wir UNDEN rekursiv die Eingabe x mit x / 2 , wodurch die Muster der aufeinanderfolgenden gesetzten Bits progressiv reduziert werden, bis nur das am weitesten rechts stehende Bit der Sequenz übrig bleibt. Wir behalten eine Kopie des letzten Nicht-Null-Werts und bestimmen die Position seines höchstwertigen Bits durch Rundung seines Logarithmus zur Basis 2.
Nachfolgend sind die Schritte aufgeführt, die wir für x = 750 ausführen ( 1011101110 im Binärformat) ausführen .
Kantenfall x = 0
Der Sonderfall
x = 0
führt sofort zuMath.log2(0) | 0
. Der Logarithmus von0
auswertet zu-Infinity
und das binäre bitweise ODER erzwingt einen Zwang auf eine 32-Bit-Ganzzahl. In Übereinstimmung mit der Spezifikation der abstrakten Operation ToInt32 ergibt dies das erwartete0
:quelle
0
, die Teil des Eingabebereichs ist.Math.log2(k)|0
statt31-Math.clz32(k)
? Oder vermisse ich etwas?Math.log2(k)|0
ist eigentlich sowohl kürzer als auch einfacher für den Sonderfallx=0
. Vielen Dank. :)x86-Maschinencode, 14 Byte
Mit @ Arnaulds Algorithmus von
x &= x>>1
und die höchsten Satz Bit - Position in dem Schritt nimmt vorx
wird0
.Aufrufbar von C / C ++ mit Signatur
unsigned longest_set(unsigned edi);
im x86-64 System V ABI. Dieselben Maschinencode-Bytes werden im 32-Bit-Modus auf dieselbe Weise dekodiert, aber die Standard-32-Bit-Aufrufkonventionen setzen nicht das erste Argument einedi
. (Das Ändern des Eingaberegisters aufecx
oderedx
für Windows_fastcall
/_vectorcall
odergcc -mregparm
kann durchgeführt werden, ohne etwas zu beschädigen.)Die
BSR
Anweisung von x86 (Bit Scan Reverse) ist dafür perfekt. Sie gibt uns den Bit-Index direkt, anstatt führende Nullen zu zählen. ( Erzeugtbsr
nicht direkt 0 für Eingabe = 0 wie32-lzcnt(x)
würde, aber wir brauchen bsr = 31-lzcnt für Nicht-Null-Eingaben, alsolzcnt
würden nicht einmal Anweisungen speichern, geschweige denn Byte zählen. Nullen von eax, bevor die Schleife funktioniert wegenbsr
' s semi-offizielles Verhalten, das Ziel unverändert zu lassen, wenn die Eingabe Null ist.)Dies wäre sogar noch kürzer, wenn wir die MSB-Position am längsten zurückgeben könnten. In diesem Fall würde
lea ecx, [rdi+rdi]
(3 Bytes) + Linksverschiebung anstelle von kopierenmov
+shr
(4 Bytes) .Siehe diesen TIO-Link für einen ASM-Anrufer, der dies tut
exit(longest_set(argc-1));
Testen mit einer Shell-Schleife:
quelle
Jelly ,
191711 BytesProbieren Sie es online!
-6 (!) Bytes dank @ Dennis's scharfen Beobachtungen
Wie es funktioniert
quelle
0
, die im Eingabebereich liegen.ȯ-µ...
B
immer ein Array zurückgegeben wird, das mit einer 1 beginnt ,BUṪMṪ’×Ṡ
kann es werdenṪBL’
. Außerdem brauchen Sie das nichtḞ
undḟ0
sparen ein Byte mehr¹Ðf
.Python 2 , 45 Bytes
Probieren Sie es online!
Dank Dennis viele Bytes gespart! (Die Köpfe nach oben
len(bin(...))-3
stattmath.frexp
)Vielen Dank an @xnor für das Auffinden eines Fehlers, der zum Glück leicht zu beheben war!
quelle
x=3
, ich denke, weil dieand/or
Kurzschlüsse falsch sind, wenn die Funktion 0 zurückgibt.Perl 6 ,
4535 BytesDiese stark verbesserte Version wurde freundlicherweise von @nwellnhof zur Verfügung gestellt.
Probieren Sie es online!
quelle
:g
, um alle Übereinstimmungen zu erhalten. Mit dem Smart-Match-Operator konnte ich bis zu 40 Bytes Golf spielen:{sort(.base(2).flip~~m:g/1+/).tail.from}
{.msb+1-(.base(2)~~m:g/1+/).max.to}
:g
und nicht herausgefunden, wie ich Adverb mit dem Smartmatch-Operator verwenden kann. Auch die.msb
Methode ist hier sehr hilfreich und ich wusste es vorher nicht.Python 2 ,
8978 BytesProbieren Sie es online!
BEARBEITEN: 11 Bytes dank Mr. Xcoder gespeichert.
quelle
05AB1E ,
141211 BytesProbieren Sie es online! oder Testfälle ausführen .
Erläuterung
quelle
J ,
18 bis17 BytesProbieren Sie es online!
Erläuterung
quelle
x
in der Dyade angegebenen Basen alle 0 und 1 sind, was bedeutet das dann? Eine Basis-2-Nummer hat Ziffern0
und1
, also hat eine Basis-1
Nummer Ziffern ...0
? Was1
bedeutet dann in diesem Zusammenhang? Und ist eine Basisnummer0
nur immer0
?x #. y
berechnet zuerstw =: */\. }. x , 1
und kehrt dann zurück+/ w * y
#.
, da Sie sich eher auf interne Implementierungsdetails als auf die öffentliche API verlassen?C # (.NET Core) ,
64 -60 ByteProbieren Sie es online!
AC # -Version von @ Arnauld's Antwort
Danksagung
Kevin Cruijssen hat 4 Bytes gespart.
C # (.NET Core) ,
131123 + 18 = 141 ByteProbieren Sie es online!
+18 Bytes für
using System.Linq;
Danksagung
Dank Grzegorz Puławski wurden 8 Bytes gespeichert.
Entgolft
C # (.NET Core) ,
164 bis161 ByteProbieren Sie es online!
Eine Nichtlösung
Linq
, von der ich sicher bin, dass sie verbessert werden könnte, obwohl nichts sofort offensichtlich ist.Entgolft
quelle
r
die erste Antwort verwerfenT=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
Schale , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Jelly ,
14 13 1211 BytesEin monadischer Link, der nicht negative ganze Zahlen aufnimmt und zurückgibt.
Probieren Sie es online! oder sehen Sie sich die Testsuite an .
Wie?
quelle
ŒrṪP
stattdessen die Präfixe.Jelly , 19 Bytes
Probieren Sie es online!
Vielen Dank an Jonathan Allan für das Speichern von
4 bis6 Bytes!Ich habe zu viel gearbeitet, um das aufzugeben, obwohl es ein bisschen lang ist. Ich wollte wirklich eine Lösung hinzufügen, die buchstäblich nach der längsten Teilzeichenfolge von
1
s in der Binärdarstellung sucht ...Erläuterung
quelle
BŒgḄṀB
stattdessen seinBwÇɓÇL+ɓBL_‘
Kotlin , 77 Bytes
Verschönert
Prüfung
quelle
Haskell ,
101989675 BytesProbieren Sie es online! Verbrauch:
snd.maximum.(`zip`[0..]).c $ 142
Erträge1
.Erläuterung:
c
wandelt die Eingabe in Binär um und zählt gleichzeitig die Länge der Streifen von eins, wobei die Ergebnisse in einer Liste gesammelt werden.r<-c$div n 2
berechnet rekursiv den Restr
dieser Liste undsum[r!!0+1|mod n 2>0]:r
fügt die aktuelle Länge des Streifens hinzur
. Das Listenverständnis prüftmod n 2>0
, ob die aktuelle Binärzahl eine Eins ist, und nimmt in diesem Fall die Länge des vorherigen Strichs (des ersten Elements vonr
) und addiert einen. Ansonsten ist das Listenverständnis leer undsum[]
ergibt0
. Für die Beispieleingabec 142
ergibt sich die Liste[0,3,2,1,0,0,0,1,0]
.(`zip`[0..])
Fügt die Position zu jedem Element der vorherigen Liste als zweite Komponente eines Tupels hinzu. Für das Beispiel gibt dies[(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)]
.maximum
findet das lexikographisch maximale Tupel in dieser Liste, dh die Streifenlängen werden als erste Komponente betrachtet und im Falle eines Unentschieden entscheidet die zweite Komponente, nämlich der größere Index. Dies ergibt(3,1)
im Beispiel undsnd
gibt die zweite Komponente des Tupels zurück.quelle
Python 2 oder 3 , 58 Bytes
Probieren Sie es online!
quelle
C (gcc) ,
81 -80 BytesProbieren Sie es online!
C (gcc) , 43 Bytes
AC-Version von @ Arnauld's Antwort
Probieren Sie es online!
quelle
n<1?0:log2(n)
stattdessen vor(k=log2(n))<0?0:k
MS SQL Server,
437426407398 BytesSQL-Geige
Ich bin mir sicher, dass ich Zeilenumbrüche usw. entfernen könnte, aber das ist so kompakt, wie ich es wollte:
Hier ist eine besser lesbare Version:
Der eigentliche Trick ist, dass es meines Erachtens keine native SQL-Funktionalität gibt, um eine Zahl von dezimal in binär umzuwandeln. Infolgedessen musste ich die Umwandlung in eine Binärdatei manuell codieren, und dann konnte ich diese als Zeichenfolge einzeln vergleichen, bis ich die richtige Zahl gefunden hatte.
Ich bin mir sicher, dass es einen besseren Weg gibt, aber ich habe keine (n) SQL-Antwort erhalten.
quelle
APL (Dyalog Unicode) , 22 Zeichen = 53 Byte
Benötigt,
⎕IO←0
was auf vielen Systemen Standard ist.Probieren Sie es online!
⎕
Eingabeaufforderung⊢
ergeben, dass (trennt sich¯1
von⎕
)2⊥⍣¯1
konvertiere zu base-2 und verwende so viele positionen wie nötigb←
speichern alsb
(für b inary)⌽
umkehren(
…)
Markieren Sie die Startpositionen von Folgendem:⊆⍨b
Selbstpartitionierungb
(dh die 1-Streifen vonb
)↑
mischen (Liste der Listen in Matrix umwandeln, mit Nullen auffüllen)∨⌿
vertikale OP-Reduktion (ergibt die längste Strichstärke)⍸
ɩ zu den Startpositionen⌽
umkehren⊃
wähle die erste aus (ergibt null, wenn keine verfügbar ist)quelle
MATL , 15 Bytes
Probieren Sie es online!
Verwendet die Hälfte und UND-Idee. Das
k
ist nur notwendig, um es zu beenden1
- aus irgendeinem Grund gibt 1 AND 0.5 1 zurück und verursacht eine Endlosschleife.(Alternative Lösung:
BtnwY'tYswb*&X>)-
durch Konvertieren in Binär- und Lauflängencodierung)quelle
Google Sheets, 94 Bytes
Nein, es ist nicht sehr hübsch. Es wäre wirklich schön, etwas lagern zu können
Dec2Bin(A1)
Referenzvariable .Wichtig: Die
Dec2Bin
Funktion hat wie Excel einen maximalen Eingabewert von511
. Alles, was größer ist, gibt einen Fehler zurück (siehe unten).quelle
R, 117 Bytes
quelle
rev
Verwenden Sie stattdessen , umReduce(...,T,T)
von rechts zu akkumulieren (Umschaltenx,y
in der Funktionsdefinition). Dann benutze1+max(z)-which.max(z)
da das Ergebnis etwas anders. Verwenden Sie"if"
anstelle von,"ifelse"
da wir die Vektorisierung nicht benötigen. und wenn Sieany(z)
stattdessen verwenden, löschen Sie!sum(z)
ein Byte.Excel VBA,
5444 Bytes-10 Bytes dank @EngineerToast
Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich
[A1]
und Ausgaben in das VBE-Direktfenster übernimmtquelle
C1
immer noch vorhandenA1
ist, kann man dieInstr
Ergebnisse meiner Meinung nach mit ein wenig Drehung für die Nullpunktkorrektur direkt ausgeben :?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)
(46 Bytes). True = -1 weil ... VBA.>0
in die[A1]
NotationAPL (Dyalog Classic) ,
2421 BytesProbieren Sie es online!
quelle
Pyth , 17 Bytes
Dies ist eine rekursive Funktion. Der Link beinhaltet
y
, um die Funktion auf dem angegebenen Eingang aufzurufen.Überprüfen Sie alle Testfälle.
Pyth , 20 Bytes
Überprüfen Sie alle Testfälle.
quelle
R, 66 Bytes
Erläuterung:
quelle
a$l
anstelle vona[[1]]
unda$v
anstelle vona[[2]]
einige Bytes speichern können :) sowie>0
anstelle von==1
.Python 2 , 41 Bytes
Probieren Sie es online!
Basierend auf dieser Lösung von Herrn Xcoder .
quelle
Javascript, 54 Zeichen
i.toString(2)
Ruft die Binärzeichenfolge für die Ganzzahl ab..split(0)
ruft jeden sequentiellen Teil in einem Array-Element ab..sort().reverse()
bringt uns als erstes den höchsten wert.[0].length
gibt uns die Länge dieses ersten Wertes.quelle
the starting position of number of largest consecutive 1's
Perl 5, 45 + 1 (-p)
Wenn Sie dies in die Befehlszeile der meisten Shells schreiben, müssen Sie dies möglicherweise wie folgt eingeben:
Der Tanz der Zitate am Ende ist nur, um Perl zu sehen
'
, was sonst von der Shell verzehrt würde.quelle
Netzhaut ,
5243 BytesIn Binärdatei konvertieren und durch die Länge der größten Folge von Einsen ersetzen.
Probieren Sie es online aus - alle Testfälle
9 Bytes gespart dank Martin.
quelle
$+
für verwenden${1}
. Sie können jedoch noch mehr sparen, indem Sie die letzte Stufe durch eine Reihe von Stufen ersetzen : tio.run/##K0otycxL/K/…${1}
wurde aus deinem Tutorial auf Github kopiert.