Thế hệ từ chuỗi Naïve Markov


9

Có nhiều cách để tạo ra các từ ngẫu nhiên. Bạn có thể lấy các âm tiết ngẫu nhiên từ một bộ, bạn có thể sử dụng n-tuples, có thể là mạng thần kinh (họ không thể làm gì?), Xen kẽ giữa phụ âm và nguyên âm, v.v ... Phương pháp mà thử thách này dựa trên là tồi tệ nhất . Nó sử dụng chuỗi Markov để tạo ra các từ ngẫu nhiên. Nếu bạn là chuỗi Markov quen thuộc, có lẽ bạn biết tại sao phương pháp này rất khủng khiếp.

Nếu bạn muốn đọc về chuỗi Markov, bấm vào đây .

Chương trình của bạn sẽ lấy một hoặc nhiều từ đầu vào và tạo một từ ngẫu nhiên duy nhất, thông qua phương pháp của chuỗi Markov có trọng số. Vì điều đó có lẽ có ý nghĩa với không ai ngoài tôi, đây là một lời giải thích thông qua việc sử dụng hình ảnh của chuỗi Markov với đầu vào làabba :

Chuỗi Markov cho <code> abba </ code>

(Tất cả các trọng số cạnh đều giống nhau cho tất cả các hình ảnh) Chương trình của bạn sẽ xuất đường dẫn thông qua chuỗi Markov dựa trên văn bản đầu vào. Như bạn có thể thấy, có một cơ hội 1/2 nó sẽ xuất raa , 1/8 cơ hội aba, 1/16 cơ hội abba, 1/32 cơ hội ababa, v.v.

Dưới đây là một số ví dụ khác về chuỗi Markov:

yabba dabba doo

nhập mô tả hình ảnh ở đây

wolfram

nhập mô tả hình ảnh ở đây

supercalifragilisticexpialidocious

nhập mô tả hình ảnh ở đây

Nếu bạn muốn thêm ví dụ, sử dụng này . (Tôi đã làm việc quá sức với nó)

Chi tiết về thử thách:

  • Đầu vào có thể được lấy dưới dạng danh sách các chuỗi hoặc dưới dạng khoảng trắng, dấu phẩy hoặc chuỗi phân tách dòng mới
  • Bạn có thể cho rằng tất cả các từ sẽ hoàn toàn viết thường mà không có dấu câu (ASCII 97-122)
  • Bạn có thể viết một chương trình hoặc một chức năng
  • Để kiểm tra, có lẽ bạn có thể nhập các ví dụ và xem liệu tất cả các đầu vào có thẳng hàng với chuỗi Markov không

Đây là , vì vậy chương trình của bạn được tính theo byte.

Hãy cho tôi biết nếu bất kỳ phần nào của điều này là không rõ ràng, và tôi sẽ cố gắng làm cho nó có ý nghĩa hơn.


Có lẽ nó có ý nghĩa với những người khá tự do, bởi vì Chatgoat và Marky đều là những chatbot Markov có trọng số IIRC.
ASCII - chỉ

Tôi không hiểu mối quan hệ giữa đầu vào và các chuỗi Markov. Đôi khi nó dường như là không thể để sản xuất từ đầu vào bằng cách sử dụng một đường dẫn trong chuỗi nhất định (ví dụ: "yabba dabba doo". Không tự vòng lặp cho bnên bạn không thể tạo ra một đôi b. Hơn nữa một khi bạn đạt được một bnó dường như không thể trở lại để starttạo ra các từ khác). Tôi tin rằng bạn phải làm rõ các yêu cầu là gì ...
Bakuriu 17/03/2016

@Bakuriu lỗi trên yabba dabba doolà một tai nạn. Tôi sẽ sửa nó càng sớm càng tốt. Khi không thể quay lại để bắt đầu, bạn chỉ tạo một từ từ một nhóm từ nhất định . Điều đó làm rõ nó?
DanTheMan 17/03/2016

Câu trả lời:


5

Bình thường, 38 32 byte

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

Cảm ơn FryAmTheEggman cho 5 byte! Thành thật mà nói, tôi bắt đầu viết câu trả lời Python khi tôi nhận thấy ai đó đã đăng một câu rất giống nhau nên tôi quyết định thử thách bản thân với một cái gì đó mới để tôi viết lại câu trả lời của mình (về cơ bản là câu trả lời của Pietu) ở Pyth.

Đầu vào là một chuỗi các chuỗi ["Mary" , "had" , "a" , "little"]


Bài đẹp đầu tiên, chào mừng bạn đến PPCG :) Một số lời khuyên golf: Fchỉ bao giờ hữu ích khi biến Vsẽ sử dụng được ghi đè khi bạn không muốn nó, vì vậy bạn có thể thay đổi người đầu tiên Fdđến Vvà thay thế dvới Ncác nơi khác. [)xung quanh một yếu tố giống như ]. Thay vì thêm vào danh sách, bạn có thể sử dụng append ( a) để lưu truyền. Nói chung, tôi nghĩ rằng bạn có thể có thể làm cho điều này ngắn hơn bằng cách thực hiện một cách tiếp cận chức năng hơn. Tôi cũng không chắc cái +kJnày dùng để làm gì, thêm chuỗi trống vào chuỗi có phải là noop không?
FryAmTheEggman 17/03/2016

Cảm ơn! Tôi rất thích áp dụng phương pháp tiếp cận chức năng nhiều hơn, đáng buồn là tôi không rành về các công cụ chức năng (biểu thức lambda có lẽ là kinh nghiệm gần nhất của tôi). Cảm ơn các byte bằng cách này!
Vì 17/03/2016

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

Đưa vào một chuỗi các chuỗi như ["yabba", "dabba", "doo"].

Ví dụ đầu ra với đầu vào đó:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Tôi cũng muốn làm nổi bật kết quả này.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

Đầu vào là stdin, chuỗi phân tách dòng mới.

QPaysTaxes đã giúp rất nhiều cho việc chơi 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
Tôi đánh giá cao tín dụng: D (Một cái gì đó như "cảm ơn QPaysTaxes vì ​​đã giúp đỡ chơi gôn" hoặc những thứ tương tự có vẻ phổ biến ở đây)
Vụ kiện của Quỹ Monica

1

Matlab, 160 byte

Đưa đầu vào như một mảng ô của chuỗi, như {'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))

Điều này đọc các từ và chuyển đổi chúng thành một vectơ các giá trị ASCII, với 96 để đánh dấu sự bắt đầu của một từ và 123 để biểu thị sự kết thúc của một từ. Để tạo một từ ngẫu nhiên, hãy bắt đầu bằng 96. Tìm kiếm tất cả các số nguyên theo 96 trong vectơ và lấy một mẫu ngẫu nhiên từ những từ đó để chọn chữ cái tiếp theo. Lặp lại điều này, tìm kiếm tất cả các số nguyên theo sau hiện tại, cho đến khi đạt 123, báo hiệu kết thúc của từ. Chuyển đổi nó trở lại thành chữ và hiển thị.

Đầu vào {'yabba','dabba','doo'}tạo ra kết quả như thế nào da. Dưới đây là kết quả của chạy mười: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.