Tujuan
Tujuan dari tantangan ini adalah untuk menghasilkan fungsi n
yang menghitung sejumlah cara untuk membagi n X 1
kisi - kisi menjadi segitiga di mana semua simpul segitiga berada pada titik-titik kisi.
Contoh
Sebagai contoh, ada 14 cara untuk mempartisi kisi 2 x 1, jadi f(2) = 14
melalui partisi berikut ini di
mana partisi memiliki masing-masing 2, 2, 2, 2, 4, dan 2 orientasi berbeda.
Mencetak gol
Ini kode-golf , jadi kode terpendek menang.
code-golf
geometry
combinatorics
grid
Peter Kagey
sumber
sumber
Jawaban:
05AB1E , 13 byte
Pelabuhan @Bubbler 's Jelly jawabannya .
Sangat lambat karena permutasi bawaan.
Cobalah online atau verifikasi empat input pertama .
Penjelasan:
sumber
Haskell ,
60 55 5452 byteSetelah menggambar dan memprogram banyak contoh, terlintas dalam benak saya bahwa ini sama dengan masalah benteng:
Pada dasarnya Anda memiliki garis atas dan bawah dari kisi . Sekarang Anda harus mengisi garis non-horisontal. Setiap segitiga harus memiliki dua garis non-horizontal. Apakah salah satu sisinya merupakan bagian atas atau garis bawah sesuai dengan arah dan panjang Anda akan pergi dalam masalah benteng. Ini adalah OEIS A051708 . Sebagai ilustrasi korespondensi ini, perhatikan contoh-contoh berikut. Di sini garis atas berhubungan dengan gerakan ke atas, sedangkan garis bawah berhubungan dengan gerakan ke kanan.1 × n
Terima kasih @PeterTaylor untuk -6 byte dan @PostLeftGarfHunter untuk -2 byte!
Cobalah online!
sumber
A051708(n+1)
. Jadi saya memposting jawaban yang benar pertama :-PHaskell , 42 byte
Cobalah online!
Implementasi yang cukup langsung yang berulang lebih dari 2 variabel.
Inilah cara kami mendapatkan solusi ini. Mulai dengan kode yang menerapkan formula rekursif langsung:
54 byte
Cobalah online!
Menggunakan interpretasi benteng bergerak flawr ini ,
a%b
adalah jumlah jalur yang mendapatkan benteng dari(a,b)
ke(0,0)
, menggunakan hanya bergerak penurunan koordinat. Langkah pertama mengurangia
atau mengurangib
, menjaga yang lain sama, maka rumus rekursif.49 byte
Cobalah online!
Kita dapat menghindari pengulangan
map(a%)[0..b-1]++map(b%)[0..a-1]
dengan memperhatikan bahwa kedua bagiannya samaa
danb
bertukar. Panggilan tambahana?b
menghitung jalur di mana langkah pertama menuruna
, danb?a
menghitung jalur di mana langkah pertama berkurangb
. Ini pada umumnya berbeda, dan mereka menambaha%b
.Penjumlahan dalam
a?b
juga dapat ditulis sebagai daftar pemahamana?b=sum[a%i|i<-[0..b-1]]
.42 byte
Cobalah online!
Akhirnya, kita menyingkirkan
%
dan hanya menulis rekursi dalam hal?
dengan menggantia%i
dengana?i+i?a
panggilan rekursif.Basis kasus baru menyebabkan ini
?
untuk memberikan output dua kali lipat dari?
pada versi 49-byte, karena dengan0?0=1
, kita akan melakukannya0%0=0?0+0?0=2
. Ini memungkinkan penggunaan definef n=n?n
tanpa mengurangi separuh yang harus kita lakukan.sumber
a%b
menghitung jumlah partisi menggunakan node0,1,...,a
di garis atas, dan anggukan0,1,..,b
di garis bawah. Operatora?b
menghitung jumlah cara Anda dapat menambahkan baris baru dari simpul atasa
jika simpul bawahb
sudah digunakan. (Anda dapat terhubunga
ke semua node[0,1,...,b-1]
, tetapi kemudian Anda harus mengulang untuk masing-masing node .)?
dari 42 byte yang tidak saya miliki, dan yang paling aneh adalah bahwa itu tidak simetris.map...
dengan pemahaman daftar, pada langkah kedua kita cukup tancapkan definisi%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 byte)
Demo online
Ini menggunakan pendekatan Bubbler untuk menjumlahkan permutasi
n
0s dann
1s.Pembedahan
Pendekatan alternatif (28 byte)
Demo online
Pembedahan
Segitiga memiliki satu tepi horizontal dan dua tepi yang menghubungkan garis horizontal. Beri label tepi non-horizontal dengan tupel dari dua x-coord dan urutkan secara leksikografis. Kemudian tepi pertama adalah
(0,0)
, tepi terakhir adalah(n,n)
, dan dua tepi berturut-turut berbeda persis satu dari dua posisi. Ini menghasilkan rekursi sederhana, yang telah saya terapkan menggunakan operator rekursi memoisedj
:Catatan
Ini bukan pertama kalinya saya ingin
fj
didukung di CJam. Di sini itu akan membawa skor menjadi 24 byte juga. Mungkin saya harus mencoba menulis tambalan ...sumber
Jelly ,
1514 byteCobalah online!
-1 byte berdasarkan komentar Peter Taylor.
Gunakan ilustrasi flawr secara langsung, bukan formula yang dihasilkan.
Bagaimana itu bekerja
Ambil setiap rute yang memungkinkan pada kotak persegi. Jumlah cara untuk memindahkan unit L dalam satu arah sebagai benteng adalah
2**(L-1)
. Terapkan ini untuk setiap rute dan jumlah jumlah cara untuk melintasi setiap rute.sumber
Arang ,
4431 bytedicoret 44 masih teratur 44
Cobalah online! Penjelasan: Bekerja dengan menghitung jumlah cara untuk mempartisi trapesium dengan panjang sisi yang berlawanan
m,n
menjadi segitiga yang semuanya terletak pada offset bilangan bulat. Ini hanyalah kasus umum dari ukuran persegi panjangn
dalam pertanyaan. Jumlah partisi diberikan secara rekursif sebagai jumlah dari jumlah partisi untuk semua sisim,0..n-1
dann,0..m-1
. Ini setara dengan masalah umum dari benteng, OEIS A035002 . Kode hanya menghitung jumlah partisi bekerja dari0,0
hinggan,n
menggunakan nilai-nilai yang sebelumnya dihitung sebagai kelanjutannya.Lingkari baris
0..n
.Mulai dengan baris kosong.
Ulangi kolom di baris
0..n
.Ambil baris sejauh ini dan nilai-nilai di baris sebelumnya di kolom saat ini, dan tambahkan jumlah total ke baris saat ini. Namun, jika tidak ada nilai sama sekali, maka gantikan
1
dengan jumlah tersebut.Tambahkan baris yang sudah selesai ke daftar baris sejauh ini.
Keluarkan nilai akhir yang dihitung.
sumber
JavaScript (ES6),
45 4442 byteMenggunakan rumus rekursif yang ditemukan oleh Peter Taylor dan flawr .
Cobalah online!
sumber
Pari / GP , 43 byte
Menurut OEIS , fungsi pembangkit dari urutan ini adalah
Cobalah online!
sumber
Python 3 , 51 byte
Cobalah online!
Port of flawr menjawab
sumber