lnicola
6/20/2014 - 4:04 PM

simple text generator based on Markov chains

simple text generator based on Markov chains

using System;
using System.Collections.Generic;
using System.Linq;

static class Program
{
    static void Main(string[] args)
    {
        var input = "foo bar baz foo bar qux".Split();

        var table = input.Zip(input.Skip(1), Tuple.Create)
                         .Zip(input.Skip(2), Tuple.Create)
                         .ToLookup(p => p.Item1, p => p.Item2);

        Func<Tuple<string, string>, Random, IEnumerable<string>> generate = null;
        generate = (key, random) => new[] { key.Item1 }.Concat(key.Item2 == null ? new string[] { } : new[] { 0 }.SelectMany(_ => generate(Tuple.Create(key.Item2, table[key].ElementAtOrDefault(random.Next(table[key].Count()))), random)));

        Console.WriteLine(String.Join(" ", generate(table.First().Key, new Random()).Take(50)));
    }
}