Hasilkan urutan Abacaba


35

Tantangan ini adalah tentang mencetak urutan abacaba dengan kedalaman tertentu.

Berikut adalah diagram dari 5 urutan pertama ( a(N)adalah urutan abacaba dengan kedalaman N, huruf besar / kecil hanya untuk menunjukkan polanya, ini tidak diperlukan dalam output program Anda):

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

Seperti yang mungkin Anda tahu, urutan abacaba ke-n adalah yang terakhir dengan huruf ke-n dan itu sendiri ditambahkan lagi ke dalamnya. ( a(n) = a(n - 1) + letter(n) + a(n - 1))

Tugas Anda adalah membuat program atau fungsi yang mengambil integer dan mencetak urutan abacaba dari kedalaman itu. Output harus benar setidaknya untuk nilai hingga dan termasuk 15.


3
Bukankah urutannya tidak terdefinisi setelah 𝑎₂₅?
LegionMammal978

3
@nicael Saya tahu, saya hanya ingin tahu bagaimana 𝑎 (∞) akan didefinisikan.
LegionMammal978

2
Juga dikenal sebagai urutan penggaris (tetapi dengan huruf dan bukan angka), untuk sesuatu yang lebih mudah Google-mampu.
user253751

4
Untuk apa nilainya, solusi apa pun yang valid untuk masalah ini juga merupakan solusi untuk puzzle Towers of Hanoi untuk disk N.
Jeff Zeitlin

3
Bisakah kita menggunakan pengindeksan berbasis 1 dan bukan pengindeksan berbasis 0?
Buah Esolanging

Jawaban:


8

Pyth, 11 byte

u++GHG<GhQk

Pengurangan sederhana.


2
@Loovjo Oh. Tidak masuk akal, 0seharusnya menjadi urutan IMO yang kosong, tetapi saya akan menyesuaikan dengan pertanyaan ...
orlp

4
Ya sederhana. pergi dan memukul kepala di dinding
J Atkin

@JAtkin Buka Pyth di rev-doc.txtsebelah jawaban ini, dan harusnya mudah saja.
orlp

Hehehe, bukan yang saya maksud (saya tidak tahu apa-apa, jadi ....)
J Atkin

7

Python, 44 byte

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

Terlihat mencurigakan mungkin golf.


7

Haskell, 39 37 byte

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

Contoh penggunaan: a 3-> "abacabadabacaba".

Sunting: @Angs menemukan dua byte untuk disimpan. Terima kasih!


Tidak akan a n=a(n-1)++[97+n]++a(n-1)bekerja Tidak dapat menguji sekarang.
seequ

@Seeq: tidak, [97+n]adalah daftar Integerdan a(n-1)adalah daftar Char(alias String). Anda tidak dapat menggabungkan daftar dengan tipe yang berbeda. toEnummembuat Charkeluar dari Integer.
nimi

Ah, saya selalu berpikir Char hanya bilangan bulat khusus di Haskell.
seequ

['a'..]!!nlebih pendek 2 byte daritoEnum(97+n)
Angs

@ Angs: Tangkapan bagus! Terima kasih!
nimi

6

Pyth, 14 13 byte

Terima kasih kepada Jakube karena telah menghemat satu byte!

VhQ=+k+@GNk;k

Sebuah solusi dengan 14 byte: VhQ=ks[k@GNk;k.

Penjelasan:

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

Coba di sini !


Tidakkah seharusnya "N dalam jangkauan" berada di Vtelepon? hQhanyaeval(input) + 1
Loovjo

@Loovjo Ya, itu lebih baik dan tidak membingungkan :)
Adnan

Anda dapat mempersingkat =kmenjadi =. Pyth akan secara otomatis menetapkan hasilnya k, karena kmerupakan variabel pertama dalam ekspresi +k+@GNk.
Jakube

@ Jakube Terima kasih banyak! :)
Adnan

