Wygeneruj sekwencję Abacaba


35

Wyzwanie polega na wydrukowaniu sekwencji abacaba na określonej głębokości.

Oto schemat pierwszych 5 sekwencji ( a(N)jest to sekwencja abacaba głębokości N, wielkie / małe litery służą tylko do pokazania wzoru, nie jest to potrzebne w danych wyjściowych programu):

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

Jak zapewne można stwierdzić, n-ta sekwencja abacaba jest ostatnią z n-tą literą i sama do niej została dodana. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Twoim zadaniem jest stworzenie programu lub funkcji, która przyjmuje liczbę całkowitą i wypisuje sekwencję abacaba na tej głębokości. Dane wyjściowe muszą być poprawne przynajmniej dla wartości do 15 włącznie.


3
Czy sekwencja nie byłaby niezdefiniowana po 𝑎₂₅?
LegionMammal978

3
@nicael Wiem, po prostu zastanawiałem się, jak zdefiniować 𝑎 (∞).
LegionMammal978

2
Znany również jako sekwencja linijki (ale z literami zamiast cyfr), dla czegoś łatwiejszego w Google.
user253751

4
Dla tego, co jest warte, każde prawidłowe rozwiązanie tego problemu jest również rozwiązaniem zagadki Towers of Hanoi dla dysków N.
Jeff Zeitlin

3
Czy możemy zastosować indeksowanie oparte na 1 zamiast indeksowania oparte na 0?
Esolanging Fruit

Odpowiedzi:


8

Pyth, 11 bajtów

u++GHG<GhQk

Prosta redukcja.


2
@Loovjo Oh. Nie ma sensu, 0powinna być pusta sekwencja IMO, ale dostosuję się do pytania ...
orlp

4
Tak, proste. idzie i uderza głową w ścianę
J Atkin

@JAtkin Otwórz Pyth'a rev-doc.txtobok tej odpowiedzi i powinien on łatwo okazać się prosty.
orlp

Hehehe, nie to miałem na myśli (nie wiem pyth, więc ....)
J Atkin

7

Python, 44 bajty

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

Wygląda podejrzanie na golfa.


7

Haskell, 39 37 bajtów

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

Przykład użycia: a 3-> "abacabadabacaba".

Edycja: @Angs znalazł dwa bajty do zapisania. Dzięki!


Nie a n=a(n-1)++[97+n]++a(n-1)działałoby? Nie mogę teraz przetestować.
patrz

@Seeq: nie, [97+n]jest listą Integeri a(n-1)jest listą Char(aka String). Nie można łączyć list z różnymi typami. toEnumrobi Charz Integer.
nimi

Ach, zawsze myślałem, że Char jest po prostu wyspecjalizowaną liczbą całkowitą w Haskell.
patrz

['a'..]!!njest o 2 bajty krótszy niżtoEnum(97+n)
Angs

@Angs: Good catch! Dzięki!
nimi

6

Pyth, 14 13 bajtów

Dzięki Jakube za uratowanie bajtu!

VhQ=+k+@GNk;k

Roztwór z 14 bajtów: VhQ=ks[k@GNk;k.

Wyjaśnienie:

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

Wypróbuj tutaj !


Czy „N in range” nie powinno być na Vlinii? hQjest po prostueval(input) + 1
Loovjo

@Loovjo Tak, to jest lepsze i mniej mylące :)
Adnan

Możesz skrócić =kdo =. Pyth automatycznie przypisze wynik k, ponieważ kjest to pierwsza zmienna w wyrażeniu +k+@GNk.
Jakube,

@Jakube Dziękuję bardzo! :)
Adnan

