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


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 .

Завдання

У цьому виклику ваш вхід - ціле число n≥1 . Вашим результатом має бути кількість циклічно самоописуваних списків, сума яких дорівнює 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.