Generowanie słów w łańcuchu Naïve Markov


9

Istnieje wiele sposobów generowania losowych słów. Możesz pobrać losowe sylaby z zestawu, możesz użyć n-krotek, prawdopodobnie sieci neuronowych (co nie mogą zrobić?), Na przemian spółgłosek i samogłosek itp. Metoda, na której opiera się to wyzwanie, jest zdecydowanie najgorsza . Wykorzystuje łańcuch Markowa do generowania losowych słów. Jeśli znasz łańcuchy Markowa, prawdopodobnie wiesz, dlaczego ta metoda jest tak straszna.

Jeśli chcesz przeczytać o łańcuchach Markowa, kliknij tutaj .

Twój program pobierze jedno lub więcej słów i wygeneruje pojedyncze losowe słowo za pomocą metody ważonego łańcucha Markowa. Ponieważ prawdopodobnie nie ma to sensu dla nikogo oprócz mnie, oto wyjaśnienie poprzez użycie obrazu łańcucha Markowa z wprowadzeniem abba:

Łańcuch Markowa dla <code> abba </code>

(Wszystkie grubości krawędzi są takie same dla wszystkich zdjęć) Twój program wyświetli ścieżkę przez łańcuch Markowa na podstawie wprowadzonego tekstu. Jak widać, istnieje 1/2 szansa, że ​​się wyda a, 1/8 szansa aba, 1/16 szansa abba, 1/32 szansa ababaitp.

Oto kilka innych przykładów łańcuchów Markowa:

yabba dabba doo

wprowadź opis zdjęcia tutaj

wolfram

wprowadź opis zdjęcia tutaj

supercalifragilisticexpialidocious

wprowadź opis zdjęcia tutaj

Jeśli chcesz więcej przykładów, skorzystaj z tego . (Zbyt ciężko nad tym pracowałem)

Szczegóły wyzwania:

  • Dane wejściowe można traktować jako listę ciągów znaków lub jako ciąg oddzielony spacją, przecinkiem lub znakiem nowej linii
  • Możesz założyć, że wszystkie słowa będą pisane małymi literami bez interpunkcji (ASCII 97-122)
  • Możesz napisać program lub funkcję
  • Aby przetestować, prawdopodobnie możesz wprowadzić przykłady i sprawdzić, czy wszystkie dane wejściowe są zgodne z łańcuchami Markowa

To jest , więc twój program jest oceniany w bajtach.

Daj mi znać, jeśli jakakolwiek część tego jest niejasna, a ja postaram się, aby miało to większy sens.


Prawdopodobnie ma to sens dla całkiem wolnych ludzi, ponieważ Chatgoat i Marky są ważonymi chatbotami Markov IIRC.
Tylko ASCII,

Nie rozumiem związku między danymi wejściowymi a tymi łańcuchami Markowa. Czasami wydaje się, że niemożliwe jest utworzenie słowa wejściowego przy użyciu jednej ścieżki w danym łańcuchu (np. „Yabba dabba doo”. Brak własnej pętli, bwięc nie można wytworzyć podwójnego b. Ponadto po osiągnięciu bnie wydaje się możliwe wróć do, startaby utworzyć inne słowa). Uważam, że musisz wyjaśnić, jakie są wymagania ...
Bakuriu,

@ Bakuriu błąd na yabba dabba dooto wypadek. Naprawię to jak najszybciej. Jeśli nie możesz wrócić, zacznij generować tylko jedno słowo z danego zestawu słów. Czy to wyjaśnia?
DanTheMan

Odpowiedzi:


5

Pyth, 38 32 bajty

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

Dzięki FryAmTheEggman za 5 bajtów! Szczerze mówiąc zacząłem pisać odpowiedź na Python, gdy zauważyłem, że ktoś opublikował bardzo podobną odpowiedź, więc postanowiłem rzucić sobie wyzwanie z czymś nowym, więc przepisałem swoją odpowiedź (która była w zasadzie odpowiedzią Pietu) w Pyth.

Dane wejściowe to tablica ciągów ["Mary" , "had" , "a" , "little"]


Nicea pierwszy post, zapraszamy do PPCG :) Porady Golf: Fjest zawsze tylko użyteczne, gdy zmienna Vużyłby zostanie nadpisane, kiedy nie ma się, więc można zmienić pierwszy Fddo Vi wymienić dz Ninnym. [)wokół jednego elementu jest taki sam jak ]. Zamiast dodawać do listy, możesz użyć append ( a), aby zapisać rzutowanie. Mówiąc bardziej ogólnie, myślę, że możesz to skrócić, przyjmując bardziej funkcjonalne podejście. Nie jestem też pewien, po co to +kJjest, dodanie pustego łańcucha do łańcucha powinno być noop?
FryAmTheEggman

Dzięki! Chciałbym niestety przyjąć bardziej funkcjonalne podejście. Niestety nie znam się dobrze na funkcjach (wyrażenia lambda są prawdopodobnie moim najbliższym doświadczeniem). Nawiasem mówiąc, dzięki za bajty!
Lause

4

Python 2, 138 133 bajtów

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

Pobiera tablicę ciągów takich jak ["yabba", "dabba", "doo"].

Przykładowe dane wyjściowe z tym wejściem:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Chcę również podkreślić ten wynik.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Ruby, 112 107 101 99

Dane wejściowe to standardowe, oddzielone ciągi znaków.

QPaysTaxes bardzo pomogło w grze w golfa!

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
Byłbym wdzięczny za kredyt: D (Coś w rodzaju „dzięki QPaysTaxes za pomoc w grze w golfa” lub coś podobnego wydaje się tutaj powszechne)
pozew Fund Moniki z

1

Matlab, 160 bajtów

Pobiera dane wejściowe jako tablicę komórek ciągów znaków, takich jak {'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))

Odczytuje słowa i konwertuje je na wektor wartości ASCII, z liczbą 96 oznaczającą początek słowa, a liczbą 123 oznaczającą koniec słowa. Aby skonstruować losowe słowo, zacznij od 96. Poszukaj wszystkich liczb całkowitych następujących po 96 w wektorze i pobierz losową próbkę spośród tych, aby wybrać następną literę. Powtórz to, szukając liczb całkowitych następujących po bieżącym, aż do osiągnięcia 123, co sygnalizuje koniec słowa. Konwertuj go z powrotem na litery i wyświetl.

Dane wejściowe {'yabba','dabba','doo'}dają wyniki takie jak da. Oto wyniki dziesięciu seriach: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.