N gegeben, n-tes Element von ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E', ...] ausgeben?

12

Betrachten Sie die folgende Liste:

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

Hier ist eine Möglichkeit, es zu betrachten: Sie lernen, wie man chinesische Schriftzeichen schreibt, und Sie möchten immer größere Teile davon lernen und sie währenddessen üben. Sie beginnen mit A, gehen dann mit B, dann gibt es bereits eine Sequenz, die ein Paar von zwei ist, so dass Sie es kombinieren. Dann gehst du mit C und D, machst ein weiteres Paar und übst es. Dann proben Sie: ABCD. Dann geht das selbe mit E bis H, dann probt: ABCDEFGH. Die Liste ist unendlich.

Ziel ist es, ein n-tes Element dieser Liste zu generieren und auszudrucken, wobei die Indizes von Null aufwärts gehen. Angenommen, Sie erhalten nach 'Z' erneut 'A'.

Das Gewinnkriterium ist die Länge des Quellcodes.

d33tah
quelle
3
Ich bin nicht sicher, ob ich es bekomme, wann BCoder CDEF? Was entscheidet, was wir verketten und was nicht? Wie ist es unendlich , wenn es beginnt Awieder nach Z(man an einem gewissen Punkt bedeutet , nachdem ABCDEFGHIJKLMNOPQRSTUVWXZwir haben , ABCDEFGHIJKLMNOPQRSTUVWXZABoder was?)
Jonathan Allan
5
Testfall für Buchstaben, die herumlaufen, ist erwünscht ( x,y,z,a,b...).
Stewie Griffin
7
Ich empfehle dringend, dass Sie die Sandbox in Zukunft verwenden, um Ihre Herausforderung zu verbessern. Dort würden Sie Feedback von Mitbenutzern erhalten, um sicherzustellen, dass Ihre Herausforderung für die Haupt-PPCG-Site geeignet ist! Persönlich würde ich einen Post für mindestens 2 Tage in der Sandbox lassen, damit jeder die Chance hat, den Post zu sehen.
JungHwan Min
2
@JungHwanMin: Nicht OK, um die Liste unendlich zu drucken. Ich würde übergeben, um eine Liste von ganzen Zahlen zurückzugeben.
d33tah
4
Was bedeutet "Ich würde eine Liste von ganzen Zahlen zurückgeben"? Ist die Ausgabe einer Liste von ganzen Zahlen akzeptabel oder nicht? Wenn ja, was ist mit "Angenommen, nach 'Z' wird wieder 'A' angezeigt" - sollte dies bei diesem Ausgabeformat der Fall sein (nach i + 25 wird i erneut angezeigt)? (Aktualisieren Sie auch den Beitrag mit den relevanten Informationen - lassen Sie die Spezifikation nicht in den Kommentaren zu finden.)
Jonathan Allan

Antworten:

8

Python 2, 53 Bytes

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

Probieren Sie es online!

Ähnlich wie bei dieser Konstruktion mit der Transformation x = u-v,y = u

KSab
quelle
Was für eine schöne Vereinfachung! Die erste Anweisung kann x^=y-xfür -1 Byte stehen.
xnor
@ Xnor oh richtig, dumm mich
KSab
6

JavaScript (ES6), 59 Byte

Wir können 2 Bytes einsparen, indem wir die Sequenz 1-indizieren und eine Vereinfachung verwenden, die der von KSab verwendeten ähnelt :

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

Probieren Sie es online!


JavaScript (ES6), 61 Byte

Gibt eine Liste nicht umschließender Ganzzahlen zurück.

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

Probieren Sie es online!

Basierend auf einer Konstruktion von Donald Knuth. Zugehöriger OEIS-Eintrag: A182105 .

Wie?

Dies ist eine zweistufige rekursive Funktion.

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

(un+1,vn+1)={(un+1,1),wenn (unUND-un)=vn(un,2vn),Andernfalls

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


JavaScript (ES6), 97 Byte

Gibt Großbuchstaben zurück.

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)

Probieren Sie es online!

Oder 91 Bytes in Kleinbuchstaben.

Arnauld
quelle
2

Wolfram Language (Mathematica) , 80 71 Bytes

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

Probieren Sie es online!

Gibt eine Liste von Ganzzahlen anstelle einer umschließenden Alphabetzeichenfolge zurück. 0-indiziert.

Verwendet OEIS A182105 , danke an @Arnauld.

Drucken Sie die Liste unbegrenzt, 54 Bytes

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

Probieren Sie es online!

1-indiziert. Die TIO-Version hat limstatt Abstürze zu verhindern.

JungHwan min
quelle
1

Gelee , 16 Bytes

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

13

Volles Programm. Druck ,-separated Liste von ganzen Zahlen.

Erik der Outgolfer
quelle
1

Holzkohle , 45 42 35 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 1-indiziert. Ich konnte keine einfache Formel finden, um das Ergebnis zu generieren, also habe ich einfach das in der Frage angegebene Verfahren befolgt. Erläuterung:

FN

Wiederholen Sie die angegebene Anzahl nMale.

⊞υ

Schieben Sie das nächste Element in das vordefinierte leere Array u, berechnet als ...

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

... wenn mehr als ein Element enthalten ist uund die letzten beiden Elemente die gleiche Länge haben ...

⁺⊟υ⊟υ

... dann füge das vorletzte Element an das letzte Element an (was das Ergebnis in umgekehrter Reihenfolge aufbaut) ...

§αL⭆υκ

... andernfalls kann der nächste Buchstabe gefunden werden, indem die Anzahl der bisher hinzugefügten Buchstaben gezählt und zyklisch in das vordefinierte Großbuchstaben indiziert wird. (Wenn die Liste leer ist und die Liste in eine Zeichenfolge abgebildet wird, werden durch die Angabe der Summe der Länge oder der Länge der Summe zwei Bytes gespart, während eine leere Liste in Sonderzeichen eingeschlossen wird.)

⮌⊟υ

Nehmen Sie das letzte Element von u, das das umgekehrte nElement der gewünschten Liste ist, und drucken Sie implizit das umgekehrte Element aus.

Neil
quelle