Dado N, salida n-ésimo elemento de ['A', 'B', 'AB', 'C', 'D', 'CD', 'ABCD', 'E', ...]?

12

Considere la siguiente lista:

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

Aquí hay una forma de verlo: estás aprendiendo a escribir caracteres chinos y quieres aprender cada vez más pedazos de ellos, ensayándolos a medida que avanzas. Comienzas con A, luego vas con B, luego ya hay una secuencia que es un par de dos, así que la combinas. Luego vas con C y D, haces otro par, practicas. Entonces ensayas: ABCD. Entonces lo mismo ocurre con E hasta H, luego ensaye: ABCDEFGH. La lista es infinita.

El objetivo es generar e imprimir un elemento n-ésimo de esta lista, los índices van desde cero. Suponga que después de 'Z', obtiene 'A' nuevamente.

El criterio ganador es la longitud del código fuente.

d33tah
fuente
3
No estoy seguro si lo entiendo, ¿cuándo es BCo CDEF? ¿Qué decide qué concatenamos y qué no? ¿Cómo es infinito si comienza de Anuevo después Z(quieres decir en algún momento después de ABCDEFGHIJKLMNOPQRSTUVWXZque tenemos ABCDEFGHIJKLMNOPQRSTUVWXZABo algo así?)
Jonathan Allan
55
Se aprecia el caso de prueba para las letras que se envuelven ( x,y,z,a,b...).
Stewie Griffin
77
Le recomiendo que use Sandbox en el futuro para mejorar su desafío. ¡Allí, recibiría comentarios de otros usuarios para asegurarse de que su desafío sea adecuado para el sitio principal de PPCG! Personalmente, dejaría una publicación en el Sandbox durante al menos 2 días para que todos tengan la oportunidad de ver la publicación.
JungHwan Min
2
@JungHwanMin: no está bien imprimir infinitamente la lista. Pasaría devolviendo una lista de enteros.
d33tah
44
¿Qué significa "pasaría devolviendo una lista de enteros"? ¿Es aceptable o no la salida de una lista de enteros? Si es así, ¿qué pasa con "Supongamos que después de 'Z', obtienes 'A' nuevamente", ¿debería ser este el caso con este formato de salida (después de i + 25 obtenemos i de nuevo)? (También actualice la publicación con la información relevante; no deje la especificación que se encuentra en los comentarios)
Jonathan Allan

Respuestas:

8

Python 2, 53 bytes

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

Pruébalo en línea!

Similar a esta construcción con la transformación x = u-v,y = u

KSab
fuente
¡Qué bonita simplificación! La primera declaración puede ser x^=y-xde -1 byte.
xnor
@xnor oh cierto, tonto
KSab
6

JavaScript (ES6), 59 bytes

Podemos ahorrar 2 bytes haciendo que la secuencia esté indexada en 1 y usando una simplificación similar a la utilizada por KSab :

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

Pruébalo en línea!


JavaScript (ES6), 61 bytes

Devuelve una lista de enteros no envolventes.

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

Pruébalo en línea!

Basado en una construcción de Donald Knuth. Entrada OEIS relacionada: A182105 .

¿Cómo?

Esta es una función recursiva de dos etapas.

(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 bytes

Devuelve envolviendo letras mayúsculas.

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)

Pruébalo en línea!

O 91 bytes en minúsculas.

Arnauld
fuente
2

Wolfram Language (Mathematica) , 80 71 bytes

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

Pruébalo en línea!

Devuelve una lista de enteros en lugar de una cadena de alfabeto envolvente. 0 indexado.

Utiliza OEIS A182105 , gracias a @Arnauld.

Imprimir la lista indefinidamente, 54 bytes

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

Pruébalo en línea!

1 indexado. La versión TIO tiene en limlugar de evitar bloqueos.

JungHwan Min
fuente
1

Jalea , 16 bytes

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

13

Programa completo Imprime ,una lista separada de enteros.

Erik el Outgolfer
fuente
1

Carbón , 45 42 35 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. 1 indexado. No pude encontrar una fórmula simple para generar el resultado, así que simplemente seguí el procedimiento dado en la pregunta. Explicación:

FN

Repita el número dado nveces.

⊞υ

Empuje el siguiente elemento a la matriz vacía predefinida u, calculada como ...

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

... si hay más de un elemento uy los dos últimos elementos tienen la misma longitud ...

⁺⊟υ⊟υ

... luego agregue el penúltimo elemento al último elemento (que acumula el resultado en orden inverso) ...

§αL⭆υκ

... de lo contrario, la siguiente letra se puede encontrar contando cuántas letras hemos agregado hasta ahora e indexando cíclicamente en el alfabeto en mayúsculas predefinido. (Tomar la suma de la longitud o la longitud de la suma falla cuando la lista está vacía, y mapear la lista en una cadena ahorra dos bytes en una lista vacía en mayúsculas especiales).

⮌⊟υ

Tome el último elemento de u, que es el nelemento reverso de la lista deseada, e imprima implícitamente el reverso.

Neil
fuente