Policz cyklicznie samoopisujące się listy

19

Listy cyklicznie samoopisujące

Lista L dodatnich liczb całkowitych jest cyklicznie samoopisująca , jeśli spełnione są następujące warunki.

  1. L jest niepusty.
  2. Pierwszy i ostatni element L są różne.
  3. Jeśli podzielisz L na przebiegi równych elementów, element każdego biegu jest równy długości następnego biegu, a element ostatniego biegu jest równy długości pierwszego cyklu.

Weźmy na przykład L=[1,1,1,2,3,3,1,1,1,3] . Jest niepusty, a pierwszy i ostatni element są różne. Kiedy dzielimy go na przebiegi, otrzymujemy [[1,1,1],[2],[3,3],[1,1,1],[3]] .

  • Pierwszy przebieg to 1 s, a długość następnego [2] wynosi 1 .
  • Drugi przebieg to 2 s, a długość następnego [3,3] wynosi 2 .
  • Trzeci przebieg to 3 s, a długość następnego [1,1,1] wynosi 3 .
  • Czwarty przebieg to 1 s, a długość następnego [3] wynosi 1 .
  • Wreszcie ostatni przebieg to 3 s, a długość pierwszego [1,1,1] wynosi 3 .

Oznacza to, że L jest cyklicznie samoopisującą się listą.

W przypadku nieprzykładowym lista [3,2,2,2,1,4,1,1,1] nie jest cyklicznie samoopisująca, ponieważ po przebiegu 2 s następuje przebieg o długości 1 . Lista [2,2,4,4,3,3,3,3] również nie jest cyklicznie samoopisująca, ponieważ ostatni bieg jest ciągiem 3 s, ale pierwszy bieg ma długość2 .

Zadanie

W tym wyzwaniu twoja liczba jest liczbą całkowitą n1 . Twój wynik będzie liczbą cyklicznie samoopisujących się list, których suma wynosi n . Na przykład n=8 powinno dawać 4 , ponieważ cyklicznie samoopisujące się listy, których suma wynosi 8 to [1,1,1,1,4] , [1,1,2,1,1,2] , [2,1,1,2,1,1] i[4,1,1,1,1] . Wygrywa najniższa liczba bajtów i obowiązują inne standardowezasady.

Oto prawidłowe wartości wyjściowe dla danych wejściowych od 1 do 50 :

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
Zgarb
źródło
4
Niespodziewany zwrot akcji! W połowie opisu spodziewałem się mniej interesującego zadania polegającego na ustaleniu, czy lista jest CSD. Sława.
Sparr
Trochę mi przykro, że definicja nie obejmuje list, w których pierwszy i ostatni element są takie same i liczą się jako ta sama grupa, tak jak gdyby lista była w rzeczywistości cyklem bez wyraźnego początku / końca.
Sparr
To jest golf golfowy, więc myślę, że ustalenie, czy lista jest cyklicznie samoopisująca, jest bardziej interesujące (rozwiązania szybsze do wykonania) - jeśli nie ma innej drogi niż wygenerowanie wszystkich list i policzenie.
user202729,
Istnieje algorytm wielomianowy, ale jego programowanie jest dość trudne i zdecydowanie nie tak golfowe, jak rozwiązanie generujące i weryfikujące wszystkie możliwe listy.
user202729,
2
Każda liczba parzysta oprócz 2 może być uzyskana jako n,1,...,1, a każda liczba nieparzysta większa niż 13 może być uzyskana poprzez połączenie 3,2,2,2,1,1z liczbą parzystą. Dowód, że 13 jest niemożliwe, pozostawia się czytelnikowi jako ćwiczenie.
Nitrodon,

Odpowiedzi:

6

Haskell , 75 bajtów

Dzięki Ørjan za uratowanie jednego bajtu!

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

Wypróbuj online!

Problem jest równoważny z:

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

H.PWiz
źródło
1
76
Ørjan Johansen
1

Galaretka , 18 bajtów

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

Wypróbuj online!

Pomysł: Każda cyklicznie samoopisująca się lista może być opisana jako lista wartości dla każdego bloku i możemy wydedukować długości z tych wartości. Pamiętaj, że dwie sąsiednie wartości muszą być różne. Oczywiście może być najwyżej nbloków, a długość każdego bloku jest najwyżej n.

użytkownik202729
źródło
1

Haskell, 118 105 103 bajtów

Edycja: -13 bajtów dzięki @ Ørjan Johansen, -2 bajtów dzięki @ 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]]

Wypróbuj online!

nimi
źródło
Z czynnikiem o tej samej sztuczki Pokazałem H.PWiz.
Ørjan Johansen
Przegapiłeś (i#d)n->i#d$n
H.PWiz