Cerita:
Lucy bertanya pada George berapa Angka Keberuntungannya. Setelah beberapa perenungan, George menjawab bahwa ia memiliki beberapa Angka Keberuntungan. Setelah kebingungan singkat, Lucy bertanya pada George apa n
Angka Keberuntungan pertamanya . George kemudian meminta Anda, temannya, untuk menulis kepadanya sebuah program untuk melakukan pekerjaan untuknya.
Tantangan:
Anda akan menulis sebuah program / fungsi yang akan menerima dari input standar / argumen fungsi string atau integer n
. Program / fungsi kemudian akan mengembalikan / menampilkan n
Angka Keberuntungan pertama . Angka keberuntungan didefinisikan melalui ayakan sebagai berikut.
Mulai dengan bilangan bulat positif:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, ...
Sekarang hapus setiap angka kedua:
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
Angka kedua yang tersisa adalah 3 , jadi hapuslah setiap angka ketiga:
1, 3, 7, 9, 13, 15, 19, 21, 25, ...
Sekarang angka selanjutnya yang tersisa adalah 7 , jadi hapuslah setiap angka ketujuh:
1, 3, 7, 9, 13, 15, 21, 25, ...
Selanjutnya, hapus setiap angka kesembilan dan seterusnya. Urutan yang dihasilkan adalah angka keberuntungan.
Kemenangan:
Seperti biasa untuk codegolf, byte paling sedikit menang.
Seperti biasa, pengiriman menggunakan celah standar didiskualifikasi.
sumber
Jawaban:
Python 2, 79
Keajaiban iterasi pada daftar saat loop memodifikasinya!
Daftar
L
dimulai dengan semua bilangan bulat1
ke nilai yang cukup tinggi. Kode iterates atas setiap elemenr
dariL
, mengambil sublist setiapr
'elemen th, dan menghapus masing-masing nilai. Akibatnya, nilai yang dihapus tidak berulang. Pada akhirnya, cetakn
elemen pertama .Ekspresi
map(A.remove,B)
adalah trik yang sudah lama saya tunggu untuk digunakan. Itu panggilanA.remove
untuk setiap elemenB
, yang menyebabkan semua elemenB
untuk dihapusA
. Secara efektif, diperlukan perbedaan daftar, meskipunB
harus menjadi sublist dariA
. Ini membutuhkan Python 2, karena Python 3 tidak akan benar-benar mengevaluasi peta.Loop pertama perlu di-cased khusus untuk mengkonversi
r
dari1
menjadi2
, asr+=r<2
.Batas atas yang cukup tinggi
2**n
membuat program sangat lambat untuk nilai besarn
. Menggunakann*n+1
cukup, tetapi biaya karakter. Catatan yangn*n
tidak berfungsin=1
.sumber
n**2
angka, bukan2**n
map
Anda miliki di sana. Saya bertanya-tanya apakah ada cara yang lebih baik ...n**2+1
kecuali kasusnyan=1
bisa dimaafkan.map(A.index,B)
untuk menemukan indeks elemen B di A,map(A.count,B)
untuk menemukan jumlah elemen B di A,map(A.extend,B)
untuk menambahkan daftar B yang rata ke A. Pikiran membingungkan.Haskell,
7169 byteMenentukan fungsi
f
. Ekspresi1:s[3,5..]3
mengevaluasi ke daftar nomor keberuntungan yang tak terbatas, danf
hanya mengambil yang pertaman
dengantake n
.Saya bisa mencukur 5 byte dari saringan menggunakan pemahaman daftar paralel
tetapi itu akan membutuhkan melewati flag compiler humongous
-XParallelListComp
ke GHC untuk mengaktifkan ekstensi.Penjelasan dari saringan
Ide dasarnya adalah
s(n:k)p
menghasilkan angka(p-1)
keberuntungan ke-1n
, menjatuhkan setiapn
angka dari ekor yang tak terbatask
(diimbangi denganp
memperhitungkan angka yang dihasilkan sebelumnya), dan berulang ke daftar itu dengan akumulator(p+1)
. Dalamf
, kami menginisialisasi proses dengan angka ganjil mulai dari3
, dan tempel1
ke depan, mendapatkan angka keberuntungan persis.sumber
Python 2,
71 6967Pada awalnya, saya pikir ini akan menjadi tantangan besar bagi pemotongan array Python. Namun, saya menemukan batu sandungan ketika saya menemukan bahwa irisan dengan langkah selain 1 hanya dapat memiliki irisan lain dengan panjang yang sama. Tetapi setelah googling "python remove slice", iman saya dipulihkan: Saya menemukan
del
pernyataan funky yang melakukan trik dengan sempurna.Versi lama
-2 byte terima kasih kepada Sp3000.
sumber
> <> ,
121114111 byteSaya hanya punya beberapa kata untuk dikatakan ...
... "Argh, otakku sakit."
Penjelasan
> <> adalah bahasa pemrograman 2D esoterik dan jelas tidak cocok untuk tugas ini, karena kurangnya array. Bahkan, satu-satunya tipe data di> <> adalah campuran aneh int / float / char, dan semuanya terjadi pada setumpuk tumpukan.
Inilah ikhtisarnya:
Berikut adalah contoh tiruan yang menunjukkan kira-kira cara kerja pengayak (di sini
k
adalah angka keberuntungan yang kami saring):sumber
nao
tampaknya dapat diartikan sebagai "cetak benda ini sekarang".CJam - 25
Cobalah online
Penjelasan:
Implementasi ini tidak menghapus angka secara berurutan dari array, tetapi menghitung setiap angka berdasarkan berapa banyak yang akan dihapus sebelumnya.
Untuk setiap indeks i (dari 0 hingga n-1) dan setiap angka keberuntungan l sebelumnya, dalam urutan terbalik, kami menambah i dengan i / (l-1), kecuali untuk l = 1 kami menggunakan 1 bukan 0, dan juga menambahkan 1 di akhir.
Misalnya untuk i = 4 kita memiliki 4 angka pertama, [1 3 7 9], dan menghitung:
4 + 4 / (9-1) = 4
4 + 4 / (7-1) = 4
4 + 4 / (3 -1) = 6
6 + 6/1 = 12
12 + 1 = 13
sumber
Pyth:
2322 byteCobalah secara online: Pyth Compiler / Executor
Penjelasan:
Pengurangan sebenarnya menghitung lebih dari
Q
angka keberuntungan (perintah hapus disebut Q + 1 kali, Q-1 harus cukup).sumber
R, 58 byte
Dengan jeda baris:
Versi sebelumnya, 62 byte
Versi sebelumnya, 78 byte
sumber
n=as.numeric(readline())
kefunction(n){...}
. Ini menciptakan objek fungsi yang dapat ditugaskan dan dipanggil. Jatuhkan kurung kurawal difor
loop.n=scan(n=1)
?CJam,
3230 byteMengambil input dari STDIN.
Penjelasan kode :
Cobalah online di sini
sumber
Python 2,
105101 byteImplementasi yang mudah.
Pyth,
39363532 byteMirip dengan pendekatan di atas, tetapi semuanya diindeks 0 daripada diindeks 1. Cobalah online .
Terima kasih kepada @Jakube karena menunjukkan penghematan byte.
sumber
Mathematica, 80 byte
Implementasi langsung dari definisi. Seperti beberapa jawaban lain, mulai dengan rentang dari
1
ke dan kemudian terus memfilter.n2
sumber
Perl,
86817886:
UPDATE: jelas,
grep{...}
lebih baik darimap{...?$_:()}
81:UPDATE: OK, sebenarnya satu-liner sekarang. Saya bisa berhenti. (?) 78:
sumber
Oktaf,
1398372Tidak Disatukan:
sumber
J,
6052 bytePenjelasan (dari kanan ke kiri):
2,1+2*i.@*:@>:
tampaknya terlalu lama tetapi saya hanya dapat mempersingkat dengan 1 byte swapping*:
dengan!
membuat daftar bertambah secara eksponensial.sumber
JavaScript (ES6) 96
99Edit Menghitung mundur di loop pertama - terima kasih @DocMax
Tidak disatukan
Uji di Firefox / konsol FireBug
Keluaran
sumber
F=n=>{for(o=[1],i=n*n;--i;)o[i]=2*i+1;for(;++i<n;o=o.filter((x,j)=>++j%o[i]));return o.slice(0,n)}
Matlab, 104 byte
Dengan terima kasih kepada @ flawr untuk komentar dan saran yang sangat tepat.
Contoh dari command prompt Matlab:
sumber
Bash + coreutils, 136
Saya berharap untuk menurunkan ini lebih, tapi oh well. Tidak setiap hari Anda melakukan pipe ke fungsi rekursif dalam skrip shell:
Keluaran:
Bash + coreutils, 104
Lebih pendek menggunakan implementasi yang lebih mudah:
sumber
Pergi, 326
Implementasi lurus ke depan menggunakan goroutine dan pipa untuk membuat saringan.
sumber
MATLAB, 62 karakter
Saya salah menafsirkan tantangan pada awalnya - versi revisi saya sekarang sebenarnya lebih pendek.
sumber
Racket 196 byte
Menghasilkan angka keberuntungan hingga n:
Versi tidak disatukan:
Pengujian:
Keluaran:
sumber