Створіть послідовність Абакаби


35

Ця задача полягає у друкуванні послідовності абакаби певної глибини.

Ось схема перших 5 послідовностей ( a(N)це послідовність абакаби на глибині N, верхній / нижній регістр - це просто показати шаблон, це не потрібно у висновку вашої програми):

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

Як ви, напевно, можете сказати, послідовність n-ї абакаби - остання з п’ятою літерою і сама знову додана до неї. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Ваше завдання - скласти програму або функцію, яка займає ціле число і друкує послідовність абакаби цієї глибини. Вихід повинен бути правильним принаймні для значень до 15 включно.


3
Чи не буде послідовність не визначена після 𝑎₂₅?
LegionMammal978

3
@nicael Я знаю, мені було просто цікаво, як 𝑎 (∞) буде визначено.
LegionMammal978

2
Також відомий як послідовність лінійки (але з літерами замість цифр), для чогось легшого для Google.
користувач253751

4
Оскільки це варте, будь-яке правильне рішення цієї проблеми також є вирішенням головоломки Вежі Ханої для N дисків.
Джефф Зейтлін

3
Чи можемо ми використовувати індексацію на основі 1 замість індексації на основі 0?
Esolanging Fruit

Відповіді:


8

Pyth, 11 байт

u++GHG<GhQk

Просте скорочення.


2
@Loovjo О. Не має сенсу, 0повинна бути порожня послідовність ІМО, але я відповім на питання ...
orlp

4
Так, просто. іде і стукає головою об стіну
J Atkin

@JAtkin Відкрийте Pyth rev-doc.txtпоруч із цією відповіддю, і він повинен легко показати себе простим.
orlp

Hehehe, не те, що я мав на увазі (я не знаю pyth, так що ....)
J Atkin

7

Пітон, 44 байти

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

Виглядає підозріло, може бути, пограти.


7

Haskell, 39 37 байт

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

Приклад використання: a 3-> "abacabadabacaba".

Редагувати: @Angs знайшов два байти для збереження. Спасибі!


Не буде a n=a(n-1)++[97+n]++a(n-1)працювати? Неможливо зараз перевірити.
seequ

@Seeq: ні, [97+n]це список Integerі a(n-1)є списком Char(ака String). Ви не можете об'єднати списки різних типів. toEnumробить Charпоза Integer.
німі

Ах, я завжди вважав, що Чар є просто спеціалізованим цілим числом в Haskell.
seequ

['a'..]!!nна 2 байти коротше, ніжtoEnum(97+n)
Angs

@Angs: Гарний улов! Спасибі!
німі

6

Pyth, 14 13 байт

Дякую Якубе за збереження байта!

VhQ=+k+@GNk;k

Рішення з 14 байт: VhQ=ks[k@GNk;k.

Пояснення:

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

Спробуйте тут !


Чи не повинен "N у діапазоні" бути на Vлінії? hQпростоeval(input) + 1
Ловжо

@Loovjo Так, це краще і менш заплутано :)
Аднан

Можна скоротити =kдо =. Pyth автоматично призначить результат k, оскільки kце перша змінна у виразі +k+@GNk.
Якубе

@Jakube Дуже дякую! :)
Аднан

