Cuente listas cíclicamente autodescriptivas

19

Listas cíclicamente autodescriptivas

Una lista L de enteros positivos se autodescribe cíclicamente , si se cumplen las siguientes condiciones.

  1. L no está vacío.
  2. El primer y último elemento deL son diferentes.
  3. Si divide en ejecuciones de elementos iguales, el elemento de cada ejecución es igual a la longitud de la próxima ejecución, y el elemento de la última ejecución es igual a la longitud de la primera ejecución.L

Por ejemplo, considere . No está vacío, y el primer y el último elemento son diferentes. Cuando lo dividimos en carreras, obtenemos .L=[1,1,1,2,3,3,1,1,1,3][[1,1,1],[2],[3,3],[1,1,1],[3]]

  • La primera ejecución es una ejecución de s, y la longitud de la siguiente ejecución, , es 11[2]1 .
  • La segunda ejecución es una ejecución de 2 s, y la duración de la siguiente ejecución, [3,3] , es 2 .
  • La tercera ejecución es una ejecución de 3 s, y la duración de la siguiente ejecución, [1,1,1] , es 3 .
  • La cuarta ejecución es una ejecución de 1 s, y la duración de la siguiente ejecución, [3] , es 1 .
  • Finalmente, la última ejecución es una ejecución de 3 s, y la duración de la primera ejecución, [1,1,1] , es 3 .

Esto significa que L es una lista cíclicamente autodescriptiva.

Para un no ejemplo, la lista no se autodescribe cíclicamente, ya que una serie de s es seguida por una serie de longitud . La lista tampoco se autodescribe cíclicamente, ya que la última ejecución es una ejecución de s, pero la primera ejecución tiene una longitud de .[3,2,2,2,1,4,1,1,1]21[2,2,4,4,3,3,3,3]32

La tarea

En este desafío, su entrada es un número entero . Su salida será el número de listas cíclicamente autodescriptivas cuya suma es igual a . Por ejemplo, debería dar como resultado , ya que las listas autodescriptivas cíclicas cuya suma es son , , y . El conteo de bytes más bajo gana, y se aplican otras reglas estándar de .n1nn=848[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][4,1,1,1,1]

Estos son los valores de salida correctos para las entradas de a :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
fuente
44
Un giro inesperado! A mitad de la descripción esperaba la tarea menos interesante de determinar si una lista era CSD. Prestigio.
Sparr el
Estoy un poco triste porque la definición no incluye listas donde el primer y el último elemento son iguales, y cuentan como el mismo grupo, como lo harían si la lista fuera en realidad un ciclo sin un inicio / final distinto.
Sparr
Este es el código de golf, por lo que creo que determinar si una lista se autodescribe cíclicamente es más interesante (soluciones más rápidas de ejecutar), si no hay otro camino que no sea generar todas las listas y contar.
user202729
Existe un algoritmo de tiempo polinómico, pero es bastante difícil de programar y definitivamente no es tan complejo como una solución que genera y verifica todas las listas posibles.
user202729
2
Cada número par, excepto 2, se puede obtener como n,1,...,1, y cada número impar mayor que 13 se puede obtener concatenando 3,2,2,2,1,1a un número par. La prueba de que 13 es imposible se deja como un ejercicio para el lector.
Nitrodon el

Respuestas:

6

Haskell , 75 bytes

¡Gracias Ørjan por guardar un 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]]

Pruébalo en línea!

El problema es equivalente a:

¿De cuántas maneras se puede escribir n como i=0kaiai+1 con aiN,aiai+1,a0=ak

H.PWiz
fuente
1
76
Ørjan Johansen el
1

Jalea , 18 bytes

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

Pruébalo en línea!

Idea: cada lista de autodescripción cíclica se puede describir como una lista de valores para cada bloque, y podemos deducir las longitudes de los valores. Tenga en cuenta que dos valores adyacentes deben ser diferentes. Por supuesto, puede haber como máximo nbloques y la longitud de cada bloque es como máximo n.

usuario202729
fuente
1

Haskell, 118 105 103 bytes

Editar: -13 bytes gracias a @ Ørjan Johansen, -2 bytes gracias a @ 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]]

Pruébalo en línea!

nimi
fuente
Factor a cabo con el mismo truco que mostró H.PWiz.
Ørjan Johansen el
Te perdiste (i#d)n->i#d$n
H.PWiz