Враховуючи 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

@xnor о так, нерозумно мені
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

Мова Вольфрама (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.