Compter les listes auto-descriptives cycliquement

19

Listes auto-descriptives cycliquement

Une liste d'entiers positifs se décrit de façon cyclique si les conditions suivantes sont réunies.L

  1. L n'est pas vide.
  2. Les premier et dernier éléments de sont différents.L
  3. Si vous divisez en séries d'éléments égaux, l'élément de chaque série est égal à la longueur de la série suivante et l'élément de la dernière série est égal à la longueur de la première série.L

Par exemple, considérons . Il n'est pas vide et les premier et dernier éléments sont différents. Lorsque nous le divisons en séries, nous obtenons .L=[1,1,1,2,3,3,1,1,1,3][[1,1,1],[2],[3,3],[1,1,1],[3]]

  • La première exécution est une exécution de s, et la longueur de l'exécution suivante, , est de .1[2]1
  • La deuxième manche est une course de s, et la longueur de la manche suivante, , est de .2[3,3]2
  • La troisième manche est une course de s, et la longueur de la manche suivante, , est de .3[1,1,1]3
  • Le quatrième cycle est un cycle de s, et la longueur du cycle suivant, , est de .1[3]1
  • Enfin, la dernière série est une série de s et la longueur de la première série, , est de .3[1,1,1]3

Cela signifie que est une liste cycliquement auto-descriptive.L

Pour un non-exemple, la liste n'est pas auto-descriptive cycliquement, puisqu'un passage de s est suivi d'un passage de longueur . La liste , , , , , , n'est pas non plus auto-descriptive cycliquement, puisque la dernière série est une série de s, mais la première série a une longueur de .[3,2,2,2,1,4,1,1,1]21[2,2,4,4,3,3,3,3]32

La tâche

Dans ce défi, votre entrée est un entier . Votre sortie doit être le nombre de listes cycliquement auto-descriptives dont la somme est égale à . Par exemple, devrait donner , car les listes cycliquement auto-descriptives dont la somme est sont , , et . Le nombre d'octets le plus bas gagne et d'autres règles de standard s'appliquent.n1nn=848[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][4,1,1,1,1]

Voici les valeurs de sortie correctes pour les entrées de à :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
Zgarb
la source
4
Une touche inattendue! À mi-chemin de la description, je m'attendais à la tâche moins intéressante de déterminer simplement si une liste était un CSD. Gloire.
Sparr
Je suis un peu triste que la définition n'inclue pas de listes où le premier et le dernier élément sont les mêmes et comptent comme le même groupe, comme ils le feraient si la liste était en fait un cycle sans début / fin distinct.
Sparr
Il s'agit de code-golf, donc je pense que déterminer si une liste est cycliquement auto-descriptive est plus intéressant (solutions plus rapides à exécuter) - s'il n'y a pas d'autre moyen que de générer toutes les listes et de compter.
user202729
Il existe un algorithme de temps polynomial, mais il est assez difficile à programmer et certainement pas aussi golfique qu'une solution qui génère et vérifie toutes les listes possibles.
user202729
2
Chaque nombre pair sauf 2 peut être obtenu en tant que n,1,...,1, et chaque nombre impair supérieur à 13 peut être obtenu en concaténant 3,2,2,2,1,1un nombre pair. La preuve que 13 est impossible est laissée au lecteur comme exercice.
Nitrodon

Réponses:

6

Haskell , 75 octets

Merci Ørjan pour avoir sauvé un octet!

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

Essayez-le en ligne!

Le problème est équivalent à:

Combien de façons n peut-il être écrit comme i=0kaiai+1 avec aiN,aiai+1,a0=ak

H.PWiz
la source
1
76
Ørjan Johansen
1

Gelée , 18 octets

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

Essayez-le en ligne!

Idée: Chaque liste cycliquement auto-descriptive peut être décrite comme une liste de valeurs pour chaque bloc, et nous pouvons déduire les longueurs des valeurs. Notez que deux valeurs adjacentes doivent être différentes. Bien sûr, il peut y avoir au plus des nblocs et la longueur de chaque bloc est au plus n.

user202729
la source
1

Haskell, 118 105 103 octets

Edit: -13 octets grâce à @ Ørjan Johansen, -2 octets grâce à @ 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]]

Essayez-le en ligne!

nimi
la source
Factoriser avec le même truc que je montre H.PWiz.
Ørjan Johansen
Vous avez manqué (i#d)n->i#d$n
H.PWiz