Генерация последовательности Абакаба


35

Эта задача касается печати последовательности abacaba определенной глубины.

Вот схема первых 5 последовательностей ( a(N)это последовательность abacaba глубины N, верхний / нижний регистр просто для того, чтобы показать шаблон, это не требуется в выходных данных вашей программы):

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

Как вы, вероятно, можете сказать, n-ая последовательность abacaba является последней с n-ой буквой и снова добавленной к ней. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

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


3
Разве последовательность не будет неопределенной после 𝑎₂₅?
LegionMammal978

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

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

4
Что бы ни стоило, любое правильное решение этой проблемы также является решением головоломки Ханойских Башен для N дисков.
Джефф Цейтлин

3
Можем ли мы использовать индексирование на основе 1 вместо индексирования на основе 0?
Esolanging Fruit

Ответы:


8

Pyth, 11 байт

u++GHG<GhQk

Простое сокращение.


2
@ Loovjo Ох. Не имеет смысла, 0должна быть пустая последовательность ИМО, но я
подхожу

4
Да просто. идет и бьет головой о стену
J Аткин

@JAtkin Откройте Pyth rev-doc.txtрядом с этим ответом, и он должен легко показать себя простым.
orlp

Хе-хе, не то, что я имел в виду (я не знаю, Pyth, так что ....)
J Аткин

7

Python, 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.
Nimi

Ах, я всегда думал, что Чар - просто специализированное целое число в Хаскеле.
Seequ

['a'..]!!nна 2 байта корочеtoEnum(97+n)
Angs

@Angs: Хороший улов! Благодарность!
Ними,

6

Pyth, 14 13 байтов

Спасибо Jakube за сохранение байта!

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

@Loovjo Да, это лучше и меньше сбивает с толку :)
Аднан

Вы можете сократить =kдо =. Pyth автоматически присваивает результат k, поскольку kявляется первой переменной в выражении +k+@GNk.
Якуб

@Jakube Большое спасибо! :)
Аднан

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

5

Сетчатка , 37 32 байта

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

Конечный перевод строки значителен. Ввод принимается в одинарном .

Попробуйте онлайн!


Это не работает.
Дрянная Монахиня

@KennyLau да, потому что Retina изменилась, так как я опубликовал этот ответ. Если вы посмотрите версию, которая была самой последней, когда она была опубликована непосредственно на GitHub, она будет работать с этим.
Мартин Эндер

5

Brainfuck, 157 байтов

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

Вход дан в двоичном виде.

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

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

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

Подробное объяснение

Память устроена следующим образом:

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

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

Обратный отсчет содержит количество циклов копирования, которые еще предстоит выполнить. Последовательность ABACABA хранится в последовательных блоках, каждый из которых состоит из 3 ячеек. Значение содержит символ элемента (то есть «A», «B», «C» ...). Копировать флаг указывает , необходимо ли или нет соответствующий элемент должен быть скопирован в пределах текущего цикла копирования (0 = копировать, 1 = нет). Конец флаг установлен в 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

4

JavaScript (ES6), 43 42 байта

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

Байт сохранен благодаря @Neil !

Еще одно простое рекурсивное решение ...


(n+11).toString(36)экономит 1 байт и работает до (25)!
Нил

@Neil Реализован. Благодарность!
user81655


3

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

?aлучший способ написать, "a"но выглядит смешно с троичным?:

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


2

C #, 59 байт

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

Просто еще одно решение C # ...


2

Perl, 33 байта

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

Нет необходимости в игре в гольф. Создает строку путем итеративного добавления следующего символа в последовательности плюс обратная строка до сих пор, используя значение ASCII «a» в качестве начальной точки. Использует, $\чтобы сохранить несколько штрихов, но это примерно так же сложно, как и получается.

Работает на a(0)протяжении a(25)и даже дальше. Несмотря на то, что вы попадаете в расширенный ASCII a(29), вы исчерпаете память задолго до того, как исчерпаете коды символов:

a(25)составляет ~ 64 МБ. a(29)составляет ~ 1 ГБ.

Чтобы сохранить результат 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

Mathematica, 36 32 байта

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

Вы когда-нибудь смотрели TWOW 11B?


Нет необходимости в, "",и тогда вы можете использовать инфиксную нотацию для Fold.
Мартин Эндер,

# 1 вызывает нулевые <>s, а # 2 работает только для двоичных функций.
CalculatorFeline

Вы разместили этот комментарий на ответ, который вы хотели? Потому что я понятия не имею, что вы имеете в виду. :)
Мартин Эндер

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

О, ты имеешь в виду «предложение № 1». Нет, это не вызывает Nulls. С чего бы это?
Мартин Эндер

2

Python, 62 54 46 45 байт

Я хотел бы думать, что этот код все еще может быть каким-то образом отключен.

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

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

Попробуйте онлайн!


Вывод должен быть в нижнем регистре. Верхний регистр в вопросе только для ясности о повторении.
Loovjo

Упс. Благодарю за разъяснение.
Sherlock9

Blargle. Спасибо @ user81655
Sherlock9

Это неверно (никогда не заканчивается - попробуйте). Даже в базовом случае рекурсивная часть выражения оценивается.
Линн

Исправлена. Спасибо @ Линн!
Sherlock9

1

Mathematica, 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 байтов.
Нил

@ Нил Хаха, это умный взлом
Nicael

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

@Neil Ницца, не знал об этом.
Никель

Я думаю, что вы можете сохранить байт, увеличивая значение iinline и уменьшая приращение в цикле 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;}}

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

Довольно простой рекурсивный алгоритм грубой силы, использует 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

Gaia , 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

Шелуха , 12 байт

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

Попробуйте онлайн!

Использует индексирование на основе 1, которое, я надеюсь, в порядке.

объяснение

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

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

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.