Учитывая N, выведите n-й элемент из ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E',…]?


12

Рассмотрим следующий список:

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».

Критерии победы - длина исходного кода.


3
Не уверен, что получу, когда есть BCили CDEF? Что решает, что мы объединяем, а что нет? Как это бесконечно, если это начинается Aснова после Z(вы имеете в виду в какой-то момент после ABCDEFGHIJKLMNOPQRSTUVWXZтого, как у нас есть ABCDEFGHIJKLMNOPQRSTUVWXZABили что-то?)
Джонатан Аллан

5
Тестовый пример для букв, которые переносятся, приветствуется ( x,y,z,a,b...).
Стьюи Гриффин

7
Я настоятельно рекомендую вам использовать Песочницу в будущем, чтобы улучшить вашу задачу. Там вы будете получать отзывы от других пользователей, чтобы убедиться, что ваша задача подходит для основного сайта PPCG! Лично я бы оставил пост в Песочнице как минимум на 2 дня, чтобы у всех был шанс увидеть этот пост.
JungHwan Мин

2
@JungHwanMin: не в порядке, чтобы бесконечно печатать список. Я бы пропустил возвращение списка целых чисел.
d33tah

4
Что значит "я бы пропустил возвращение списка целых чисел"? Является ли вывод списка целых чисел приемлемым или нет? Если так, то как насчет «Предположим, что после« Z »вы снова получите« A »» - должно ли это быть в случае с этим выходным форматом (после i + 25 мы снова получим i)? (Также обновите сообщение с соответствующей информацией - не оставляйте спецификацию, чтобы быть найденной в комментариях.)
Джонатан Аллан

Ответы:


8

Python 2, 53 байта

x,y=0,1
exec"x^=y-x;y+=x/y;"*input()
print range(x,y)

Попробуйте онлайн!

Подобно этой конструкции с преобразованием x = u-v,y = u


Какое хорошее упрощение! Первое утверждение может быть x^=y-xдля -1 байта.
xnor

@ xнор, да, глупый я
KSab

6

JavaScript (ES6), 59 байт

Мы можем сохранить 2 байта, сделав последовательность 1 проиндексированной и используя упрощение, подобное тому, которое использует KSab :

n=>(x=g=y=>n?g(y+=y==(x^=y-x),n--):x<y?[x++,...g(y)]:[])(1)

Попробуйте онлайн!


JavaScript (ES6), 61 байт

Возвращает список целых чисел без переноса.

n=>(g=v=>n?g(u&-u^v?v*2:!!u++,n--):v?[u-v,...g(v-1)]:[])(u=1)

Попробуйте онлайн!

Основано на конструкции Дональда Кнута. Соответствующая запись OEIS: A182105 .

Как?

Это двухэтапная рекурсивная функция.

Сначала мы строим последовательность определенную как и:(un,vn)(u1,v1)=(1,1)

(un+1,vn+1)={(un+1,1),if (unANDun)=vn(un,2vn),otherwise

Во время второго прохода мы создаем список и в конечном итоге возвращаем его.[unvn,unvn+1,,un]


JavaScript (ES6), 97 байт

Возвращает заглавные буквы.

n=>(s=i='',g=v=>(s+=String.fromCharCode(65+i++%26),n--)?g(u&-u^v?v*2:!!u++):s.substr(u-v,v))(u=1)

Попробуйте онлайн!

Или 91 байт в нижнем регистре.



2

Wolfram Language (Mathematica) , 80 71 байт

Range@#2+#-#2&@@Nest[If[#~BitAnd~-#==#2,{#+1,1},{#,2#2}]&@@#&,{1,1},#]&

Попробуйте онлайн!

Возвращает список целых чисел вместо строки переноса алфавита. 0 индексированные.

Использует OEIS A182105 , благодаря @Arnauld.

Печать списка бесконечно, 54 байта

Do[j=Range@i;#∣i&&Print@j[[-#;;]]&/@(2^j/2),{i,∞}]

Попробуйте онлайн!

1-индексироваться. Версия TIO имеет limвместо того, чтобы предотвратить сбои.




1

Древесный уголь , 45 42 35 байт

FN⊞υ⎇∧›Lυ¹⁼L§υ±¹L§υ±²⁺⊟υ⊟υ§αL⭆υκ⮌⊟υ

Попробуйте онлайн! Ссылка на подробную версию кода. 1-индексироваться. Я не мог найти простую формулу для генерации результата, поэтому я просто следовал процедуре, приведенной в вопросе. Объяснение:

FN

Повторите указанное количество nраз.

⊞υ

Вставьте следующий элемент в предопределенный пустой массив u, рассчитанный как ...

⎇∧›Lυ¹⁼L§υ±¹L§υ±²

... если в нем более одного элемента, uа последние два элемента имеют одинаковую длину ...

⁺⊟υ⊟υ

... затем добавьте предпоследний элемент к последнему элементу (который создает результат в обратном порядке) ...

§αL⭆υκ

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

⮌⊟υ

Возьмите последний элемент u, который является обращенным nэлементом желаемого списка, и неявно выведите обратное.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.