Mam inną odpowiedź na to wyzwanie. To nie przebije tego rozwiązania, ale ilustruje technikę podania pierwszych n znaków w sekwencji: Vt^2Q=+k@Gx_.BhN`1)k(W tym przypadku jest ustawione, aby dać pierwsze 2 ^ Q-1 znaków, jak wymaga wyzwanie, ale widać jak to zmienić.)
kwintopia


5

Brainfuck, 157 bajtów

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

Dane wejściowe są podawane w postaci binarnej.

Podstawową ideą jest wielokrotne powielanie bieżącej sekwencji (zaczynając od „a”) i zwiększanie ostatniego elementu po każdej iteracji:

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

Gdy wszystko to zostanie wykonane określoną ilość razy, wynik zostanie wydrukowany z wyłączeniem ostatniego elementu.

Szczegółowe wyjaśnienie

Pamięć jest uporządkowana w następujący sposób:

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

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

Odliczanie przechowuje liczbę cykli kopiowania, które należy jeszcze wykonać. Sekwencja ABACABA jest przechowywana w sąsiednich blokach, z których każdy składa się z 3 komórek. Wartość zawiera znak elementu (tj. „A”, „B”, „C” ...). Kopiowanie Flaga wskazuje, czy odpowiedni element musi być kopiowane w ramach obecnego cyklu kopiowania (0 = kopiowanie, 1 = nie). Koniec flaga jest ustawiona na 0 dla ostatniego elementu, gdy jest kopiowany (jest to 1 we wszystkich innych przypadkach).

Teraz do faktycznego (nieco nie golfowego) programu:

,                       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
Witamy na stronie! Byłbym zainteresowany bardziej szczegółowym podziałem!
Kreator pszenicy

1
@ SriotchilismO'Zaic Dziękujemy za odpowiedź :) Dodałem teraz szczegółowe wyjaśnienie.
orthoplex

5

Haskell , 36 bajtów

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

Wypróbuj online!

Wykorzystuje inną metodę rekurencyjną niż większość innych odpowiedzi. Aby uzyskać następny ciąg w sekwencji, nie łączymy dwóch kopii w poprzednim ciągu z nową literą pomiędzy, ale zamiast tego zwiększamy każdą literę i między literami a.

aba -> bcb -> abacaba

1
Masz na myśli bcbzamiast cbc?
Jo King

4

05AB1E , 12 bajtów (niekonkurencyjny)

Kod:

'aIGDN>.bsJl

Niech mnie diabli. Naprawiłem wiele błędów dzięki temu wyzwaniu haha.

Wyjaśnienie:

'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

Dlaczego jest niekonkurencyjny?
Loovjo,

@Loovjo Naprawiłem błędy po opublikowaniu wyzwania, dlatego nie jest konkurencyjne :(
Adnan

4

JavaScript (ES6), 43 42 bajty

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

Zapisany bajt dzięki @Neil !

Kolejne proste rozwiązanie rekurencyjne ...


(n+11).toString(36)oszczędza 1 bajt i działa do (25)!
Neil

@Neil Implemented. Dzięki!
user81655,


3

Ruby (1.9 i nowsze), 38 bajtów

?ajest bardziej golfistycznym sposobem pisania, "a"ale wygląda dziwnie po zmieszaniu z trójskładnikiem?:

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

3

R , 48 bajtów

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

Wypróbuj online!

Prosta rekurencja.


Co to jest pasta0 ???
Xi'an

@ Xi'an paste0jest równoważne pastez sep="", więc unikaj spacji między literami, które pastebyłyby dodawane domyślnie.
Robin Ryder

2

C #, 59 bajtów

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

Po prostu kolejne rozwiązanie C # ...


2

Perl, 33 bajty

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

Nie ma prawdziwej potrzeby odblokowywania gry w golfa. Buduje ciąg, iteracyjnie dodając kolejny znak w sekwencji plus odwrotność łańcucha do tej pory, używając wartości ASCII „a” jako punktu początkowego. Używa, $\aby zaoszczędzić kilka pociągnięć, ale jest to tak trudne, jak to możliwe.

Działa na a(0)wskroś, a(25)a nawet dalej. Chociaż później dostajesz się do rozszerzonego ASCII a(29), zabraknie pamięci na długo przed wyczerpaniem się kodów znaków:

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

Aby zapisać wynik a(255)(nieprzetestowany!), Potrzebne byłyby 2 ^ 256 - 1 = 1,15x10 ^ 77 bajtów lub około 1,15x10 ^ 65 1-terabajtowych dysków.


1
Potrzebujemy teraz
CalculatorFeline

2

Java 7, 158 bajtów

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

Lubię czaić się przy PPCG i cieszę się, że mogę głosować / komentować inne odpowiedzi.

Dane wejściowe są podawane jako parametry programu. Ma to ten sam format, co wiele innych odpowiedzi tutaj, ponieważ jest to prosta rekurencyjna implementacja. Skomentowałbym inną odpowiedź, ale nie mam jeszcze przedstawiciela, który mógłby to skomentować. Różni się też nieco tym, że wywołanie rekurencyjne jest wykonywane dwukrotnie, zamiast budowania łańcucha i przekazywania go dalej.


Witamy zatem w PPCG! Mam nadzieję, że w przyszłości zrobisz coś więcej niż głosowanie i komentowanie (ale nie czuję, że musisz). :)
Martin Ender

2

Mathematica, 36 32 bajtów

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

Czy kiedykolwiek oglądałeś TWOW 11B?


Nie ma potrzeby, "",a następnie można użyć notacji infix dla Fold.
Martin Ender

# 1 powoduje null <>s, a # 2 działa tylko dla funkcji binarnych.
CalculatorFeline

Czy zamieściłeś ten komentarz do zamierzonej odpowiedzi? Ponieważ nie mam pojęcia, co masz na myśli. :)
Martin Ender

* # 1 powoduje, że StringJoin dołącza wartości null, a # 2 działa tylko dla funkcji binarnych lub asocjacyjnych. (x ~ Fold ~ y ~ Fold ~ z = Fold [x, Fold [y, z]] zamiast Fold [x, y, z])
CalculatorFeline

Och, masz na myśli „sugestię nr 1”. Nie, to nie powoduje Nulls. Dlaczego miałoby to
Martin Ender

2

Python, 62 54 46 45 bajtów

Chciałbym myśleć, że ten kod wciąż można w jakiś sposób pograć w golfa.

Edycja: Naprawiono błąd dzięki Lynn. -1 bajt dzięki kałamarnicy.

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

Wypróbuj online!


Dane wyjściowe powinny być pisane małymi literami. Wielkie litery w pytaniu mają na celu wyjaśnienie powtórzeń.
Loovjo

Ups Dziękuję za wyjaśnienie.
Sherlock9

Blargle. Dzięki @ user81655
Sherlock9

Jest to nieprawidłowe (nigdy się nie kończy - spróbuj). Nawet w przypadku podstawowym obliczana jest rekurencyjna część wyrażenia.
Lynn,

Naprawiony. Dzięki @Lynn!
Sherlock9

1

Mathematica, 46 bajtów

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

Prosta funkcja rekurencyjna. Inne rozwiązanie:

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

1

K5, 18 bajtów

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

Wielokrotnie stosuj funkcję do przenoszonej wartości ( "A") i każdego elementu sekwencji. Sekwencja składa się z liter alfabetu od B do pewnej liczby N ( `c$66+!). Funkcja łączy lewy argument po obu stronach prawego argumentu ( {x,y,x}).

