#!/Utils/bin/perl5

$pos{'.'} = 0;                            # period will be 0
$pos{' '} = 1;                            # space will be 1
for ($i = 0; $i < 26; $i++) {             # 'a' to 'z' will be 2 to 28
  $pos{chr ($i + 97)} = $i + 2; 
} 

while (<STDIN>) {                                          # read trigrams from
  ($one,$two,$three,$freq) = /^(.)(.)(.)\t?(\d+)?/;        # STDIN and put them
  $freq = 1 unless defined $freq;                          # in array @table
  $table[$pos{$one}*784 + $pos{$two}*28 + $pos{$three}] += $freq;  

}

for ($zin = 0; $zin < 10; $zin++) {       # generate 10 random sentences
  $first =  ".";                          # leading bigram is ". "
  $second = " ";
  do {                                    # first calculate total numer of
    $total = 0;                           # possibilities given leading bigram
    $posbigram = $pos{$first} * 784 + $pos{$second} * 28;
    for ($i = 0; $i < 28; $i++) {
      $total += $table[$posbigram + $i];
    }

    $i = 0;
    $next = rand($total);                 # $next is random between 0 and total
    while ($next >= $table[$posbigram + $i]) {
      $next -= $table[$posbigram + $i++]; 
    }

    if ($i == 0) { print ".\n"; }                  # new line after period 
    elsif ($i == 1) { print " "; }                 # '1' is space
    elsif ($first eq ".") { print chr(63 + $i); }  # first letter in upper case
    else { print chr(95 + $i); }                   # rest  in lowe case
    $first = $second;                              # new leading bigram
    if ($i == 1) { $second = " "; }
    else { $second = chr(95 + $i); }

  } while ($i > 0);                      # until sentence boundry
}