У мене є інша відповідь на цей виклик. Він не буде бити це рішення, але він ілюструє техніку надання перших n символів послідовності: Vt^2Q=+k@Gx_.BhN`1)k(У цьому випадку встановлено, щоб дати перші 2 ^ Q-1 символи, як вимагає виклик, але ви можете побачити як це змінити.)
квінтопія

5

Сітківка , 37 32 байт

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

Подача підводного каналу є значною. Введення приймається одинарним .

Спробуйте в Інтернеті!


Вона не працює.
Leaky Nun

@KennyLau так, тому що Retina змінилася, коли я опублікував цю відповідь. Якщо ви перевірите останній випуск, коли він був розміщений безпосередньо з GitHub, він буде працювати з цим.
Мартін Ендер

5

Brainfuck, 157 байт

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

Вхід подається у двійковій формі.

Основна ідея полягає в тому, щоб повторно дублювати поточну послідовність (починаючи з «а») і нарощувати останній елемент після кожної ітерації:

  1. a → aa → ab

  2. ab → abab → abac

  3. абак → абакабак → абакабак

  4. ...

Коли все це було зроблено вказану кількість разів, результат надрукується, виключаючи останній елемент.

Поглиблене пояснення

Пам'ять розташована таким чином:

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

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

Зворотний відлік містить кількість циклів копіювання, які ще належить виконати. Послідовність ABACABA зберігається в суміжних блоках, кожен з яких складається з 3 комірок. Значення містить характер елемента (тобто "A", "B", "C" ...). Копіювати прапор вказує , чи потрібно чи ні відповідний елемент повинен бути скопійований в межах поточного циклу копіювання (0 = копіювати, 1 = немає). End прапор встановлений в 0 для останнього елемента , поки він копіюється (це 1 у всіх інших випадках).

Тепер до фактичної (злегка не золотої) програми:

,                       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
Ласкаво просимо на сайт! Мене зацікавить більш детальна розбивка!
Пшеничний майстер

1
@ SriotchilismO'Zaic Дякую за вашу відповідь :) Я додав детальне пояснення.
ортоплекс

5

Haskell , 36 байт

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

Спробуйте в Інтернеті!

Для цього використовується інший рекурсивний метод, ніж більшість інших відповідей. Щоб отримати наступний рядок у послідовності, ми не з'єднуємо дві копії в попередньому рядку з новою літерою між ними, а натомість збільшуємо кожну букву та проміжок a.

aba -> bcb -> abacaba

1
Ви маєте на увазі bcbзамість cbc?
Джо Кінг

4

05AB1E , 12 байт (неконкурентоспроможний)

Код:

'aIGDN>.bsJl

Я буду проклятий. Я виправив багато помилок завдяки цій проблемі ха-ха.

Пояснення:

'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

Чому він є неконкурентоспроможним?
Loovjo

@Loovjo Я виправляв помилки після опублікування виклику, тому це неконкуренто :(
Adnan



3

Рубін (1,9 і вище), 38 байт

?aє гольфістичним способом писати, "a"але виглядає дивно, коли його змішують із потрійними?:

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



2

Perl, 33 байти

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

Немає реальної потреби в не-гольфі. Побудовує рядок шляхом ітеративного додавання наступного символу в послідовності плюс реверсу рядка до цих пір, використовуючи значення ASCII 'a' в якості вихідної точки. Використання$\ для збереження декількох штрихів, але це настільки ж складно, як це стає.

Працює a(0)наскрізь a(25)і навіть далі. Незважаючи на те, що ви потрапите в розширений ASCII після a(29), у вас не вистачить пам'яті задовго до того, як у вас вичерпаються коди символів:

a(25)становить ~ 64MiB. a(29)становить ~ 1GiB.

Щоб зберегти результат a(255)(неперевірений!), Знадобиться 2 ^ 256 - 1 = 1,15x10 ^ 77 байт або приблизно 1,15x10 ^ 65 1-терабайтних накопичувачів.


1
Нам потрібні ці дискові механізми, пов'язані з
CalculatorFeline

2

Java 7, 158 байт

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

Мені подобається ховатися навколо PPCG, і мені б сподобалося мати можливість голосувати / коментувати інші відповіді.

Введення задано як програмні параметри. Це відповідає тому ж формату, що і багато інших відповідей тут, оскільки це прямолінійна рекурсивна реалізація. Я б прокоментував іншу відповідь, але ще не маю відповіді, щоб коментувати. Це також трохи відрізняється тим, що рекурсивний виклик виконується двічі, а не побудова рядка та передача його вздовж.


Ласкаво просимо до PPCG! Я сподіваюся, що ви зробите щось більше, ніж голосування та коментування в майбутньому (але не відчуваєте, що потрібно). :)
Мартін Ендер

2

Математика, 36 32 байти

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

Ви коли-небудь дивилися TWOW 11B?


Немає потреби в, "",і тоді ви можете використовувати позначення інфіксації для Fold.
Мартін Ендер

№1 викликає null <>s, а # 2 працює лише для двійкових функцій.
CalculatorFeline

Ви опублікували цей коментар у відповідь, яку ви планували? Тому що я поняття не маю на увазі. :)
Мартін Ендер

* # 1 викликає приєднання StringJoin до нулів, а №2 працює лише для бінарних або асоціативних функцій. (x ~ Fold ~ y ~ Fold ~ z = Fold [x, Fold [y, z]] замість Fold [x, y, z])
CalculatorFeline

О, ти маєш на увазі "пропозиція №1". Ні, це не викликає Нулів. Навіщо це?
Мартін Ендер

2

Пітон, 62 54 46 45 байт

Я хотів би подумати, що цей код все-таки можна якось пограти вниз.

Редагувати: виправлення помилок завдяки Лінні. -1 байт завдяки кальмарам.

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

Спробуйте в Інтернеті!


Вихідні дані повинні бути малими. Прописні запитання - це просто для ясності щодо повторення.
Loovjo

Уопс. Дякуємо за роз’яснення.
Шерлок9

Блискучий. Дякуємо @ user81655
Sherlock9

Це недійсне значення (воно ніколи не припиняється - спробуйте). Навіть у базовому випадку оцінюється рекурсивна частина виразу.
Лінн

Виправлено. Дякую @Lynn!
Шерлок9,

1

Математика, 46 байт

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

Проста рекурсивна функція. Ще одне рішення:

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

1

К5, 18 байт

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

Неодноразово застосовуйте функцію до перенесеного значення ( "A") та кожного елемента послідовності. Послідовність - це алфавітні символи від B до деякого числа N ( `c$66+!). Функція приєднується до лівого аргументу з обох боків правого аргументу ( {x,y,x}).

