Contar listas auto-descritivas ciclicamente


19

Listas auto-descritivas ciclicamente

Uma lista L de números inteiros positivos é auto-descrita ciclicamente , se as seguintes condições forem válidas.

  1. L não é vazio.
  2. O primeiro e o último elementos de L são diferentes.
  3. Se você dividir L em execuções de elementos iguais, o elemento de cada execução será igual ao comprimento da próxima execução e o elemento da última execução será igual ao comprimento da primeira execução.

Por exemplo, considere L=[1,1,1,2,3,3,1,1,1,3] . Não é vazio, e o primeiro e o último elementos são diferentes. Quando dividimos em rodadas, obtemos [[1,1,1],[2],[3,3],[1,1,1],[3]] .

  • A primeira corrida é uma corrida de 1 s, e o comprimento da próxima corrida, [2] , é 1 .
  • A segunda corrida é uma corrida de 2 s, e o comprimento da próxima corrida, [3,3] , é 2 .
  • A terceira corrida é uma corrida de 3 s, e a duração da próxima corrida, [1,1,1] , é 3 .
  • A quarta corrida é uma corrida de 1 s, e o comprimento da próxima corrida, [3] , é 1 .
  • Finalmente, a última corrida é de 3 s, e o comprimento da primeira, [1,1,1] , é 3 .

Isso significa que L é uma lista auto-descritiva ciclicamente.

Para um não exemplo, a lista [3,2,2,2,1,4,1,1,1] não é auto-descritiva ciclicamente, uma vez que uma execução de 2 s é seguida por uma execução de comprimento 1 . A lista [2,2,4,4,3,3,3,3] também não é auto-descritiva ciclicamente, uma vez que a última execução é uma execução de 3 s, mas a primeira execução tem duração2 .

A tarefa

Neste desafio, sua entrada é um número inteiro n1 . Sua saída deve ser o número de listas auto-descritivas ciclicamente cuja soma é igual a n . Por exemplo, n=8 deve resultar em 4 , pois as listas auto-descritivas ciclicamente cuja soma é 8 são [1,1,1,1,4] , [1,1,2,1,1,2] , [2,1,1,2,1,1] e[4,1,1,1,1] . A menor contagem de bytes vence e outras regras padrão deaplicam.

Aqui estão os valores de saída corretos para entradas de 1 a 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

4
Uma reviravolta inesperada! No meio da descrição, eu esperava a tarefa menos interessante de apenas determinar se uma lista era CSD. Parabéns.
Sparr

Fico um pouco triste que a definição não inclua listas em que o primeiro e o último elemento sejam iguais e conte como o mesmo grupo, como seria se a lista fosse realmente um ciclo sem um início / fim distinto.
Sparr

Isso é código-golfe, então acho que determinar se uma lista é auto-descritiva ciclicamente é mais interessante (soluções mais rápidas de executar) - se não há outra maneira senão gerar todas as listas e contagens.
precisa saber é o seguinte

Existe um algoritmo polinomial de tempo, mas é bastante difícil programar e definitivamente não é tão eficiente quanto uma solução que gera e verifica todas as listas possíveis.
precisa saber é o seguinte

2
Todo número par, exceto 2, pode ser obtido como n,1,...,1, e todo número ímpar maior que 13 pode ser obtido concatenando 3,2,2,2,1,1um número par. A prova de que 13 é impossível é deixada como um exercício para o leitor.
Nitrodon

Respostas:


6

Haskell , 75 bytes

Obrigado Ørjan por salvar um 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]]

Experimente online!

O problema é equivalente a:

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



1

Geléia , 18 bytes

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

Experimente online!

Ideia: Cada lista auto-descritiva ciclicamente pode ser descrita como uma lista de valores para cada bloco, e podemos deduzir os comprimentos dos valores. Observe que dois valores adjacentes devem ser diferentes. Obviamente, pode haver no máximo nblocos e o comprimento de cada bloco é no máximo n.


1

Haskell, 118 105 103 bytes

Edit: -13 bytes graças a @ Ørjan Johansen, -2 bytes graças 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]]

Experimente online!


Fator para fora com o mesmo truque que eu mostrou H.PWiz.
Ørjan Johansen

Você perdeu (i#d)n->i#d$n
H.PWiz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.