Étant donné N, produire le nième élément de ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E',…]?

12

Considérez la liste suivante:

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

Voici une façon de voir les choses: vous apprenez à écrire des caractères chinois et souhaitez en apprendre de plus en plus de gros morceaux, en les répétant au fur et à mesure. Vous commencez avec A, puis allez avec B, puis il y a déjà une séquence qui est une paire de deux, donc vous la combinez. Ensuite, vous allez avec C et D, faites une autre paire, entraînez-vous. Ensuite, vous répétez: ABCD. Ensuite, la même chose va de E à H, puis répétez: ABCDEFGH. La liste est infinie.

Le but est de générer et d'imprimer un n-ième élément de cette liste, les index remontant à zéro. Supposons qu'après «Z», vous obtenez à nouveau «A».

Le critère gagnant est la longueur du code source.

d33tah
la source
3
Je ne suis pas sûr de l'avoir, quand BCou CDEF? Qu'est-ce qui décide de ce que nous concaténons et de ce que nous ne faisons pas? Comment est-il infini si cela Arecommence après Z(vous voulez dire à un moment donné après que ABCDEFGHIJKLMNOPQRSTUVWXZnous ayons ABCDEFGHIJKLMNOPQRSTUVWXZABquelque chose?)
Jonathan Allan
5
Un cas de test pour les lettres qui s'enroulent est apprécié ( x,y,z,a,b...).
Stewie Griffin
7
Je vous recommande fortement d'utiliser le Sandbox à l'avenir pour améliorer votre défi. Là, vous recevrez des commentaires de la part des autres utilisateurs pour vous assurer que votre défi convient au site principal de PPCG! Personnellement, je laisserais un message dans le bac à sable pendant au moins 2 jours afin que tout le monde ait la possibilité de voir le message.
JungHwan Min
2
@JungHwanMin: pas OK pour imprimer la liste à l'infini. Je passerais en retournant une liste d'entiers.
d33tah
4
Que signifie «Je passerais en renvoyant une liste d'entiers»? La sortie d'une liste d'entiers est-elle acceptable ou non? Si oui, qu'en est-il de "Supposons qu'après 'Z', vous obtenez à nouveau 'A'" - cela devrait-il être le cas avec ce format de sortie (après i + 25, nous obtenons à nouveau i)? (Mettez également à jour le message avec les informations pertinentes - ne laissez pas de spécification dans les commentaires.)
Jonathan Allan

Réponses:

8

Python 2, 53 octets

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

Essayez-le en ligne!

Semblable à cette construction avec la transformation x = u-v,y = u

KSab
la source
Quelle belle simplification! La première instruction peut être x^=y-xpour -1 octet.
xnor
@xnor oh right, idiot moi
KSab
6

JavaScript (ES6), 59 octets

Nous pouvons économiser 2 octets en rendant la séquence indexée 1 et en utilisant une simplification similaire à celle utilisée par KSab :

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

Essayez-le en ligne!


JavaScript (ES6), 61 octets

Renvoie une liste d'entiers non enveloppants.

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

Essayez-le en ligne!

Basé sur une construction de Donald Knuth. Entrée OEIS associée: A182105 .

Comment?

Il s'agit d'une fonction récursive en deux étapes.

Nous construisons d'abord la séquence définie comme et:(un,vn)(u1,v1)=(1,1)

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

Lors de la deuxième passe, nous construisons la liste et éventuellement la .[unvn,unvn+1,,un]


JavaScript (ES6), 97 octets

Renvoie des lettres majuscules d'habillage.

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)

Essayez-le en ligne!

Ou 91 octets en minuscules.

Arnauld
la source
2

Wolfram Language (Mathematica) , 80 71 octets

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

Essayez-le en ligne!

Renvoie une liste d'entiers au lieu d'une chaîne d'alphabet enveloppante. 0 indexé.

Utilise OEIS A182105 , grâce à @Arnauld.

Impression indéfinie de la liste, 54 octets

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

Essayez-le en ligne!

1 indexé. La version TIO a limau lieu de prévenir les plantages.

JungHwan Min
la source
1

Gelée , 16 octets

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

13

Programme complet. Imprime ,une liste d'entiers séparée.

Erik le Outgolfer
la source
1

Fusain , 45 42 35 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. 1 indexé. Je n'ai pas trouvé de formule simple pour générer le résultat, j'ai donc simplement suivi la procédure indiquée dans la question. Explication:

FN

Répétez le nombre donné de nfois.

⊞υ

Poussez l'élément suivant dans le tableau vide prédéfini u, calculé comme ...

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

... s'il y a plus d'un élément uet que les deux derniers éléments ont la même longueur ...

⁺⊟υ⊟υ

... puis ajoutez l'avant-dernier élément au dernier élément (qui construit le résultat dans l'ordre inverse) ...

§αL⭆υκ

... sinon la lettre suivante peut être trouvée en comptant le nombre de lettres que nous avons ajoutées jusqu'à présent et en les indexant cycliquement dans l'alphabet majuscule prédéfini. (La prise de la somme de la longueur ou de la longueur de la somme échoue lorsque la liste est vide et le mappage de la liste dans une chaîne économise deux octets par rapport à la casse spéciale d'une liste vide.)

⮌⊟υ

Prenez le dernier élément de u, qui est le nème élément inversé de la liste souhaitée, et imprimez implicitement l'inverse.

Neil
la source