Дія:

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

Я думаю, що послідовність повинна бути малою, але це не має байтів.
user48538

1

JavaScript, 65 57 1 байт

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

Демонстрація:

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

1 - дякую Нілу за збереження 8 байт


(i+11).toString(36)економить 6 байт.
Ніл

@Neil Haha, це розумний хак
nicael

О, і якщо ви перемістите завдання s="a";до forцього, воно стане значенням, що повертається за замовчуванням, і ви можете скинути трейлінг ;sна ще 2 байт збереження.
Ніл

@Neil Nice, не знав про це.
nicael

Я думаю, що ви можете зберегти байт, збільшивши iрядок і опустивши приріст у циклі for. Отже ...for(i=0;i<n;)s+=(i+++11)...
Не те, що Чарльз

1

Japt, 20 17 байт

97oU+98 r@X+Yd +X

Перевірте це в Інтернеті!

Як це працює

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

Неконкурентна версія, 14 байт

97ôU r@X+Yd +X

ôФункція схожа o, але і створює діапазон [X..X+Y]замість [X..Y). Перевірте це в Інтернеті!

Я дуже вважаю за краще змінити 97 на 94, і в такому випадку вихід для 5виглядає так:

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

1

Java, 219 байт

Моя перша спроба гольфу з кодом. Напевно, може бути далі гольф, але я голодний і виходжу на обід.

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

Безголівки:

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

Досить прямолінійний алгоритм грубої сили, використовує charманіпуляції.


Ви можете опустити publicключове слово з aі addLetter/ j.
снідакайхан хоче, щоб Моніка повернулася

1

MATL , 14 байт

0i:"t@whh]97+c

Для цього використовується версія 8.0.0 мови / компілятора, що є раніше, ніж виклик.

Приклад

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

Пояснення

Secuence створюється перше з номерами 0, 1, 2... Вони перетворюються в літери 'a', 'b', 'c'в кінці кінців.

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

Редагувати

Спробуйте в Інтернеті!


1

Powershell, 53 , 46 , 44 , 41 байт

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

Вставлення в консоль призведе до помилкового виводу під час другого запуску, оскільки $dйого не ініціалізують повторно.

Збережіть 2 байти, використовуючи + = Збережіть 3 байти завдяки @TimmyD


@TimmyD На насправді отримує його до 41 , так як я не потрібен (, ).
Джонатан Ліч-Пепін

Ні, це була моя вина, я фактично забув оновити це, хоча сказав, що так і зробив.
Джонатан Ліч-Пепін

сценарій не змінюється з 0 і не генерує великі літери
mazzy

1

Гая , 14 байт

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

Спробуйте в Інтернеті!

₵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 байт

;gCåÈ+iY

Спробуй це

;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

APL (NARS), 24 символи, 48 байт

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

тест:

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

1
Чи APL не використовує власну кодову сторінку з кожним символом по одному байту, роблячи це 24 байтами?
Loovjo

@Loovjo для того, що я знаю, Nars Apl має набір символів 2 байти для персонажа
RosLuP

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.