Gere a sequência Abacaba


35

Esse desafio é imprimir a sequência de abacaba de uma profundidade específica.

Aqui está um diagrama das 5 primeiras seqüências ( a(N)é a sequência abacaba de profundidade N, maiúscula / minúscula é apenas para mostrar o padrão, isso não é necessário na saída do seu programa):

a(0) = A
a(1) = aBa
a(2) = abaCaba
a(3) = abacabaDabacaba
a(4) = abacabadabacabaEabacabadabacaba
...
a(25) = abacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaiabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabajabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabahabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabagabacabadabacabaeabacabadabacabafabacabadabacabaeabacabadabacabaia...

Como você provavelmente pode dizer, a sequência da n-ésima abacaba é a última com a n-ésima letra e é novamente adicionada a ela. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Sua tarefa é criar um programa ou função que use um número inteiro e imprima a sequência abacaba dessa profundidade. A saída deve estar correta pelo menos para valores de até 15 inclusive.


3
A sequência não seria indefinida após 𝑎₂₅?
— precisa saber é o seguinte

3
@nicael eu sei, eu só estava me perguntando como 𝑎 (∞) seria definido.
— precisa saber é o seguinte

2
Também conhecida como sequência da régua (mas com letras em vez de números), para algo mais fácil para o Google.
— precisa saber é o seguinte

4
Pelo que vale a pena, qualquer solução válida para esse problema também é a solução do quebra-cabeça Towers of Hanoi para N discos.
— Jeff Zeitlin

3
Podemos usar a indexação baseada em 1 em vez da indexação baseada em 0?
— Esolanging Fruit

Respostas:


8

Pitão, 11 bytes

u++GHG<GhQk

Redução simples.


2
@Loovjo Oh. Não faz sentido, 0deve ser a seqüência vazia IMO, mas eu vou estar de acordo com a questão ...
— orlp

4
Sim, simples. vai e franja cabeça na parede
— J Atkins

@JAtkin Abra o Pyth's rev-doc.txtao lado desta resposta e ela deve mostrar-se facilmente simples.
— 13126 orlp

Hehehe, não o que eu quis dizer (eu não sei pyth, então ....)
— J Atkin

7

Python, 44 bytes

f=lambda n:"a"[n:]or f(n-1)+chr(97+n)+f(n-1)

Parece suspeito, pode ser jogável.


7

Haskell, 39 37 bytes

a 0="a"
a n=a(n-1)++['a'..]!!n:a(n-1)

Exemplo de uso: a 3-> "abacabadabacaba".

Edit: @Angs encontrou dois bytes para salvar. Obrigado!


Não a n=a(n-1)++[97+n]++a(n-1)funcionaria? Não é possível testar agora.
— seequ

@ Seeq: não, [97+n]é uma lista de Integere a(n-1)é uma lista de Char(aka String). Você não pode concatenar listas com tipos diferentes. toEnumfaz um Charfora do Integer.
— nimi

Ah, eu sempre pensei que Char era apenas um número inteiro especializado em Haskell.
— seequ

['a'..]!!né 2 bytes mais curto quetoEnum(97+n)
— Angs

@ Angs: Boa captura! Obrigado!
— nimi

6

Pitão, 14 13 bytes

Agradecemos a Jakube por salvar um byte!

VhQ=+k+@GNk;k

Uma solução com 14 bytes: VhQ=ks[k@GNk;k.

Explicação:

VhQ=+k+@GNk;k

               # Implicit: k = empty string
VhQ            # For N in range input + 1      
   =           # Assign k
      +@GNk    # Position N at alphabet + k
    +k         # k + above
           ;   # End loop
            k  # Print k

Experimente aqui !


"N in range" não deveria estar em jogo V? hQé apenaseval(input) + 1
— Loovjo

@Loovjo Sim, isso é melhor e menos confuso :)
— Adnan

Você pode reduzir =kpara =. Pyth atribuirá automaticamente o resultado k, já que ké a primeira variável na expressão +k+@GNk.
— Jakube

@Jakube Muito obrigado! :)
— Adnan

