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

12

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

Aqui está uma maneira de analisar: você está aprendendo a escrever caracteres chineses e deseja aprender cada vez mais grandes partes deles, ensaiando-os à medida que avança. Você começa com A, depois vai com B, então já existe uma sequência que é um par de dois, então você a combina. Então você vai com C e D, faz outro par, pratica. Então você ensaia: ABCD. Então o mesmo acontece com E até H, depois ensaie: ABCDEFGH. A lista é infinita.

O objetivo é gerar e imprimir um n-ésimo elemento desta lista, os índices subindo de zero. Suponha que após 'Z', você obtenha 'A' novamente.

O critério vencedor é o comprimento do código-fonte.

d33tah
fonte
3
Não tenho certeza se entendi, quando é BCou CDEF? O que decide o que concatenamos e o que não fazemos? Como é infinito se ele começa em Anovamente depois Z(quer dizer, em algum momento depois ABCDEFGHIJKLMNOPQRSTUVWXZtemos ABCDEFGHIJKLMNOPQRSTUVWXZABou algo assim?)
Jonathan Allan
5
O caso de teste para letras que envolvem é apreciado ( x,y,z,a,b...).
Stewie Griffin
7
Eu recomendo fortemente que você use a Sandbox no futuro para melhorar seu desafio. Lá, você receberá feedback de outros usuários para garantir que seu desafio seja adequado ao site principal do PPCG! Pessoalmente, deixaria uma postagem na Sandbox por pelo menos 2 dias para que todos tenham a chance de vê-la.
JungHwan Min 20/07/19
2
@ JungHwanMin: não está OK para imprimir infinitamente a lista. Eu passaria retornando uma lista de números inteiros.
d33tah
4
O que significa "eu passaria retornando uma lista de números inteiros"? A saída de uma lista de números inteiros é aceitável ou não? Se sim, o que dizer de "Suponha que, depois de 'Z', você obtenha 'A' novamente" - esse deve ser o caso com este formato de saída (depois de i + 25, obtemos i novamente)? (Também atualizar o post com a informação relevante - não deixe especificação pode ser encontrada nos comentários.)
Jonathan Allan

Respostas:

8

Python 2, 53 bytes

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

Experimente online!

Semelhante a esta construção com a transformação x = u-v,y = u

KSab
fonte
Que bela simplificação! A primeira instrução pode ser x^=y-xde -1 byte.
Xnor
@xnor oh certo, bobo me
KSab
6

JavaScript (ES6), 59 bytes

Podemos economizar 2 bytes, tornando a sequência indexada 1 e usando uma simplificação semelhante à usada pelo KSab :

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

Experimente online!


JavaScript (ES6), 61 bytes

Retorna uma lista de números inteiros sem quebra automática.

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

Experimente online!

Baseado em uma construção de Donald Knuth. Entrada OEIS relacionada: A182105 .

Quão?

Esta é uma função recursiva de dois estágios.

(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

Retorna quebra automática de letras maiú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)

Experimente online!

Ou 91 bytes em minúsculas.

Arnauld
fonte
2

Wolfram Language (Mathematica) , 80 71 bytes

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

Experimente online!

Retorna uma lista de números inteiros em vez de uma sequência de quebra automática de alfabeto. Indexado a 0.

Usa o OEIS A182105 , graças a @Arnauld.

Imprimindo a lista indefinidamente, 54 bytes

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

Experimente online!

1 indexado. A versão do TIO possui, em limvez de evitar falhas.

JungHwan Min
fonte
1

Gelatina , 16 bytes

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

13

Programa completo. Imprime - ,lista separada de números inteiros.

Erik, o Outgolfer
fonte
1

Carvão , 45 42 35 bytes

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

Experimente online! Link é a versão detalhada do código. 1 indexado. Não consegui encontrar uma fórmula simples para gerar o resultado, simplesmente segui o procedimento indicado na pergunta. Explicação:

FN

Repita o número especificado nvezes.

⊞υ

Empurre o próximo elemento para a matriz vazia predefinida u, calculada como ...

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

... se houver mais de um elemento ue os dois últimos tiverem o mesmo comprimento ...

⁺⊟υ⊟υ

... acrescente o penúltimo elemento ao último elemento (que cria o resultado na ordem inversa) ...

§αL⭆υκ

... caso contrário, a próxima letra poderá ser encontrada contando quantas letras adicionamos até agora e indexando ciclicamente no alfabeto maiúsculo predefinido. (A soma da extensão ou a extensão da soma falha quando a lista está vazia e o mapeamento da lista em uma sequência salva dois bytes sobre a inclusão de uma lista vazia em maiúsculas e minúsculas.)

⮌⊟υ

Pegue o último elemento de u, que é o nth invertido da lista desejada e imprima implicitamente o reverso.

Neil
fonte