Наивное марковское цепное слово генерация


9

Есть много способов генерировать случайные слова. Вы можете взять случайные слоги из набора, вы можете использовать n-кортежи, возможно, нейронные сети (что они не могут сделать?), Чередуя согласные и гласные, и т. Д. Метод, на котором основана эта задача, безусловно, худший , Он использует цепь Маркова для генерации случайных слов. Если вам знакомы цепочки Маркова, вы, вероятно, знаете, почему этот метод так ужасен.

Если вы хотите прочитать о цепях Маркова, нажмите здесь .

Ваша программа будет вводить одно или несколько слов и генерировать одно случайное слово, используя метод взвешенной цепочки Маркова. Поскольку это, вероятно, не имеет смысла ни для кого, кроме меня, вот объяснение с помощью использования изображения цепочки Маркова с вводом abba:

Цепь Маркова для <code> abba </ code>

(Все веса ребер одинаковы для всех изображений) Ваша программа выведет путь по цепочке Маркова на основе введенного текста. Как вы можете видеть, есть шанс 1/2, что он выдаст a, шанс 1/8, шанс aba1/16, шанс abba1/32 ababaи т. Д.

Вот еще несколько примеров цепей Маркова:

yabba dabba doo

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

wolfram

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

supercalifragilisticexpialidocious

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

Если вы хотите больше примеров, используйте это . (Я слишком много работал над этим)

Детали вызова:

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

Это Таким образом, ваша программа оценивается в байтах.

Дайте мне знать, если какая-то часть этого неясна, и я постараюсь сделать это более понятным.


Это, вероятно, имеет смысл для довольно свободных людей, потому что Chatgoat и Marky оба являются взвешенными марковскими чат-ботами IIRC.
Только для 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другое. [)вокруг один элемент такой же как ]. Вместо добавления в список вы можете использовать append ( a) для сохранения приведения. В целом, я думаю, что вы, вероятно, можете сделать это короче, применив более функциональный подход. Я также не уверен, для чего +kJ, добавление пустой строки в строку должно быть noop?
FryAmTheEggman

Спасибо! Я хотел бы использовать более функциональный подход, к сожалению, я не очень разбираюсь в функциональных вещах (лямбда-выражения, вероятно, являются моим ближайшим опытом) Кстати, спасибо за байты!
Lause

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 за помощь в игре в гольф" или что-то подобное здесь встречается часто)
Fund Monica's Lawsuit

1

Matlab, 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.