Terinspirasi oleh tantangan ini
Diberikan bilangan bulat dalam kisaran 0 <= n < 2**64
, output wadah ukuran minimum yang bisa masuk
- bit: 1
- menggigit: 4
- byte: 8
- pendek: 16
- int: 32
- panjang: 64
Testcases:
0 -> 1
1 -> 1
2 -> 4
15 -> 4
16 -> 8
123 -> 8
260 -> 16
131313 -> 32
34359750709 -> 64
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
2
merupakan output juga ...Jawaban:
05AB1E , 10 byte
Penjelasan
Cobalah online!
sumber
Python, 39 byte
Menghitung berapa kali seseorang harus mengambil akar kuadrat untuk
n
berada di bawah16
, dengan beberapa casing khusus untuk menghindari output 2.Jika 2 dimasukkan, kita bisa melakukannya
dengan True untuk 1.
41 byte:
Berulang kali eksponen
i
hingga dua kali lipat2**i>n
. Melompat darii=1
kei=4
dengan menggeser sedikit tambahan saati
ganjil.Alt 45 byte:
sumber
1
ketika akar kuadrat dari 0 atau 1 selalu 1 (tak terhingga berulang dalamor 2*f(n**.5)
)?or
hanya dievaluasi jika bagian sebelum dievaluasi untuk sesuatu yang palsu (nol). Untuk n = 0, dan untuk n = 1,n>1
dievaluasi menjadiFalse
, yang diperlakukan sebagai nol dalam ekspresi numerik, dann<16
dievaluasi menjadiTrue
, yang diperlakukan sebagai satu dalam ekspresi numerik. Begitu4**(n>1)*(n<16)
juga 1.J, 19 byte
Kata kerja monadik mengambil angka di sebelah kanan dan meludahkan ukuran wadah. Ada beberapa cara yang setara untuk menulisnya sehingga saya memasukkan keduanya.
Dijelaskan oleh ledakan:
Apa yang keren adalah kita melihat dua cara berbeda untuk mengambil basis log 2 dalam J. Yang pertama adalah yang jelas
2^.
, yang merupakan logaritma numerik. Yang kedua adalah#@#:
, yang dapat dibaca sebagai "panjang representasi basis-2". Ini hampir setara dengan one-plus-floor-of-log-base-2, kecuali itu#:0
adalah daftar satu-elemen0
, yang persis seperti yang kita inginkan. Ini berdetak1+2<.@^.1&>.
8 byte.Digunakan di REPL:
Solusi 20 byte yang terlalu pintar.
sumber
Python,
535049 bytesumber
lambda n:[w for w in[1,4,8,16,32,64]if n<2**w][0]
lebih pendek satu byteMathematica,
443938 byteTerima kasih @orlp untuk 5 byte dan @MartinEnder untuk 1 byte.
Temukan elemen pertama dalam daftar
{1, 4, 8, 16, 32, 64}
sehingga angka 2 ^ lebih besar dari input.sumber
Pip , 19 byte
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES7), 35 byte
sumber
f=(n,b=1)=>2**b>n&&b-2?b:f(n,b*2)
harus sedikit lebih pendek.Mathematica,
464338 byteTerima kasih kepada JungHwan Min dan Martin Ender karena telah menghemat 3 byte! Terima kasih kepada ngenisis untuk penghematan 5 byte yang besar!
Fungsi tanpa nama mengambil integer non negatif sebagai input dan mengembalikan integer positif.
BitLength@#
menghitung jumlah bit dalam input, dan kemudian2^⌈Log2@...⌉
menghitung kekuatan terkecil 2 yang setidaknya sama besar dengan jumlah bit. Akhirnya,/.{2->4,0->1}
urus kasus khusus yang tidak ada "niblit" antara bit dan nybble, dan juga memperbaiki jawaban untuk input aneh0
.sumber
BitLength@#
bukan⌊1+Log2@#⌋
. Kemudian alih-alih mengganti∞
dengan1
Anda dapat mengganti0
, menyimpan 2 byte lain dan Anda terikat untuk yang pertama.BitLength
. Lihat jawaban sayaJulia, 40 byte
Ini adalah fungsi anonim yang menghasilkan array kekuatan 2 dari 0 hingga 6, tidak termasuk 2, dan memfilternya hanya untuk elemen-elemen x sedemikian rupa sehingga 2 x lebih besar dari input. Unsur seperti pertama adalah jawabannya. Sayangnya ini membutuhkan promosi 2 ke a
BigInt
untuk menghindari overflow pada x = 64.Ini sebenarnya sangat mirip dengan jawaban Python orlp, meskipun saya tidak melihatnya sebelum meramu pendekatan ini.
Cobalah online!
sumber
Perl 6 , 30 byte
+<
adalah operator bit shift kiri Perl 6, yang disebut banyak bahasa lain<<
.sumber
Haskell, 31 byte
Alt 32-byte:
sumber
Java, 143 byte.
sumber
return a<2?1:a<5?4:a<9?8:a<17?16:a<33?32:64;
Haskell, 43 byte
sumber
Ruby,
3936 byteTerima kasih GB untuk membantu golf
sumber
Java 8,
6555 byteIni adalah ekspresi lambda yang mengambil
long
dan mengembalikan sebuahint
. Tidak pernah bermain golf di Jawa sebelumnya, jadi ini seharusnya mudah dikalahkan:Cobalah online!
Untuk 47 byte , kita dapat memiliki:
Namun,
1L<<i
luapan untuk nilai pengembalian lebih besar dari 32, jadi ini gagal untuk testcase akhir.sumber
4
ketika diuji dengan16
ketika seharusnya mengembalikan 8. Juga Anda masih dapat golf solusi ini dengan menghapus tanda kurung sekitari<<=1+i%2;
karena tanpa{}
s, loop sementara hanya akan mengeksekusi baris berikutnyaMathematica, 30 byte
Penjelasan:
Membiarkan
N
menjadi himpunan bilangan bulat negatif. Tentukan dua fungsi aktifN
,BitLength
danNextPower
sebagai berikut:Solusi ini pada dasarnya menghitung
NextPower(BitLength(n))
diberi bilangan bulatn >= 0
. Karenan > 0
, kita bisa melihatnyaNextPower(n) = 2^BitLength(n-1)
, jadiNextPower(BitLength(n)) = 2^BitLength(BitLength(n)-1)
.Sekarang
BitLength
built-in Mathematica setuju dengan definisi yang saya berikann >= 0
. Untukn < 0
,BitLength[n] == BitLength[BitNot[n]] == BitLength[-1-n]
, jadiBitLength[-1] == BitLength[0] == 0
. Dengan demikian kami mendapatkan jawaban yang diinginkan1
untukn==0
.Karena kita lewati langsung dari bit ke nibble, kita harus mengganti jawaban
2
dengan4
.sumber
bash,
49 byte,48 byteatau
Simpan dalam skrip dan berikan nomor untuk diuji sebagai argumen.
Sunting: Diganti || dengan |, yang berfungsi karena argumen selalu 0 atau 1.
Catatan: Ini berfungsi untuk bilangan bulat hingga bilangan bulat positif terbesar yang dapat ditangani versi bash Anda. Jika saya punya waktu, saya akan memodifikasinya untuk bekerja hingga 2 ^ 64-1 dalam versi bash yang menggunakan aritmatika bertanda 32-bit.
Sementara itu, berikut ini adalah solusi 64-byte yang berfungsi untuk jumlah besar yang sewenang-wenang (dalam versi bash apa pun):
sumber
Ditumpuk,
3430 byteatau
Yang pertama mengambil input pada TOS dan meninggalkan output pada TOS; yang kedua adalah fungsi. Coba di sini!
Penjelasan
Berikut ini contohnya yang bekerja pada repl :
Uji kasus
Atau, sebagai program lengkap:
sumber
Racket 45 byte
Tidak Disatukan:
Versi lain:
dan menggunakan panjang string:
Pengujian:
Keluaran:
sumber
Oktaf,
40 36 3129 byteFungsi anonim sederhana. Diasumsikan bahwa nilai input adalah bilangan bulat - lihat peringatan di bagian akhir.
Kode kerjanya sebagai berikut:
Pertama array dari panjang bit yang diizinkan (1,4,8,16,32,64) dibuat dan disimpan
b
.Selanjutnya kita menemukan jumlah bit yang diperlukan untuk menyimpan nomor input
a
dengan membandingkan dengan ukuran maksimum setiap wadahb
untuk melihat mana yang cukup besar.Kami kemudian menggunakan vektor indeks yang dihasilkan untuk mengekstrak ukuran wadah dari
b
lagi.Akhirnya kita mengambil elemen pertama dalam array yang dihasilkan yang akan menjadi wadah sekecil mungkin.
Anda dapat mencobanya online di sini .
Cukup jalankan kode berikut, lalu lakukan
ans(x)
.Satu-satunya peringatan dengan ini adalah bahwa presisi ganda digunakan untuk konstanta secara default yang berarti bahwa itu hanya bekerja dengan angka hingga nilai tertinggi yang diwakili oleh pelampung presisi ganda yang kurang dari 2 ^ 64.
Ini dapat diperbaiki dengan memastikan bahwa angka yang dipasok ke fungsi adalah bilangan bulat bukan ganda. Hal ini dapat dicapai dengan memanggil fungsi misalnya dengan:
ans(uint64(x))
.sumber
PHP,
494644 byteJalankan seperti ini:
Penjelasan
Tweaks
$r=
tugas-R
agar$argn
tersediasumber
CJam , 18 byte
Cobalah online!
Penjelasan
sumber
C,
7152 bytesumber
(1<<15)+1
atau lebih merusak ini karena perilaku yang ditandatanganilong long
? Jenis yang Anda inginkan adalahuint64_t
yang mengharuskan#include <stdint.h>
yang masih kalah dibandingkanunsigned long long
! Header adalah kutukan bermain golf di c.unsigned long long
atauuint64_t
, tetapi karena tampaknya berfungsi dengan baik,long long
saya menggunakannya.QBIC , 27 byte
Penjelasan
sumber
Pyke, 13 byte
Coba di sini!
sumber
PHP, 43 byte
Jalankan dengan
echo <number> | php -R '<code>'
.loop
$i
hingga2**(2**$i)
lebih besar dari input. (Tweak:<<
bukannya**
menghilangkan parens)Setelah loop, $ i adalah salah satu yang terlalu tinggi; sehingga mendapat pengurangan sebelum menghitung output
- tetapi tidak untuk
$i==2
.sumber