Generieren Sie die Abacaba-Sequenz

35

Bei dieser Herausforderung geht es darum, die Abacaba-Sequenz einer bestimmten Tiefe zu drucken.

Hier ist ein Diagramm der ersten 5 Sequenzen ( a(N)ist die Abacaba-Sequenz der Tiefe N, Groß- / Kleinschreibung soll nur das Muster zeigen, dies wird in der Ausgabe Ihres Programms nicht benötigt):

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

Wie Sie wahrscheinlich feststellen können, ist die n-te Abacaba-Sequenz die letzte mit dem n-ten Buchstaben und dem dazugefügten Buchstaben. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die eine Ganzzahl annimmt und die Abacaba-Sequenz dieser Tiefe ausgibt. Die Ausgabe muss mindestens für Werte bis einschließlich 15 korrekt sein.

Loovjo
quelle
3
Wäre die Sequenz nach 𝑎₂₅ nicht undefiniert?
LegionMammal978
3
@nicael Ich weiß, ich habe mich nur gefragt, wie 𝑎 (∞) definiert werden würde.
LegionMammal978
2
Wird auch als Linealsequenz bezeichnet (jedoch mit Buchstaben anstelle von Zahlen), um etwas leichter Google-fähig zu machen.
user253751
4
Für das, was es wert ist, ist jede gültige Lösung für dieses Problem auch die Lösung für das Towers of Hanoi- Puzzle für N- Scheiben.
Jeff Zeitlin
3
Können wir eine 1-basierte Indexierung anstelle einer 0-basierten Indexierung verwenden?
Esolanging Fruit

Antworten:

8

Pyth, 11 Bytes

u++GHG<GhQk

Einfache Reduktion.

orlp
quelle
2
@ Loovjo Oh. Macht keinen Sinn, 0sollte die leere Sequenz IMO sein, aber ich werde der Frage entsprechen ...
Orlp
4
Ja, einfach. geht und schlägt den Kopf an die Wand
J Atkin
@JAtkin Öffne Pyths rev-doc.txtneben dieser Antwort und es sollte sich als einfach erweisen .
Orlp
Hehehe, nicht was ich meinte (ich weiß nicht, Pyth, so ....)
J Atkin
7

Python, 44 Bytes

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

Sieht verdächtig aus, als könnte man Golf spielen.

Sp3000
quelle
7

Haskell, 39 37 Bytes

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

Anwendungsbeispiel: a 3-> "abacabadabacaba".

Edit: @Angs hat zwei Bytes zum Speichern gefunden. Vielen Dank!

nimi
quelle
Würde nicht a n=a(n-1)++[97+n]++a(n-1)funktionieren Kann jetzt nicht testen.
Siehe auch
@Seeq: nein, [97+n]ist eine Liste von Integerund a(n-1)ist eine Liste von Char(aka String). Sie können Listen nicht mit unterschiedlichen Typen verketten. toEnummacht ein Charaus dem Integer.
Nimi
Ah, ich dachte immer, Char sei nur eine spezialisierte Ganzzahl in Haskell.
Siehe auch
['a'..]!!nist 2 Bytes kürzer alstoEnum(97+n)
Angs
@Angs: Guter Fang! Vielen Dank!
Nimi
6

Pyth, 14 13 Bytes

Danke an Jakube für das Speichern eines Bytes!

VhQ=+k+@GNk;k

