Рассмотрим следующий список:
expected = [
'A',
'B',
'AB',
'C',
'D',
'CD',
'ABCD',
'E',
'F',
'EF',
'G',
'H',
'GH',
'EFGH',
'ABCDEFGH',
'I',
'J',
'IJ',
'K',
'L',
'KL',
'IJKL',
'M',
'N',
'MN',
'O',
'P',
'OP',
'MNOP',
'IJKLMNOP',
'ABCDEFGHIJKLMNOP',
...
]
Вот один из способов взглянуть на это - вы учитесь писать китайские иероглифы и хотите изучать их все больше и больше, репетируя их по ходу дела. Вы начинаете с A, затем идете с B, тогда уже есть последовательность, которая представляет собой пару из двух, поэтому вы объединяете ее. Затем вы идете с C и D, создаете другую пару, практикуете это. Затем вы репетируете: ABCD. Затем то же самое идет с E до H, затем репетируйте: ABCDEFGH. Список бесконечен.
Цель состоит в том, чтобы сгенерировать и распечатать n-й элемент этого списка, индексы повышаются с нуля. Предположим, что после «Z» вы снова получаете «A».
Критерии победы - длина исходного кода.
BC
илиCDEF
? Что решает, что мы объединяем, а что нет? Как это бесконечно, если это начинаетсяA
снова послеZ
(вы имеете в виду в какой-то момент послеABCDEFGHIJKLMNOPQRSTUVWXZ
того, как у нас естьABCDEFGHIJKLMNOPQRSTUVWXZAB
или что-то?)x,y,z,a,b...
).Ответы:
Python 2, 53 байта
Попробуйте онлайн!
Подобно этой конструкции с преобразованием
x = u-v
,y = u
источник
x^=y-x
для -1 байта.JavaScript (ES6), 59 байт
Мы можем сохранить 2 байта, сделав последовательность 1 проиндексированной и используя упрощение, подобное тому, которое использует KSab :
Попробуйте онлайн!
JavaScript (ES6), 61 байт
Возвращает список целых чисел без переноса.
Попробуйте онлайн!
Основано на конструкции Дональда Кнута. Соответствующая запись OEIS: A182105 .
Как?
Это двухэтапная рекурсивная функция.
Сначала мы строим последовательность определенную как и:( тыN, vN) ( ты1, v1) = ( 1 , 1 )
Во время второго прохода мы создаем список и в конечном итоге возвращаем его.[ тыN- vN, уN- vN+ 1 , … , тыN]
JavaScript (ES6), 97 байт
Возвращает заглавные буквы.
Попробуйте онлайн!
Или 91 байт в нижнем регистре.
источник
Python 2 , 60 байт
Попробуйте онлайн!
Основано на использовании Арнаулдом конструкции Кнута . Условие
u&-u==v
может быть заменено более простым условиемu/v%2>0
или, альтернативноu&v>0
, так какv
это всегда степень 2, котораяu
делится на.источник
Wolfram Language (Mathematica) ,
8071 байтПопробуйте онлайн!
Возвращает список целых чисел вместо строки переноса алфавита. 0 индексированные.
Использует OEIS A182105 , благодаря @Arnauld.
Печать списка бесконечно, 54 байта
Попробуйте онлайн!
1-индексироваться. Версия TIO имеет
lim
вместо того,∞
чтобы предотвратить сбои.источник
Python 2 ,
938982 байтаПопробуйте онлайн!
Возвращает список целых чисел. Аналогично подходу Арнаулда к Javascript .
источник
Желе , 16 байт
Полная программа. Печатает
,
разделенный список целых чисел.источник
Древесный уголь ,
454235 байтПопробуйте онлайн! Ссылка на подробную версию кода. 1-индексироваться. Я не мог найти простую формулу для генерации результата, поэтому я просто следовал процедуре, приведенной в вопросе. Объяснение:
Повторите указанное количество
n
раз.Вставьте следующий элемент в предопределенный пустой массив
u
, рассчитанный как ...... если в нем более одного элемента,
u
а последние два элемента имеют одинаковую длину ...... затем добавьте предпоследний элемент к последнему элементу (который создает результат в обратном порядке) ...
... в противном случае следующую букву можно найти, посчитав, сколько букв мы добавили до сих пор и циклически индексируя в заранее заданный прописной алфавит. (Принимая сумму длины или длину суммы не удается, когда список пуст, и отображение списка в строку сохраняет два байта над специальным регистром пустого списка.)
Возьмите последний элемент
u
, который является обращеннымn
элементом желаемого списка, и неявно выведите обратное.источник