Çevrimsel olarak kendini tanımlayan listeleri sayma


19

Döngüsel olarak kendini tanımlayan listeler

Aşağıdaki koşullar geçerliyse, pozitif tamsayıların listesi döngüsel olarak kendi kendini tanımlar .L

  1. L boş değil.
  2. nin ilk ve son elemanları farklıdır.L
  3. L yi eşit elemanların çalışmalarına böldüğünüzde , her çalışmanın öğesi bir sonraki çalışmanın uzunluğuna ve son çalışmanın öğesi ilk çalışmanın uzunluğuna eşit olur.

Örneğin, L=[1,1,1,2,3,3,1,1,1,3] düşünün . Boş değildir ve ilk ve son unsurlar farklıdır. [[1,1,1],[2],[3,3],[1,1,1],[3]] elde ederiz .

  • İlk çalıştırma zincirinin bir parçasıdır 1 s, ve bir sonraki döngüde uzunluğu, [2] , bir 1 .
  • İkinci tur, bir çalışma olan 2 s, ve bir sonraki döngüde uzunluğu, [3,3] , bir 2 .
  • Üçüncü çalışma bir çalışma olan 3 s, ve bir sonraki döngüde uzunluğu, [1,1,1] , bir 3 .
  • Dördüncü çalıştırma zincirinin bir parçasıdır 1 s, ve bir sonraki döngüde uzunluğu, [3] , bir 1 .
  • Son olarak, son çalışma zincirinin bir parçasıdır 3 s ve ilk çalışma uzunluğu, [1,1,1] , bir 3 .

Bu, L nin döngüsel olarak kendini tanımlayan bir liste olduğu anlamına gelir .

Örnek olmayanlar için, [3,2,2,2,1,4,1,1,1] listesi döngüsel olarak kendi kendini tanımlamaz, çünkü 2 saniyelik bir çalışmanın ardından 1 uzunluğundaki bir işlem gelir . [2,2,4,4,3,3,3,3] listesi de döngüsel olarak kendi kendini tanımlamamaktadır, çünkü son çalışma 3 saniyelik bir çalışmadır , ancak ilk çalışma 2 uzunluğuna sahiptir .

Görev

Bu zorlukta, tamsayısıdır . Çıktınız, toplamı eşit olan, döngüsel olarak kendini tanımlayan listelerin sayısı olacaktır . Örneğin, ile sonuçlanmalıdır , periyodik olarak yana olan toplamıdır kendini açıklayan listeleri olan , , ve . En düşük bayt sayısı kazanır ve diğer standart kuralları geçerlidir.n1nn=848[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][4,1,1,1,1]

Burada gelen girişler için doğru çıkış değerleri bulundunuz :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
Beklenmedik bir bükülme! Açıklamanın ortasında, sadece bir listenin CSD olup olmadığını belirleme konusunda daha az ilginç bir görev bekliyordum. Kudos.
Sparr

Tanımın, ilk ve son öğenin aynı olduğu listeleri içermemesi ve listenin aslında farklı bir başlangıç ​​/ bitiş olmadan bir döngü olsaydı olduğu gibi aynı grup olarak sayılmasından biraz üzgünüm.
Sparr

Bu kod golf, bu yüzden bir liste döngüsel olarak kendini tanımlayan olup olmadığını belirlemek daha ilginç olduğunu düşünüyorum (yürütmek için daha hızlı çözümler) - tüm listeleri ve saymak dışında kısa bir yol yoksa.
user202729

Bir polinom zaman algoritması vardır, ancak programlamak oldukça zordur ve kesinlikle olası tüm listeleri üreten ve doğrulayan bir çözüm kadar golfp değildir.
user202729

2
2 dışındaki n,1,...,1her çift sayı, 13'ten büyük olan her tek sayı, çift bir sayıya birleştirilerek elde edilebilir 3,2,2,2,1,1. 13'ün imkansız olduğu kanıtı okuyucu için bir alıştırma olarak bırakılmıştır.
Nitrodon

Yanıtlar:


6

Haskell , 75 bayt

Bir bayt kaydettiğiniz için Ørjan'a teşekkürler!

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]]

Çevrimiçi deneyin!

Sorun şuna eşittir:

Kaç yolları n olarak yazılabilir i=0kaiai+1 ile aiN,aiai+1,a0=ak



1

Jöle , 18 bayt

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

Çevrimiçi deneyin!

Fikir: Her döngüsel olarak kendini tanımlayan liste, her blok için bir değer listesi olarak tanımlanabilir ve uzunlukları değerlerden çıkarabiliriz. İki bitişik değerin farklı olması gerektiğini unutmayın. Tabii ki en fazla nblok olabilir ve her bloğun uzunluğu en fazladır n.


1

Haskell, 118 105 103 bayt

Düzenleme: @ Ørjan Johansen sayesinde -13 bayt, @ H.PWiz sayesinde -2 bayt

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]]

Çevrimiçi deneyin!


H.PWiz'i gösterdiğim aynı hile ile faktör .
Ørjan Johansen

Sen cevapsız (i#d)n> -i#d$n
H.PWiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.