Diberikan bilangan bulat n
(di mana n < 10001
) sebagai input, tulis sebuah program yang akan menampilkan n
angka Ulam pertama . Nomor Ulam didefinisikan sebagai berikut:
- U 1 =
1
, U 2 =2
. - Sebab
n > 2
, U n adalah bilangan bulat terkecil yang lebih besar dari U n-1 yang merupakan jumlah dari dua istilah sebelumnya yang berbeda dalam satu cara.
Misalnya, U 3 adalah 3
(2 + 1), U 4 adalah 4
(3 + 1) (perhatikan bahwa (2 + 2) tidak dihitung karena persyaratannya tidak berbeda), dan U 5 adalah 6
, (U 5 bukan 5 karena 5 dapat direpresentasikan sebagai 2 + 3 atau 4 + 1). Berikut adalah beberapa angka Ulam pertama:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
Ini kode golf, jadi entri terpendek menang.
code-golf
number
number-theory
sequence
Absinth
sumber
sumber
n
harus kami tangani?Jawaban:
CJam,
474137 byteCobalah online.
Contoh dijalankan
Bagaimana itu bekerja
Ide dasar ini adalah sebagai berikut:
Mulai dengan array
A := [ 0 U₁ U₂ ... Uₖ ]
.Hitung
S
, array dari semua jumlahx + y
sehinggax,y ∊ A
danx < y
.Buang semua jumlah non-unik dari
S
. Karena setiap angka Ulam lebih besar dari 2 adalah jumlah dari dua yang lebih kecil dan jumlah nol dan itu sendiri, ini membuang angka-angka UlamU₃, U₄, ... Uₖ
.Array yang tersisa adalah
[ U₁ U₂ Uₖ₊₁ ... ]
, jadi angka Ulam berikutnya adalah elemen terkecil ketiga. Tambahkan keA
dan kembali ke langkah 1.sumber
100
sudah butuh beberapa detik. Saya kira menghitung input maksimum 1e5 akan memakan waktu lama?J - 46 char
Mengambil fungsi
n
sebagai argumen.Dijelaskan oleh ledakan:
sumber
+_*
...T-SQL,
301300288287Saya telah melakukan sedikit penyalahgunaan SQL ringan.
Cobalah di SQL Server 2008 di sini .
@ N memegang integer input. Ubah contoh "100" menjadi apa yang seharusnya. "10000" mungkin akan selesai pada akhirnya, tapi aku belum membiarkannya selesai. Hitungan char entri ini adalah untuk input satu digit. Output dalam bentuk hasil kueri.
sumber
Haskell,
7067 karakterpemakaian:
sumber
GolfScript (
4137 byte)Demo online
Produk Cartesian di GolfScript cukup panjang, jadi ini membutuhkan pendekatan yang berbeda. Pertumbuhan jangka panjang dari angka-angka Ulam adalah bahwa angka
n
Ulam ke-sekitar13.5n
, tetapi dalam 10.000 istilah pertama rasio terbesar antara angkan
ke-Ulam dann
hanya di bawah13.3
. Jadi diberikann
kita dapat memfilter14n
angka pertama untuk menemukan nomor yang termasuk dalam urutan.Dengan terima kasih kepada Dennis untuk 41-> 37.
sumber
n = 1000
membutuhkan waktu kurang dari satu menit dengan GolfScript; port ke CJam selesain = 1000
dalam 8 detik dann = 10000
dalam 1 jam 20 m. - Anda dapat menyimpan empat byte dengan menggabungkan pendekatan Anda dengan saya, yaitu termasuk 0 dalam array dan membuangnya setelah itu. Itu memungkinkan menggunakan set union alih-alih blok dan menghilangkan kebutuhan untuk variabel:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
itu adilE
. Tetapi Anda perlu membaca dari STDIN, mengonversi bilangan bulat menjadi satu singleton sebelum melakukan set union (saya akan mengajukan laporan bug tentang itu) dan2$
tidak akan bekerja di loop dalam karena CJam memodifikasi stack setelah setiap iterasi ... I Sudah mencoba beberapa trik yang berbeda, tetapi yang terpendek persis 37 byte:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 karakterJalankan ini di Web Console atau Scratchpad dari Firefox terbaru (Malam atau rilis).
EDIT 8 Golf banyak !!! dan membuatnya menjadi
94 karakter9390 karakter (terima kasih kepada @openorclose). (Sub 100 pertama saya)Ini adalah versi saya yang jauh lebih cepat
tetapilebihpanjang 3 karakter (107 karakter)dan jumlah karakter yang persis sama seperti di atasdan jauh lebih kecil daripada metode brute force di bawah ini !, (terima kasih kepada edc65):Saya akan terus mencoba golf lebih jauh. Tapi kami memerasnya dari ruang lingkup JS: P
Berikut adalah beberapa angka ketika saya menjalankan ini di dalam tag skrip di halaman web:
Ini adalah kiriman pertama saya yang sangat terinspirasi oleh jawaban @ rink.attendant.6 di JavaScript.
Saya tahu ini bisa bermain golf lebih jauh. Saya juga akan memposting solusi non-bruteforced, yang mungkin lebih pendek.
EDIT 1 : Golf sedikit lebih dan tetap untuk n = 1
Saya harus mengatakan bahwa saya iri pada Haskell dan J karena pintasan yang sangat berguna untuk setiap jenis persyaratan -_-
sumber
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
return
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
Kecuali jika [, 1] diperlukan di suatu tempatPerl - 71 byte
Cobalah online!
Menghitung shebang sebagai satu.
Menggunakan array kedua untuk menyimpan jumlah tampaknya jauh lebih cepat daripada hash. Penggunaan memori juga kurang, yang tidak saya duga.
Penggunaan sampel:
Output sampel:
Perkiraan runtime:
sumber
n == 1e4
. Luar biasa! Output untukn == 1
tidak benar; itu harus mencetak satu nomor.Jawa, 259
Brute force bekerja dengan baik untuk ini.
sumber
1
harus berupa angka tunggal.APL (Dyalog Extended) ,
3635 byte-1 byte oleh Adám
Cobalah online!
* (Dalam ngn / APL, konstanta dapat mengakhiri kereta tanpa menggunakan
⍨
. Tapi ngn / APL tidak memiliki hitungan, jadi kita perlu ⍨ suatu tempat.)sumber
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Pendekatan yang sama dengan jawaban saya:
sumber
Jelly , 20 byte
Cobalah online!
sumber
CoffeeScript,
119114Akhir-akhir ini saya telah mempraktikkan CoffeeScript untuk meningkatkan dalam bermain golf JavaScript, jadi inilah jawaban JavaScript saya yang dikompilasi ke dalam CoffeeScript:
Saya tidak mengerti loop dan pemahaman dalam CoffeeScript dengan sangat baik jadi mungkin ini bisa di-golf lebih lanjut tetapi itulah yang saya miliki untuk saat ini. Baris baru dihitung sebagai satu karakter (gaya Unix).
sumber
JavaScript,
147154150 (136)Sangat terinspirasi oleh solusi Java Brute-force @ Ypnypn yang diposting sebelumnya:
Terima kasih untuk @Dennis karena mencukur 4 hingga 18 byte dari versi asli saya
Versi berbahaya (menggunakan
for..in
loop)Saya tidak akan merekomendasikan menjalankan ini karena perulangan melalui objek yang menggunakan perulangan dapat menyebabkan mesin Anda terbakar dan / atau berubah menjadi mesin pembunuh yang marah, tapi ini dia:
instanceof
Array
for..in
Tidak disatukan
sumber
z=0
di dalam loop, Anda hanya perlu sekali. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
jauh lebih pendek daril.forEach
pendekatan.Mathematica,
10791 byteIni adalah implementasi yang sangat langsung dari spesifikasi.
Saya juga menerapkan trik Dennis untuk memasukkan jumlah
0
, tetapi hasilnya adalah ini membuat elemen ketiga dari daftar0
sebelum melanjutkan seperti yang diharapkan, jadi saya perlu menghapus elemen itu dari daftar.Ini menangani input
1000
dalam beberapa detik, tapi saya ragu Anda akan mendapatkan hasil 10k dalam jumlah waktu yang wajar. Tapi saya tidak berpikir ada yang melakukan dengan baik pada hal itu.sumber
OCaml - 254 Karakter
Kode menggunakan tabel hash untuk menyimpan jumlah elemen saat ini dari daftar dan memperbaruinya setiap kali elemen baru dihitung.
Pemakaian:
Dalam juru bahasa OCaml:
Tidak disatukan
sumber
Python,
137128126 karakter.Ini adalah golf pertama saya, dan saya telah menurunkannya dari ~ 250 karakter, saya cukup senang tetapi akan senang dengan saran tentang cara meningkatkan!
sumber
for b in U:t[a+b]+=a!=b
dan baris 8 & 9 kewhile t[i]-2:i+=1
for
U,i=[1,2],2
keU,i=[1],2
daninput()-2
keinput()-1
dant=_*3*i
ket=_*3*i;U+=[i]
dan menghapus;U+=[i]
pada akhir untukC #, 257
Pendekatan kekerasan, menggunakan LINQ:
Tidak Serigala, Dengan Test Harness
sumber
Pyth,
2725 byteCobalah online di sini .
Sunting: golf 2 byte dengan melakukan penjumlahan sebelum pengelompokan. Versi sebelumnya:
<uaGh-mssdfq1lT.gsk.cG2GQS2
sumber
C, 478 byte
Di Tio sekarang dalam 9 detik akan menemukan nilai 10.000 (dan di sana mencetak 100 nilai pertama). Triknya adalah menggunakan pencarian tidak linier di loop dalam tetapi pencarian biner ... Berikut ini adalah fungsi yang terindentasi dengan baik dan dapat dibaca penuh (akhirnya bagi saya):
sumber
APL (NARS), 278 char, 556 byte
itu akan menjadi terjemahan dalam APL dari C yang saya kirim. Sepertinya saya tidak mengerti kapan harus menggunakan ∇∇ di tempat ∇ ... mungkin ∇∇ digunakan ketika ada satu argumen adalah satu fungsi (dan bukan satu tipe lainnya). "u bs x, a, b" harus menjadi pencarian bin di array "u" untuk nilai "x" dalam rentang a..b; itu akan mengembalikan 1, indexWhereFind atau 0, indexWhereEndOfsearch. Dengan fungsi argumen 200 p ambil + - sebentar di sini ...
sumber
∇∇
dalam dop mengacu pada operator itu sendiri sementara∇
mengacu pada fungsi turunan yang terdiri dari operator dengan operannya. Jadi dalam operator monadik∇
sama dengan(⍺⍺∇∇)
sementara dalam operator diad artinya(⍺⍺∇∇⍵⍵)
.