Saya punya jawaban berbeda untuk tantangan ini. Itu tidak akan mengalahkan solusi ini, tetapi itu menggambarkan teknik untuk memberikan n karakter pertama dari urutan: Vt^2Q=+k@Gx_.BhN`1)k(Dalam hal ini, itu diatur untuk memberikan 2 ^ Q-1 karakter pertama sesuai tantangan yang dibutuhkan, tetapi Anda dapat melihat bagaimana mengubah itu.)
kuintopia


5

Brainfuck, 157 byte

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

Masukan diberikan dalam bentuk biner.

Ide dasarnya adalah berulang kali menduplikasi urutan saat ini (dimulai dengan "a") dan untuk menambah elemen terakhir setelah setiap iterasi:

  1. a → aa → ab

  2. ab → abab → abac

  3. abac → abacabac → abacabac

  4. ...

Ketika semua ini telah dilakukan sebanyak yang ditentukan, hasilnya akan dicetak tidak termasuk elemen terakhir.

Penjelasan mendalam

Memori diatur dengan cara berikut:

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

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

Countdown menyimpan jumlah siklus salinan yang belum dieksekusi. Urutan ABACABA disimpan dalam blok adjecent, masing-masing terdiri dari 3 sel. Nilai memegang karakter elemen (yaitu "A", "B", "C" ...). The Copy bendera menunjukkan apakah atau tidak sesuai elemen perlu disalin dalam siklus menyalin saat ini (0 = menyalin, 1 = tidak). The End bendera diatur ke 0 untuk elemen terakhir saat itu sedang disalin (itu 1 dalam semua kasus lain).

Sekarang untuk program yang sebenarnya (sedikit ungolfed):

,                       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
Selamat datang di situs ini! Saya akan tertarik dengan rincian yang lebih rinci!
Wheat Wizard

1
@ SriotchilismO'Zaic Terima kasih atas balasan Anda :) Saya sekarang telah menambahkan penjelasan terperinci.
orthoplex

5

Haskell , 36 byte

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

Cobalah online!

Ini menggunakan metode rekursif yang berbeda dari sebagian besar jawaban lainnya. Untuk mendapatkan string berikutnya dalam urutan, kami tidak menggabungkan dua salinan dalam string sebelumnya dengan huruf baru di antaranya, melainkan menambah setiap huruf dan intersperse a.

aba -> bcb -> abacaba

1
Apakah maksud Anda bcbalih-alih cbc?
Jo King

4

05AB1E , 12 byte (tidak kompetitif)

Kode:

'aIGDN>.bsJl

Saya akan terkutuk. Saya memperbaiki banyak bug berkat tantangan ini haha.

Penjelasan:

'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

Mengapa ini tidak kompetitif?
Loovjo

@Loovjo Saya memperbaiki bug setelah tantangan diposting, oleh karena itu tidak kompetitif :(
Adnan

4

JavaScript (ES6), 43 42 byte

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

Satu byte disimpan berkat @Neil !

Namun solusi rekursif sederhana lainnya ...


(n+11).toString(36)menghemat 1 byte, dan bekerja hingga (25)!
Neil

@Neil Diimplementasikan. Terima kasih!
user81655


3

Ruby (1.9 dan lebih tinggi), 38 byte

?aadalah cara golf untuk menulis "a"tetapi terlihat aneh ketika dicampur dengan ternary?:

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

3

R , 48 byte

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

Cobalah online!

Rekursi sederhana.


Eh, apa itu paste0 ???
Xi'an

@ Xi'an paste0setara dengan pastedengan sep="", jadi Anda menghindari spasi di antara huruf-huruf yang pasteakan ditambahkan secara default.
Robin Ryder

2

C #, 59 byte

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

Hanya solusi C # lainnya ...


2

Perl, 33 byte

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

Tidak ada kebutuhan nyata untuk tidak bermain golf. Bangun string ke atas dengan menambahkan secara berulang karakter berikutnya dalam urutan ditambah kebalikan dari string sejauh ini, menggunakan nilai ASCII dari 'a' sebagai titik awal. Menggunakan $\untuk menghemat beberapa pukulan, tapi itu sama rumitnya dengan yang didapat.

Berfungsi untuk a(0)melewati a(25)dan bahkan melampaui. Meskipun Anda masuk ke ASCII diperpanjang setelaha(29) , Anda akan kehabisan memori jauh sebelum Anda kehabisan kode karakter:

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

Untuk menyimpan hasil a(255)(belum teruji!), Seseorang memerlukan 2 ^ 256 - 1 = 1.15x10 ^ 77 byte, atau kira-kira 1,15x10 ^ 65 drive 1-terabyte.


1
Kita membutuhkan drive yottabyte bergetar atom, sekarang!
CalculatorFeline

2

Java 7, 158 byte

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

Saya suka mengintai PPCG dan saya senang bisa memberikan suara / mengomentari jawaban lain.

Input diberikan sebagai parameter program. Ini mengikuti format yang sama dengan banyak jawaban lain di sini dalam arti itu adalah implementasi rekursif langsung. Saya akan mengomentari jawaban lain tetapi saya belum memiliki perwakilan untuk berkomentar. Ini juga sedikit berbeda karena panggilan rekursif dilakukan dua kali daripada membangun string dan meneruskannya.


Selamat datang di PPCG! Saya harap Anda akan melakukan lebih dari memilih dan berkomentar di masa depan (tapi jangan merasa Anda harus melakukannya). :)
Martin Ender

2

Mathematica, 36 32 byte

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

Pernahkah Anda menonton TWOW 11B?


Tidak perlu untuk "",dan kemudian Anda dapat menggunakan notasi infiks untuk Fold.
Martin Ender

# 1 menyebabkan null <>s, dan # 2 hanya berfungsi untuk fungsi biner.
CalculatorFeline

Apakah Anda memposting komentar ini pada jawaban yang Anda maksudkan? Karena aku tidak tahu apa maksudmu. :)
Martin Ender

* # 1 menyebabkan StringJoin bergabung dengan nol, dan # 2 hanya berfungsi untuk fungsi biner atau asosiatif. (x ~ Lipat ~ y ~ Lipat ~ z = Lipat [x, Lipat [y, z]] bukan Lipat [x, y, z])
CalculatorFeline

Oh maksudmu "saran # 1". Tidak, itu tidak menyebabkan Nulls. Kenapa harus begitu?
Martin Ender

2

Python, 62 54 46 45 byte

Saya ingin berpikir bahwa kode ini masih bisa diturunkan entah bagaimana.

Sunting: Perbaikan bug berkat Lynn. -1 byte berkat squid.

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

Cobalah online!


Output harus dalam huruf kecil semua. Huruf besar dalam pertanyaan hanya untuk kejelasan tentang pengulangan.
Loovjo

Aduh. Terimakasih atas klarifikasinya.
Sherlock9

Blargle. Terima kasih @ user81655
Sherlock9

Ini tidak valid (tidak pernah berakhir - coba). Bahkan dalam kasus dasar, bagian rekursif dari ekspresi dievaluasi.
Lynn

Tetap. Terima kasih @ Lynn!
Sherlock9

1

Mathematica, 46 byte

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

Fungsi rekursif sederhana. Solusi lain:

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

1

K5, 18 byte

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

Berulang kali menerapkan fungsi ke nilai yang dibawa ( "A") dan setiap elemen dari suatu urutan. Urutannya adalah karakter alfabet dari B hingga beberapa angka N ( `c$66+!). Fungsi tersebut bergabung dengan argumen kiri di kedua sisi argumen kanan ( {x,y,x}).

