markov_chain_text_generator.sf 763 B

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/ruby
  2. # A very simple text generator, using Markov chains.
  3. # See also:
  4. # https://en.wikipedia.org/wiki/Markov_chain
  5. # https://rosettacode.org/wiki/Markov_chain_text_generator
  6. func build_dict (n, words) {
  7. var dict = Hash()
  8. words.each_cons(n+1, {|*prefix|
  9. var suffix = prefix.pop
  10. dict{prefix.join(' ')} := [] << suffix
  11. })
  12. return dict
  13. }
  14. var file = File(ARGV[0] || "alice_oz.txt")
  15. var n = Num(ARGV[1] || 2)
  16. var max = Num(ARGV[2] || 100)
  17. var words = file.open_r.words
  18. words << words.first(n)...
  19. var dict = build_dict(n, words)
  20. var rotor = words.first(n)
  21. var chain = [rotor...]
  22. max.times {
  23. var new = dict{rotor.join(' ')}.rand
  24. chain.push(new)
  25. rotor.shift
  26. rotor.push(new)
  27. }
  28. say chain.join(' ')