#!/usr/local/bin/ruby -w # $Id$ class Marcov def initialize(ary, cont = 2) raise "continous must be > 1" if cont < 2 @ary = ary @chain = Hash.new([]) (@ary.size - cont + 2).times do |i| @chain[@ary[i..(i + cont - 2)]] += [@ary[(i + 1)..(i + cont - 1)]] end end def chain(seed0 = nil) if seed0 seed = @chain.keys.find {|x| p x; x[0] == seed0 } raise "couldn't start from #{seed0}" unless seed else seed = @chain.keys[rand(@chain.keys.size)] # seed = @chain.keys[0] end r = [seed[0]] while true n = @chain[seed][rand(@chain[seed].size)] if n == nil || n.size < 1 r += seed[1..-1] if seed.size > 1 break end r += [n[0]] seed = n end r end end if $0 == __FILE__ Mix = Struct.new("Mix", "split", "join") Letter = Mix.new(//, "") Word = Mix.new(/[ \t]/, " ") mix = Letter chain = 4 while true case ARGV[0] when /-([0-9]+)/ ARGV.shift chain = $1.to_i when /-e/ ARGV.shift chain = 2 unless chain == 2 mix = Word when /-j/ ARGV.shift chain = 4 unless chain == 4 mix = Letter else break end end splitter, joinner = mix.split, mix.join a = [] debug = false if debug 10.times do a << rand(8) end chain = 3 else while (buf = gets) != nil a += buf.split(splitter) end end m = Marcov.new(a, chain) if debug p m p m.chain(1) else puts m.chain.join(joinner) end end