Eine Lösung mit 14 Bytes VhQ=ks[k@GNk;k.

Erläuterung:

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

Probieren Sie es hier aus !

Adnan
quelle
Sollte nicht "N in Reichweite" in der VLeitung sein? hQist nureval(input) + 1
Loovjo
@ Loovjo Ja, das ist besser und weniger verwirrend :)
Adnan
Sie können verkürzen =kzu =. Pyth weist das Ergebnis automatisch zu k, da dies kdie erste Variable im Ausdruck ist +k+@GNk.
Jakube
@ Jakube Vielen Dank! :)
Adnan
Ich habe eine andere Antwort auf diese Herausforderung. Diese Lösung wird nicht übertroffen, es wird jedoch eine Technik für die Angabe der ersten n Zeichen der Sequenz veranschaulicht: Vt^2Q=+k@Gx_.BhN`1)k(In diesem Fall werden die ersten 2 ^ Q-1 Zeichen angegeben, wie es die Herausforderung erfordert, aber Sie können sehen wie man das ändert.)
Quintopia
5

Retina , 37 32 Bytes

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

Der Zeilenvorschub am Ende ist signifikant. Die Eingabe erfolgt unär .

Probieren Sie es online!

Martin Ender
quelle
Es funktioniert nicht.
Undichte Nonne
@KennyLau ja, weil sich Retina geändert hat, seit ich diese Antwort gepostet habe. Wenn Sie sich die neueste Version ansehen, als diese direkt von GitHub gepostet wurde, funktioniert dies auch.
Martin Ender
5

Brainfuck, 157 Bytes

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

Die Eingabe erfolgt binär.

Die Grundidee ist, die aktuelle Sequenz (beginnend mit "a") wiederholt zu duplizieren und das letzte Element nach jeder Iteration zu erhöhen:

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

Wenn dies alles die angegebene Anzahl von Malen durchgeführt wurde, wird das Ergebnis ohne das letzte Element gedruckt.

Ausführliche Erklärung

Der Speicher ist folgendermaßen angeordnet:

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

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

Countdown enthält die Anzahl der Kopierzyklen, die noch ausgeführt werden müssen. Die ABACABA-Sequenz wird in benachbarten Blöcken gespeichert, die jeweils aus 3 Zellen bestehen. Der Wert enthält das Zeichen des Elements (dh "A", "B", "C" ...). Das Flag Kopieren gibt an, ob das entsprechende Element innerhalb des aktuellen Kopierzyklus kopiert werden muss (0 = Kopieren, 1 = Nicht kopieren). Das End- Flag wird für das letzte Element, während es kopiert wird, auf 0 gesetzt (in allen anderen Fällen ist es 1).

Nun zum aktuellen (leicht ungolften) Programm:

,                       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)
Orthoplex
quelle
2
Welcome to the site! I'd be interested in a more detailed breakdown!
Wheat Wizard
1
@SriotchilismO'Zaic Thanks for your reply :) I have now added a detailed explanation.
orthoplex
5

Haskell, 36 bytes

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

Try it online!

This uses a different recursive method from most of the other answers. To get the next string in the sequence, we don't join two copies in the previous string with a new letter in between, but instead increment every letter and intersperse a's.

aba -> bcb -> abacaba
xnor
quelle
1
Do you mean bcb instead of cbc?
Jo King
4

05AB1E, 12 bytes (non-competitive)

Code:

'aIGDN>.bsJl

I'll be damned. I fixed a lot of bugs thanks to this challenge haha.

Explanation:

'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
Adnan
quelle
Why is it non-competitive?
Loovjo
@Loovjo I fixed the bugs after the challenge was posted, therefore it's non-competitive :(
Adnan
4

JavaScript (ES6), 43 42 bytes

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

A byte saved thanks to @Neil!

Yet another simple recursive solution...

user81655
quelle
(n+11).toString(36) saves you 1 byte, and works for up to a(25)!
Neil
@Neil Implemented. Thanks!
user81655
3

CJam (14 bytes)

'aqi{'b+1$++}/

Online demo

Peter Taylor
quelle
3

Ruby (1.9 and up), 38 bytes

?a is a golfier way to write "a" but looks weird when mixed with ternary ?:

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

R, 48 bytes

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

Try it online!

Simple recursion.

Robin Ryder
quelle
Uh, what is paste0???
Xi'an
@Xi'an paste0 is equivalent to paste with sep="", so you avoid the spaces between letters that paste would add by default.
Robin Ryder
2

C#, 59 bytes

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

Just another C# solution...

LegionMammal978
quelle
2

Perl, 33 bytes

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

No real need for un-golfing. Builds the string up by iteratively appending the next character in sequence plus the reverse of the string so far, using the ASCII value of 'a' as its starting point. Uses $\ to save a few strokes, but that's about as tricky as it gets.

Works for a(0) through a(25) and even beyond. Although you get into extended ASCII after a(29), you'll run out of memory long before you run out of character codes:

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

To store the result of a(255) (untested!), one would need 2^256 - 1 = 1.15x10^77 bytes, or roughly 1.15x10^65 1-terabyte drives.

type_outcast
quelle
1
We need those atom-shudder yottabyte drives, now!
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);}}}

I like to lurk around PPCG and I would enjoy being able to vote/comment on other answers.

Input is given as program parameters. This follows the same format as many other answers here in that it's a straight forward recursive implementation. I would have commented on the other answer but I don't have the rep to comment yet. It's also slightly different in that the recursive call is done twice rather than building a string and passing it along.

Poke
quelle
Welcome to PPCG then! I hope you'll do some more than voting and commenting in the future (but don't feel like you have to). :)
Martin Ender
2

Mathematica, 36 32 bytes

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

Have you ever watched TWOW 11B?

CalculatorFeline
quelle
There is no need for the "", and then you can use infix notation for Fold.
Martin Ender
#1 causes null <>s, and #2 only works for binary functions.
CalculatorFeline
Did you post this comment on the answer you intended? Because I have no idea what you mean. :)
Martin Ender
*#1 causes StringJoin to join nulls, and #2 only works for binary or associative functions. (x~Fold~y~Fold~z=Fold[x,Fold[y,z]] instead of Fold[x,y,z])
CalculatorFeline
Oh you mean "suggestion #1". No it doesn't cause Nulls. Why would it?
Martin Ender
2

Python, 62 54 46 45 bytes

I would like to think that this code can still be golfed down somehow.

Edit: Bug fix thanks to Lynn. -1 byte thanks to squid.

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

Try it online!

Sherlock9
quelle
Output should be in all-lowercase. The uppercase in the question is just for clarity about the repetition.
Loovjo
Whoops. Thanks for the clarification.
Sherlock9
Blargle. Thanks @user81655
Sherlock9
This is invalid (it never terminates — try it). Even in the base case, the recursive part of the expression is evaluated.
Lynn
Fixed. Thanks @Lynn!
Sherlock9
1

Mathematica, 46 bytes

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

Simple recursive function. Another solution:

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

K5, 18 bytes

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

Repeatedly apply a function to a carried value ("A") and each element of a sequence. The sequence is the alphabetic characters from B up to some number N (`c$66+!). The function joins the left argument on either side of the right argument ({x,y,x}).

