Na Wordve Markov Chain การสร้างคำ


9

มีหลายวิธีในการสร้างคำสุ่ม คุณสามารถใช้พยางค์สุ่มจากชุดคุณสามารถใช้ n-tuples อาจเป็นเครือข่ายประสาท (สิ่งที่พวกเขาทำไม่ได้?) สลับระหว่างพยัญชนะและสระ ฯลฯ วิธีการท้าทายนี้มีพื้นฐานมาจากที่เลวร้ายที่สุด . มันใช้เชนมาร์คอฟเพื่อสร้างคำสุ่ม หากคุณคุ้นเคยกับโซ่มาร์คอฟคุณอาจรู้ว่าทำไมวิธีการนี้ถึงแย่มาก

ถ้าคุณต้องการที่จะอ่านเกี่ยวกับโซ่มาร์คอฟ, คลิกที่นี่

โปรแกรมของคุณจะป้อนคำอย่างน้อยหนึ่งคำและสร้างคำสุ่มหนึ่งคำผ่านวิธีการของห่วงโซ่มาร์คอฟแบบถ่วงน้ำหนัก ตั้งแต่ที่อาจจะทำให้รู้สึกถึงไม่มีใคร แต่ฉันนี่คือคำอธิบายผ่านการใช้ภาพของห่วงโซ่มาร์คอฟที่มีการป้อนข้อมูลของabba:

ห่วงโซ่มาร์คอฟสำหรับ <code> abba </code>

(น้ำหนักขอบทั้งหมดเท่ากันสำหรับรูปภาพทั้งหมด) โปรแกรมของคุณจะแสดงเส้นทางผ่านห่วงโซ่มาร์คอฟตามข้อความอินพุต อย่างที่คุณเห็นมันมีโอกาส 1/2 ที่มันจะออกaมาโอกาส 1/8 ของabaโอกาส 1/16 โอกาสabba1/32 โอกาสababaเป็นต้น

นี่คือตัวอย่างอื่น ๆ ของมาร์คอฟเชน:

yabba dabba doo

ป้อนคำอธิบายรูปภาพที่นี่

wolfram

ป้อนคำอธิบายรูปภาพที่นี่

supercalifragilisticexpialidocious

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณต้องการตัวอย่างเพิ่มเติมใช้นี้ (ฉันทำงานหนักเกินไปกับมัน)

รายละเอียดของความท้าทาย:

  • อินพุตสามารถใช้เป็นรายการของสตริงหรือเป็นสตริงคั่นด้วยช่องว่างเครื่องหมายจุลภาคหรือขึ้นบรรทัดใหม่
  • คุณอาจคิดว่าคำทั้งหมดจะเป็นตัวพิมพ์เล็กทั้งหมดโดยไม่มีเครื่องหมายวรรคตอน (ASCII 97-122)
  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น
  • ในการทดสอบคุณอาจป้อนตัวอย่างและดูว่าอินพุตทั้งหมดเข้ากับสายมาร์คอฟหรือไม่

นี่คือ ดังนั้นโปรแกรมของคุณจึงได้คะแนนเป็นไบต์

แจ้งให้เราทราบหากส่วนใดส่วนหนึ่งไม่ชัดเจนและฉันจะพยายามทำให้เข้าใจมากขึ้น


มันอาจจะสมเหตุสมผลสำหรับคนที่ค่อนข้างอิสระเพราะ Chatgoat และ Marky เป็นทั้ง Chatbots IIRC ของ Markov ที่มีน้ำหนัก
ASCII เท่านั้นเท่านั้น

ฉันไม่เข้าใจความสัมพันธ์ระหว่างอินพุตและเชนมาร์คอฟเหล่านั้น บางครั้งดูเหมือนว่าเป็นไปไม่ได้ที่จะสร้างคำอินพุตโดยใช้หนึ่งพา ธ ในห่วงโซ่ที่กำหนด (เช่น "yabba dabba doo" ไม่มีการวนซ้ำตัวเองเพื่อbให้คุณไม่สามารถสร้างสองครั้งbได้นอกจากนี้เมื่อคุณเข้าถึงbมัน กลับไปที่startเพื่อสร้างคำอื่น ๆ ) ฉันเชื่อว่าคุณต้องอธิบายให้ชัดเจนว่าข้อกำหนดคืออะไร
บาคุริ