Eu tenho uma resposta diferente para esse desafio. Ele não supera essa solução, mas ilustra uma técnica para fornecer os primeiros n caracteres da sequência: Vt^2Q=+k@Gx_.BhN`1)k(Nesse caso, ele está definido para fornecer os primeiros 2 ^ Q-1 caracteres conforme o desafio exigir, mas você pode ver como mudar isso.)
— quintopia


5

Brainfuck, 157 bytes

,+>-[>++<-----]>----->>+<<<<[->>[[->>[>>>]<+<+<[<<<]>>[>>>]<]>>[>>>]<[-<<[<<<]>>[>>>]<+>>[>>>]<]+>+<<<[<<<]>>[>>>]+[>>>]<]<<<+>>[<-<<]<]>>>>[>>>]<<<<<<[<<.<]

A entrada é dada em binário.

A idéia básica é duplicar repetidamente a sequência atual (começando com "a") e incrementar o último elemento após cada iteração:

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

Quando tudo isso for feito na quantidade especificada de vezes, o resultado será impresso excluindo o último elemento.

Explicação detalhada

A memória é organizada da seguinte maneira:

.---------.-.-----.----.---.-----.----.---.---
|Countdown|0|Value|Copy|End|Value|Copy|End|...
'---------'-'-----'----'---'-----'----'---'---

            |--Element 1---|--Element 2---|

A contagem regressiva mantém o número de ciclos de cópia que ainda precisam ser executados. A sequência ABACABA é armazenada em blocos adjecentes, cada um composto por 3 células. Valor mantém o caractere do elemento (ou seja, "A", "B", "C" ...). O sinalizador Copiar indica se o elemento correspondente precisa ou não ser copiado no ciclo de cópia atual (0 = cópia, 1 = não). O fim sinalizador é definido como 0 para o último elemento enquanto está sendo copiado (é 1 em todos os outros casos).

Agora, para o programa atual (um pouco não destruído):

,                       read Countdown from input
+                       add 1 to avoid off-by-one error
>-[>++<-----]>-----     initialize value cell of first element to 97 ("a")
>>+                     set End flag of first element to 1
<<<<                    move to Countdown
[                       loop until Countdown hits 0 (main loop)
    -                   decrement Countdown
    >>                  move to Value cell of first element
    [                   copying loop
        [               duplication sub-loop
            -           decrement Value cell of the element to copy
            >>          move to End flag
            [>>>]       move to End flag of the last element
            <+<+        increment Copy and Value cell of last element (Copy cell is temporarily abused)
            <           move to End flag of second to last element
            [<<<]>>     move back to Copy cell of first element
            [>>>]<      move to Value cell of the first element where the Copy flag is 0
        ]
        >>[>>>]<        move to (abused) Copy flag of the last element
        [               "copy back" sub-loop
            -           decrement Copy flag
            <<          move to End flag of second to last element
            [<<<]>>     move back to Copy cell of first element
            [>>>]<      move to Value cell of the first element where the Copy flag is 0
            +           increment Value cell
            >>[>>>]<    move back to Copy flag of the last element
        ]
        +>+             set Copy and End flag to 1
        <<<             move to End flag of second to last element
        [<<<]>>         move back to Copy cell of first element
        [>>>]<          move to Value cell of the first element where the Copy flag is 0
        >+<             set Copy flag to 1
        >[>>>]<         move to Value cell of the next element to copy
    ]                   loop ends three cells behind the last "valid" Value cell
    <<<+                increment Value cell of last element
    >>                  move to End flag
    [<-<<]              reset all Copy flag
    <                   move to Countdown
]
>>>>                    move to End flag of first element
[>>>]<<<                move to End flag of last element                
<<<                     skip the last element
[<<.<]                  output Value cells (in reverse order, but that doesn't matter)

2
Bem vindo ao site! Eu estaria interessado em uma análise mais detalhada!
— Wheat Wizard

11
@ SriotchilismO'Zaic Obrigado pela sua resposta :) Agora adicionei uma explicação detalhada.
— orthoplex

5

Haskell , 36 bytes

tail.(iterate((:"a").succ=<<)"_a"!!)

Experimente online!

Isso usa um método recursivo diferente da maioria das outras respostas. Para obter a próxima sequência na sequência, não juntamos duas cópias na sequência anterior com uma nova letra no meio, mas, em vez disso, incrementamos todas as letras e letras intercaladas a.

aba -> bcb -> abacaba

11
Você quer dizer em bcbvez de cbc?
— Jo King

4

05AB1E , 12 bytes (não competitivo)

Código:

'aIGDN>.bsJl

Eu serei amaldiçoado. Corrigi muitos bugs graças a esse desafio haha.

Explicação:

'aIGDN>.bsJl

'a             # Push the character 'a'
  I            # User input
   G           # For N in range(1, input)
    D          # Duplicate the stack
     N         # Push N
      >        # Increment
       .b      # Convert to alphabetic character (1 = A, 2 = B, etc.)
         s     # Swap the last two elements
          J    # push ''.join(stack)
           l   # Convert to lowercase
               # Implicit: print the last item of the stack

Por que não é competitivo?
— Loovjo 9/01

@Loovjo Corrigi os bugs depois que o desafio foi lançado, portanto não é competitivo :( #: #
— Adnan

4

JavaScript (ES6), 43 42 bytes

a=n=>n?a(--n)+(n+11).toString(36)+a(n):"a"

Um byte salvo graças ao @Neil !

Ainda outra solução recursiva simples ...


(n+11).toString(36)economiza 1 byte e funciona até (25)!
— Neil

@ Nee Implemented. Obrigado!
— precisa saber é o seguinte


3

Ruby (1.9 e superior), 38 bytes

?aé uma maneira mais golfista de escrever, "a"mas parece estranha quando misturada com ternário?:

a=->n{n<1??a:a[n-1]+(97+n).chr+a[n-1]}

3

R , 48 bytes

f=function(n)if(n)paste0(a<-f(n-1),letters[n],a)

Experimente online!

Recursão simples.


O que é paste0 ???
— Xi'an

@ Xi'an paste0é equivalente a pastewith sep="", para evitar os espaços entre as letras que pasteseriam adicionadas por padrão.
— Robin Ryder

2

C #, 59 bytes

string a(int n){return n<1?"a":a(n-1)+(char)(97+n)+a(n-1);}

Apenas mais uma solução C # ...


2

Perl, 33 bytes

map$\.=chr(97+$_).$\,0..pop;print

Não há necessidade real de não jogar golfe. Constrói a cadeia de caracteres anexando iterativamente o próximo caractere em seqüência mais o reverso da cadeia até o momento, usando o valor ASCII de 'a' como ponto de partida. Usos$\ para salvar alguns traços, mas é o mais complicado possível.

Trabalha para a(0)através a(25)e até além. Embora você tenha entrado em ASCII estendido depois a(29), ficará sem memória muito antes de ficar sem códigos de caracteres:

a(25) é ~ 64MiB. a(29)é ~ 1GiB.

Para armazenar o resultado de a(255)(não testado!), Seria necessário 2 ^ 256 - 1 = 1,15x10 ^ 77 bytes, ou aproximadamente 1,15x10 ^ 65 unidades de 1 terabyte.


11
Agora precisamos dessas unidades de yottabyte com tremor de átomos !
— CalculatorFeline

2

Java 7, 158 bytes

class B{public static void main(String[]a){a('a',Byte.valueOf(a[0]));}static void a(char a,int c){if(c>=0){a(a,c-1);System.out.print((char)(a+c));a(a,c-1);}}}

Eu gosto de espreitar o PPCG e gostaria de poder votar / comentar outras respostas.

A entrada é fornecida como parâmetros do programa. Isso segue o mesmo formato de muitas outras respostas aqui, pois é uma implementação recursiva direta. Eu teria comentado a outra resposta, mas ainda não tenho o representante para comentar. Também é um pouco diferente, pois a chamada recursiva é feita duas vezes, em vez de construir uma string e transmiti-la.


Bem-vindo ao PPCG, então! Espero que você faça mais do que votar e comentar no futuro (mas não sinta que precisa). :)
— Martin Ender

2

Mathematica, 36 32 bytes

##<>#&~Fold~Alphabet[][[;;#+1]]&

Você já assistiu TWOW 11B?


Não há necessidade de "",e, em seguida, você pode usar a notação infix para Fold.
— Martin Ender

O número 1 causa nulos <>e o número 2 funciona apenas para funções binárias.
— CalculatorFeline

Você postou este comentário na resposta que pretendia? Porque eu não tenho ideia do que você quer dizer. :)
— Martin Ender

* # 1 faz com que StringJoin junte nulos, e # 2 funciona apenas para funções binárias ou associativas. (x ~ Dobre ~ y ~ Dobre ~ z = Dobre [x, Dobre [y, z]] em vez de Dobre [x, y, z])
— CalculatorFeline

Oh, você quer dizer "sugestão 1". Não, não causa nulos. Por quê?
— Martin Ender

2

Python, 62 54 46 45 bytes

Eu gostaria de pensar que esse código ainda pode ser revertido de alguma forma.

Edit: Correção de bug graças a Lynn. -1 byte graças ao squid.

a=lambda n:n and a(n-1)+chr(97+n)+a(n-1)or'a'

Experimente online!


A saída deve estar em letras minúsculas. A maiúscula na pergunta é apenas para esclarecer a repetição.
— Loovjo 9/01/16

Ops. Obrigado pelo esclarecimento.
— Sherlock9

Blargle. Obrigado @ user81655
— Sherlock9

Isso é inválido (nunca termina - tente). Mesmo no caso base, a parte recursiva da expressão é avaliada.
— Lynn

Fixo. Obrigado @Lynn!
— Sherlock9

1

Mathematica, 46 bytes

If[#<1,"a",(a=#0[#-1])<>Alphabet[][[#+1]]<>a]&

Função recursiva simples. Outra solução:

a@0="a";a@n_:=(b=a[n-1])<>Alphabet[][[n+1]]<>b

1

K5, 18 bytes

"A"{x,y,x}/`c$66+!

