Generasi Kata Rantai Naïve Markov


9

Ada banyak cara untuk menghasilkan kata-kata acak. Anda dapat mengambil suku kata acak dari suatu set, Anda dapat menggunakan n-tuple, mungkin jaringan saraf (apa yang tidak bisa mereka lakukan?), Berganti-ganti antara konsonan dan vokal, dll. Metode yang mendasari tantangan ini sejauh ini adalah yang terburuk . Ini menggunakan rantai Markov untuk menghasilkan kata-kata acak. Jika Anda akrab dengan rantai Markov, Anda mungkin tahu mengapa metode ini sangat mengerikan.

Jika Anda ingin membaca tentang rantai Markov, klik di sini .

Program Anda akan mengambil input satu atau lebih kata dan menghasilkan satu kata acak, melalui metode rantai Markov tertimbang. Karena itu mungkin masuk akal bagi siapa pun selain saya, berikut adalah penjelasan melalui penggunaan gambar rantai Markov dengan masukan dari abba:

Rantai Markov untuk <code> abba </code>

(Semua bobot tepi sama untuk semua gambar) Program Anda akan menampilkan jalur melalui rantai Markov berdasarkan teks input. Seperti yang Anda lihat, ada 1/2 peluang yang akan dihasilkan a, 1/8 peluang aba, 1/16 peluang abba, 1/32 peluang ababa, dll.

Berikut adalah beberapa contoh rantai Markov lainnya:

yabba dabba doo

masukkan deskripsi gambar di sini

wolfram

masukkan deskripsi gambar di sini

supercalifragilisticexpialidocious

masukkan deskripsi gambar di sini

Jika Anda ingin lebih banyak contoh, gunakan ini . (Saya bekerja terlalu keras untuk itu)

Detail tantangan:

  • Input dapat diambil sebagai daftar string, atau sebagai spasi, koma, atau string yang dipisahkan baris baru
  • Anda dapat mengasumsikan bahwa semua kata akan seluruhnya menjadi huruf kecil tanpa tanda baca (ASCII 97-122)
  • Anda dapat menulis program atau fungsi
  • Untuk menguji, Anda mungkin bisa memasukkan contoh dan melihat apakah semua input sesuai dengan rantai Markov

Ini adalah , jadi program Anda dinilai dalam byte.

Beri tahu saya jika ada bagian yang tidak jelas, dan saya akan membuatnya lebih masuk akal.


Mungkin masuk akal bagi orang yang cukup bebas, karena Chatgoat dan Marky sama-sama berbobot Markov chatbots IIRC.
ASCII

Saya tidak mengerti hubungan antara input dan rantai Markov itu. Kadang-kadang tampaknya tidak mungkin untuk menghasilkan kata input dengan menggunakan satu jalur dalam rantai yang diberikan (mis. "Yabba dabba doo". Tidak ada pengulangan sendiri bsehingga Anda tidak dapat menghasilkan ganda b. Terlebih lagi setelah Anda mencapai suatu bitu, tampaknya tidak mungkin untuk kembali ke startuntuk menghasilkan kata-kata lain). Saya percaya Anda harus mengklarifikasi apa persyaratannya ...
Bakuriu

@ Bakuriu kesalahan pada yabba dabba dookecelakaan adalah. Saya akan memperbaikinya sesegera mungkin. Mengenai ketidakmampuan untuk memulai kembali, Anda hanya menghasilkan satu kata dari serangkaian kata yang diberikan . Apakah itu memperjelasnya?
DanTheMan

Jawaban:


5

Pyth, 38 32 byte

VQJK1FZacN1k XKH]Z=KZ;WJ=JO@HJpJ

Terima kasih kepada FryAmTheEggman untuk 5 byte! Sejujurnya saya mulai menulis jawaban Python ketika saya melihat seseorang memposting yang sangat mirip jadi saya memutuskan untuk menantang diri saya dengan sesuatu yang baru jadi saya menulis ulang jawaban saya (yang pada dasarnya adalah jawaban Pietu) di Pyth.

Input adalah larik string ["Mary" , "had" , "a" , "little"]


Bagus pertama pos, selamat datang untuk PPCG :) Beberapa tips golf: Fhanya pernah berguna ketika variabel Vakan digunakan akan diganti bila Anda tidak ingin, sehingga Anda dapat mengubah yang pertama Fduntuk Vdan mengganti ddengan Ntempat lain. [)sekitar satu elemen sama dengan ]. Alih-alih menambahkan ke daftar, Anda dapat menggunakan append ( a) untuk menyimpan casting. Lebih umum, saya pikir Anda mungkin bisa membuat ini lebih pendek dengan mengambil pendekatan yang lebih fungsional. Saya juga tidak yakin untuk apa +kJ, menambahkan string kosong ke string harus menjadi noop?
FryAmTheEggman

Terima kasih! Saya akan senang untuk mengambil pendekatan yang lebih fungsional sayangnya saya tidak berpengalaman dalam hal-hal fungsional (ekspresi lambda mungkin pengalaman terdekat saya). Omong-omong, terima kasih untuk byte!
Lause

4

Python 2, 138 133 byte

from random import*
M={}
for w in input():
 P=p=1
 for k in list(w)+[""]:M[p]=M.get(p,[])+[k];p=k
while P:P=choice(M[P]);k+=P
print k

Mengambil array string seperti ["yabba", "dabba", "doo"].

Contoh output dengan input itu:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Saya juga ingin menyoroti hasil ini.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

Input adalah stdin, string yang dipisahkan oleh baris baru.

QPaysTaxes banyak membantu dalam bermain golf!

M={}
while gets
k=''
$_.each_char{|c|M[k]||=[];M[k]<<c;k=c}
end
k=''
print k=M[k].sample while M[k]

1
Saya akan menghargai kredit: D (Sesuatu seperti "terima kasih kepada QPaysTaxes untuk bantuan golf" atau sejenisnya yang umum di sini)
Dana Gugatan Monica

1

Matlab, 160 byte

Mengambil input sebagai array sel string, misalnya {'string1','string2','string3'}.

s=input('');n=[];l=96;for i=1:numel(s);n=[n 96 double(s{i}) 123];end
while(l(end)<123);p=n(find(n==l(end))+1);l=[l p(randsample(nnz(p),1))];end
char(l(2:end-1))

Ini membaca kata-kata, dan mengubahnya menjadi vektor nilai ASCII, dengan angka 96 untuk menandai awal kata, dan angka 123 untuk mewakili akhir kata. Untuk membuat kata acak, mulailah dengan 96. Pencarian untuk semua bilangan bulat yang mengikuti 96 dalam vektor, dan ambil sampel acak dari yang untuk memilih huruf berikutnya. Ulangi ini, cari semua bilangan bulat yang mengikuti yang saat ini, hingga 123 tercapai, yang menandakan akhir kata. Konversikan kembali ke huruf, dan tampilkan.

Input {'yabba','dabba','doo'}menghasilkan hasil seperti da. Berikut adalah hasil dari berjalan sepuluh: yabababbbababa, da, doo, doooooo, ya, da,doooo , ya, do, yaba.

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.