;; Markov chain
#Markov on
on *:TEXT:*:#:{
;; cycle through each "word", adding it to the chain
var %n = $0, %i = 1
var %w1 = _NOWORD_, %w2 = _NOWORD_
while (%i <= %n) {
var %word = $gettok($1-,%i,32)
insert $prefix(%w1,%w2) %word
%w1 = %w2
%w2 = %word
inc %i
}
}
alias -l insert {
if (!$hget(Markov)) { hmake Markov 50 }
var %index = $1, %value = $2-
hadd -s Markov %index $hget(Markov,%index) %value
}
alias -l prefix {
var %word1 = $remove($1,`), %word2 = $remove($2,`)
return $+(%word1,`,%word2)
}
on *:TEXT:!Markov*:#markovtest:{
msg $chan [MARKOV] $genmarkov($2)
}
on *:INPUT:#markovtest:{
if ($1 == !Markov) {
msg $chan [MARKOV] $genmarkov($2)
}
}
alias -l genmarkov {
var %length = $iif($1,$1,10)
var %i = 1, %w1 = _NOWORD_, %w2 = _NOWORD_, %out
while (%i <= %length) {
var %list = $hget(Markov,$prefix(%w1,%w2))
var %nextword = $gettok(%list, $r(1,$numtok(%list,32)), 32)
if (%nextword === _NOWORD_) { return }
%out = %out %nextword
%w1 = %w2
%w2 = %nextword
inc %i
}
return %out
}
#Markov end