Aplique repetidamente uma função a um valor transportado ( "A") e a cada elemento de uma sequência. A sequência é os caracteres alfabéticos de B até um número N ( `c$66+!). A função une o argumento esquerdo em ambos os lados do argumento direito ({x,y,x} ).

Em ação:

 ("A"{x,y,x}/`c$66+!)'!6
("A"
 "ABA"
 "ABACABA"
 "ABACABADABACABA"
 "ABACABADABACABAEABACABADABACABA"
 "ABACABADABACABAEABACABADABACABAFABACABADABACABAEABACABADABACABA")

Eu acho que a sequência deve ser minúscula, mas isso não custa bytes.
— precisa saber é o seguinte

1

JavaScript, 65 57 1 bytes

n=>eval('s="a";for(i=0;i<n;i++)s+=(i+11).toString(36)+s')

Demo:

function a(n){
  return eval('s="a";for(i=0;i<n;i++)s+=(i+11).toString(36)+s')
}
alert(a(3))

1 - obrigado Neil por salvar 8 bytes


(i+11).toString(36)economiza 6 bytes.
— Neil

@ Neil Haha, isso é um truque inteligente
— nicael

Ah, e se você mover a atribuição s="a";para antes fordela, ela se tornará o valor de retorno padrão e você poderá descartar a fuga ;spara outro salvamento de 2 bytes.
— Neil

