Pernyataan masalah
Diberikan satu set bilangan prima unik dan berurutan (tidak harus termasuk 2), hasilkan semua kombinasi kekuatan pertama bilangan prima ini - mis., Tidak ada pengulangan - dan juga 1. Sebagai contoh, diberikan himpunan {2, 3, 5, 7}, Anda menghasilkan {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210} karena:
1 = 1
2 = 2
3 = 3
5 = 5
6 = 2 x 3
7 = 7
10 = 2 x 5
14 = 2 x 7
15 = 3 x 5
21 = 3 x 7
30 = 2 x 3 x 5
35 = 5 x 7
42 = 2 x 3 x 7
70 = 2 x 5 x 7
105 = 3 x 5 x 7
210 = 2 x 3 x 5 x 7
Perhatikan bahwa jika kardinalitas set input Anda adalah k, ini akan memberi Anda 2 ^ k anggota dalam set output Anda.
Aturan / Ketentuan
- Anda dapat menggunakan bahasa apa pun. Bertujuan untuk penghitungan karakter terkecil dari kode sumber.
- Solusi Anda harus berupa program lengkap atau fungsi lengkap. Fungsi ini bisa anonim (jika bahasa Anda mendukung fungsi anonim).
- Solusi Anda harus dapat mendukung produk hingga setidaknya 2 ^ 31. Jangan khawatir tentang mendeteksi atau menangani bilangan bulat bilangan bulat jika Anda melewati angka yang produknya terlalu bagus untuk diwakili. Namun, sebutkan batas perhitungan Anda.
- Anda dapat menerima daftar atau set dan menghasilkan daftar atau set. Anda dapat mengasumsikan input diurutkan tetapi Anda tidak diharuskan untuk menghasilkan output yang diurutkan.
Latar Belakang
Kapan atau mengapa ini bermanfaat? Satu tempat yang sangat berguna adalah membuat tabel pengali untuk berpacu secara paralel dalam algoritma bilangan bulat yang dikenal sebagai Faktor Bentuk Square.. Di sana, setiap pengganda ganjil yang Anda coba mengurangi kemungkinan gagal algoritma (untuk menemukan faktor) sekitar 50% pada semiprimes keras. Jadi dengan himpunan bilangan prima {3, 5, 7, 11}, yang menghasilkan satu set pengganda uji coba 16 untuk berpacu secara paralel, algoritma gagal sekitar 2 ^ –16 waktu pada hard semiprimes. Menambahkan 13 ke daftar bilangan prima menghasilkan satu set 32 pengganda percobaan, mengurangi kemungkinan kegagalan menjadi sekitar 2 ^ –32, memberikan peningkatan hasil yang drastis tanpa biaya komputasi tambahan (karena bahkan dengan pengganda dua kali lebih banyak yang berpacu secara paralel, di rata-rata masih menemukan jawaban dalam jumlah langkah yang sama).
sumber
1 0
bash --version
CJam, 13 byte
Membaca array (mis.,
[2 3 5 7]
) Dari STDIN. Cobalah online.Fungsi anonim akan memiliki jumlah byte yang sama:
Contoh dijalankan
Bagaimana itu bekerja
sumber
Haskell, 22
solusinya adalah fungsi anonim:
contoh penggunaan:
Penjelasan:
(:[1])
adalah fungsi yang diberi nomorx
mengembalikan daftar[x,1]
.mapM(:[1])
adalah fungsi yang diberi daftar angka memetakan fungsi(:[1])
di atasnya, dan mengembalikan setiap cara yang mungkin untuk memilih elemen dari setiap daftar. misalnya,mapM(:[1]) $ [3,4]
pertama memetakan fungsi untuk mendapatkan[[3,1] , [4,1]]
. maka pilihan yang mungkin adalah[3,4]
(memilih nomor pertama dari keduanya)[3,1]
[1,4]
dan[1,1]
mengembalikannya[[3,4],[3,1],[1,4],[1,1]]
.kemudian
map product
memetakan semua pilihan dan mengembalikan produk mereka, yang merupakan output yang diinginkan.fungsi ini polimorfik dalam artinya jenisnya yang dapat beroperasi pada semua jenis angka. Anda dapat memasukkannya daftar
Int
dan hasilnya akan menjadi daftarInt
tetapi juga dapat diterapkan pada daftar jenisInteger
dan mengembalikan daftarInteger
. ini berarti bahwa perilaku overflow tidak ditentukan oleh fungsi ini tetapi oleh tipe input (sistem tipe ekspresif yay Haskell :))sumber
Integer
, yang merupakan tipe integer tak terbatas. Ada jugaInt
, integer 32-bit, tapi itu kebanyakan hanya warisan.Mathematica,
1817 byteItu fungsi anonim. Sebut saja seperti
sumber
×@@@𝒫@#
harus tak terkalahkan.(*/@#~2#:@i.@^#)
16 karakter dalam J;)Pembaruan: C (fungsi f), 92
Bahkan sebagai fungsi, ini masih merupakan entri terpanjang di sini. Ini adalah pertama kalinya saya melewatkan array dengan panjang yang tidak diketahui sebagai argumen fungsi di C, dan tampaknya tidak ada cara bagi fungsi C untuk mengetahui panjang array yang diteruskan ke sana, karena argumen dilewatkan sebagai pointer ( terlepas dari sintaks yang digunakan). Oleh karena itu argumen kedua diperlukan untuk menunjukkan panjangnya.
Saya menyimpan output ke stdout, karena mengatur array integer dan mengembalikannya hampir pasti akan lebih lama.
Terima kasih kepada Dennis untuk tipsnya.
Lihat fungsi
f
(92 karakter tidak termasuk spasi yang tidak perlu) dalam program pengujian di bawah ini.Keluaran melalui printf
Keluaran melalui pointer array
C (program), 108
tidak termasuk spasi yang tidak perlu.
Input dari commandline, output ke stdout. C tidak akan menang di sini, tapi mungkin saya akan mencoba mengonversi fungsi besok.
Pada dasarnya kami mengulangi semua
1<<c
kombinasi bilangan prima, dengan setiap biti/c
dikaitkan dengan ada atau tidak adanya bilangan prima tertentu dalam produk. "Loop dalam"i%c
berjalan melalui bilangan prima, mengalikannya dengan nilaii/c.
Wheni%c
mencapai 0, produk adalah output, kemudian diatur ke 1 untuk iterasi "luar" berikutnya.anehnya,
printf("%d ",p,p=1)
tidak bekerja (selalu mencetak 1.) Ini bukan pertama kalinya saya melihat perilaku aneh ketika suatu nilai digunakan dalamprintf
dan ditetapkan kemudian di braket yang sama. Dalam hal ini dimungkinkan bahwa koma kedua tidak diperlakukan sebagai pemisah argumen, melainkan sebagai operator.Pemakaian
sumber
-Wsequence-point
atau-Wall
, GCC akan mengeluh.c-=1
kec--
atau bahkan menggunakani=--c<<c
jika Anda tidak keberatan UB (tampaknya bekerja dengan GCC). 2. Kedua penggunaan||
dapat diganti dengan operator ternary:p=i%c?p:!!printf("%d ",p)
danp*=(i/c>>i%c)&1?1:atoi(v[i%c+1])
c-=1
adalah golf dasar yang seharusnya saya tidak melewatkannya, tapi itu adalah perbaikan bug cepat karena saya lupa bahwa ada satu string tambahan di argv (nama program.)i=..c<<c
bekerja pada GCC / cygwin, tetapi saya telah meninggalkan yang asli program apa adanya dan beralih ke suatu fungsi. Jadi saya baru saja belajar bahwasizeof
tidak berfungsi pada array yang dilewatkan sebagai argumen fungsi. Saya telah memasukkan saran Anda untuk operator ternary ke dalam fungsi. Saya terjebak dengan keluaran ke stdout karena saya tidak melihat cara singkat untuk mengembalikan array.Haskell, 27 byte
Ini adalah implementasi Haskell dari jawaban CJam @ sudo sebagai fungsi anonim. Ini tidak akan mengalahkan solusi Haskell yang luar biasa dari haskeller @proud, tetapi saya akan tetap menyimpannya di sini.
Penjelasan:
foldr
mengambil fungsi biner, nilai, dan daftar. Kemudian menggantikan setiap sel kontra dalam daftar dengan aplikasi fungsi, dan akhir daftar dengan nilai, seperti ini:foldr f v [a,b,c] == f a (f b (f c v))
. Nilai kami adalah daftar satu elemen yang berisi1
, dan fungsi binernya adalahf = (=<<)(++).map.(*)
. Sekarang,f
mengambil nomorn
, membuat fungsi(n*)
yang mengalikan olehn
, membuat dari itu fungsig = map(n*)
yang berlaku berfungsi untuk semua elemen daftar, dan feed yang berfungsi untuk(=<<)(++)
. Di sini,(++)
adalah fungsi rangkuman, dan(=<<)
merupakan ikatan monadik , yang dalam hal ini menerima(++)
dang
, dan memberikan fungsi yang mengambil dalam daftar, berlakug
untuk salinannya, dan menggabungkan keduanya.Singkatnya: mulai dengan
[1]
, dan untuk setiap nomorn
dalam daftar input, ambil salinan daftar saat ini, gandakan semuanya dengann
, dan tambahkan ke daftar saat ini.sumber
Python: 55 karakter
Secara rekursif menghasilkan produk dengan memilih untuk memasukkan atau mengecualikan setiap nomor secara bergantian.
sumber
and
jika Anda menulis jumlah sebaliknya?PARI / GP , 26 byte
Versi yang lebih panjang termasuk
(30 byte) dan
(31 byte).
Perhatikan bahwa jika inputnya adalah matriks faktorisasi dan bukannya set, 18 byte dapat disimpan menggunakan
divisors
sendiri. Tetapi mengubah satu set ke matriks faktorisasi tampaknya membutuhkan lebih dari 18 byte. (Saya bisa melakukannya dalam 39 byte langsung sebagaiv->concat(Mat(v~),Mat(vectorv(#v,i,1)))
atau 24 byte dengan mengalikan dan re-factoringv->factor(factorback(v))
, adakah yang bisa melakukan lebih baik?)sumber
Sage -
3634Intinya, sama dengan solusi Martin Büttner , jika saya memahaminya dengan benar. Seperti yang saya sebutkan di komentar, saya mungkin mengirimnya sebagai jawaban.
Ini adalah fungsi anonim, yang misalnya bisa disebut sebagai berikut:
sumber
J (20)
Ini ternyata lebih lama dari yang saya harapkan atau harapkan. Masih: lebih pendek dari haskel!
Pemakaian:
Ini berfungsi untuk semua rangkaian angka, bukan hanya bilangan prima. Juga, bilangan prima dapat berukuran tidak terbatas, selama array memiliki postfix
x
:2 3 5 7x
sumber
*/@#~2#:@i.@^#
adalah alternatif untuk 14 byte.05AB1E , 2 byte
Cobalah online!
Penjelasan
sumber
R, 56 byte
Saya mempertimbangkan di sini bahwa s adalah himpunan (dan daftar). Saya yakin itu bisa dibuat lebih pendek. Saya akan melihat.
sumber
PHP, 97 Bytes
sumber