Підраховуйте циклічно самоописуючі списки


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 s йде пробіг довжиною 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. Кудос.
Спарр

Мені трохи сумно, що визначення не включає списки, де перший і останній елемент однакові, і вважається однією і тією ж групою, як вони були, якби список насправді був циклом без чіткого початку / кінця.
Спарр

Це код-гольф, тому я думаю, що визначення циклічного само опису є цікавішим (рішення швидше виконувати) - якщо немає іншого способу, крім генерування всіх списків та підрахунку.
користувач202729

Існує алгоритм багаточленного часу, але це досить складно запрограмувати і, безумовно, не настільки вибагливий, як рішення, яке генерує та перевіряє всі можливі списки.
користувач202729

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

Відповіді:



1

Желе , 18 байт

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

Спробуйте в Інтернеті!

Ідея: Кожен циклічно самоописуючий список може бути описаний як список значень для кожного блоку, і ми можемо вивести довжини зі значень. Зауважте, що два сусідніх значення повинні бути різними. Звичайно, їх може бути не більше nблоків, а довжина кожного блоку - не більше n.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.