Dalam aksi:

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

Saya pikir urutannya harus huruf kecil, tetapi tidak ada biaya byte.
user48538

1

JavaScript, 65 57 1 byte

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 - terima kasih Neil untuk menyimpan 8 byte


(i+11).toString(36)menghemat 6 byte.
Neil

@ Neil Haha, itu peretasan yang cerdas
nicael

Oh, dan jika Anda memindahkan tugas s="a";ke sebelum formaka itu menjadi nilai pengembalian default dan Anda dapat menghapus trailing ;suntuk penghematan 2 byte lainnya.
Neil

@ Neil Nice, tidak tahu tentang itu.
nicael

Saya pikir Anda dapat menyimpan byte dengan menambah iinline dan menjatuhkan kenaikan di for loop. Jadi ...for(i=0;i<n;)s+=(i+++11)...
Bukan berarti Charles

1

Japt, 20 17 byte

97oU+98 r@X+Yd +X

Uji secara online!

Bagaimana itu bekerja

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

Versi yang tidak bersaing, 14 byte

97ôU r@X+Yd +X

The ôfungsi seperti o, tetapi menciptakan kisaran [X..X+Y]bukan [X..Y). Uji secara online!

Saya lebih suka mengubah 97 ke 94, dalam hal ini output untuk 5terlihat seperti:

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

1

Java, 219 byte

Upaya golf kode pertama saya. Mungkin bisa bermain golf lebih jauh, tapi saya lapar dan pergi makan siang.

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

Tidak Disatukan:

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

Algoritma rekursif brute force cukup mudah, menggunakan charmanipulasi.


Anda dapat menghilangkan publickata kunci dari adan addLetter/ j.
dorukayhan ingin Monica kembali

1

MATL , 14 byte

0i:"t@whh]97+c

Ini menggunakan versi 8.0.0 dari bahasa / kompiler, yang lebih awal dari tantangan.

Contoh

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

Penjelasan

Secuence yang dibuat pertama dengan angka 0, 1, 2, ... ini dikonversi ke huruf 'a', 'b', 'c'di akhir.

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

Cobalah online!


1

Powershell, 53 , 46 , 44 , 41 Bytes

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

Menempel ke konsol akan menghasilkan output erron pada jalankan kedua karena $dtidak diinisialisasi ulang.

Simpan 2 byte dengan menggunakan + = Simpan 3 byte berkat @TimmyD


@TimmyD Sebenarnya mendapatkannya turun ke 41 karena aku tidak akan membutuhkan (, ).
Jonathan Leech-Pepin

Tidak, itu salah saya, saya benar-benar lupa untuk memperbaruinya meskipun saya katakan saya perbarui.
Jonathan Leech-Pepin

skrip tidak berubah dengan 0 dan tidak menghasilkan huruf besar
mazzy

1

Gaia , 14 byte

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

Cobalah 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 byte

;gCåÈ+iY

Cobalah

;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

Sekam , 12 byte

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

Cobalah online!

Menggunakan pengindeksan berbasis 1, yang saya harap tidak apa-apa.

Penjelasan

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

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

1

APL (NARS), 24 karakter, 48 byte

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

uji:

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

1
Bukankah APL menggunakan halaman kode sendiri dengan setiap karakter satu byte, membuat ini 24 byte?
Loovjo

@Loovjo untuk apa yang saya tahu Nars Apl memiliki set karakter 2 byte untuk karakter
RosLuP

1

PHP -r , 43 byte

register_argc_argv harus diaktifkan agar ini berfungsi.

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

Cobalah online!

PHP , 51 byte

Fungsi anonim yang mencetak output secara langsung.

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

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.