Dalam Gödel, Escher, Bach , Douglas Hofstadter memperkenalkan urutan bilangan bulat yang biasanya disebut sebagai urutan gambar-angka:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Anda dapat menikmati mengerjakan sendiri definisi urutan sebagai bagian dari tantangan, tetapi jika Anda tidak dapat atau tidak ingin mengetahuinya, Anda dapat menemukannya di OEIS sebagai urutan A030124 dan definisi yang sedikit lebih jelas di Wikipedia .
Tulis program atau fungsi yang, diberikan n
melalui STDIN, ARGV atau argumen fungsi, mencetak daftar n
angka pertama dari urutan ke STDOUT dalam format daftar yang masuk akal.
Ini adalah kode golf, solusi terpendek dalam byte yang menang.
code-golf
number
number-theory
sequence
Martin Ender
sumber
sumber
Haskell,
676160565553 karakterkembali ke algoritma pertama.
solusi ini menghitung urutan komplemen dengan menjumlahkan elemen awal dari urutan. kemudian menghitung urutan karena semua angka antara nomor urutan pelengkap.
(#)
adalah fungsi yang menghitung angka antara urutan komplemen.h
adalah urutan itu sendiri.g
adalah fungsi yang menjawab pertanyaan.fungsi g didefinisikan hanya mengambil jumlah elemen yang dibutuhkan dari h.
kehalusan:
h
sebenarnya adalah urutan gambar figur kecuali untuk 2 elemen pertama.bukan urutan komplemen yang dihitung, tetapi urutan komplemen dengan menambahkan 1 untuk setiap elemen.
dua kehalusan ini adalah alasan
scanl(+)8h
(yang merupakan kode untuk urutan komplemen (kecuali untuk 2 elemen pertama) dengan 1 yang ditambahkan) ada8
di dalamnya. itu untuk elemen ketiga dari urutan komplemen dengan 1 ditambahkan padanya.alasan perhitungan tidak hilang dua elemen pertama adalah karena mereka ditambahkan
g
di2:4:h
.contoh:
sumber
Ruby,
5448Demo
Sunting: Memotong golf ini sedikit lebih banyak setelah saya menyadari saya tidak perlu memegang urutan pelengkap lengkap dalam memori. Begini cara kerjanya sekarang: Kami menggunakan
x
untuk melacak nomor yang dihitung terbesar dalam urutan pelengkap, danb
merupakan kumpulan kandidat untuk urutan.n
kali, kami menampilkan elemen terkecil yang tersisab
dan menambahkannya kex
untuk menghitung angka berikutnya dalam urutan komplemen. Lalu kami menghapus kedua angka dari kumpulan kandidat, jadi kami selalu mengeluarkan angka terkecil yang belum ditambahkan ke urutan mana pun.Trik golf Ruby: Sintaks lambab Stabby lebih pendek dari definisi metode. Persyaratan bahwa output diberikan kepada STDOUT alih-alih sebagai nilai pengembalian mengilhami saya untuk menggunakan fakta bahwa nilai baliknya
p(x)
adalahx
, yang biasanya tidak saya ingat karena itu bukan kasus dalam versi Ruby yang digunakan dalam Anarchy Golf.sumber
2..2*n
. Saya harus menggunakann*n
karena saya melakukan secara efektifb = [x]^b
sehingga saya membutuhkan elemen terbesarb
untuk menjadi lebih besar dari nilai terbesarx
, tetapi Andab -= [x]
hanya membutuhkan yangb
berisi nilai kemungkinan terbesar dari urutan output.GolfScript (
2421 byte)Demo online
Ini dimulai sangat berbeda, tetapi akhirnya konvergen pada port GolfScript dari solusi Ruby histokrat sebelum Dennis membuat beberapa saran yang membawanya ke arah yang sedikit berbeda. Secara khusus, mencetak angka-angka ketika kami mengidentifikasinya menghemat sedikit lebih banyak daripada mengumpulkannya dalam sebuah array untuk dicetak pada akhirnya; alasannya adalah bahwa itu berarti bahwa kita tidak perlu khawatir tentang lebih dari 3 item di stack.
Pembedahan
sumber
^
dengan\-
, Anda dapat mengganti).*
dengan3*
. Ini tidak akan menghemat byte, tetapi secara drastis mengurangi waktu berjalan dan penggunaan memori. - Anda harus dapat menyimpan satu byte dengan mempertahankan integer di atas array. Loop akan memiliki jumlah byte yang sama, tetapi inisialisasi akan menjadi satu byte lebih pendek.~.3*,1>\{(\(.p@+\|}*;
J - 28 char
Pengambilan fungsi
n
sebagai argumen.Kami menjalankan fungsi, dengan
n
argumen kiri, ke argumen kanannya berulang kali hingga tidak menghasilkan perubahan. Argumen untuk memulai adalah daftar2 4
.Dalam fungsi itu sendiri, kita mengambil jumlah parsial
+/\
dan jumlah penuh+/
, dan kemudian menambah keduanya&:>:
. Kami kemudian menghasilkan setiap bilangan bulat dari 2 menjadi satu lebih dari jumlah penuh (2+i.
), dan mengatur pengurangan (-.
) jumlah parsial, meninggalkan urutan figur-figur yang lebih panjang dengan definisi. Akhirnya, kami memperpendek atau memperpanjang daftar secara siklisn
.Hasilnya adalah itu
2 4
menjadi3 7
, dan ini dihapus dari2..8
meninggalkan2 4 5 6 8
. Setelah satu putaran,2 4 5 6 8
menjadi3 7 12 18 26
menjadiDengan cara ini, kami berulang kali memperpanjang urutan gambar-gambar. Itu
$
perilaku panjang adalah cara menghemat karakter non-sepele menunggu urutan tumbuh dengan panjangn
atau lebih besar, dan keluarann
nilai pertama ketika mereka berhenti berubah. Kita juga tidak harus menunggu lama: kita bisa mendapatkan sebanyak 46336 istilah dari empat aplikasi kata kerja dalam.Fungsi yang sama di k:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
sumber
Jawa -
183158Ini adalah yang paling saya main golf, dan saya bangga karenanya! (Meskipun tidak ada di dekat bagian atas tangga lagu (karena itu Java))
Terima kasih kepada Peter Taylor untuk saran
lebih besar -
sumber
Byte.valueOf
menghemat tiga, dan karena pertanyaan tidak menentukan kisaran input, saya pikir itu harus diterima. Di luar loop,m
hanya digunakan untuk menginisialisasin
, sehinggak++<m
bisa jadim-->0
, menghilangkank
seluruhnya.int[] n
dapat diinisialisasi sebagaiint n[]
dan digabungkan ke dalam initialiser sebelumnya.n
tidak pernah memegang nilai selain1
, jadin[...]!=0
bisa jadin[...]>0
. Penginisialisasi kemudian dapat menjadi bagian penginisialisasi darifor
loop pertama .u
dan hanya menggunakan++w
, tidak perlu diaturn[q]
ataun[w]
. Ada satu bug, di mana Anda menjalankan akhirn
kapanm==2
, yang tampaknya paling baik diperbaiki dengan menginisialisasin=new int[2*m*m]
, tapi saya pikir itu turun ke 157 byte.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
menyimpan tanda titik koma.Python 2 - 77 byte
Kode:
Bekerja sama dengan solusi @ histocrat, kecuali input berasal dari stdin.
sumber
Python 2 - 68
sumber
Jelly , 15 byte
Cobalah online!
Kesalahan memori pada input 6.
Bagaimana itu bekerja
Versi yang lebih efisien, 16 byte
Cobalah online!
Gunakan ide dari jawaban J. ini . Potong ke panjang yang diinginkan setiap iterasi, dan ambil fixpoint. Saya pikir menggunakan
S
(jumlah) alih-alihṀ‘
(maks + 1), tapi saya tidak bisa menjamin kebenarannya.sumber