@ Neil Nice, não sabia disso.
— Nicael

Eu acho que você pode salvar um byte, incrementando iinline e soltando o incremento no loop for. Então ...for(i=0;i<n;)s+=(i+++11)...
— Não que Charles

1

Japonês, 20 17 bytes

97oU+98 r@X+Yd +X

Teste online!

Como funciona

         // Implicit: U = input integer
65oU+66  // Generate a range from 65 to U+66.
r@       // Reduce each item Y and previous value X in this range with this function:
X+Yd     // return X, plus the character with char code Y,
+X       // plus X.

         // Implicit: output last expression

Versão não concorrente, 14 bytes

97ôU r@X+Yd +X

A ôfunção é como o, mas cria o intervalo em [X..X+Y]vez de[X..Y) . Teste online!

Eu prefiro alterar o 97 para o 94; nesse caso, a saída 5é assim:

^_^`^_^a^_^`^_^b^_^`^_^a^_^`^_^c^_^`^_^a^_^`^_^b^_^`^_^a^_^`^_^

1

Java, 219 bytes

Minha primeira tentativa de código de golfe. Provavelmente pode jogar golfe, mas estou com fome e vou almoçar.

public class a{public static void main(String[]a){String b=j("a",Integer.parseInt(a[0]),1);System.out.println(b);}public static String j(String c,int d,int e){if(d>=e){c+=(char)(97+e)+c;int f=e+1;c=j(c,d,f);}return c;}}

