Problem:
Suchen Sie die Anzahl der führenden Nullen in einer 64-Bit-Ganzzahl mit Vorzeichen
Regeln:
- Die Eingabe kann nicht als Zeichenfolge behandelt werden. Es kann alles sein, wo mathematische und bitweise Operationen den Algorithmus antreiben
- Die Ausgabe sollte unabhängig von der Sprache anhand der 64-Bit-Ganzzahl mit Vorzeichen überprüft werden
- Es gelten die Standardcode-Golfregeln
- Kürzester Code in Bytes gewinnt
Testfälle:
Diese Tests gehen von zwei vorzeichenbehafteten Ganzzahlen aus. Wenn es Ihrer Sprache / Lösung an einer anderen Darstellung von Ganzzahlen mit Vorzeichen mangelt oder diese verwendet, rufen Sie diese bitte auf und geben Sie zusätzliche Testfälle an, die möglicherweise relevant sind. Ich habe einige Testfälle aufgenommen, die sich mit doppelter Genauigkeit befassen. Sie können jedoch auch andere vorschlagen, die aufgelistet werden sollen.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
statt0
?Antworten:
x86_64-Maschinensprache unter Linux, 6 Byte
Benötigt Haswell oder K10 oder einen höheren Prozessor mit
lzcnt
Anleitung.Probieren Sie es online!
quelle
Hexagony ,
7870 BytesProbieren Sie es online!
Ist diese Herausforderung für eine praktische Sprache nicht zu trivial? ;)
Seitenlänge 6. Ich kann es nicht in eine Seitenlänge von 5 Sechseck passen.
Erläuterung
quelle
Python , 31 Bytes
Probieren Sie es online!
Das Expresson ist das bitweise
&
von zwei Teilen:Das
67-len(bin(-n))
gibt die richtige Antwort für nicht negative Eingaben. Es nimmt die Bitlänge und subtrahiert 67, was 3 mehr als 64 ist, um das-0b
Präfix zu kompensieren . Die Negation ist ein Trick, auf den man sich einstellen mussn==0
bei dem die Negation kein-
Vorzeichen erzeugt.Das
& ~n>>64
macht die Antwort stattdessen0
für negativn
. Wennn<0
,~n>>64
gleich 0 ist (auf 64-Bit - Integer), so und-ing mit ihm gibt0
. Wannn>=0
, das~n>>64
auswertet-1
und macht&-1
nichts.Python 2 , 36 Bytes
Probieren Sie es online!
Arithmetische Alternative.
quelle
Java 8,
3226 Bytes.Long::numberOfLeadingZeros
Builtins FTW.
-6 Bytes dank Kevin Cruijssen
Probieren Sie es online!
quelle
numberOfLeadingZeros
.. Sie können es zu 28 Bytes BTW Golf spielen:n->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
ist es noch kürzer (26 Bytes).C (gcc) , 14 Bytes
Funktioniert gut auf tio
C (gcc) ,
35 bis29 BytesProbieren Sie es online!
Als Dennis für 6 Bytes
C (gcc) Compiler Flags, 29 Bytes von David Foerster
Probieren Sie es online!
quelle
__builtin_clzl
mit dem ich aufwarten kann .long
32 Bit (einschließlich Windows x64) benötigen Sie__builtin_clzll
(lange ohne Vorzeichen). godbolt.org/z/MACCKf . (Im Gegensatz zu Intel - Spezifika, GNU C builtins werden unabhängig vom Betrieb unterstützt mit einem Maschinenbefehl ist machbar Auf 32-Bit x86, clzll compiliert zu einem Zweig oder cmov zu tun.lzcnt(low half)+32
Oderlzcnt(high half)
Or.bsr
Wennlzcnt
nicht verfügbar.__builtin_clz(l)(l)
undefiniertes Verhalten für Null: "Wenn x 0 ist, ist das Ergebnis undefiniert."Perl 6 ,
35 2826 Bytes-2 Bytes dank nwellnhof
Probieren Sie es online!
Anonymer Codeblock, der eine Nummer entgegennimmt und eine Nummer zurückgibt. Dies konvertiert die Zahl in eine Binärzeichenfolge und zählt die führenden Nullen. Dies funktioniert für negative Zahlen, da das erste Zeichen ein
-
Beispiel ist-00000101
und daher keine führenden Nullen vorhanden sind.Erläuterung:
quelle
JavaScript (Node.js) , 25 Byte
Übernimmt die Eingabe als BigInt-Literal.
Probieren Sie es online!
quelle
n=>n<1?0:n.toString(2)-64
dasselbe tun?n=>n<1?0:n.toString(2).length-64
, aber das würde sowieso nicht funktionieren. Das würde ich denken..toString()
Ansatz funktioniert, aber wir benötigen immer noch ein BigInt-Literal als Eingabe. Ansonsten haben wir nur 52 Bits Mantisse, was zu ungültigen Ergebnissen führt, wenn die Genauigkeit verloren geht .Python 3 , 34 Bytes
Probieren Sie es online!
quelle
J , 18 Bytes
Probieren Sie es online!
J , 19 Bytes
Probieren Sie es online!
Erläuterung:
quelle
1#.[:*/\1-_64{.#:
(17) ist knapp, funktioniert aber nicht für negative Zahlen :(Perl 6 , 18 Bytes
-2 Bytes dank Jo King
Probieren Sie es online!
quelle
Ruby , 22 Bytes
Probieren Sie es online!
quelle
05AB1E ,
109 BytesI / O sind beide Ganzzahlen
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Haskell , 56 Bytes
Danke xnor, dass du einen Fehler entdeckt hast !
Könnte ziemlich viel Speicherplatz belegen , versuche es online!
Vielleicht möchten Sie es mit einer kleineren Konstante testen: Versuchen 8-Bit!
Erläuterung
Anstatt{ 0 , 1 }64 in lexikographischer Reihenfolge. Also können wir einfach die Summe1 S-Präfix mit
mapM(pure[0,1])[1..64]
die Eingabe in Binär umzuwandeln, verwenden wir,mapM(pure[1,0])[1..64]
was im Wesentlichen die invertierten Zeichenfolgen generiertsum.fst.span(>0)
.quelle
Powershell, 51 Bytes
Testskript:
Ausgabe:
quelle
Java 8, 38 Bytes
Eingabe als
long
(64-Bit-Ganzzahl), Ausgabe alsint
(32-Bit-Ganzzahl).Port von @ l4m2 's C (gcc) Antwort .
Probieren Sie es online aus.
Erläuterung:
BEARBEITEN: Kann 26 Bytes lang sein,
Long::numberOfLeadingZeros
wenn die in @ lukegs Java 8-Antwort angezeigte integrierte Funktion verwendet wird .quelle
APL + WIN, 34 Bytes
Erläuterung:
quelle
C # (Visual C # Interactive Compiler) , 42 Byte
Probieren Sie es online!
C # (Visual C # Interactive Compiler) , 31 Byte
Noch kürzer, basierend auf der C (gcc) Antwort von @ l4m2. Habe nie gewusst, dass man solche Funktionen deklarieren kann, danke @Dana!
Probieren Sie es online!
quelle
Gelee ,
109 Bytes-1 dank eines tollen Tricks von Erik dem Outgolfer (ist jetzt einfach nicht negativ
AƑ
)Ein monadischer Link, der eine ganze Zahl (innerhalb des Bereichs) akzeptiert, die eine ganze Zahl ergibt.
Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Die 10 war
ḤBL65_ɓ>-×
Hier ist eine weitere 10-Byte-Lösung, die mir gefällt, da sie "BOSS" heißt ...
Test-Suite hier
...
BoṠS63r0¤i
,BoṠS63ŻṚ¤i
oderBoṠS64ḶṚ¤i
würde auch funktionieren.Weitere 10 Bytes (von Dennis) sind
æ»64ḶṚ¤Äċ0
(wiederæ»63r0¤Äċ0
undæ»63ŻṚ¤Äċ0
werden auch funktionieren)quelle
Ƒ
schnelle, sehr schöne Arbeit!AƑ
einiger Zeit. Seien Sie gewarnt, dass es nicht vektorisiert! ;-) Eigentlich heißt es "Abflachen und dann prüfen, ob alle Elemente nicht negativ sind".Perl 5 , 37 Bytes
Probieren Sie es online!
Oder diese 46 Bytes, wenn die "Stringifizierung" nicht erlaubt ist: sub z
quelle
s/length$&/$+[0]/
(-3 Bytes);)sub
Schlüsselwort nicht aus Antworten entfernen, die Perl 5-Funktionen enthalten.sub
in Antworten für andere Sprachen, Perl6, Powershell und mehr ähnelt.sub{}
(anonymes?) Sub erstellen, was erklärt, warum es in Perl6-Antworten weggelassen wurde. Ich bin mit @nwellnhof einverstanden, dass Sie nicht entfernen dürfensub
. (als ich noch aktiv war, wie vor einem Jahr oder so, das war die Regel)$+[0]
.Swift (auf einer 64-Bit-Plattform), 41 Byte
Deklariert einen aufgerufenen Closure,
f
der ein akzeptiert und zurückgibtInt
. Diese Lösung funktioniert nur richtig 64-Bit - Plattformen, woInt
sichtypealias
auf edInt64
. (Int64
Kann auf einer 32-Bit-Plattform explizit für den Parametertyp des Closures verwendet werden, wobei 2 Byte hinzugefügt werden.)In Swift ist sogar der ganzzahlige Grundtyp ein gewöhnliches Objekt, das in der Standardbibliothek deklariert ist. Dies bedeutet,
Int
dass Methoden und Eigenschaften vorhanden sein können, z. B.leadingZeroBitCount
(dies ist für alle Typen erforderlich, die demFixedWidthInteger
Protokoll der Standardbibliothek entsprechen ).quelle
Haskell , 24 Bytes
Probieren Sie es online!
Dies ist im Grunde die gleiche wie die Java-Lösung von Kevin Cruijssen, aber ich habe sie unabhängig gefunden.
Das Argument sollte einen Typ
Int
für einen 64-Bit-Build oderInt64
für irgendetwas haben.Erläuterung
Wenn das Argument negativ ist, ist das Ergebnis sofort 0. Andernfalls verschieben wir uns mit Einsen nach links , bis wir eine negative Zahl erreichen. Mit dieser Füllung vermeiden wir einen Sonderfall für 0.
Nur als Referenz, hier ist der offensichtliche / effiziente Weg:
34 Bytes
quelle
Sauber , 103 Bytes
Verwendet das gleiche "Builtin" wie die Antwort von ceilingcat.
Probieren Sie es online!
Sauber , 58 Bytes
Probieren Sie es online!
quelle
Stax , 10 Bytes
Führen Sie es aus und debuggen Sie es
Es ist eine Portierung von Kevins 05AB1E-Lösung.
quelle
Perl 5
-p
, 42 BytesProbieren Sie es online!
Länger als eine Bitstring-basierte Lösung, aber eine anständige Mathe-basierte Lösung.
quelle
int
Anruf getätigt, der das Problem lösen sollte.APL (NARS), 15 Zeichen, 30 Byte
Teste für ein paar Zahlen, um zu sehen, wie man es benutzt:
quelle
Rust, 18 Bytes
Probieren Sie es online!
quelle
K (ngn / k) , 6 Bytes
Probieren Sie es online!
2\
codiere das Argument in binär#
Länge64-
subtrahieren von 64quelle
# = length
... sieht stringbasiert aus2\
gibt eine Liste von Ganzzahlen an und ermittelt#
deren Länge. Hier sind keine Zeichenfolgen beteiligt.PHP,
5046 BytesLaufen Sie als Pipe mit
-R
oder versuchen Sie es online ,<?=$argn<0?0:0|64-log($argn+1,2);
hat Rundungsprobleme; Also habe ich den langen Weg genommen.quelle
Wolfram Language (Mathematica) , 41 Bytes
Die Formel für positive Zahlen ist gerecht
63-Floor@Log2@#&
. Ersetzungsregeln werden für die Sonderfälle Null und negative Eingabe verwendet.Die Eingabe muss keine 64-Bit-Ganzzahl mit Vorzeichen sein. Dadurch wird das Wort der Eingabe effektiv in eine Ganzzahl umgewandelt. Wenn Sie eine Zahl außerhalb der normalen Grenzen für eine 64-Bit-Ganzzahl eingeben, wird eine negative Zahl zurückgegeben, die angibt, wie viele weitere Bits zum Speichern dieser Ganzzahl erforderlich wären.
Probieren Sie es online!
@ LegionMammal978s Lösung ist mit 28 Bytes ziemlich viel kürzer. Die Eingabe muss eine Ganzzahl sein. Pro der Dokumentation: „
BitLength[n]
ist effektiv eine effiziente VersionFloor[Log[2,n]]+1
.“ Es sorgt automatisch für den Fall von Null Berichterstattung korrekt0
statt-∞
.Wolfram Language (Mathematica) , 28 Byte
Probieren Sie es online!
quelle
Boole[#>=0](64-BitLength@#)&
ist mit 28 Bytes etwas kürzer. Es verwendet das gleiche Grundkonzept wie Ihr, gilt aberBitLength
undBoole
.bitNumber - math.ceil (math.log (number) / math.log (2))
zB 64-Bit-NUMMER: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
quelle