Nomor Cullen adalah angka apa pun yang terkandung dalam urutan yang dihasilkan menggunakan rumus:
C (n) = (n * 2 ^ n) +1.
Tugas Anda:
Tulis program atau fungsi yang menerima input dan mengeluarkan nilai kebenaran / kepalsuan berdasarkan apakah input tersebut adalah Nomor Cullen.
Memasukkan:
Integer non-negatif antara 0 dan 10 ^ 9 (inklusif).
Keluaran:
Nilai kebenaran / kepalsuan yang menunjukkan apakah input adalah Nomor Cullen.
Kasus uji:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Mencetak:
Ini adalah kode-golf , sehingga skor terendah dalam byte menang.
code-golf
number
decision-problem
Gryphon - Pasang kembali Monica
sumber
sumber
n
tampaknya berbasis 0.Ḷ
atauR
di dalamnya :-)Jawaban:
Pyth,
65 bytecoba online
sumber
kode mesin x86_64 ( System V ABI ),
2827 byte-1 byte terima kasih kepada @Cody Grey, terima kasih!
Algoritma waktu-konstan!
Penjelasan:
Biarkan y bilangan bulat dan
x=y*2^y + 1
. Mengambil log, kita memilikiy + log2(y) = log2(x-1)
, sehinggay=log2(x-1)-log2(y)
. Memasukkan kembali nilai y, kita dapatkany=log2(x-1)-log2(log2(x-1)-log2(y))
. Melakukan satu kali ini lebih, kita memperoleh:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Mari kita hapus syarat terakhir (dari urutan
log2(log2(log2(log2(x))))
, ini harus aman!), Dan berasumsi bahwax-1≈x
, kita memperoleh:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Sekarang, membiarkan
f(n) = floor(log2(n))
, itu dapat diverifikasi secara manual yangy
dapat diambil dengan tepat oleh:,y=f(x)-f[f(x)-f(f(x))]
untuk y <26 , dan dengan demikian x ⩽ 10 ^ 9 , sebagaimana ditentukan oleh tantangan (1) .Algoritma kemudian hanya terdiri dari komputasi y diberikan x , dan verifikasi bahwa x == y * 2 ^ y + 1 . Kuncinya adalah bahwa
f(n)
hanya dapat diimplementasikan sebagaibsr
instruksi (bit-scan mundur), yang mengembalikan indeks 1-bit pertama dalam n , dany*2^y
sebagaiy << y
.Kode terperinci:
(1) Bahkan, kesetaraan ini tampaknya berlaku untuk nilai y hingga 50.000.
sumber
eax
akan memungkinkan Anda untuk menghilangkanmovzbl
, menghemat 1 byte. Anda harus melakukan XOR sebelumcmpl
hal itu tidak merusak bendera, tentu saja, tetapi itu sama sekali tidak masalah karena tidak ada yang tergantung setelahnyaeax
. Atau, Anda bisa saja memutuskan bahwa metode mengembalikan Boolean hanya dalam 8 bit yang lebih rendah, menghemat semua 3 byte!Jelly ,
76 byteCobalah online!
Mengambil input sebagai argumen baris perintah. Jika diberi nomor Cullen C ( n ), output n +1 (yang benar dalam Jelly, menjadi bilangan nol, perhatikan bahwa kita memiliki n ≥0 karena inputnya bilangan bulat, dan angka Cullen dengan negatif n tidak pernah bilangan bulat) . Jika diberi nomor non-Cullen, mengembalikan 0, yang merupakan falsey di Jelly.
Penjelasan
Pada dasarnya, bentuk array angka Cullen minus satu, lalu cari input minus satu di dalamnya. Jika input adalah nomor Cullen, kami akan menemukannya, jika tidak kami tidak akan. Perhatikan bahwa array cukup panjang untuk mencapai input, karena C ( n ) selalu lebih besar dari n .
sumber
JavaScript (ES6),
3735 byteDisimpan 2 byte berkat Neil
Demo
Tampilkan cuplikan kode
sumber
x<n?f(n,k+1):x==n
bekerja?undefined+1===NaN
tapi-~undefined===1
. Anda dapat membaca lebih lanjut tentang ini di sini .Haskell, 28 byte
Cobalah online!
sumber
Ohm , 8 byte
Cobalah online!
sumber
PHP , 43 byte
Cobalah online!
sumber
$argn
variabel khusus? Mengubahnya menjadi$a
akan menghemat 6 byte: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/…$argn
tersedia jika Anda menjalankan PHP dari baris perintah dengan-R
opsi05AB1E , 7 byte
Cobalah online!
Penjelasan:
sumber
R ,
535146 byteFungsi anonim. Cek apakah
x
dihasilkan dalam urutan C (n) untuk n dalam [0, x].3 byte golf oleh Giuseppe.
Cobalah online!
sumber
x%in%...
sebagai gantiany(x==...)
; itu akan menjatuhkan Anda 4 bytelapply
hanya memeriksa vektor, dan menggunakanscan
alih-alih mengambil argumen fungsi - saya mendapatkan jawaban @giuseppe. Terima kasih telah mempostingnya secara terpisah sehingga saya dapat melihat apa yang saya lewatkan - saya belajar lebih banyak dengan mencoba sesuatu sendiri, meskipun saya biasanya kalah.C, C ++, Java, C #, D: 70 byte
Karena kesamaan antara semua bahasa ini, kode ini berfungsi untuk masing-masing
sumber
i=30;i--;)if(i<<i==n-1)
alih-alihi=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 byte
Cobalah online!
sumber
Python 2 , 36 byte
Cobalah online!
Output dengan tidak menabrak / menabrak, seperti yang saat ini diizinkan oleh konsensus meta ini .
Python 2 , 42 byte
Cobalah online!
Keluaran melalui kode keluar
sumber
R , 26 byte
Cobalah online!
Pendekatan yang sedikit berbeda dari jawaban R lainnya ; membaca dari
stdin
dan karena input dijamin antara 0 dan 10 ^ 9, kita hanya perlu memeriksan
antara 0 dan 26.sumber
scan()
. Kerja bagus.APL (Dyalog) , 9 byte
Untuk menutupi kasus n = 1, diperlukan
⎕IO←0
yang default pada banyak sistem.Cobalah online!
⊢
adalah n (argumen)∊
anggota dari1
satu+
plus⍳
yang saya ntegers 0 ... ( n -1)×
waktu2
dua*
untuk kekuatan⍳
yang saya ntegers 0 ... ( n -1)sumber
⎕IO←0
non-standar, karena banyak memang selalu menetapkan seperti itu, tanpa spesifikasi yang diperlukan setiap kali.⎕IO←0
,.Python 2 , 32 byte
Cobalah online!
Buat daftar nomor Cullen hingga
10^9
, lalu hitung berapa kali input muncul di dalamnya. Terima kasih kepada Vincent karena menunjukkann<<n|1
alih-alih(n<<n)+1
, menghemat 2 byte.sumber
n<<n|1
(n<<n
sedang genap);)838860801
. Anda perlurange(26)
, karena jangkauannya tidak termasuk.D, 65 byte
Ini adalah port algoritme @ HatsuPointerKun ke D (kode aslinya sudah D, tapi ini dengan trik khusus-D)
Bagaimana? (Trik spesifik D)
Sistem template D lebih pendek dari C ++, dan dapat menyimpulkan tipe. Dan D juga menginisialisasi variabel-variabelnya ke default setelah deklarasi.
sumber
Mathematica, 30 byte
Fungsi murni mengambil integer non negatif sebagai input dan return
True
atauFalse
. Jika inputnya adalahn
, maka(r=Range@#-1)
tetapkan variabel yangr
akan{0, 1, ..., n-1}
, dan kemudian secarar2^r+1
hitung menghitungn
angka Cullen pertama .MemberQ[...,#]
kemudian periksa apakahn
merupakan elemen dari daftar.sumber
Mathematica, 32 byte
sumber
Excel VBA, 45 Bytes
Fungsi jendela langsung VBE anonim yang mengambil input dari sel
[A1]
dan ouput ke jendela langsung VBEHarus dijalankan dalam modul bersih atau memiliki nilai untuk i, j disetel ulang ke nilai default 0 di antara proses
Input output
I / O seperti yang terlihat di jendela langsung VBE
sumber
Swi-Prolog, 69 byte
f(X)
berhasil jika dapat menemukan nilai I di mana X = I * 2 ^ I + 1. Petunjuk rentang menghentikannya kehabisan ruang tumpukan, tapi itu cukup untuk rentang angka Cullen hingga 10 ^ 9 dalam spesifikasi pertanyaan.misalnya
sumber
cQuents , 9 byte
Cobalah online!
Penjelasan
sumber
TI-BASIC, 17 byte
Penjelasan
sumber
QBIC , 24 byte
Penjelasan
sumber
k, 19 bytes
Try it online. Truthy is an array with a number in it:
,3
or,0
et cetera. Falsey is an empty array:()
or!0
depending on your interpreter.sumber
Java (OpenJDK 8), 56 bytes
Try it online!
sumber
Pari/GP, 25 bytes
Try it online!
sumber