Biorąc pod uwagę N, wyślij n-ty element z [„A”, „B”, „AB”, „C”, „D”, „CD”, „ABCD”, „E”,…]?

12

Rozważ następującą listę:

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',
...
]

Oto jeden ze sposobów, aby na to spojrzeć - uczysz się pisać chińskie znaki i chcesz nauczyć się coraz większych ich fragmentów, ćwicząc je podczas podróży. Zaczynasz od A, potem B, a potem jest już sekwencja złożona z dwóch, więc ją połączysz. Następnie idź z C i D, stwórz kolejną parę, ćwicz ją. Następnie ćwiczysz: ABCD. To samo dotyczy E do H, a następnie ćwiczyć: ABCDEFGH. Lista jest nieskończona.

Celem jest wygenerowanie i wydrukowanie n-tego elementu tej listy, indeksów rosnących od zera. Załóżmy, że po „Z” znów dostajesz „A”.

Kryterium wygranej to długość kodu źródłowego.

d33tah
źródło
3
Nie jestem pewien, czy to rozumiem, kiedy jest BClub CDEF? Co decyduje o tym, co łączymy, a co nie? Jak to jest nieskończone, jeśli zaczyna się od Anowa po Z(masz na myśli w pewnym momencie po tym ABCDEFGHIJKLMNOPQRSTUVWXZ, ABCDEFGHIJKLMNOPQRSTUVWXZABczy coś?)
Jonathan Allan
5
Doceniany jest przypadek testowy na owijające się litery ( x,y,z,a,b...).
Stewie Griffin,
7
Zdecydowanie zalecamy korzystanie z piaskownicy w przyszłości, aby poprawić swoje wyzwanie. Tam otrzymujesz informacje zwrotne od innych użytkowników, aby upewnić się, że Twoje wyzwanie jest odpowiednie dla głównej witryny PPCG! Osobiście zostawiłbym post w piaskownicy na co najmniej 2 dni, aby każdy miał szansę go zobaczyć.
JungHwan Min
2
@JungHwanMin: nie OK, aby nieskończenie wydrukować listę. Zdałbym, zwracając listę liczb całkowitych.
d33tah
4
Co oznacza „przekazałbym listę liczb całkowitych”? Czy wyjście z listy liczb całkowitych jest dopuszczalne, czy nie? Jeśli tak, to co powiesz na „Załóżmy, że po„ Z ”znów dostajesz„ A ”- czy tak powinno być w przypadku tego formatu wyjściowego (po i + 25 otrzymujemy i ponownie)? (Również zaktualizuj post za pomocą odpowiednich informacji - nie pozostawiaj specyfikacji w komentarzach.)
Jonathan Allan

Odpowiedzi:

8

Python 2, 53 bajty

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

Wypróbuj online!

Podobnie do tej konstrukcji z transformacją x = u-v,y = u

KSab
źródło
Cóż za miłe uproszczenie! Pierwsza instrukcja może dotyczyć x^=y-x-1 bajtów.
xnor
@xnor oh racja, głupiutki
KSab
6

JavaScript (ES6), 59 bajtów

Możemy zaoszczędzić 2 bajty, tworząc sekwencję 1 indeksowaną i stosując uproszczenie podobne do tego używanego przez KSab :

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

Wypróbuj online!


JavaScript (ES6), 61 bajtów

Zwraca listę nie zawijających liczb całkowitych.

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

Wypróbuj online!

Na podstawie konstrukcji Donalda Knutha. Powiązany wpis OEIS: A182105 .

W jaki sposób?

Jest to dwustopniowa funkcja rekurencyjna.

(un,vn)(u1,v1)=(1,1)

(un+1,vn+1)={(un+1,1),Jeśli (unI-un)=vn(un,2)vn),Inaczej

[un-vn,un-vn+1,,un]


JavaScript (ES6), 97 bajtów

Zwraca zawijanie wielkich liter.

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)

Wypróbuj online!

Lub 91 bajtów małymi literami.

Arnauld
źródło
2

Wolfram Language (Mathematica) , 80 71 bajtów

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

Wypróbuj online!

Zwraca listę liczb całkowitych zamiast zawijanego ciągu alfabetu. 0-indeksowane.

Wykorzystuje OEIS A182105 , dzięki @Arnauld.

Drukowanie listy w nieskończoność, 54 bajty

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

Wypróbuj online!

1-indeksowany. Wersja TIO ma limzamiast zapobiegać awariom.

JungHwan Min
źródło
1

Galaretka , 16 bajtów

1;ẎṀ+ƊẎQṭƊƊ¡ị@‘Ṿ

13

Pełny program Wyświetla ,oddzielną listę liczb całkowitych.

Erik the Outgolfer
źródło
1

Węgiel drzewny , 45 42 35 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. 1-indeksowany. Nie mogłem znaleźć prostej formuły do ​​wygenerowania wyniku, więc po prostu zastosowałem się do procedury podanej w pytaniu. Wyjaśnienie:

FN

Powtórz podaną liczbę nrazy.

⊞υ

Wciśnij następny element do predefiniowanej pustej tablicy u, obliczonej jako ...

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

... jeśli jest więcej niż jeden element, ua ostatnie dwa elementy mają tę samą długość ...

⁺⊟υ⊟υ

... następnie dodaj przedostatni element do ostatniego elementu (który tworzy wynik w odwrotnej kolejności) ...

§αL⭆υκ

... w przeciwnym razie można znaleźć następną literę, licząc, ile liter dodaliśmy do tej pory i cyklicznie indeksując do predefiniowanego dużego alfabetu. (Przyjmowanie sumy długości lub długości sumy kończy się niepowodzeniem, gdy lista jest pusta, a mapowanie listy na ciąg oszczędza dwa bajty na specjalnym umieszczeniu pustej listy.)

⮌⊟υ

Weź ostatni element u, który jest odwrócony nth żądanej listy, i niejawnie wydrukuj odwrotną stronę.

Neil
źródło