Générer la séquence Abacaba


35

Ce défi consiste à imprimer la séquence abacaba d'une profondeur spécifique.

Voici un diagramme des 5 premières séquences ( a(N)la séquence abacaba de profondeur N, les majuscules / minuscules servent simplement à montrer le motif, cela n’est pas nécessaire dans la sortie de votre programme):

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

Comme vous pouvez probablement le constater, la nième séquence abacaba est la dernière avec la nième lettre et s'ajoute à elle. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Votre tâche consiste à créer un programme ou une fonction prenant un entier et imprimant la séquence abacaba de cette profondeur. La sortie doit être correcte au moins pour les valeurs inférieures ou égales à 15.


3
La séquence ne serait-elle pas indéfinie après 𝑎₂₅?
LegionMammal978

3
@ nicael Je sais, je me demandais simplement comment () serait défini.
LegionMammal978

2
Également connue sous le nom de séquence de règles (mais avec des lettres au lieu de chiffres), pour quelque chose de plus facilement compatible avec Google.
user253751

4
Pour ce que cela vaut, toute solution valable à ce problème est également la solution au casse-tête Towers of Hanoi pour N disques.
Jeff Zeitlin le

3
Peut-on utiliser une indexation basée sur 1 au lieu d'une indexation basée sur 0?
Esolanging Fruit le

Réponses:


8

Pyth, 11 octets

u++GHG<GhQk

Réduction simple.


2
@ Loovjo Oh. Cela n'a aucun sens, 0devrait être la séquence vide IMO, mais je vais me conformer à la question ...
orlp

4
Ouais, simple. va et frappe la tête contre un mur
J Atkin

@JAtkin Ouvrez Pyth's à rev-doc.txtcôté de cette réponse et elle devrait facilement se montrer simple.
Orlp

Hehehe, pas ce que je voulais dire (je ne sais pas pyth, alors ....)
J Atkin

7

Python, 44 octets

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

On dirait avec méfiance qu'on pourrait jouer au golf.


7

Haskell, 39 37 octets

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

Exemple d'utilisation: a 3-> "abacabadabacaba".

Edit: @Angs a trouvé deux octets à sauvegarder. Merci!


Ça ne a n=a(n-1)++[97+n]++a(n-1)marcherait pas ? Je ne peux pas tester maintenant.
Voir le

@Seeq: non, [97+n]est une liste de Integeret a(n-1)est une liste de Char(aka String). Vous ne pouvez pas concaténer des listes avec différents types. toEnumfait un Charhors de la Integer.
nimi

Ah, j'ai toujours pensé que Char n'était qu'un entier spécialisé en Haskell.
Voir le

['a'..]!!nest 2 octets plus court quetoEnum(97+n)
Angs

@Angs: Bonne prise! Merci!
nimi

6

Pyth, 14 à 13 octets

Merci à Jakube d'avoir sauvegardé un octet!

VhQ=+k+@GNk;k

Une solution à 14 Octets VhQ=ks[k@GNk;k.

Explication:

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

Essayez-le ici !


"N in range" ne devrait-il pas être sur la Vligne? hQest justeeval(input) + 1
Loovjo

@ Loovjo Ouais, c'est mieux et moins déroutant :)
Adnan

Vous pouvez raccourcir =kà =. Pyth attribuera automatiquement le résultat à k, car kest la première variable de l'expression +k+@GNk.
Jakube

@ Jakube Merci beaucoup! :)
Adnan

J'ai une réponse différente pour ce défi. Il ne battra pas cette solution, mais elle illustre une technique pour donner les premiers caractères n de la séquence: Vt^2Q=+k@Gx_.BhN`1)k(Dans ce cas, il est réglé pour donner les premiers 2 ^ Q-1 caractères comme le défi , il faut, mais vous pouvez voir comment changer cela.)
quintopia

5

Retina , 37 32 octets

$
aa
(T`_l`l`.$
)`1(a.*)
$1$1
z

Le retour à la ligne est important. L'entrée est prise en unaire .

Essayez-le en ligne!


Ça ne marche pas.
Leaky Nun

@KennyLau oui, car Retina a changé depuis que j'ai posté cette réponse. Si vous consultez la version la plus récente au moment où elle a été publiée directement à partir de GitHub, cela fonctionnera avec cela.
Martin Ender

5

Brainfuck, 157 octets

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

L'entrée est donnée en binaire.

L'idée de base est de dupliquer à plusieurs reprises la séquence en cours (en commençant par "a") et d'incrémenter le dernier élément après chaque itération:

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

Lorsque tout cela a été fait le nombre de fois spécifié, le résultat est imprimé en excluant le dernier élément.

Explication approfondie

La mémoire est organisée de la manière suivante:

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

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

Le compte à rebours contient le nombre de cycles de copie à exécuter. La séquence ABACABA est stockée dans des blocs adjacents, chacun composé de 3 cellules. La valeur contient le caractère de l'élément (c'est-à-dire "A", "B", "C" ...). L' indicateur Copier indique si l'élément correspondant doit ou non être copié dans le cycle de copie en cours (0 = copie, 1 = pas). L' indicateur de fin est mis à 0 pour le dernier élément en cours de copie (c'est 1 dans tous les autres cas).

