Kadang-kadang, ketika menulis sebuah program, Anda perlu menggunakan bilangan prima karena alasan tertentu (misalnya kriptografi). Saya berasumsi bahwa kadang-kadang, Anda perlu menggunakan nomor komposit juga. Terkadang, setidaknya di sini di PPCG, program Anda harus dapat menangani perubahan yang sewenang-wenang. Dan dalam keadaan yang dibuat dengan mudah untuk membuat pertanyaan PPCG yang menarik, mungkin bahkan angka yang Anda gunakan harus tahan terhadap korupsi ...
Definisi
Bilangan komposit adalah bilangan bulat ≥ 4 yang bukan bilangan prima, yaitu bilangan bulat yang lebih besar dari 1. Bilangan komposit tahan bitflip didefinisikan sebagai berikut: bilangan bulat positif komposit, yang jika Anda menulisnya dalam biner dalam jumlah bit minimum yang mungkin, Anda dapat mengubah satu atau dua bit dari angka tersebut, dan jumlahnya masih berupa gabungan.
Contoh
Sebagai contoh, perhatikan angka 84. Dalam biner, itu 1010100
. Berikut adalah semua angka yang berbeda tidak lebih dari 2 bit dari itu:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
Kolom pertama adalah angka dalam biner; kolom kedua adalah angka dalam desimal. Seperti yang ditunjukkan kolom ketiga, semua angka ini adalah gabungan. Dengan demikian, 84 adalah nomor komposit tahan-bitflip.
Tugas
Anda harus menulis salah satu dari tiga program atau fungsi berikut, yang mana yang paling masuk akal untuk bahasa Anda:
- Suatu program atau fungsi yang mengambil bilangan bulat n negatif sebagai input, dan mengeluarkan bilangan komposit n bitflip-tahan pertama.
- Sebuah program atau fungsi yang mengambil bilangan bulat positif n sebagai input, dan output semua nomor komposit bitflip tahan kurang dari n (atau jika Anda suka, kurang dari atau sama dengan n , yaitu Anda dapat memilih apakah n termasuk dalam output jika bitflip -tahan).
- Program atau fungsi yang tidak mengambil input, dan mengeluarkan semua nomor komposit yang tahan-bitflip. (Ini harus menggunakan mekanisme output yang mampu menghasilkan output saat program masih berjalan, seperti mencetak ke stdout, daftar malas, atau generator; Anda tidak bisa hanya menghitung seluruh daftar dan kemudian mencetaknya.)
Uji kasus
Berikut adalah beberapa angka komposit tahan-bitflip pertama:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Klarifikasi
- Hanya angka yang Anda hasilkan yang harus tahan terhadap bitflips. Ini bukan tugas membuat program yang tahan terhadap bitflips; gunakan angka apa pun dalam program itu sendiri yang Anda sukai.
- Angka yang Anda hasilkan tidak harus tahan terhadap bitflip di "nol terkemuka"; bayangkan bahwa jumlahnya akan disimpan dalam jumlah bit minimum yang mungkin, dan hanya bit-bit itu yang harus kebal terhadap flipping. Namun, 1 bit awal pada angka yang Anda hasilkan harus kebal terhadap bitflips.
- Gunakan algoritma apa pun yang Anda suka yang menghasilkan hasil yang tepat; Anda tidak ditandai dengan efisiensi di sini.
- Jika Anda dapat membuktikan bahwa ada banyak angka komposit tahan-bitflip, maka a) pembatasan format output dicabut, dan b) pengodean daftar akan diizinkan (walaupun mungkin lebih bertele-tele daripada hanya menghitungnya). Aturan ini sebagian besar hanya untuk kelengkapan; Saya tidak berharap itu relevan.
Kondisi kemenangan
Ini kode-golf , jadi seperti biasa, lebih pendek lebih baik. Juga seperti biasa, panjang program akan diukur dalam byte.
n
jikan
tahan bitflip? (yaitu membuatnya "kurang dari atau sama dengan n"?)Jawaban:
Jelly , 20? 22 byte
Cobalah online!
Menghasilkan angka pertama n tersebut .
Mungkin
;0
dapat dihapus (tanpanya kita tidak memeriksa apakah nomor itu sendiri komposit - apakah ada bilangan prima dengan semua bit-flips komposit?)Perhatikan bahwa tidak cukup untuk melakukan tes
not(any(is prime))
ke set angka bit-membalik. Kita juga harus menguji yang0
tidak di set.Ini karena
0
tidak prima dan bukan komposit (1
juga, tapi lihat di bawah).Kebutuhan untuk memeriksa
0
dapat dilihat oleh contoh tandingan:131136
( 2 17 +2 6 ) memiliki set bit-flip berikut:Semuanya, kecuali
0
komposit, namun0
tidak prima.1
juga non-prime dan non-komposit dan bisa muncul di set. Namun kita dapat, jika kita mau, membiarkan ini seolah-olah itu adalah gabungan:semua input kurang dari atau sama dengan
3
(jika dianggap sama sekali) mengandung0
pula (sebenarnya semua kurang dari yang7
dilakukan).untuk mencapai
1
dalam satu bit flip nomor aslinya harus dalam bentuk 2 k +2 0 , dan jika ini lebih besar dari3
, yaitu k> 1 , maka kita dapat mencapai3
dengan membalik k- bit dan mengatur 1- bit ( 2 1 +2 0 = 3 ).untuk mencapai
1
dalam dua bit membalik angka asli harus dalam bentuk 2 k dan jika ini lebih besar dari yang3
bisa kita raih2
dalam dua flip, dan2
merupakan bilangan prima.Seperti berdiri kode menangani keduanya
0
dan1
bersama - sama menggunakan "tidak signifikan" atomỊ
,.Bagaimana?
sumber
;0
ada -Œċ
dapatkan semua pasangan unordered dengan penggantian indeks (J
), jadi untuk 84, yang memiliki 7 bit itu 28 (termasuk suka [1,1] untuk bit-flips tunggal (dari bagian "dengan penggantian"), bukan 29 (ditambah tanpa perubahan)Brachylog ,
3238 byteCobalah online!
Ini adalah fungsi / predikat
↰₀
yang mengembalikan generator yang menghasilkan semua angka tersebut. (TIO link hanya mencetak angka pertama, sehingga sesuatu dapat diamati. Menjalankannya secara lokal telah menghasilkan lebih banyak.)Sekarang diperbarui untuk menangani angka yang berada dalam dua bit dari 0 atau 1 (yang tidak prima atau komposit) dengan benar.
Penjelasan
Predikat helper
↰₂
(mengembalikan daftar yang sama dengan input, kecuali mungkin satu elemen)Saya akan senang jika ada cara terser untuk melakukan rekursi yang relatif sederhana ini, tapi saya belum yakin; ada beberapa fitur yang tampak menjanjikan dalam spesifikasi, tetapi ditandai sebagai tidak diterapkan.
Program utama
↰₀
sumber
JavaScript (ES6), 96 byte
Program lengkap yang meminta jumlah bilangan bulat yang cocok dan menampilkannya satu per satu, menggunakan
alert()
.Kecuali jika browser Anda diatur untuk menggunakan Tail Call Optimization, ini pada akhirnya akan rusak karena limpahan rekursi.
Di bawah ini adalah versi non-rekursif (102 byte).
Anggapan
Algoritma ini bergantung pada asumsi bahwa semua angka komposit yang tahan bitflip adalah genap. Ini mengarah ke penyederhanaan yang agak penting: alih-alih membalik setiap pasangan bit yang mungkin, kami hanya membalik bit # 0 dan yang lainnya (atau tidak ada bit sama sekali) dan memeriksa bahwa semua angka yang dihasilkan adalah komposit.
Namun, saya tidak dapat menemukan bukti yang jelas bahwa nomor komposit tahan bitflip aneh tidak benar-benar ada. Kebetulan tidak pernah terjadi untuk jumlah kecil (saya memeriksa hingga 1.000.000), dan sepertinya probabilitas menemukan satu menurun karena jumlah bit meningkat (tetapi ini pada dasarnya hanya intuisi saya tentang hal itu).
sumber
Jelly ,
2017 byteCobalah online!
Bagaimana itu bekerja
sumber
Python 2, 113 byte
(Baris kedua adalah fungsi tanpa nama yang mengembalikan daftar semua angka komposit tahan-bitflip yang kurang dari input ke fungsi.)
Sintaks
all(u%q for q in range(2,u))
akan mengevaluasiTrue
kapan punu
prima atau kurang dari atau sama dengan2
, dan sebaliknya akan dievaluasiFalse
. (KosongTrue
jikau
kurang dari atau sama dengan2
.)Dengan kata lain,
all(u%q for q in range(2,u))
sama dengan0
if dan only ifu
is composite.Jika input fungsi kurang dari
2
, maka fungsi mengembalikan daftar kosong (seperti yang diinginkan). Jadi asumsikan inputN
paling tidak2
, dan anggaplah1 <= n < N
. Untuk masing-masingk
dari0
hinggan
(termasuk), kode akan memeriksa apakahn
XOR dengank
komposit, dan juga memeriksa apakahk
memiliki paling tidak dua1
dalam representasi binernya. Jikan^k
komposit, atau jikak
memiliki lebih dari dua1
, maka itu bergerak ke nilai berikutnyak
. Jika melewati semua nilaik
dari0
melaluin
cara ini, maka itu termasukn
dalam daftar.Di sisi lain, jika ada nilai
k
dengan paling banyak dua1
sehinggan^k
tidak komposit, makan
tidak termasuk dalam daftar.sumber
Perl 6 ,
8785 byteMengembalikan semua angka yang lebih kecil atau sama dengan angka input.
Bagaimana itu bekerja
Untuk setiap angka n dari 2 hingga input, ia melakukan yang berikut:
Menghasilkan semua bilangan bulat non-negatif yang memiliki panjang bit yang sama atau lebih pendek dari n .
Memfilter angka dari daftar ini yang memiliki kurang dari tiga bit yang ditetapkan (menggunakan regex).
XOR n dengan masing-masing angka itu, menghasilkan semua "mutasi" yang valid dari n .
Hanya membiarkan n menjadi bagian dari daftar output jika tidak ada mutasi yang non-komposit (diperiksa dengan mengambil masing-masing mutasi x modulo semua-Persilangan angka antara 2 dan x -1).
sumber
Mathematica, 115 byte
14 byte disimpan berkat @MartinEnderSangat tidak efisien karena menghasilkan semua angka hingga 2 ^ ceil (lg (n)).
Kode kedua menggunakan U + F4A1 (
Function
fungsi)sumber
Floroid ,
95109 byteMengembalikan daftar nomor yang tahan bitflip hingga
input - 1
. Menangani situasi tegang (0 dan 1) juga.Floroid adalah bahasa lama saya, yang hanya saya gunakan beberapa kali. Belum menyentuhnya untuk waktu yang lama, maka ukuran program.
Diterjemahkan ke kode Python berikut, yang saya pikir dapat dikurangi dengan rekursi.
Setiap fungsi yang digunakan di sini sudah ditentukan sebelumnya dalam Floroid. Halaman ini berisi semua fungsi dan definisinya.
sumber
MATL ,
30282726 byteCobalah online!
Menghasilkan semua angka komposit tahan-bitflip hingga (dan termasuk) n. Menggunakan gagasan dari kedua solusi Jelly - hanya menganggap 0 sebagai masalah non-prima; dan menghasilkan daftar angka dalam jarak 2 terlebih dahulu, kemudian mengambil xor.
Solusi alternatif, dengan mengulang (30 byte):
Menghasilkan semua angka komposit tahan-bitflip hingga (dan termasuk) n.
sumber
CJam ,
3433 byteHitung semua komposit yang tahan bitflip secara ketat kurang dari n .
Seperti Jonathan Allan, saya tidak yakin apakah itu benar-benar perlu untuk memeriksa 0 bitflips. Jika ternyata tidak ada bilangan prima yang memiliki semua bitflipsnya menghasilkan bilangan komposit, maka
0+
dapat dihilangkan.Cobalah online!
Penjelasan
sumber
MATL , 29 byte
Terima kasih kepada Jonathan Allan untuk koreksi.
Ini membutuhkan angka n dan menghasilkan semua angka komposit tahan-bitflip hingga n .
Bagaimana itu bekerja
Cobalah di MATL Online!
sumber