Вступление
Последовательность Gijswijt ( A090822 ) классно действительно, очень медленно. Проиллюстрировать:
- Первые 3 появляются в 9-м семестре (хорошо).
- Первые 4 появляются в 220-м семестре (далеко, но выполнимо).
- Первые 5 появляются в (приблизительно) 10 ^ (10 ^ 23) -ом члене (просто нет).
- Никто на самом деле даже не знает, где первые 6 ... подозревается, что это на ...
2 ^ (2 ^ (3 ^ (4 ^ 5))) -й срок.
Вы можете предположить, что вам не придется иметь дело с двузначным числом.
Последовательность генерируется так:
- Первый член - 1.
- Каждый термин после этого представляет собой количество повторяющихся «блоков», предшествующих ему (если имеется несколько повторяющихся «блоков», используется наибольшее количество повторяющихся блоков).
Чтобы уточнить, вот несколько первых терминов.
1 -> 1, 1
(один повторяющийся блок ( 1
), поэтому записанная цифра равна 1
)
1, 1 -> 1, 1, 2
(два повторяющихся блока ( 1
), поэтому записанная цифра равна 2
)
1, 1, 2 -> 1, 1, 2, 1
(один повторяющийся блок ( 2
или 1, 1, 2
), поэтому записанная цифра 1
)
1, 1, 2, 1 -> 1, 1, 2, 1, 1
(вы поняли)
1, 1, 2, 1, 1 -> 1, 1, 2, 1, 1, 2
1, 1, 2, 1, 1, 2 -> 1, 1, 2, 1, 1, 2, 2
(два повторяющихся блока ( 1, 1, 2
), поэтому записанная цифра равна 2
)
задача
Ваша задача, как указано в вопросе, сгенерировать n цифр последовательности Gijswijt.
инструкции
- Ввод будет целым числом
n
. - Ваш код может выводить цифры в любой форме (список, несколько выходов и т. Д.).
Это код гольф, поэтому выигрывает самый короткий код в байтах.
._
функцию и другие полезные функции в Pyth.CJam,
33313027 байтовСпасибо Питеру Тейлору за сохранение 1 байта.
Проверьте это здесь.
объяснение
источник
CJam (
30 29 2724 байта)Онлайн демо
Это очень совместные усилия с Мартином.
e`
) для определения повторений принадлежит МартинуW$
для упрощения управления стека$W>+
специальный регистр, как объяснено в рассечении нижеМой первый 30-байтовый подход:
Онлайн демо
рассечение
источник
Haskell, 97 байт
Третья строка определяет анонимную функцию, которая принимает целое число и возвращает список целых чисел. Посмотрите это в действии.
объяснение
Вспомогательная функция
f
создает последовательность в обратном порядке, рекурсивно проверяя, начинается ли предыдущая последовательность с повторного блока.k
количество повторений иp
длина блока.источник
Pyth,
4138 байтПопробуйте онлайн!
источник
Сетчатка ,
6660 байтВвод представляет собой унарное целое число, используемое
!
в качестве цифры (хотя это можно изменить на любой другой нечисловой символ). Вывод - это просто строка цифр.Попробуйте онлайн! (В качестве альтернативы для удобства приведена версия с десятичным вводом. )
Для целей тестирования, это может быть ускорено много с небольшой модификацией, которая позволяет тестировать ввод 220 в течение одной минуты:
Попробуйте онлайн! ( Десятичная версия. )
Если вы хотите протестировать еще большие числа, лучше просто набрать им массивный ввод и поставить
:
после начального+
. Это заставит Retina печатать текущую последовательность каждый раз, когда она заканчивает вычисление новой цифры (со всеми цифрами, сдвинутыми по одной).объяснение
Решение состоит из одной подстановки регулярного выражения, которая применяется ко входу несколько раз, пока результат не перестанет изменяться, что в этом случае происходит из-за того, что регулярное выражение больше не совпадает. В
+
начале вводит этот цикл. Это1
предел, который говорит Retina только о замене первого соответствия (это относится только к самой первой итерации). На каждой итерации этап заменяет одну!
(слева) следующей цифрой последовательности.Как обычно, если вам нужен учебник по балансировке групп, я отсылаю вас к моему SO-ответу .
Вот аннотированная версия регулярного выражения. Обратите внимание, что цель состоит в том, чтобы захватить максимальное количество повторяющихся блоков в группе
1
.Наконец, после того, как все это сделано, мы записываем обратно
$1
(тем самым удаляя!
), а также количество перехватов в группе,$#1
которым соответствует максимальное количество повторений.источник
Рубин, 84 байта
Ответ Retina вдохновил меня сделать решение на основе регулярных выражений, чтобы найти лучшую последовательность вместо подсчета последовательности в массиве, но с меньшим количеством гениальности (отрицательные взгляды с квантификаторами не разрешены в Ruby, поэтому я сомневаюсь Я мог бы в любом случае напрямую перенести ответ Retina)
Учитывая уже сгенерированную последовательность
s
, она отображает всеi
от1
доs.length
(n
использовалась в этом случае для сохранения байтов с тех порn>=s.length
), а затем использует это регулярное выражение, чтобы помочь вычислить количество повторений подпоследовательности с длинойi
:Если совпадение найдено этой длины, он вычисляет количество повторений путем деления длины данного матча
$&
поi
, длина подпоследовательности; если совпадений не найдено, оно рассматривается как1
. Затем функция находит максимальное количество повторений из этого сопоставления и добавляет это число в конец строки.источник