Passons maintenant au programme actuel (légèrement non-golfé):

,                       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
Bienvenue sur le site! Je serais intéressé par une ventilation plus détaillée!
Wheat Wizard le

1
@ SriotchilismO'Zaic Merci pour votre réponse :) J'ai maintenant ajouté une explication détaillée.
orthoplex

5

Haskell , 36 octets

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

Essayez-le en ligne!

Ceci utilise une méthode récursive différente de la plupart des autres réponses. Pour obtenir la chaîne suivante de la séquence, nous ne joignons pas deux copies de la chaîne précédente avec une nouvelle lettre entre elles, mais au lieu de cela, nous incrémentons toutes les lettres et celles qui les séparent a.

aba -> bcb -> abacaba

1
Voulez-vous dire bcbau lieu de cbc?
Jo King

4

05AB1E , 12 octets (non concurrentiel)

Code:

'aIGDN>.bsJl

Que je sois damné. J'ai corrigé beaucoup de bugs grâce à ce challenge haha.

Explication:

'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

Pourquoi est-ce non compétitif?
Loovjo

@Loovjo J'ai corrigé les bugs après la publication du défi, il n'est donc pas compétitif :(
Adnan

4

JavaScript (ES6), 43 42 octets

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

Un octet enregistré grâce à @Neil !

Encore une autre solution récursive simple ...


(n+11).toString(36)vous sauve 1 octet et travaille pour un maximum de (25)!
Neil

@Neil implémenté. Merci!
user81655


3

Ruby (1.9 et plus), 38 octets

?aest une manière plus golfeuse d’écrire "a"mais qui a l’air bizarre quand il est mélangé avec ternary?:

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

3

R , 48 octets

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

Essayez-le en ligne!

Récursion simple.


Euh, qu'est-ce que paste0 ???
Xi'an

@ Xi'an paste0est équivalent à pastewith sep="", vous évitez ainsi les espaces entre les lettres qui pasteseraient ajoutées par défaut.
Robin Ryder le

2

C #, 59 octets

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

Juste une autre solution C # ...


2

Perl, 33 octets

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

Pas vraiment besoin de dé-golfer. Construit la chaîne en ajoutant de manière itérative le caractère suivant dans la séquence, ainsi que l’inverse de la chaîne jusqu’à présent, en utilisant la valeur ASCII de «a» comme point de départ. Utilise $\pour sauver quelques coups, mais c'est à peu près aussi difficile que cela devient.

Fonctionne pour à a(0)travers a(25)et même au-delà. Bien que vous passiez à l'ASCII étendu après a(29), vous manquerez de mémoire bien avant de manquer de codes de caractères:

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

Pour stocker le résultat de a(255)(non testé!), Il faut 2 ^ 256 - 1 = 1,15 x 10 ^ 77 octets, soit environ 1,15 x 10 ^ 65 lecteurs de 1 téraoctet.


1
Nous avons besoin de ces lecteurs de yottaoctets frémissants d'atomes, maintenant!
CalculatriceFeline

2

Java 7, 158 octets

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);}}}

J'aime me promener dans PPCG et j'aimerais pouvoir voter / commenter d'autres réponses.

L'entrée est donnée en tant que paramètres du programme. Cela suit le même format que beaucoup d'autres réponses ici, en ce sens qu'il s'agit d'une implémentation récursive simple. J'aurais commenté l'autre réponse mais je n'ai pas encore le représentant à commenter. Il est également légèrement différent en ce sens que l'appel récursif est effectué deux fois plutôt que de construire une chaîne et de la transmettre.


Bienvenue à PPCG alors! J'espère que vous ferez plus que voter et commenter à l'avenir (mais ne vous sentez pas obligé de le faire). :)
Martin Ender

2

Mathematica, 36 32 octets

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

Avez-vous déjà regardé TWOW 11B?


Vous n'avez pas besoin de la "",et vous pouvez utiliser la notation infix pour Fold.
Martin Ender

# 1 cause des valeurs nulles <>et # 2 ne fonctionne que pour les fonctions binaires
CalculatriceFeline

Avez-vous posté ce commentaire sur la réponse que vous vouliez? Parce que je n'ai aucune idée de ce que tu veux dire. :)
Martin Ender