In action:

 ("A"{x,y,x}/`c$66+!)'!6
("A"
 "ABA"
 "ABACABA"
 "ABACABADABACABA"
 "ABACABADABACABAEABACABADABACABA"
 "ABACABADABACABAEABACABADABACABAFABACABADABACABAEABACABADABACABA")
JohnE
quelle
I think the sequence should be lowercase, but that costs no bytes.
user48538
1

JavaScript, 65 571 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 - thanks Neil for saving 8 bytes

nicael
quelle
(i+11).toString(36) saves you 6 bytes.
Neil
@Neil Haha, that's a clever hack
nicael
Oh, and if you move the assignment s="a"; to before the for then it becomes the default return value and you can drop the trailing ;s for another 2 byte saving.
Neil
@Neil Nice, didn't know about that.
nicael
I think you can save a byte by incrementing i inline and dropping the increment in the for loop. So... for(i=0;i<n;)s+=(i+++11)...
Not that Charles
1

Japt, 20 17 bytes

97oU+98 r@X+Yd +X

Test it online!

How it works

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

Non-competing version, 14 bytes

97ôU r@X+Yd +X

The ô function is like o, but creates the range [X..X+Y] instead of [X..Y). Test it online!

I much prefer changing the 97 to 94, in which case the output for 5 looks like so:

^_^`^_^a^_^`^_^b^_^`^_^a^_^`^_^c^_^`^_^a^_^`^_^b^_^`^_^a^_^`^_^
ETHproductions
quelle
1

Java, 219 bytes

My first code golf attempt. Probably can be golf'd further, but I'm hungry and going out to lunch.

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

Pretty straightforward brute force recursive algorithm, uses char manipulation.

JamesENL
quelle
You can omit the public keyword from a and addLetter/j.
dorukayhan wants Monica back
1

MATL, 14 bytes

0i:"t@whh]97+c

This uses version 8.0.0 of the language/compiler, which is earlier than the challenge.

Example

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

Explanation

The secuence is created first with numbers 0, 1, 2, ... These are converted to letters 'a', 'b', 'c' at the end.

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

Edit

Try it online!

Luis Mendo
quelle
1

Powershell, 53,46,44,41 Bytes

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

Pasting into console will generate erronous output on the second run since $d is not re-initialized.

Save 2 bytes by using += Save 3 bytes thanks to @TimmyD

Jonathan Leech-Pepin
quelle
@TimmyD Actually gets it down to 41 since I won't need the (,).
Jonathan Leech-Pepin
No, that was my fault, I actually forgot to update it even though I said I did.
Jonathan Leech-Pepin
the script does not wirk with 0 and does not generate a uppercase letter
mazzy
1

Gaia, 14 bytes

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

Try it 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
Giuseppe
quelle
1

Japt, 8 bytes

;gCåÈ+iY

Try it

;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
Shaggy
quelle
1

Husk, 12 bytes

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

Try it online!

Uses 1-based indexing, which I hope is OK.

Explanation

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

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

APL(NARS), 24 chars, 48 bytes

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

test:

  f←{⍵<0:⍬⋄k,⎕A[⍵+1],k←∇⍵-1}
  f 0
A
  f 1
ABA
  f 2
ABACABA
  f 3
ABACABADABACABA
  f 4
ABACABADABACABAEABACABADABACABA
RosLuP
quelle
1
Doesn’t APL use it’s own code page with every character one byte, making this 24 bytes?
Loovjo
@Loovjo for what I know Nars Apl has character set 2 bytes for character
RosLuP
1

PHP -r, 43 bytes

register_argc_argv must be enabled for this to work.

for($a=$b=a;$argv[1]--;$a.=++$b.$a);echo$a;

Try it online!

PHP, 51 bytes

An anonymous function that prints the output directly.

function($n){for($a=$b=a;$n--;$a.=++$b.$a);echo$a;}

Try it online!

Shieru Asakoto
quelle