Generazione di parole in catena di Naïve Markov


9

Esistono molti modi per generare parole casuali. Puoi prendere sillabe casuali da un set, puoi usare n-tuple, probabilmente reti neurali (cosa non possono fare?), Alternando consonanti e vocali, ecc. Il metodo su cui si basa questa sfida è di gran lunga il peggiore . Utilizza una catena di Markov per generare parole casuali. Se hai familiarità con le catene di Markov, probabilmente sai perché questo metodo è così terribile.

Se vuoi leggere delle catene di Markov, clicca qui .

Il tuo programma prenderà un input una o più parole e genererà una singola parola casuale, attraverso il metodo di una catena Markov ponderata. Dal momento che probabilmente non ha senso nessuno tranne me, ecco una spiegazione attraverso l'uso di un'immagine della catena Markov con l'input di abba:

Una catena di Markov per <code> abba </code>

(Tutti i pesi dei bordi sono uguali per tutte le immagini) Il programma emetterà il percorso attraverso una catena di Markov in base al testo di input. Come puoi vedere, c'è 1/2 possibilità che verrà emessa a, 1/8 possibilità di aba, 1/16 possibilità di abba, 1/32 possibilità di ababa, ecc.

Ecco alcuni altri esempi di catene di Markov:

yabba dabba doo

inserisci qui la descrizione dell'immagine

wolfram

inserisci qui la descrizione dell'immagine

supercalifragilisticexpialidocious

inserisci qui la descrizione dell'immagine

Se vuoi altri esempi, usa questo . (Ci ho lavorato troppo duramente)

Dettagli della sfida:

  • L'input può essere preso come un elenco di stringhe o come stringa separata da spazio, virgola o newline
  • Si può presumere che tutte le parole saranno interamente in minuscolo senza punteggiatura (ASCII 97-122)
  • È possibile scrivere un programma o una funzione
  • Per testare, potresti probabilmente inserire gli esempi e vedere se tutti gli input si allineano con le catene di Markov

Questo è , quindi il tuo programma è segnato in byte.

Fammi sapere se una parte di ciò non è chiara e proverò a renderla più sensata.


Probabilmente ha senso per un popolo abbastanza libero, perché Chatgoat e Marky sono entrambi ponderati chatbot Markov IIRC.
ASCII il

Non capisco la relazione tra l'input e quelle catene di Markov. A volte sembra impossibile produrre la parola di input utilizzando un percorso nella catena specificata (ad esempio "yabba dabba doo". Nessun loop automatico per bcui non è possibile produrre un doppio b. Inoltre, una volta raggiunto un b, non sembra possibile torna a startper produrre le altre parole). Credo che tu debba chiarire quali sono i requisiti ...
Bakuriu

@Bakuriu l'errore su yabba dabba dooè un incidente. Lo riparerò il prima possibile. Per quanto riguarda il fatto di non poter tornare indietro, si genera una sola parola da un determinato insieme di parole. Ciò lo chiarisce?
DanTheMan

Risposte:


5

Pyth, 38 32 byte

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

Grazie a FryAmTheEggman per 5 byte! Ad essere sincero ho iniziato a scrivere la risposta di Python quando ho notato che qualcuno ne aveva pubblicato uno molto simile, quindi ho deciso di sfidare me stesso con qualcosa di nuovo, quindi ho riscritto la mia risposta (che era sostanzialmente la risposta di Pietu) in Pyth.

L'input è una matrice di stringhe ["Mary" , "had" , "a" , "little"]


Bel primo post, non esitare a PPCG :) Alcuni consigli golf: Fè sempre e solo utile quando la variabile Vuserebbe viene ignorato quando non si vuole che, in modo da poter modificare il primo Fdad Ve sostituire dcon Naltrove. [)intorno a un elemento è uguale a ]. Invece di aggiungere a un elenco è possibile utilizzare append ( a) per salvare il casting. Più in generale, penso che tu possa probabilmente accorciarlo adottando un approccio più funzionale. Inoltre non sono sicuro a cosa +kJserve, aggiungere la stringa vuota a una stringa dovrebbe essere un noop?
FryAmTheEggman

Grazie! Mi piacerebbe adottare un approccio più funzionale purtroppo non sono esperto di cose funzionali (le espressioni lambda sono probabilmente la mia esperienza più vicina). Grazie comunque per i byte!
Lause

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

Accetta una matrice di stringhe come ["yabba", "dabba", "doo"].

Esempi di output con quell'ingresso:

do
ya
dabbbbbbbaba
do
ya
yaba
da
dabba
yabbababbababbbbababa
do

Voglio anche evidenziare questo risultato.

stidoupilioustialilisusupexpexpexpicexperagilidoupexpexpilicalidousupexpiocagililidocercagidoustilililisupialis

2

Rubino, 112 107 101 99

L'input è stringhe stdin, separate da newline.

QPaysTaxes ha aiutato molto a giocare a 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
Apprezzerei il merito: D (Qualcosa del tipo "grazie a QPaysTaxes per l'aiuto del golf" o simili sembra comune da queste parti)
Fondo Monica's Lawsuit

1

Matlab, 160 byte

Accetta input come una matrice di celle di stringhe, come {'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))

Questo legge le parole e le converte in un vettore di valori ASCII, con un 96 per contrassegnare l'inizio di una parola e un 123 per rappresentare la fine di una parola. Per costruire una parola casuale, inizia con un 96. La ricerca di tutti i numeri interi che seguono 96 nel vettore e preleva un campione casuale da quelli per scegliere la lettera successiva. Ripeti questo, cercando tutti gli interi che seguono quello corrente, fino a quando non viene raggiunto 123, che segnala la fine della parola. Convertire nuovamente in lettere e visualizzare.

L'input {'yabba','dabba','doo'}produce risultati simili da. Ecco i risultati di piste dieci: yabababbbababa, da, doo, doooooo, ya, da, doooo, ya, do, yaba.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.