Inspiriert von dieser Herausforderung
Geben Sie bei einer Ganzzahl im Bereich 0 <= n < 2**64
den Container mit der Mindestgröße aus, in den er passen kann
- Bit: 1
- Knabbern: 4
- Byte: 8
- kurz: 16
- int: 32
- lang: 64
Testfälle:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
2
eine Ausgabe wäre ...Antworten:
05AB1E , 10 Bytes
Erläuterung
Probieren Sie es online!
quelle
Python, 39 Bytes
Zählt, wie oft man die Quadratwurzel ziehen muss,
n
um darunter zu sein16
, mit einem speziellen Gehäuse, um Ausgaben von 2 zu vermeiden.Wenn 2 enthalten wären, könnten wir tun
mit True für 1.
41 Bytes:
Verdoppelt wiederholt den Exponenten
i
bis2**i>n
. Springt voni=1
bis,i=4
indem ein zusätzliches Bit verschoben wird, wenni
es ungerade ist.Alt 45 Bytes:
quelle
1
wenn die Quadratwurzel von 0 oder 1 immer 1 ist (unendliche Rekursivität inor 2*f(n**.5)
)?or
wird nur ausgewertet wenn das Teil vorher etwas falsch bewertet wird (null). Für n = 0 und für n = 1 wirdn>1
ausgewertet bisFalse
, was in einem numerischen Ausdruck als Null behandelt wird, undn<16
ausgewertet bisTrue
, was in einem numerischen Ausdruck als Eins behandelt wird. So4**(n>1)*(n<16)
ist 1.J, 19 Bytes
Monadisches Verb, das die Zahl rechts aufnimmt und die Behältergröße ausspuckt. Es gibt zwei äquivalente Schreibweisen, also habe ich beide eingeschlossen.
Erklärt durch Explosion:
Was cool ist, ist, dass wir in J zwei verschiedene Arten sehen
2^.
, Logarithmus 2 zu nehmen. Die erste ist der offensichtliche , ein numerischer Logarithmus. Die zweite ist#@#:
, die als "Länge der Basis-2-Darstellung" gelesen werden kann. Dies ist fast gleichbedeutend mit einem Plus-Stockwerk-von-Log-Basis-2, mit der Ausnahme, dass#:0
es sich um die Liste mit einem Element handelt0
, die genau das ist, was wir wollen. Dies schlägt1+2<.@^.1&>.
um 8 Bytes.Im Einsatz bei der REPL:
Alte, zu clevere 20-Byte-Lösung.
quelle
Python,
535049 Bytesquelle
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
ist ein Byte kürzerMathematica,
443938 BytesDanke @orlp für 5 Bytes und @MartinEnder für 1 Byte.
Findet als erstes die Elemente in der Liste
{1, 4, 8, 16, 32, 64}
, sodass 2 ^ number größer als die Eingabe ist.quelle
Pip , 19 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES7), 35 Byte
quelle
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
sollte etwas kürzer sein.Mathematica,
464338 BytesVielen Dank an JungHwan Min und Martin Ender für die Einsparung von 3 Bytes! Danke an ngenisis für die großen 5-Byte-Einsparungen!
Unbenannte Funktion, die eine nicht negative Ganzzahl als Eingabe verwendet und eine positive Ganzzahl zurückgibt.
BitLength@#
berechnet die Anzahl der Bits in der Eingabe und2^⌈Log2@...⌉
berechnet dann die kleinste Potenz von 2, die mindestens so groß ist wie die Anzahl der Bits. Zum Schluss wird/.{2->4,0->1}
auf den Sonderfall geachtet, dass zwischen Bit und Nybble kein "Niblit" besteht, und die Antwort für die seltsame Eingabe korrigiert0
.quelle
BitLength@#
anstelle von verwenden⌊1+Log2@#⌋
. Anstatt durch∞
zu1
ersetzen0
, können Sie dann ersetzen , indem Sie weitere 2 Bytes speichern, und Sie sind zuerst gebunden.BitLength
. Siehe meine AntwortJulia, 40 Bytes
Dies ist eine anonyme Funktion, die ein Array der Zweierpotenzen von 0 bis 6 (mit Ausnahme von 2) generiert und es nur auf die Elemente x filtert, sodass 2 x größer als die Eingabe ist. Das erste solche Element ist die Antwort. Leider erfordert dies das Hochstufen von 2 auf a
BigInt
, um einen Überlauf auf x = 64 zu vermeiden .Dies ist der Python-Antwort von orlp eigentlich ziemlich ähnlich, obwohl ich es nicht gesehen habe, bevor ich mir diesen Ansatz ausgedacht habe.
Probieren Sie es online!
quelle
Perl 6 , 30 Bytes
+<
ist Perl 6's linker Bitverschiebungsoperator, den viele andere Sprachen aufrufen<<
.quelle
Haskell, 31 Bytes
32 Byte alt:
quelle
Java, 143 Bytes.
quelle
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 Bytes
quelle
Ruby,
3936 BytesVielen Dank, GB, dass Sie beim Golfen helfen
quelle
Java 8,
65-55BytesDies ist ein Lambda-Ausdruck, der ein nimmt
long
und ein zurückgibtint
. Nie zuvor in Java Golf gespielt, daher sollte dies leicht zu schlagen sein:Probieren Sie es online!
Für 47 Bytes könnten wir haben:
Allerdings
1L<<i
überläuft für Rückgabewerte größer als 32, so dass diese für die endgültige Testfall ausfällt.quelle
4
wenn getestet wird,16
wann es 8 zurückgeben soll. Sie können diese Lösung auch weiterhin spielen, indem Sie die Klammern entfernen,i<<=1+i%2;
da{}
die while-Schleife ohne s nur die nächste ZeileMathematica, 30 Bytes
Erläuterung:
Sei
N
die Menge der nichtnegativen ganzen Zahlen. Definieren Sie zwei Funktionen aufN
,BitLength
undNextPower
wie folgt dar :Diese Lösung berechnet im Wesentlichen
NextPower(BitLength(n))
eine ganze Zahln >= 0
. Dennn > 0
wir können dasNextPower(n) = 2^BitLength(n-1)
so sehenNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Jetzt
BitLength
stimmt der Mathematica -Code mit der Definition überein, für die ich angegeben haben >= 0
. Fürn < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
soBitLength[-1] == BitLength[0] == 0
. So bekommen wir die gewünschte Antwort von1
fürn==0
.Da wir direkt von Bit zu Nibbeln springen, müssen wir Antworten von
2
durch ersetzen4
.quelle
Bash,
49 Bytes,48 Bytesoder
Speichern Sie in einem Skript und übergeben Sie die zu testende Nummer als Argument.
Bearbeiten: Ersetzt || mit |, was funktioniert, weil die Argumente immer 0 oder 1 sind.
Hinweis: Dies funktioniert für ganze Zahlen bis zur größten positiven Ganzzahl, die Ihre Version von bash verarbeiten kann. Wenn ich Zeit habe, ändere ich sie so, dass sie in Versionen von Bash, die 32-Bit-Arithmetik mit Vorzeichen verwenden, bis zu 2 ^ 64-1 funktioniert.
In der Zwischenzeit ist hier eine 64-Byte-Lösung, die für beliebig große Zahlen (in jeder Bash-Version) funktioniert:
quelle
Gestapelt,
3430 Bytesoder
Der erste nimmt Eingaben in den TOS entgegen und lässt Ausgaben im TOS; der zweite ist eine Funktion. Probieren Sie es hier aus!
Erläuterung
Hier ist ein Beispiel für die Arbeit an der Replik :
Testfälle
Oder als volles Programm:
quelle
Schläger 45 Bytes
Ungolfed:
Andere Versionen:
und mit Stringlänge:
Testen:
Ausgabe:
quelle
Octave,
40 36 3129 BytesEinfache anonyme Funktion. Es wird davon ausgegangen, dass der Eingabewert eine Ganzzahl ist - siehe Warnung am Ende.
Der Code funktioniert wie folgt:
Zunächst wird ein Array der zulässigen Bitlängen (1,4,8,16,32,64) erstellt und in gespeichert
b
.Als nächstes ermitteln wir die Anzahl der Bits, die zum Speichern der Eingabenummer erforderlich sind,
a
indem wir die maximale Größe jedes Containers in vergleichenb
, um festzustellen , welche ausreichend groß sind.Wir verwenden dann den resultierenden Indexvektor, um die Containergröße
b
erneut zu extrahieren .Schließlich nehmen wir das erste Element im resultierenden Array, das der kleinstmögliche Container ist.
Sie können es hier online ausprobieren .
Führen Sie einfach den folgenden Code aus, und führen Sie dann aus
ans(x)
.Die einzige Einschränkung dabei ist, dass für Konstanten standardmäßig die doppelte Genauigkeit verwendet wird. Dies bedeutet, dass nur Zahlen mit dem höchsten Wert verwendet werden können, der durch einen Gleitkommawert mit doppelter Genauigkeit von weniger als 2 ^ 64 darstellbar ist.
Dies kann behoben werden, indem sichergestellt wird, dass die an die Funktion übergebene Zahl eine Ganzzahl und keine Doppelzahl ist. Dies kann erreicht werden, indem die Funktion zum Beispiel mit: aufgerufen wird
ans(uint64(x))
.quelle
PHP,
494644 BytesLaufen Sie wie folgt:
Erläuterung
Optimierungen
$r=
Zuordnung aufgehoben wurde-R
, um$argn
verfügbar zu machenquelle
CJam , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
C
7152 Bytesquelle
(1<<15)+1
oder mehr dies nicht aufgrund des signierten Verhaltens vonlong long
unterbrechen? Der Typ, den Sie wirklich wollen, istuint64_t
derjenige,#include <stdint.h>
der es erfordert, und der im Vergleich zu den anderen immer noch ein Verlierer istunsigned long long
! Header sind der Fluch des Golfsports in c.unsigned long long
oder zu verwendenuint64_t
, aber da es zu funktionieren scheint,long long
bin ich mitgegangen.QBIC , 27 Bytes
Erläuterung
quelle
Pyke, 13 Bytes
Probieren Sie es hier aus!
quelle
PHP, 43 Bytes
Laufen Sie mit
echo <number> | php -R '<code>'
.Endlosschleifen
$i
, bis2**(2**$i)
größer als die Eingabe ist. (Tweak:<<
anstatt**
Parens zu eliminieren)Nach der Schleife ist $ i eins zu hoch; es wird also ein dekrement vor der berechnung der ausgabe
- aber nicht für
$i==2
.quelle