Hitung daftar yang menggambarkan diri secara siklis


19

Daftar menggambarkan diri secara siklis

Daftar bilangan bulat positif menggambarkan diri secara siklis , jika kondisi berikut ini berlaku.L

  1. L tidak kosong.
  2. Elemen pertama dan terakhir berbeda.L
  3. Jika Anda membagi menjadi run dari elemen yang sama, elemen dari setiap run sama dengan panjang run berikutnya, dan elemen dari run terakhir sama dengan panjang run pertama.L

Sebagai contoh, pertimbangkan . Itu nonempty, dan elemen pertama dan terakhir berbeda. Ketika kita memecahnya menjadi run, kita mendapatkan .L=[1,1,1,2,3,3,1,1,1,3][[1,1,1],[2],[3,3],[1,1,1],[3]]

  • Run pertama adalah run detik, dan panjang run berikutnya, , adalah .1[2]1
  • Run kedua adalah run detik, dan panjang run berikutnya, , adalah .2[3,3]2
  • Run ketiga adalah run detik, dan panjang run berikutnya, , adalah .3[1,1,1]3
  • Run keempat adalah run detik, dan panjang run berikutnya, , adalah .1[3]1
  • Akhirnya, putaran terakhir adalah putaran detik, dan panjang putaran pertama, , adalah .3[1,1,1]3

Ini berarti bahwa adalah daftar yang menggambarkan dirinya secara siklis.L

Sebagai contoh, daftar tidak menggambarkan diri secara siklikal, karena run s diikuti oleh run of length . Daftar juga tidak menggambarkan secara siklikal, karena putaran terakhir adalah putaran detik, tetapi putaran pertama memiliki panjang .[3,2,2,2,1,4,1,1,1]21[2,2,4,4,3,3,3,3]32

Tugas

Dalam tantangan ini, input Anda adalah bilangan bulat . Output Anda akan menjadi jumlah daftar yang menggambarkan diri secara siklis yang jumlahnya sama dengan . Sebagai contoh, harus menghasilkan , karena daftar yang menggambarkan diri secara siklis dengan jumlah adalah , , dan . Hitungan byte terendah menang, dan aturan standar lainnya berlaku.n1nn=848[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][4,1,1,1,1]

Berikut adalah nilai output yang benar untuk input dari hingga :150

1 -> 0
2 -> 0
3 -> 0
4 -> 2
5 -> 0
6 -> 2
7 -> 0
8 -> 4
9 -> 0
10 -> 6
11 -> 6
12 -> 12
13 -> 0
14 -> 22
15 -> 10
16 -> 32
17 -> 16
18 -> 56
19 -> 30
20 -> 96
21 -> 56
22 -> 158
23 -> 112
24 -> 282
25 -> 198
26 -> 464
27 -> 364
28 -> 814
29 -> 644
30 -> 1382
31 -> 1192
32 -> 2368
33 -> 2080
34 -> 4078
35 -> 3844
36 -> 7036
37 -> 6694
38 -> 12136
39 -> 12070
40 -> 20940
41 -> 21362
42 -> 36278
43 -> 37892
44 -> 62634
45 -> 67154
46 -> 108678
47 -> 118866
48 -> 188280
49 -> 209784
50 -> 326878

4
Pelintiran yang tak terduga! Di tengah-tengah deskripsi saya mengharapkan tugas yang kurang menarik hanya menentukan apakah daftar itu CSD. Pujian.
Sparr

Saya sedikit sedih bahwa definisi tidak termasuk daftar di mana elemen pertama dan terakhir adalah sama, dan dihitung sebagai kelompok yang sama, seperti yang akan mereka lakukan jika daftar itu benar-benar sebuah siklus tanpa awal / akhir yang berbeda.
Sparr

Ini adalah kode-golf, jadi saya pikir menentukan apakah suatu daftar secara otomatis menggambarkan lebih menarik (solusi lebih cepat untuk dieksekusi) - jika tidak ada cara lain selain menghasilkan semua daftar dan menghitung.
user202729

Ada algoritme waktu polinomial, tetapi cukup sulit untuk memprogram dan jelas bukan golf seperti solusi yang menghasilkan dan memverifikasi semua daftar yang mungkin.
user202729

2
Setiap bilangan genap kecuali 2 dapat diperoleh sebagai n,1,...,1, dan setiap bilangan ganjil lebih besar dari 13 dapat diperoleh dengan menggabungkan 3,2,2,2,1,1ke bilangan genap. Bukti bahwa 13 tidak mungkin dibiarkan sebagai latihan bagi pembaca.
Nitrodon

Jawaban:


6

Haskell , 75 byte

Terima kasih Ørjan karena menyimpan satu byte!

g n=sum[x#n|x<-[1..n],let a#n=sum$[b#(n-a*b)|b<-[1..n],a/=b]++[0^n^2|a==x]]

Cobalah online!

Masalahnya setara dengan:

ni=0kaiai+1aiN,aiai+1,a0=ak



1

Jelly , 18 byte

ṗⱮ¹Ẏ;ḷ/$€IẠ$Ƈ×Ɲ€§ċ

Cobalah online!

Ide: Setiap daftar yang menggambarkan diri secara siklis dapat digambarkan sebagai daftar nilai untuk setiap blok, dan kita dapat menyimpulkan panjang dari nilai-nilai tersebut. Perhatikan bahwa dua nilai yang berdekatan harus berbeda. Tentu saja bisa paling banyak nblok dan panjang setiap blok paling banyak n.


1

Haskell, 118 105 103 byte

Sunting: -13 byte terima kasih kepada @ Ørjan Johansen, -2 byte terima kasih kepada @ H.PWiz

g s=sum[b#a$s|b<-[1..s],a<-[1..s],let(d#l)s|d==a,d/=b,l*d==s=1|n<-s-d*l=sum[i#d$n|i<-[1..s],d/=i,n>=0]]

Cobalah online!


Faktor keluar dengan trik yang sama saya menunjukkan H.PWiz.
Ørjan Johansen

Anda melewatkan (i#d)n->i#d$n
H.PWiz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.