@Bakuriu ข้อผิดพลาดในyabba dabba dooการเกิดอุบัติเหตุ ฉันจะแก้ไขโดยเร็วที่สุด เพื่อที่จะไม่สามารถกลับไปเริ่มต้นใหม่ได้คุณสร้างเพียงหนึ่งคำจากชุดคำที่กำหนด มันชัดเจนหรือไม่?
DanTheMan

คำตอบ:


5

Pyth, 38 32 ไบต์

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

ขอบคุณFryAmTheEggman เป็นเวลา 5 ไบต์! บอกตามตรงฉันเริ่มเขียนคำตอบของ Python เมื่อฉันสังเกตเห็นว่ามีคนโพสต์ข้อความที่คล้ายกันมากฉันจึงตัดสินใจท้าทายตัวเองด้วยสิ่งใหม่ดังนั้นฉันจึงเขียนคำตอบของฉันใหม่ (ซึ่งเป็นคำตอบของ Pietu) ใน Pyth

อินพุตเป็นอาร์เรย์ของสตริง ["Mary" , "had" , "a" , "little"]


โพสต์แรกที่ดียินดีต้อนรับสู่ PPCG :) เคล็ดลับกอล์ฟ: Fจะมีประโยชน์เฉพาะเมื่อตัวแปรVจะใช้จะถูกแทนที่เมื่อคุณไม่ต้องการมันดังนั้นคุณสามารถเปลี่ยนรายการแรกFdเป็นVและแทนที่dด้วยNที่อื่น รอบองค์ประกอบหนึ่งเป็นเช่นเดียวกับ[) ]แทนที่จะเพิ่มลงในรายการคุณสามารถใช้ผนวก ( a) เพื่อบันทึกการส่ง โดยทั่วไปแล้วฉันคิดว่าคุณอาจทำให้สิ่งนี้สั้นลงได้โดยใช้วิธีการทำงานที่มากขึ้น ฉันยังไม่แน่ใจว่า+kJมีไว้เพื่ออะไรการเพิ่มสตริงว่างลงในสตริงควรเป็น noop หรือไม่
FryAmTheEggman

ขอบคุณ! ฉันชอบที่จะใช้วิธีการทำงานที่มากขึ้นเศร้าฉันไม่รอบรู้ในสิ่งที่ทำงาน (การแสดงออกแลมบ์ดาอาจเป็นประสบการณ์ที่ใกล้เคียงที่สุดของฉัน) ขอบคุณสำหรับไบต์โดยวิธี!
ลด

4

Python 2, 138 133 ไบต์

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

["yabba", "dabba", "doo"]ใช้เวลาในอาร์เรย์ของสตริงเช่น

ตัวอย่างผลลัพธ์ด้วยอินพุตนั้น:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

ฉันต้องการเน้นผลลัพธ์นี้ด้วย

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

ทับทิม, 112 107 101 99

อินพุตคือ stdin, สตริงขึ้นบรรทัดใหม่คั่น

QPaysTaxes ช่วยได้มากด้วยการตีกอล์ฟ!

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
ฉันขอขอบคุณเครดิต: D (บางอย่างเช่น "ขอบคุณ QPaysTax สำหรับความช่วยเหลือในการเล่นกอล์ฟ" หรือสิ่งที่คล้ายกันทั่วไปที่นี่)
คดีของกองทุนโมนิก้า

1

Matlab ขนาด 160 ไบต์

จะเข้าเป็น array {'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))

สิ่งนี้จะอ่านคำเหล่านั้นและแปลงเป็นเวกเตอร์ของค่า ASCII ด้วย 96 เพื่อทำเครื่องหมายจุดเริ่มต้นของคำและ 123 เพื่อแสดงถึงจุดสิ้นสุดของคำ เพื่อสร้างคำสุ่มเริ่มต้นด้วย 96 การค้นหาจำนวนเต็มทั้งหมดที่ตามหลัง 96 ในเวกเตอร์และใช้ตัวอย่างสุ่มจากที่จะเลือกตัวอักษรต่อไป ทำซ้ำสิ่งนี้โดยมองหาจำนวนเต็มทั้งหมดที่ตามหลังจนถึงปัจจุบันจนถึง 123 ซึ่งส่งสัญญาณการสิ้นสุดของคำ แปลงกลับเป็นตัวอักษรและแสดงผล

การป้อนข้อมูลที่ก่อให้เกิดผลลัพธ์เช่น{'yabba','dabba','doo'} daนี่คือผลของการวิ่งสิบคือ: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, ,doyaba

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.