Monday Mini-Golf: Serangkaian tantangan kode-golf pendek , diposting (mudah-mudahan!) Setiap hari Senin.
Sebuah Fibonacci seperti urutan diperoleh dengan menggunakan metode yang sama seperti yang terkenal deret Fibonacci ; yaitu, setiap angka F (n) ditemukan dengan menambahkan dua angka sebelumnya dalam urutan ( F (n) = F (n-1) + F (n-2) ), atau dengan mengurangi dua angka berikutnya ( F (n) = F (n + 2) - F (n + 1) ). Perbedaan utama adalah bahwa urutan ini dapat dimulai dengan dua angka. Pengindeksan nol urutan ini dapat diperdebatkan, tetapi untuk sekarang, kita akan menggunakan aturan ini:
- Angka 0 dalam urutan seperti Fibonacci adalah angka terakhir yang lebih kecil dari angka sebelumnya.
Sebagai contoh, deret Fibonacci dapat ditulis sebagai 1, 0, 1, 1, 2, 3, 5...
, sehingga angka ke-0 dalam deret itu adalah satu-satunya 0
.
Tantangan
Tujuan dari tantangan ini adalah untuk menulis program atau fungsi yang menggunakan tiga bilangan bulat, dalam format apa pun:
- A dan B , dua angka untuk mulai menghasilkan urutan.
- N , panjang urutan yang dihasilkan ke keluaran.
Dan menampilkan nomor N pertama dari urutan, mulai dari tanggal 0.
Detail
- A , B , dan N dapat diambil dalam urutan dan format apa pun, selama keduanya terlihat terpisah. Jika Anda menggunakan urutan / format yang berbeda, harap tentukan apa itu.
- Anda dapat mengasumsikan bahwa A , B , dan N selalu bilangan bulat positif.
- Anda dapat berasumsi bahwa N tidak lebih dari 100, dan urutan yang dihasilkan tidak akan mengandung
x >= 2^31
. - Jika A lebih besar dari B , maka B adalah angka ke-0 dalam urutan.
- Output harus dipisahkan oleh spasi, koma, dan / atau baris baru.
- Ruang trailing atau baris baru diizinkan, tetapi bukan koma jejak.
Kasus uji
Contoh 1:
8 13 10
Bekerja mundur dari 8 13
sampai kita menemukan angka yang lebih besar dari yang sebelumnya, kita dapatkan 13 8 5 3 2 1 1 0 1
. Jadi, 0
adalah angka ke-0 dalam urutan ini. Bekerja maju dari ini, kami mencetak 0
dan 9 anggota berikutnya:
0 1 1 2 3 5 8 13 21 34
Contoh 2:
23 37 5
Sekali lagi bekerja mundur untuk menemukan nomor 0, kami temukan 37 23 14 9 5 4 1 3
. Angka 0 kali ini 1
, jadi kami mencetaknya, bersama dengan 4 anggota berikutnya:
1 4 5 9 14
Contoh 3:
4 3 8
Dengan ini, kita tidak harus bekerja mundur untuk menemukan angka ke-0, karena 3
lebih kecil dari 4
:
3 7 10 17 27 44 71 115
Contoh 4:
29 47 11
Hasil:
1 3 4 7 11 18 29 47 76 123 199
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek yang valid dalam byte menang. Tiebreaker pergi ke pengajuan diposting sebelumnya. Pemenang akan dipilih Senin depan, 28 Sep. Semoga beruntung!
Sunting: Selamat kepada pemenang Anda, @ Jakube, menggunakan Pyth untuk 23 byte yang luar biasa !
[8, 13, 10]
)?Jawaban:
Pyth, 23 byte
Cobalah online: Demonstrasi atau Test Suite
Gaya pemrograman Pyth yang tidak biasa. Terkadang pemrograman fungsional memiliki kelemahan.
Penjelasan:
sumber
Retina ,
6554 byteDi sini,
<empty>
merupakan garis trailing kosong. Jalankan kode sebagai satu file dengan-s
bendera.Format input adalah
di mana nomor tersebut direpresentasikan dalam unary . Outputnya adalah daftar yang dipisahkan koma, juga di unary. Contohnya:
akan menjadi
dan hasil
Penjelasan
Pertama, kita mengurangi
A
danB
ke elemen 0 dan -1. The+
memberitahu Retina terus mengulangi substitusi regex ini sampai baik regex berhenti cocok atau substitusi tidak memodifikasi string. Regex menangkapA
ke dalam grup 1 dengan(1*)
, dan kemudian memastikan bahwaB
setidaknya sebesarA
saat menangkapB-A
dengan\1(1*)
ke dalam grup 2. Ini memastikan bahwa loop ini berakhir sekaliA>B
.Substitusi berubah
A,B
menjadi hanyaB-A,A
dengan mengatur pertandingan$2,$1
.Sekarang kita sudah mendapatkan jumlah pertama dari output yang diperlukan dalam string (dan juga yang sebelumnya, yang kita harus singkirkan nanti). Substitusi ini sekarang menambahkan nomor lain sebagai jumlah dari dua angka terakhir saat mengambil
1
dariN
. Karena kami sudah memiliki satu nomor, kami hanya ingin ini terjadiN-1
. Kami melakukan ini dengan memastikan\B
bahwa masih ada setidaknya;11
di akhir string. Jika kita memanggil dua nilai terakhir dari urutanC
danD
, maka regex menangkapC
ke grup 1 dan,D
ke grup dua. Kami menulis kembali dengan mereka$1$2
. Kemudian kami juga menulis$2$1
yang diterjemahkan menjadi,D+C
. Perhatikan bahwa kami tidak menulis kembali single yang1
cocok dengan kamiN
, dengan demikian mengurangi itu.Akhirnya, kita perlu menyingkirkan elemen -1 urutan, serta sisa
;1
dariN
, yang kita lakukan dengan mencocokkan salah satu dari mereka dan menggantinya dengan string kosong.sumber
Python 2,
9387676160 byteMendapat input (sebagai daftar python literal
[8,10,13]
)Berfungsi pada istilah 0
Kemudian cetak urutan penambahan sampai panjangnya tercapai
sumber
for _ in[1]*l:
, ini sedikit lebih pendek untuk dilakukanexec"stuff;"*l
for _ in[1]*l:stuff
denganexec"stuff;"*l
. @ xnor tidak memasukkan bagian barang di for for loop. Ataufor _ in[1]*l:
keexec";"*l
j>=i
denganj/i
. Baru tahu itu! (Karena Anda dapat mengasumsikan bahwa A, B, dan N selalu bilangan bulat positif )CJam,
2623 byteTerima kasih kepada Dennis karena telah menghemat 3 byte.
Mengambil input secara berurutan
N B A
(dipisahkan oleh ruang putih apa pun). Mencetak hasilnya sebagai daftar yang dipisahkan baris baru dan berakhir dengan kesalahan .Uji di sini.
Penjelasan
Ini selangkah lebih maju ketika menemukan elemen ke-0. Artinya, itu berakhir setelah salah satu nilai negatif.
sumber
q~{_@\-_g)}g\@{_@+_p}*t
(N B A
) menyimpan tiga byte.B>A
harus memeriksaB not smaller than A
atau sesuatu, tapi saya tidak tahu bagaimana melakukannya di CJam. EDIT: Solusi Dennis mencetak output yang benar.<!
bukan>
.!
dalam ini. Saya hanya menambahkan satu untuk membuatnya bekerja;)Labyrinth ,
5854494644 byteTerima kasih kepada Sp3000 untuk menyarankan penggunaan negasi bitwise, yang menghemat dua byte.
Format input adalah
B A N
. Outputnya adalah daftar yang dipisahkan oleh baris baru.Penjelasan
(Agak ketinggalan jaman. Ide dasarnya masih sama, tetapi tata letak kodenya berbeda sekarang.)
Ini menggunakan ide yang sama dengan jawaban CJam saya (jadi kredit masih masuk ke Dennis): ketika melacak kembali urutan kita tidak berhenti sampai kita mendapatkan nilai negatif (yang membuat kita dengan elemen urutan ke-1 dan -2). Kemudian, kami mulai menambahkannya sebelum mencetak nilai pertama.
Ini menggunakan beberapa trik golf Labyrinth yang bagus. Mari kita lihat kode di bagian:
IP mulai di sebelah
?
kanan (yang berbunyiA
). Pada"
(tanpa-op) itu menemui jalan buntu, jadi berbalik, menjalankan?
lagi (membacaB
). Terakhir,}
pindahB
ke tumpukan bantu. Jalan buntu menyimpan byte di atas yang naifSekarang loop yang menemukan awal urutan:
The
)(
(increment-decrement) adalah no-op, tapi itu perlu untuk memastikan bahwa atas tumpukan positif pada persimpangan (seperti bahwa IP berubah timur).:
duplikatA
,{
bergerakB
kembali ke tumpukan utama,-
menghitungA-B
. Apa yang sebenarnya kita inginkan adalahB-A
, jadi`
meniadakan nilai.Sekarang ini adalah persimpangan empat arah. Untuk hasil negatif, IP mengambil belokan kiri ke arah
?
, membacaN
dan pindah ke bagian selanjutnya dari program. Jika hasilnya nol, IP terus bergerak ke selatan, mengambil belokan di sudut, dan tetap di loop. Jika hasilnya positif, IP mengambil belok kanan (barat), belok di sudut, dan belok kanan lagi (barat lagi) sehingga juga tetap di loop. Saya pikir ini mungkin menjadi pola umum, untuk membedakan nilai-nilai negatif dari non-negatif (atau positif dari non-positif):Setidaknya saya belum bisa menemukan tata letak yang lebih ringkas / berguna untuk kasus ini.
Pokoknya, sementara
A
non-negatif, loop berlanjut,}
bergerakA
ke stack bantu dan=
swapA
danB
.Begitu
A
negatif,?
bacaN
dan kita pindah ke loop kedua:Kami tahu itu
N
positif, sehingga kami dapat mengandalkan IP untuk belok kiri (utara). Tubuh loop sekarang cukup:Dengan kata lain: memindahkan keduanya
N
danA
ke tumpukan bantu. GandakanB
, tukar salinan denganA
dan tambahkanA
ke salinan lain dariB
. Gandakan lagi untuk mencetak nilai saat iniB
. Cetak baris baru. PindahB
danN
kembali ke tumpukan utama dan penguranganN
.Meskipun
N
positif, IP akan mengambil belok kanan (utara) melanjutkan loop. SetelahN
mencapai nol, kode berakhir dengan cara yang agak mewah:IP terus bergerak lurus ke depan (barat). The
?
mencoba untuk membaca bilangan bulat lain, tapi kami sudah mencapai EOF, sehingga benar-benar mendorong0
gantinya.`
mencoba meniadakan itu, tapi itu masih nol. Jadi IP masih bergerak ke barat, mengambil belokan di sudut, dan kemudian terus bergerak ke bawah ke@
yang menghentikan program.Aku ingin tahu apakah saya bisa menempatkan
@
di posisi yang lebih murah (itu saat ini biaya 3 karakter spasi) dengan memutar tiga"
sekitar`
menjadi senyawa no-ops (seperti)(
), tapi saya belum mampu membuat pekerjaan itu belum.sumber
C,
105102100 byteTerima kasih kepada @ C0deH4cker untuk bermain golf 2 byte!
Cobalah online di Ideone .
sumber
Matlab / Oktaf, 115
125byteFungsi ini harus disebut sebagai
f([8 13],10)
.Contoh (Matlab):
Atau coba online (Oktaf) .
sumber
f([a b],n)
harus diizinkan.x=f(x,n)
dalam fungsi tajuknya diperhitungkan ...Haskell,
67 6556 byteTerima kasih kepada @nimi untuk saran
Ini mendefinisikan fungsi infiks ternary
%
, yang dipanggil dalam format(n%a)b
, misalnya:Penjelasan
Fungsi infiks biner
#
, yang didefinisikan pada baris pertama, mengambil dua bilangan bulata
danb
dan mengembalikan terbatas Fibonacci seperti urutan di manaa
danb
terjadi seperti elemen berturut-turut.Fungsi ini
%
hanya mengambiln
elemen pertama daria#b
.sumber
let f=a:scanl(+)(a+b)f in f
(-> penuh#
:a#b|a>b=let f=a:scanl(+)(a+b)f in f|1>0=(b-a)#a
dan menyimpan dua byte.> <>,
3331 +1 untuk -v = 32 byteInput harus didorong pada stack menggunakan -v karena parsing angka desimal adalah non-sepele di> <>.
Penjelasan:
Saya akan mewakili tumpukan setelah setiap (kelompok) operasi. Dimulai dengan [F (n), F (n + 1), N]
Baris pertama menuju seri ke 0:
Baris kedua naik seri sampai telah mencetak ketentuan N:
sumber
00.
pada baris pertama menjadi&
. Secara teoritis,!
harus bekerja tetapi saya pikir> <> mengisi lebar garis agar sesuai dengan lebar yang terpanjang (edit: itulah sebabnya saya pikir Anda memiliki00.
di tempat pertama).!
atau?
(pada akhir baris) jika ada pada baris terpanjang. Anda dapat mencobanya dengan sesuatu seperti1n!
dan itu akan kesalahan, tetapi jika ada garis di bawahnya dengan sesuatu yang lebih panjang dari itu, sepertilorumipsum
, itu tidak akan.Java,
1137876 byteKredit diberikan ke ETHproduksi untuk menyediakan algoritma yang saya gunakan dalam jawaban ini.
Coba di sini .
Penjelasan:
Pendekatan asli,
11393 byteTerlihat lebih golf;)
Cobalah di sini .
Penjelasan:
sumber
b=b-a
menjadib-=a
, dan sama dengana=b+a
. Ini akan menghemat 2 byteJavascript (ES6),
837363 byteIni mungkin golf hingga maks. Kita lihat saja nanti.
Tidak Terkumpul:
sumber
Mathematica 112
Akankah golf akhirnya
sumber
CJam, 40 byte
Langkah kecil. Ini adalah program CJam pertama saya, jadi saya bangga ini bekerja sama sekali.
Dibutuhkan input dalam bentuk yang sama seperti dalam contoh.
Saya sekarang melihat saya bisa menguranginya menjadi 33 byte menggunakan
{ ... }*
konstruk.Dan saya bahkan bisa menguranginya dengan satu lagi dengan menggunakan operator ternary untuk membersihkan tumpukan dan menghasilkan kesalahan.
sumber
Ruby, 141 byte
Eksekusi
Fungsi f menghasilkan output yang diinginkan, nama argumen cocok dengan nama variabel dari pertanyaan
Tidak ada yang pintar:
sumber
Mathematica, 59 byte
sumber
Ruby,
817573Disingkat 6 Bytes saat mengganti for-loop dengan range.map
Menyimpan 2 byte lainnya dengan memindahkan pernyataan cetak
sumber
Pyke, 24 byte (tidak bersaing)
Coba di sini!
sumber
Jelly , 14 byte
Cobalah online!
sumber
Gangguan Umum, 91 byte
Cobalah online!
sumber