Генерация последовательности Давенпорта-Шинзеля

11

Фон

Последовательность Давенпорта-Шинцеля имеет два целых положительных параметра dи n. Обозначим множество всех последовательностей Давенпорта-Шинцеля для заданных параметров через DS(d,n).

Рассмотрим все последовательности натуральных чисел 1до n, включительно, которые удовлетворяют:

  • Нет двух последовательных чисел в последовательности.
  • Нет подпоследовательности (не обязательно последовательной) длины больше чем d, которая чередуется между двумя различными числами.

Пусть Lобозначают максимальную длину такой последовательности ( с учетом dи n). Тогда DS(d,n)это множество всех таких последовательностей с длиной L.

Некоторые примеры могут помочь. Пусть d = 4, n = 3. Самые длинные возможные последовательности с этими ограничениями имеют L = 8. Таким образом, следующее является членом DS(4,3):

[1, 2, 1, 3, 1, 3, 2, 3]

Нет последовательных идентичных чисел и есть чередующиеся подпоследовательности длины 4, но не более длинные:

 1  2  1           2
 1  2        1     2
 1        3  1  3
 1        3  1        3
    2     3        2  3
    2           3  2  3
       1  3  1  3
       1  3  1        3

Следующие примеры не в DS(4,3):

[1, 2, 2, 3, 1, 3, 2, 3]  # Two consecutive 2's.
[1, 2, 1, 3, 1, 3, 2, 1]  # Contains alternating subsequences of length 5.
[1, 2, 1, 3, 1, 3, 2]     # Longer valid sequences for d = 4, n = 3 exist.

Для получения дополнительной информации см. MathWorld и OEIS и список литературы, который они перечисляют.

Соревнование

Даны два натуральных числа, nи dсгенерировать любую последовательность Давенпорта-Шинзеля в DS(d,n). Обратите внимание, что они, как правило, не уникальны, поэтому выведите любой допустимый результат.

Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции, и возвращая результат из функции или печатая его в STDOUT (или ближайшую альтернативу).

Вы можете использовать любую удобную, однозначную строку или формат списка для вывода.

Это код гольф, поэтому выигрывает самое короткое представление (в байтах).

Длина последовательности

Поскольку последовательности не являются уникальными, в этой задаче нет особого применения для отдельных примеров. Тем не менее, две общие проблемы достоверности довольно легко проверить для любого вывода, поэтому основной вопрос заключается в том, имеет ли последовательность правильную длину (или есть более длинная действительная последовательность). Таким образом, вот список известных 1 L для данного dи n:

 \ 
 d\n 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
   \-----------------------------------------------------------
 1 | 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 2 | 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 3 | 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
 4 | 1  4  8 12 17 22 27 32 37 42 47 53 58 64 69 75 81 86 92 98
 5 | 1  5 10 16 22 29 ...
 6 | 1  6 14 23 34 ...
 7 | 1  7 16 28 41 ...
 8 | 1  8 20 35 53 ...
 9 | 1  9 22 40 61 ...
10 | 1 10 26 47 73 ...

Вы не должны жестко закодировать любую информацию из этой таблицы в свое представление.

1 Эта таблица с 1994 года, так что , возможно, более значительным прогресс с тех пор, но я сомневаюсь , что любое представление будет иметь возможность обрабатывать даже большие записи в этой таблице в разумном количестве времени.

Мартин Эндер
источник

Ответы:

2

Python 2: 172

from itertools import*
d,n=input();S=[[1]]
for s in S:
 for v in range(1,n+1):
  if(v!=s[-1])*all(w[2:]!=w[:-2]for w in combinations(s+[v],d+1)):S.append(s+[v])
print S[-1]

Ввод просто в формате 4, 3.

Я итеративно создаю все последовательности, которые начинаются с 1двух свойств и удовлетворяют им, и сохраняю их в S. Поскольку я создаю их в отсортированном порядке (отсортирован по длине [и по значениям]), последняя запись должна быть последовательностью Давенпорта-Шинцеля. Используется тот факт, что вы можете перебирать список, добавляя его в список.

Jakube
источник
Если вы уже используете python2, вы можете сохранить байт, объединив (что я предполагаю, что два пробела) в одну вкладку. Поправьте меня если я ошибаюсь.
Захари