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.

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

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

Sp3000
sumber
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!

nimi
sumber
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 !

Adnan
sumber
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

Retina , 37 32 byte

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

Linefeed tambahan sangat penting. Input diambil secara unary .

Cobalah online!

Martin Ender
sumber
Tidak bekerja.
Leaky Nun
@ KennyLau ya, karena Retina berubah sejak saya memposting jawaban ini. Jika Anda melihat rilis yang paling baru ketika ini diposting langsung dari GitHub, itu akan bekerja dengan itu.
Martin Ender
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)
orthoplex
sumber
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
Tidak
sumber
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
Adnan
sumber
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 ...

pengguna81655
sumber
(n+11).toString(36)menghemat 1 byte, dan bekerja hingga (25)!
Neil
@Neil Diimplementasikan. Terima kasih!
user81655
3

CJam (14 byte)

'aqi{'b+1$++}/

Demo online

Peter Taylor
sumber
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]}
Sherlock9
sumber
3

R , 48 byte

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

Cobalah online!

Rekursi sederhana.

Robin Ryder
sumber
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 ...

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

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

Menyodok
sumber
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?

CalculatorFeline
sumber
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!

Sherlock9
sumber
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
LegionMammal978
sumber
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")
JohnE
sumber
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

nicael
sumber
(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^_^`^_^
Produksi ETH
sumber
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.

JamesENL
sumber
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!

Luis Mendo
sumber
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

Jonathan Leech-Pepin
sumber
@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
Giuseppe
sumber
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
Shaggy
sumber
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"!!)
Buah Esolanging
sumber
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
RosLuP
sumber
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!

Shieru Asakoto
sumber