W akcji:

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

Myślę, że sekwencja powinna być pisana małymi literami, ale to nie kosztuje bajtów.
user48538

1

JavaScript, 65 57 1 bajtów

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

Próbny:

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

1 - dzięki Neil za uratowanie 8 bajtów


(i+11).toString(36)oszczędza 6 bajtów.
Neil,

@Neil Haha, to sprytny hack
nicael

Aha, a jeśli przeniesiesz przypisanie s="a";do wcześniejszego, forwówczas stanie się ono domyślną wartością zwracaną i możesz porzucić końcowe ;szapisywanie o kolejne 2 bajty.
Neil,

@Neil Nice, nie wiedziałem o tym.
nicael

Myślę, że można zapisać bajt, zwiększając wartość iinline i upuszczając przyrost w pętli for. Więc ...for(i=0;i<n;)s+=(i+++11)...
Nie, że Charles

1

Japt, 20 17 bajtów

97oU+98 r@X+Yd +X

Przetestuj online!

Jak to działa

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

Wersja niekonkurencyjna, 14 bajtów

97ôU r@X+Yd +X

ôFunkcja jest jak o, ale tworzy szereg [X..X+Y]zamiast [X..Y). Przetestuj online!

Zdecydowanie wolę zmianę z 97 na 94, w którym to przypadku 5wygląda tak:

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

1

Java, 219 bajtów

Moja pierwsza próba golfowego kodu. Prawdopodobnie można grać w golfa dalej, ale jestem głodny i idę na 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;}}

Nie golfowany:

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

Dość prosty algorytm rekurencyjny o brutalnej sile, wykorzystuje charmanipulację.


Możesz pominąć publicsłowo kluczowe z ai addLetter/ j.
dorukayhan chce odzyskać Monikę

1

MATL , 14 bajtów

0i:"t@whh]97+c

Używa wersji 8.0.0 języka / kompilatora, która jest wcześniejsza niż wyzwanie.

Przykład

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

Wyjaśnienie

Secuence powstaje pierwsza z liczb 0, 1, 2, ... Są one zamieniane na litery 'a', 'b', 'c'na końcu.

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

Edytować

Wypróbuj online!


1

PowerShell, 53 , 46 , 44 , 41 bajtów

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

Wklejenie do konsoli wygeneruje błędne wyjście przy drugim uruchomieniu, ponieważ $dnie zostanie ponownie zainicjowane.

Zaoszczędź 2 bajty za pomocą + = Oszczędź 3 bajty dzięki @TimmyD


@TimmyD Faktycznie dostaje go w dół do 41, ponieważ nie będą potrzebne (, ).
Jonathan Leech-Pepin

Nie, to była moja wina, właściwie zapomniałem go zaktualizować, chociaż powiedziałem, że to zrobiłem.
Jonathan Leech-Pepin

skrypt nie łączy się z 0 i nie generuje dużej litery
mazzy

1

Gaia , 14 bajtów

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

Wypróbuj 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

Japt , 8 bajtów

;gCåÈ+iY

Spróbuj

;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

Łuska , 12 bajtów

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

Wypróbuj online!

Używa indeksowania 1, co mam nadzieję, że jest OK.

Wyjaśnienie

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

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

1

APL (NARS), 24 znaki, 48 bajtów

{⍵<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

1
Czy APL nie używa własnej strony kodowej z każdym znakiem w jednym bajcie, co daje 24 bajty?
Loovjo,

@Loovjo za to, co wiem Nars Apl ma zestaw znaków 2 bajty dla postaci
RosLuP

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.