Abacabaシーケンスを生成する


35

この課題は、特定の深さのアバカバシーケンスを印刷することです。

最初の5つのシーケンスの図を次に示します(a(N)深さNのアバカバシーケンスです。大文字/小文字は単にパターンを示すためであり、これはプログラムの出力では必要ありません)。

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

おそらくわかるように、n番目のアバカバシーケンスは、n番目の文字とそれ自体に追加された最後のシーケンスです。(a(n) = a(n - 1) + letter(n) + a(n - 1)

あなたの仕事は、整数を取り、その深さのアバカバシーケンスを出力するプログラムまたは関数を作成することです。出力は、少なくとも15までの値に対して正確でなければなりません。


3
𝑎₂₅の後のシーケンスは未定義になりませんか
LegionMammal978

3
@nicael私が知っている、私は𝑎(∞)がどのように定義されるのかと思っていました。
LegionMammal978

2
ルーラーシーケンスとも呼ばれます(ただし、数字の代わりに文字が使用されます)。
user253751

4
価値があるのは、この問題の有効な解決策は、N台のディスクのハノイの塔パズルの解決策でもあります。
ジェフツァイトリン

3
0ベースのインデックス付けの代わりに1ベースのインデックス付けを使用できますか?
エソランジングフルーツ

回答:


8

Pyth、11バイト

u++GHG<GhQk

単純な削減。


2
@Loovjoああ。意味があり0ません、空のシーケンスIMO である必要がありますが、質問に準拠します
...-orlp

4
うん、簡単です。行くと前髪は壁に頭
Jアトキン

@JAtkin rev-doc.txtこの答えの隣にあるPythを開いてください。簡単であることはすぐにわかるはずです。
orlp

Hehehe、私が意味するものではありません(私は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は保存する2バイトを見つけました。ありがとう!


動作しませんa n=a(n-1)++[97+n]++a(n-1)か?今はテストできません。
seequ

@Seeq:いいえ、[97+n]のリストでIntegerありa(n-1)Char(別名String)のリストです。異なるタイプのリストを連結することはできません。toEnum作るCharのアウトInteger
-nimi

ああ、私はCharがHaskellの特殊な整数だといつも思っていました。
seequ

['a'..]!!nが2バイトより短いtoEnum(97+n)
-Angs

@Angs:良いキャッチ!ありがとう!
-nimi

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
寂部

@ジャクベありがとうございます!:)
アドナン

私はこの挑戦に対して別の答えを持っています。このソリューションに勝るものはありませんが、シーケンスの最初のn文字を与える手法を示しています:(Vt^2Q=+k@Gx_.BhN`1)kこの例では、チャレンジが必要とする最初の2 ^ Q-1文字を与えるように設定されていますが、それを変更する方法。)
キントピア

5

網膜37 32バイト

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

後続の改行は重要です。入力は単項で取得さます。

オンラインでお試しください!


それは動作しません。
リーキー修道女

@KennyLauはい、この回答を投稿してからRetinaが変更されたためです。GitHubから直接投稿された最新のリリースをチェックアウトすると、そのリリースで動作します。
マーティンエンダー

5

Brainfuck、157バイト

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

入力はバイナリで提供されます。

基本的な考え方は、現在のシーケンス(「a」で始まる)を繰り返し複製し、各反復後に最後の要素をインクリメントすることです。

  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 =ない、コピー)現在の複写サイクル内にコピーする必要があるか否かを示します。エンドそれがコピーされている間フラグ(それは他のすべての場合において1'S)最後の要素を0に設定されています。

さて、実際の(少しだけの)プログラムへ:

,                       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"!!)

オンラインでお試しください!

これは、他のほとんどの答えとは異なる再帰的な方法を使用します。シーケンス内の次の文字列を取得するために、前の文字列の2つのコピーを新しい文字で結合せずに、すべての文字をインクリメントし、それらを挿入します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のおかげで1バイト節約できました!

さらに別の単純な再帰的ソリューション...


(n+11).toString(36) saves you 1 byte, and works for up to a(25)!
Neil

@Neil Implemented. Thanks!
user81655


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

3

R, 48 bytes

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

Try it online!

Simple recursion.


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


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.


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.


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?


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!


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

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")

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


(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^_^`^_^

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.


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!


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


@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


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

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"!!)

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

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!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.