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.