Dato N, output n-esimo elemento di ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E', ...]?


12

Considera il seguente elenco:

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

Ecco un modo per vederlo: stai imparando a scrivere caratteri cinesi e vuoi imparare pezzi sempre più grandi di loro, provandoli mentre procedi. Inizi con A, poi vai con B, quindi c'è già una sequenza che è una coppia di due, quindi la combini. Quindi vai con C e D, creane un'altra coppia, esercitati. Quindi provi: ABCD. Quindi lo stesso vale con E fino a H, quindi prova: ABCDEFGH. L'elenco è infinito.

L'obiettivo è generare e stampare un n-esimo elemento di questo elenco, con indici che salgono da zero. Supponi che dopo 'Z', ottieni di nuovo 'A'.

Il criterio vincente è la lunghezza del codice sorgente.


3
Non sono sicuro di averlo, quando è BCo CDEF? Cosa decide cosa concateniamo e cosa no? Come è infinito se ricomincia da Acapo dopo Z(vuoi dire ad un certo punto dopo ABCDEFGHIJKLMNOPQRSTUVWXZche abbiamo ABCDEFGHIJKLMNOPQRSTUVWXZABo qualcosa del genere?)
Jonathan Allan,

5
È apprezzato il test case per le lettere che avvolgono ( x,y,z,a,b...).
Stewie Griffin,

7
Consiglio vivamente di utilizzare Sandbox in futuro per migliorare la tua sfida. Lì, riceveresti feedback dagli altri utenti per assicurarti che la tua sfida sia adatta al sito PPCG principale! Personalmente, lascerei un post nella Sandbox per almeno 2 giorni in modo che tutti abbiano la possibilità di vedere il post.
JungHwan Min

2
@JungHwanMin: non OK per stampare all'infinito l'elenco. Passerei restituendo un elenco di numeri interi.
d33tah,

4
Che cosa significa "Passerei restituendo un elenco di numeri interi"? L'output di un elenco di numeri interi è accettabile o no? Se è così, che dire di "Supponi che dopo 'Z', ottieni di nuovo 'A'", dovrebbe essere questo il caso di questo formato di output (dopo i + 25 otteniamo di nuovo)? (Aggiorna anche il post con le informazioni pertinenti - non lasciare le specifiche che si trovano nei commenti.)
Jonathan Allan,

Risposte:


8

Python 2, 53 byte

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

Provalo online!

Simile a questa costruzione con la trasformazione x = u-v,y = u


Che bella semplificazione! La prima istruzione può essere x^=y-xper -1 byte.
xnor

@xnor oh giusto, sciocco me
KSab

6

JavaScript (ES6), 59 byte

Possiamo salvare 2 byte rendendo la sequenza 1 indicizzata e usando una semplificazione simile a quella usata da KSab :

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

Provalo online!


JavaScript (ES6), 61 byte

Restituisce un elenco di numeri interi non a capo.

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

Provalo online!

Basato su una costruzione di Donald Knuth. Voce OEIS correlata: A182105 .

Come?

Questa è una funzione ricorsiva in due fasi.

Costruiamo prima la sequenza definita come e:(un,vn)(u1,v1)=(1,1)

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

Durante il secondo passaggio, costruiamo l'elenco e alla fine lo restituiamo.[unvn,unvn+1,,un]


JavaScript (ES6), 97 byte

Restituisce avvolgendo lettere maiuscole.

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)

Provalo online!

O 91 byte in minuscolo.



2

Wolfram Language (Mathematica) , 80 71 byte

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

Provalo online!

Restituisce un elenco di numeri interi anziché una stringa di avvolgimento dell'alfabeto. 0-indicizzati.

Utilizza OEIS A182105 , grazie a @Arnauld.

Stampa l'elenco a tempo indeterminato, 54 byte

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

Provalo online!

1-indicizzati. La versione TIO ha liminvece di prevenire arresti anomali.



1

Gelatina , 16 byte

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

13

Programma completo. Stampa un ,elenco separato di numeri interi.


1

Carbone , 45 42 35 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. 1-indicizzati. Non sono riuscito a trovare una formula semplice per generare il risultato, quindi ho semplicemente seguito la procedura indicata nella domanda. Spiegazione:

FN

Ripeti il ​​dato numero di nvolte.

⊞υ

Sposta l'elemento successivo nell'array vuoto predefinito u, calcolato come ...

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

... se c'è più di un elemento in ue gli ultimi due elementi hanno la stessa lunghezza ...

⁺⊟υ⊟υ

... quindi aggiungi il penultimo elemento all'ultimo elemento (che costruisce il risultato in ordine inverso) ...

§αL⭆υκ

... altrimenti la lettera successiva può essere trovata contando quante lettere abbiamo aggiunto finora e indicizzando ciclicamente l'alfabeto maiuscolo predefinito. (Prendere la somma della lunghezza o della lunghezza della somma fallisce quando l'elenco è vuoto e mappare l'elenco in una stringa consente di salvare due byte nel caso di un elenco speciale di un elenco vuoto.)

⮌⊟υ

Prendi l'ultimo elemento di u, che è l' nelemento th invertito dell'elenco desiderato e stampa implicitamente il contrario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.