Подсчет циклически самоописывающих списков


19

Циклически описываемые списки

Список натуральных чисел L циклически самоописывается , если выполняются следующие условия.

  1. L непуста.
  2. Первый и последний элементы L различны.
  3. Если вы разбили L на серии одинаковых элементов, элемент каждого цикла равен длине следующего цикла, а элемент последнего цикла равен длине первого цикла.

Например, рассмотрим L=[1,1,1,2,3,3,1,1,1,3] . Это непусто, и первый и последний элементы разные. Когда мы разбиваем его на части, мы получаем [[1,1,1],[2],[3,3],[1,1,1],[3]] .

  • Первый цикл - 1 с, а длина следующего [2] - 1 .
  • Второй цикл составляет 2 с, а длина следующего цикла [3,3] - 2 .
  • Третий цикл - это цикл 3 с, а длина следующего цикла [1,1,1] - 3 .
  • Четвертый цикл - 1 с, а продолжительность следующего [3] - 1 .
  • Наконец, последний цикл - это цикл 3 с, а длина первого цикла [1,1,1] - 3 .

Это означает, что L является циклически самоописывающим списком.

Для примера, не являющегося примером, список [3,2,2,2,1,4,1,1,1] не является циклически самоописывающимся, поскольку за серией 2 с следует серия длиной 1 . Список [2,2,4,4,3,3,3,3] также не имеет циклического самоописания, поскольку последний цикл - это цикл 3 с, но первый цикл имеет длину2 .

Задание

В этом задании вы вводите целое число n1 . Ваш вывод должен быть числом циклически самоописываемых списков, чья сумма равна n . Например, n=8 должно привести к 4 , поскольку циклически самоописываемые списки, чья сумма равна 8 равны [1,1,1,1,4] , [1,1,2,1,1,2] , [2,1,1,2,1,1] и[4,1,1,1,1] . Побеждает меньшее количество байтов, иприменяютсядругие стандартныеправила.

Вот правильные выходные значения для входов от 1 до 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
Неожиданный поворот! В середине описания я ожидал менее интересную задачу - просто определить, является ли список CSD. Престижность.
Спарр

Мне немного грустно, что определение не включает списки, в которых первый и последний элементы совпадают, и считается одной и той же группой, как если бы список был фактически циклом без четко выраженного начала / конца.
Спарр

Это код-гольф, поэтому я думаю, что определение того, является ли список циклическим самоописанием, более интересно (решения быстрее выполняются) - если нет другого способа, кроме генерации всех списков и подсчета.
user202729

Существует алгоритм полиномиального времени, но его довольно сложно программировать, и он определенно не так уж сложен, как решение, которое генерирует и проверяет все возможные списки.
user202729

2
Каждое четное число, кроме 2, может быть получено как n,1,...,1, и каждое нечетное число, большее 13, может быть получено путем сцепления 3,2,2,2,1,1с четным числом. Доказательство невозможности 13 оставлено читателю в качестве упражнения.
Nitrodon

Ответы:



1

Желе , 18 байт

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

Попробуйте онлайн!

Идея: каждый циклически самоописываемый список может быть описан как список значений для каждого блока, и мы можем вывести длины из значений. Обратите внимание, что два соседних значения должны быть разными. Конечно, может быть не более nблоков, а длина каждого блока не более n.


1

Haskell, 118 105 103 байтов

Редактировать: -13 байтов благодаря @ Орджану Йохансену, -2 байта благодаря @ 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]]

Попробуйте онлайн!


Фактор с той же хитростью я показал H.PWiz.
Орджан Йохансен

Вы пропустили (i#d)n->i#d$n
H.PWiz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.