Herausforderung
Gegeben eine ganze Zahl in einem 32-Bit - Zweier-Komplement - Format, kehren den Index der zweiten niedrigstwertigen Ziffer Null in der binären Darstellung, wobei ein Index für 0
das niedrigstwertige Bit darstellt, und ein Index 31
repräsentiert das höchstwertige Bit.
Wenn es keine zweite Null gibt, können Sie 0, eine negative Zahl oder einen falschen Wert zurückgeben oder einen Fehler auf eine Weise melden, die in Ihrer Sprache sinnvoll ist.
Sie können die 1-Indizierung verwenden, wenn Sie dies bevorzugen. In den folgenden Testfällen wird jedoch die 0-Indizierung verwendet.
Sie können vorzeichenlose Ganzzahlen verwenden, wenn Sie dies bevorzugen. Wenn Sie dies tun, müssen Sie Ganzzahlen im Bereich verarbeiten [0, 2^32)
. Wenn Sie vorzeichenbehaftete Ganzzahlen verwenden, müssen Sie Ganzzahlen im Bereich verarbeiten [-2^31, 2^31)
. In den Testfällen werden vorzeichenbehaftete Ganzzahlen verwendet. Beachten Sie jedoch, dass -x
(signiert) 2^32 - x
(nicht signiert) ist .
Testfälle
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Keine -2 (0b11..10) -> Keine -4 (0b11..00) -> 1 -5 (0b11..1011) -> Keine -9 (0b11..10111) -> Keine 2 ^ 31-2 (0b0111..1110) -> 31
Wertung
Dies ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache!
[0, 2^32)
.0b...
als Eingabe?2^32-1
weil ich nicht zurückkehren sollte33
.Antworten:
Python 2 , 45 Bytes
Probieren Sie es online aus!
Verwendet 0-Indizierung, vorzeichenlose Zahlen und wirft einen Fehler auf keine zweite Null.
Erstellt einfach eine Liste von Indizes nicht gesetzter Bits vom niedrigsten zum höchsten und gibt den zweiten Eintrag zurück.
quelle
JavaScript (ES6), 34 Byte
Gibt einen 0-basierten Index zurück oder
-1
wenn keine zweite Null gefunden wird.Testfälle
Code-Snippet anzeigen
Alternativer Ausdruck
Rekursive Version, 42 Bytes
Gibt einen 0-basierten Index zurück oder
false
wenn keine zweite Null gefunden wird.Wie?
Testfälle
Code-Snippet anzeigen
Alternative Version von Neil vorgeschlagen, 41 Bytes
Gibt einen 0-basierten Index zurück oder löst einen zu großen Rekursionsfehler aus , wenn keine zweite Null gefunden wird.
quelle
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Gelee , 7 Bytes
Probieren Sie es online aus!
Es gibt etwas aus, das nicht im Bereich [1,31] liegt, wenn es nicht die zweite Null gibt. Dies beinhaltet
32
33
und(-inf+nanj)
. Ich denke, das macht Sinn.Es berechnet
log(((x|(x+1))+1)&~x)/log(2)
.quelle
-inf+nanj
Ich hätte nicht gedacht, dass es das überhaupt geben könnte(-inf+nanj)
für einen Eingang ausgegeben,2147483647
der eine binäre Darstellung von 31 1s hat, daher keine zweite Null in 32-Bit-Notation mit Vorzeichen (aus diesem Grund ist er so viel kürzer als meine und Eriks Antworten).(-inf+nanj)
?Java, ...
194 191186 Bytes-159 Bytes für die Verwendung kleinerer Variablennamen und das Entfernen von Leerzeichen
-25 Bytes, nachdem noch kürzere Variablen verwendet wurden und dank @ KevinCruijssen-Tipps
-18 Bytes, mehr Leerzeichen, Funktionsname
-3 Bytes, dank @KevinCruijssen, Verkürzung bei Bedingung
-5 Bytes , Dank an @Arnold Palmer, @KevinCruijssen, Verkürzungsschleife
Ungolfed
quelle
static
können entfernt werden;if(n<0||n>o){return 0;}
kann seinif(n<0|n>o)return 0;
(|
anstelle von||
und keine Klammern);bs
,bsa
usw. können alle einzelne Zeichen sein (verwenden Sie im Code-Golf niemals Mehrbyte-Variablen- / Methodennamen); Sie könnenint
s wie folgt kombinieren :int o=2^32-2,c=0,i=x.length,l=i-1;
. Und es gibt noch einige Dinge zum Golfen. Tipps zum Golfen in Java und Tipps zum Golfen in allen Sprachen könnten interessant sein. Wieder willkommen und genießen Sie Ihren Aufenthalt! :)if(c[i]=='0'){j++;}
kann immer nochif(c[i]==48)j++;
für -3 Bytes gespielt werden :) EDIT: Oder noch besser:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
kannfor(;j<2&i>0;j+=c[i--]==48?1:0);
für -8 Bytes sein.for(;j<2&i>0;j+=c[--i]==48?1:0);
sollte er funktionieren. Der Fehler ergibt sich ausi
der Länge der Zeichenfolge. Sie versuchen also zunächst, über die Grenzen des Arrays hinaus zu indizieren. Wenn Sie eine Vordekrementierung durchführen (wie im aktualisierten Snippet gezeigt), wird bei der ersten Verwendungc[c.length-1]
wie in Ihrem Originalcode darauf zugegriffen.Java (OpenJDK 8) ,
4438 ByteProbieren Sie es online aus!
Gibt 0 zurück, wenn kein zweites Nullbit vorhanden ist.
quelle
IA-32 Maschinencode,
1413 BytesHexdump:
Auflistung der Demontage:
Empfängt Eingaben in
ecx
; Ausgabe ist inal
. Gibt bei einem Fehler 0 zurück.Zunächst wird die Eingabe invertiert, sodass mithilfe der Bit-Scan-Anweisungen nach gesetzten Bits gesucht werden kann. Es sucht nach dem niedrigstwertigen gesetzten Bit, setzt es zurück, sucht erneut nach dem niedrigstwertigen gesetzten Bit und gibt das Ergebnis zurück.
Wenn der Bit-Scan-Befehl kein gesetztes Bit findet, heißt es in der Intel-Dokumentation, dass die Ausgabe undefiniert ist. In der Praxis lassen jedoch alle Prozessoren das Zielregister in diesem Fall unverändert (wie von Cody Gray angegeben, beschreibt die AMD-Dokumentation dieses Verhalten als obligatorisch).
Es gibt also folgende Fälle:
not
und bleibt 0btr
und bleibt danach 0bsf
bsf
quelle
SALC
+DEC
ist extrem klug, können Sie ein Byte nur mit , was abrasieren ist inECX
ab dem zweitenBSF
Befehl. Das einzige, was benötigt wird, ist ein 1-ByteXCHG
, um das Ergebnis zu erhalten,EAX
damit es zurückgegeben werden kann. Mit anderen Worten,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
als Eingaberegister verwenden, müssen wir GCC anweisen, die Fastcall-Aufrufkonvention zu verwenden.Dyalog APL, 20 Bytes
Verwendet 1-Indexierung, wirft,
INDEX ERROR
wenn keine zweite Null vorliegt.Wie?
⍵⊤⍨
-⍵
als kodieren32⍴2
- Binärzeichenfolge der Länge 32⌽
- umkehren~
- negieren (0 → 1, 1 → 0)(⍳32)/⍨
- mit dem Bereich 1-32 komprimieren (Indizes von Nullen belassen)2⊃
- Wählen Sie das zweite Elementquelle
⍸
)Gelee , 13 Bytes
Probieren Sie es online aus!
Verwendet die 1-Indizierung und erhält eine Ganzzahl ohne Vorzeichen als Eingabe. Rückgabe
0
für nicht gefunden.quelle
33
für den Eingang4294967295
(2^32-1
das 32-Bit-Äquivalent ohne Vorzeichen von-1
)Gelee , 12 Bytes
Eine monadische Verknüpfung, die eine Ganzzahl verwendet, die Option ohne Vorzeichen verwendet und das 1-indizierte Ergebnis zurückgibt (gibt 0 zurück, wenn keine vorhanden ist).
Probieren Sie es online aus!
oder
Versuch das
Wie?
1.
2.
quelle
x86_64 Maschinencode,
3432 BytesIch bin mir nicht sicher, ob dies der richtige Ansatz ist, ziemlich viele Bytes (es stellt sich heraus, dass dies nicht der Fall ist ):
Probieren Sie es online aus!
Danke @CodyGray für die
-2
Bytes.quelle
BSF
,BSR
,POPCNT
,BT
etc. Anatolyg hat eine Lösung in dieser Richtung vorgelegt . Ich habe noch nicht festgestellt, ob es zu schlagen ist. :-por ecx, -1
. Das sind 3 Bytes, 1 Byte kürzer als XOR + NEG. Dies ist kein guter Trick, wenn Sie nicht Golf spielen, da dadurch eine falsche Leseabhängigkeit vom Zielregister eingeführt wird. Dort würden Sie jedoch nurmov ecx, -1
die 5 Bytes verwenden und ausgeben.8. 149 Bytes
Kommentierter Code
Verwendung und Ausgabe
quelle
R , 66 Bytes
liest von stdin; kehrt
0
für keine zweite Null und die Stelle anders zurück.Probieren Sie es online aus!
quelle