Sebuah air mancur adalah susunan koin di baris sehingga setiap koin menyentuh dua koin berturut-turut di bawahnya, atau di baris bawah, dan baris bawah terhubung. Inilah air mancur 21 koin:
Tantangan Anda adalah menghitung berapa banyak air mancur yang berbeda dapat dibuat dengan jumlah koin tertentu.
Anda akan diberikan sebagai input bilangan bulat positif n
. Anda harus menampilkan jumlah n
air mancur -coin berbeda yang ada.
Aturan I / O standar, celah standar dilarang. Solusi harus dapat dihitung n = 10
dalam waktu kurang dari satu menit.
Output yang diinginkan untuk n = 1 ... 10
:
1, 1, 2, 3, 5, 9, 15, 26, 45, 78
Urutan ini adalah OEIS A005169 .
Ini kode golf. Bytes paling sedikit menang.
code-golf
sequence
combinatorics
isaacg
sumber
sumber
n
program yang harus dijamin berfungsi? (Yaitu setelah itu mungkin pecah)n
, hingga batasan tipe data, perangkat keras, dll.Jawaban:
Python, 57 byte
Seperti yang diamati pada OEIS , jika Anda menggeser setiap baris setengah langkah relatif terhadap baris di bawahnya, ukuran kolom membentuk urutan bilangan bulat positif dengan langkah ke atas maksimum 1.
Fungsi
f(n,i)
menghitung urutan dengan jumlahn
dan nomor terakhiri
. Ini dapat diringkas secara rekursif untuk setiap pilihan ukuran kolom berikutnya dari1
hinggai+1
, yaiturange(1,i+2)
. Truncating untukrange(1,i+2)[:n]
mencegah kolom menggunakan lebih banyak koin dari tetap, menghindari perlu untuk mengatakan negatif yangn
's memberi0
. Selain itu, ia menghindari kasus dasar eksplisit, karena jumlah kosong adalah0
dan tidak berulang, tetapif(0)
perlu diatur untuk1
sebagai gantinya, yangor 1
mencukupi (seperti yang akan terjadi+0**n
).sumber
M|sgL-Gd<ShHG1gQ0
Mathematica, 59 byte
Berdasarkan pada program Mathematica pada OEIS oleh Jean-François Alcover.
sumber
1/(1-x/(1-x^2/(1-x^3/(1-x^4/(1-x^5/(...))))))
.Haskell,
6048 byteTerima kasih kepada @nimi karena menyediakan solusi yang jauh lebih singkat!
Versi lama.
Fungsi yang menghitung nilainya adalah
s
, penerapan rumus rekursif yang ditemukan di sini: https://oeis.org/A005169sumber
t (n-p) q
. Golf tips: menggunakan operator infiks untukt
, menukar penjaga dan menggunakanmap
bukannya daftar pemahaman:n#p|p>n=0|p<n=sum$map((n-p)#)[1..p+1]|1<2=1
.s
menjadis=(#1)
, tetapi Anda tidak harus memberikan fungsi utama nama sama sekali, jadi(#1)
sudah cukup. 48 byte#
dan di$
sini pertama =)#
adalah pengguna didefinisikan fungsi infiks seperti+
,*
, dll yang telah ditetapkan fungsi infiks.$
adalah cara lain untuk menyesuaikan prioritas (selain tanda kurung)f (g (h x))
->f$g$h x
atau dalam kasus kamisum(map(...)[...])
->sum$map(...)[...]
.Haskell, 43 byte
Lihat jawaban Python untuk penjelasan.
Panjang yang sama dengan
min
alih - alihtake
:sumber
Pyth,
2120 byteCobalah online. Suite uji.
Ini adalah implementasi langsung dari rumus rekursif pada halaman OEIS , seperti jawaban Matlab .
sumber
Matlab,
115105 byteImplementasi formula rekursif ditemukan di sini: https://oeis.org/A005169
sumber
Julia,
4443 byteIni menggunakan rumus rekursif pada OEIS.
Penjelasan
Adakah yang memperhatikan bahwa pemogokan melalui 44 adalah hal biasa?
sumber
Python 3, 88 byte
sumber
JavaScript (ES6), 63
Menerapkan rumus rekursif di halaman OEIS
sumber