Наївне Маркове ланцюгове слово покоління


9

Існує багато способів генерації випадкових слів. Ви можете взяти випадкові склади з набору, ви можете використовувати n-кортежі, ймовірно, нейронні мережі (що вони не можуть зробити?), Чергуючи приголосні та голосні тощо. Метод, на якому базується виклик, є найгіршим . Він використовує ланцюг Маркова для генерації випадкових слів. Якщо вам відомі ланцюги Маркова, ви, мабуть, знаєте, чому цей метод такий жахливий.

Якщо ви хочете почитати про ланцюги Маркова, натисніть тут .

Ваша програма візьме на введення одне або кілька слів та генерує одне випадкове слово методом зваженого ланцюга Маркова. Оскільки це, мабуть, має сенс ні для кого, крім мене, ось пояснення через використання зображення ланцюга Маркова із введенням abba:

Ланцюжок Маркова для <code> abba </code>

(Всі ваги краю однакові для всіх зображень) Ваша програма виведе шлях через ланцюг Маркова на основі вхідного тексту. Як бачите, є 1/2 ймовірності, що вона виведе a, 1/8 шансів aba, 1/16 шансу abba, 1/32 шансу ababaтощо.

Ось ще кілька прикладів ланцюгів Маркова:

yabba dabba doo

введіть тут опис зображення

wolfram

введіть тут опис зображення

supercalifragilisticexpialidocious

введіть тут опис зображення

Якщо ви хочете більше прикладів, використовуйте це . (Я надто важко працював над цим)

Деталі виклику:

  • Введення можна сприймати як список рядків, або як пробіл, кома або рядок, розділений для нового рядка
  • Ви можете припустити, що всі слова будуть повністю малими, без розділових знаків (ASCII 97-122)
  • Ви можете написати або програму, або функцію
  • Для тестування ви, можливо, могли ввести приклади та побачити, чи всі входи узгоджуються з ланцюгами Маркова

Це є , тож ваша програма оцінюється в байтах.

Повідомте мене, якщо якась частина цього є незрозумілою, і я спробую зробити це більше сенсу.


Мабуть, це має сенс для досить вільних людей, адже Чатґоат і Маркі - обидва зважених марківських чатів IIRC.
Лише ASCII

Я не розумію зв'язку між вхідними та тими ланцюгами Маркова. Іноді здається, що неможливо створити вхідне слово, використовуючи один шлях у даному ланцюжку (наприклад, "yabba dabba doo". Немає самостійного циклу, bтому ви не можете створити подвійний b. Більше того, як тільки ви дістанетесь до, bце не здається можливим поверніться до, startщоб створити інші слова). Я вважаю, ви повинні уточнити, які вимоги є ...
Bakuriu

@Bakuriu помилка на yabba dabba dooаварії. Я виправлю це якнайшвидше. Щодо неможливості повернутися до початку, ви генеруєте лише одне слово із заданого набору слів. Це пояснює це?
DanTheMan

Відповіді:


5

Pyth, 38 32 байти

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

Дякуємо FryAmTheEggman за 5 байт! Якщо чесно, я почав писати відповідь Python, коли помітив, що хтось розмістив дуже подібний, тому я вирішив кинути виклик собі чимось новим, тому я переписав свою відповідь (що в основному була відповіддю Піетю) в 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 (Щось на кшталт "спасибі QPaysTaxes за допомогу в гольфі" або подібне, здається, тут часто зустрічається)
Позов

1

Матлаб, 160 байт

Приймає введення як масив комірок рядків, як {'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, do, yaba.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.