Ungolfed:

public class a {
    public static void main(String[] a) {
        String string = addLetter("a", Integer.parseInt(a[0]), 1);
        System.out.println(string);
    }

    public static String addLetter(String string, int count, int counter) {
        if (count >= counter) {
            string += (char) (97 + counter) + string;
            int f = counter + 1;
            string = addLetter(string, count, f);
        }
        return string;
    }
}

Algoritmo recursivo de força bruta bastante simples, usa charmanipulação.


Você pode omitir a publicpalavra-chave de ae addLetter/ j.
— Dorukayhan quer Monica de volta

1

MATL , 14 bytes

0i:"t@whh]97+c

Isso usa a versão 8.0.0 do idioma / compilador, anterior ao desafio.

Exemplo

>> matl
 > 0i:"t@whh]97+c
 >
> 3
abacabadabacaba

Explicação

O secuence é criado primeiro com números 0, 1, 2, ... Estes são convertidos em letras 'a', 'b', 'c'no final.

0         % initiallize: a(0)
i:        % input "N" and create vector [1, 2, ... N]
"         % for each element of that vector
  t       % duplicate current sequence
  @       % push new value of the sequence
  whh     % build new sequence from two copies of old sequence and new value
]         % end for
97+c      % convert 0, 1, 2, ... to 'a', 'b', 'c'. Implicitly print

Editar

Experimente online!


1

Powershell, 53 , 46 , 44 , 41 bytes

1..$args[0]|%{}{$d+=[char]($_+96)+$d}{$d}

A colagem no console gerará uma saída errônea na segunda execução, uma vez que $dnão é reinicializada.

Economize 2 bytes usando + = Economize 3 bytes graças a @TimmyD


@TimmyD Na verdade recebe-lo para baixo para 41 já que não será necessário o (, ).
— 31816 Jonathan Leech-Pepin

Não, isso foi culpa minha, eu realmente esqueci de atualizá-lo, embora eu tenha dito que sim.
— Jonathan Sanguessuga-Pepin

o script não funciona com 0 e não gera uma letra maiúscula
— mazzy

1

Gaia , 14 bytes

₵aØ@⟪¤ṇ3ṁ¤+ṫ⟫ₓ

Experimente online!

₵a		| Push lowercase alphabet
  Ø		| push lowercase string
   @         ₓ	| push the input and do everything between ⟪⟫ that many times
    ⟪¤		| swap
      ṇ		| take the last (first) character
       3ṁ	| push the 3rd item on the stack
         ¤+	| swap and concatenate
           ṫ⟫	| and palindromize


1

Japonês , 8 bytes

;gCåÈ+iY

Tente

;gCåÈ+iY     :Implicit input of integer
 g           :Index into
; C          :  Lowercase alphabet
   å         :  Cumulatively reduce, with an initial value of an empty string
    +        :    Append a copy of the current value
     i       :    Prepended with
      Y      :    The current letter

1

Casca , 12 bytes

!¡S+oṠ:o→▲"a

Experimente online!

Usa indexação baseada em 1, que espero que esteja OK.

Explicação

!             (                                          !!)
 ¡             iterate(                              )
  S                        <*>
   +                   (++)
    o                         (                     )
     Ṡ                         join$   .
      :                             (:)
       o                                    .
        →                               succ
         ▲                                   maximum
          "a                                          "a"

              (iterate((++)<*>(join$(:).succ.maximum))"a"!!)

1

APL (NARS), 24 caracteres, 48 ​​bytes

{⍵<0:⍬⋄k,⎕A[⍵+1],k←∇⍵-1}

teste:

  f←{⍵<0:⍬⋄k,⎕A[⍵+1],k←∇⍵-1}
  f 0
A
  f 1
ABA
  f 2
ABACABA
  f 3
ABACABADABACABA
  f 4
ABACABADABACABAEABACABADABACABA

11
O APL não usa sua própria página de código com cada caractere de um byte, tornando-o em 24 bytes?
— Loovjo 25/06

@Loovjo pelo que eu sei Nars Apl possui um conjunto de caracteres 2 bytes para caracteres
— RosLuP 25/06

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.