* # 1 amène StringJoin à joindre les valeurs NULL et # 2 ne fonctionne que pour les fonctions binaires ou associatives. (x ~ Pli ~ y ~ Pli ~ z = Pli [x, Pli [y, z]] au lieu de Pli [x, y, z])
CalculatriceVers

Oh tu veux dire "suggestion # 1". Non, cela ne cause pas de nullité. Pourquoi le ferait-il?
Martin Ender

2

Python, 62 54 46 45 octets

J'aimerais penser que ce code peut encore être utilisé d'une manière ou d'une autre.

Edit: correction de bug grâce à Lynn. -1 octet grâce au calmar.

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

Essayez-le en ligne!


La sortie doit être en minuscule. La majuscule dans la question est juste pour clarifier la répétition.
Loovjo

Oups. Merci pour la clarification.
Sherlock9

Blargle. Merci @ user81655
Sherlock9

Ceci est invalide (il ne se termine jamais - essayez-le). Même dans le cas de base, la partie récursive de l'expression est évaluée.
Lynn

Fixé. Merci @ Lynn!
Sherlock9

1

Mathematica, 46 octets

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

Fonction récursive simple. Une autre solution:

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

1

K5, 18 octets

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

Appliquez de manière répétée une fonction à une valeur transportée ( "A") et à chaque élément d'une séquence. La séquence est constituée des caractères alphabétiques de B à un certain nombre N ( `c$66+!). La fonction joint l'argument de gauche de part et d'autre de l'argument de droite ( {x,y,x}).

En action:

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

Je pense que la séquence devrait être en minuscule, mais cela ne coûte pas d'octets.
user48538

1

JavaScript, 65 57 1 octets

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

Démo:

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

1 - merci Neil d'avoir économisé 8 octets


(i+11).toString(36)vous sauve 6 octets.
Neil

@Neil Haha, c'est un hack intelligent
nicael

Oh, et si vous déplacez l'affectation s="a";avant, forelle devient la valeur de retour par défaut et vous pouvez supprimer la fin ;spour une sauvegarde supplémentaire de 2 octets.
Neil

@ Nice Nice, ne savait pas à ce sujet.
Nicael

Je pense que vous pouvez enregistrer un octet en incrémentant en iligne et en supprimant l'incrément dans la boucle for. Donc ...for(i=0;i<n;)s+=(i+++11)...
Pas que Charles

1

Japt, 20 17 octets

97oU+98 r@X+Yd +X

Testez-le en ligne!

Comment ça marche

         // 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

Version non concurrente, 14 octets

97ôU r@X+Yd +X

La ôfonction est comme o, mais crée la plage [X..X+Y]au lieu de [X..Y). Testez-le en ligne!

Je préfère de loin changer le 97 au 94, auquel cas la sortie 5ressemble à ceci:

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

1

Java, 219 octets

Ma première tentative de golf de code. Je peux probablement jouer au golf plus loin, mais j'ai faim et je sors déjeuner.

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;
    }
}

Algorithme récursif de force brute assez simple, utilise la charmanipulation.


Vous pouvez omettre le publicmot - clé de aet addLetter/ j.
Dorukayhan veut que Monica revienne le

1

MATL , 14 octets

0i:"t@whh]97+c

Ceci utilise la version 8.0.0 du langage / compilateur, qui est antérieure au défi.

Exemple

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

Explication

Le secuence est créé d' abord avec des nombres 0, 1, 2... Ceux - ci sont converties en lettres 'a', 'b', 'c'à la fin.

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

modifier

Essayez-le en ligne!


1

Powershell, 53 , 46 , 44 , 41 octets

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

Coller dans la console générera une sortie erronée lors de la deuxième exécution car $dn’est pas réinitialisé.

Économisez 2 octets en utilisant + = Économisez 3 octets grâce à @TimmyD


En fait @TimmyD l' obtient jusqu'à 41 puisque je ne le besoin (, ).
Jonathan Leech-Pepin

Non, c'était de ma faute, j'ai en fait oublié de le mettre à jour alors que j'avais dit l'avoir fait.
Jonathan Leech-Pepin

le script ne fonctionne pas avec 0 et ne génère pas de lettre majuscule
mazzy

1

Gaia , 14 octets

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

Essayez-le en ligne!

₵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

Japt , 8 octets

;gCåÈ+iY

L'essayer

;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

Husk , 12 octets

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

Essayez-le en ligne!

Utilise l'indexation 1, ce qui, je l'espère, est OK.

Explication

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

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

1

APL (NARS), 24 caractères, 48 ​​octets

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

tester:

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

1
APL n'utilise-t-il pas sa propre page de code avec chaque caractère, un octet, ce qui en fait 24 octets?
Loovjo le

@Loovjo pour ce que je sais, Nars Apl a un jeu de caractères de 2 octets pour le caractère
RosLuP

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.