Hal yang perlu diketahui:
Pertama, angka keberuntungan.
Angka keberuntungan dihasilkan seperti ini:
Ambil semua bilangan asli:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Kemudian, hapus setiap angka kedua.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Sekarang 3
aman.
Hapus setiap nomor ke-3:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Sekarang 7
aman.
Hapus setiap nomor 7.
Lanjutkan, dan hapus setiap n
nomor, di mana n
nomor aman pertama setelah eliminasi.
Daftar akhir nomor aman adalah angka keberuntungan.
Angka-angka sial terdiri dari daftar angka yang terpisah, yaitu [U1, U2, U3... Un]
.
U1
adalah set angka pertama yang dihapus dari "kandidat" yang beruntung, jadi mereka adalah:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
adalah set angka kedua yang dihapus:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
Dan seterusnya dan seterusnya ( U3
adalah daftar ketiga, U4
adalah yang keempat, dll.)
Tantangan:
Tugas Anda adalah, ketika diberi dua input m
dan n
, menghasilkan m
nomor ke-10 dalam daftar Un
.
Contoh input dan output:
(5, 2) -> 29
(10, 1) -> 20
Spesifikasi:
- Program Anda harus bekerja
m
hingga1e6
, dann
hingga100
.- Anda dijamin keduanya
m
dann
bilangan bulat positif. - Jika Anda penasaran,
U(1e6, 100)
=5,333,213,163
. (Terima kasih @pacholik!)
- Anda dijamin keduanya
- Program Anda harus menghitungnya dalam 1 hari di komputer modern yang masuk akal.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
PS: Alangkah baiknya jika seseorang membuat formula umum untuk menghasilkan ini. Jika Anda memiliki formula, harap cantumkan jawaban Anda!
(1e6,1e6)
?n=1
kasus ini? Karena ini spesial - untuk semua kasus lainnya, indeks berbasis 0 dari angka keberuntungan berikutnya adalahn-1
.Jawaban:
CJam , 74 byte
Cobalah online! Akan time out untuk kasus yang lebih besar, lebih banyak pada batasan waktu di bawah ini.
Penjelasan:
Program kami tanpa malu-malu meminjam kode aditsu untuk menghasilkan daftar angka keberuntungan N , mengganti angka 1 dengan angka 2 memberikan kenaikan pada setiap fase ayakan. Kode yang tersisa berkurang pada setiap elemen hingga nol ditemukan (dengan mengiris dan menambahkan ekor yang tidak dikurangi) dan secara efektif menghitung langkah-langkah di setiap fase N dari ayakan sekaligus.
Pengaturan waktu:
Jika Anda benar-benar harus menjalankan program di browser untuk angka yang lebih besar, Anda dapat menggunakan penerjemah ini dan membiarkan skrip untuk melanjutkan jika diminta, tetapi ini mungkin terlalu lambat untuk memenuhi syarat. Menggunakan ( M , N ) = (100.100) membutuhkan ~ 247s. Iterasi program relatif linier dalam hal M , sehingga komputasi (1e6.100) bisa memakan waktu ~ 29 hari.
Menggunakan penerjemah shell pada PC program menghitung (100.100) dalam ~ 6s dan menghitung (1e4.100) dalam ~ 463s. Program harus dapat menghitung (1e6.100) dalam ~ 13-17hrs. Dalam hal ini saya akan menganggap program memenuhi syarat.
Catatan semua waktu dikumpulkan dalam pengukuran dan perhitungan.
sumber
Perl,
87858281 byteTermasuk +4 untuk
-pX
Berikan input pada STDIN sebagai satu baris dengan n pertama (perhatikan ini adalah kebalikan dari urutan yang disarankan dalam tantangan). Jadi untuk menghitung
U(1000000, 100)
:Algoritma berdasarkan jawaban angka keberuntungan dari aditsu . Kompleksitas waktunya sangat cepat untuk rentang yang diperlukan. The kasus memberikan dalam 0,7 detik. Karena perl perl dengan rekursi berbasis itu menggunakan banyak memori. Menulis ulang sebagai fungsi akan membuat penggunaan memori tetapi jumlah byte lebih lama
O(n^2)
100, 1000000
5333213163
do$0
O(n)
unlucky.pl
:Ini berfungsi seperti yang ditunjukkan, tetapi gunakan literal
^S
untuk mendapatkan skor yang diklaim.Saya tidak mengetahui adanya penggunaan sebelumnya
$^S
dalam perlgolf.sumber
(1e6,100)
?do$0
olehnya pada dasarnya tidak dapat dijangkau pada komputer yang realistis. Tetapi jika itu banyak memori ada sekitar 2 tahun. Saya belum benar-benar menulis dan menguji versi normal subrutin, tetapi saya berharap itu akan selesai dalam beberapa bulan dan berjalan bahkan pada komputer dengan memori yang sangat sedikit. Jadi ada baiknya nilai-nilai ini tidak dalam kisaran yang diperlukan untuk tantangan ini.(1e6,100)
dalam sehari? Apa maksud Anda nilai-nilai ini tidak diperlukan?n
danm
diberikan dalam urutan terbalik. The100 1000000
masukan menghitungU(1000000, 100)
dan memberikan5,333,213,163
dalam 0,7 detik. Ini adalah program tercepat dari yang saat ini diposting(100,1e6)
akan jauh lebih cepat daripada(1e6,100)
, dan berpikir ini adalah penjelasan untuk secepat kilat 0,7 detik!Python 3, 170
Fungsi L menghasilkan deretan kemungkinan angka keberuntungan (jika k adalah Benar) atau Un (jika Salah). Dievaluasi dengan malas (jadi saya tidak perlu membuat n-1 daftar tanpa batas jika saya ingin Un ).
Jalankan fungsi U .
Kecepatan
U (1.000.000; 100) membutuhkan waktu sekitar 1 jam 45 menit untuk berjalan di mesin saya dengan PyPy. Saya curiga sekitar empat jam dengan CPython. (Ya, tepatnya 4 jam 20 menit.)
Jika saya menggunakan daftar alih-alih generator, saya mungkin mendapatkan beberapa kecepatan, tetapi saya akan membutuhkan daftar ukuran yang lebih besar daripada yang diizinkan oleh Python. Dan jika itu terjadi, itu akan membutuhkan puluhan gigabyte RAM.
Ya, dan U (1.000.000; 100) = 5.333.213.163 .
sumber
Haskell
Tidak dapat menghitung untuk n = 1:
175160 byteSaat dikompilasi, dibutuhkan komputer saya 2jam 35m untuk menghitung input
(1000000,100)
penggunaan ini:Saya mencoba membersihkan
where
modul, tetapi tampaknya mempengaruhi kecepatan dan saya tidak yakin mengapa ... Tapi saya pikir ada lebih banyak pemangkasan yang harus dilakukan di sini.Metode yang digunakan adalah
m?n
untuk menanyakan jawaban yang diberikanm
dann
.Tidak disatukan
Saya rasa mungkin untuk menggabungkan fungsi 'skipeverynth' dan 'everynth' menjadi fungsi tunggal yang mengembalikan pasangan.
Saya menggunakan kode orang baik ini untuk melewatkan setiap elemen ke-n. Saya melakukannya sendiri beberapa kali, tetapi selalu jauh lebih tidak efisien dan saya tidak tahu mengapa.
Mampu menghitung semua n: 170 byte
Ini pada dasarnya sama, tetapi beberapa
max
fungsi harus dilemparkan untuk menangani kasus khususn=1
.sumber
R 82 byte
Pemakaian
Ini harus memiliki vektor yang cukup besar untuk memulai sehingga ada cukup angka untuk mengembalikan nilai. Vektor yang dibuat sudah sekitar 800Mb dan fungsinya dapat menangani hingga m = 1e4 dan n = 100 sehingga masih jauh dari tujuan.
Untuk membuat vektor yang cukup besar untuk menghitung f (1e6.100) akan membutuhkan vektor awal 1: 2e10. Karena prosedur alokasi data Rs ini menciptakan vektor> 70Gb yang tidak dapat dijalankan di komputer mana pun yang saya tahu meskipun kode akan berjalan.
Untuk referensi f (1e4.100) berjalan sekitar 30 detik. Berdasarkan ini dan beberapa tes yang lebih kecil f (1E6.100) akan memakan waktu sekitar satu jam.
sumber
Racket 332 byte
Versi tidak disatukan:
Pengujian:
Keluaran:
sumber
Clojure, 221 byte
Perkasa panjang tapi menangani kasus ini
(f 1)
. Tanpa kasus khusus itu adalah 183 byte. Ini terlalu banyak upaya untuk tidak mempostingnya.Output sampel:
1000000 100 case dihitung dalam waktu sekitar 4,7 jam, setidaknya tidak crash.
sumber