1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<!doctype><html><head> <title>markov_chain.lua</title> <style> .keyword { color: red; } .identifier { color: purple; } .string { color: orange; } .number { color: blue; } .string { color: green; } .operator { font-style: bold; } .comment { color: gray; } </style></head><body> <pre class="code">
<span class="comment">-- </span><span class="identifier">Markov</span> <span class="identifier">Chain</span> <span class="identifier">Program</span> <span class="keyword">in</span> <span class="identifier">Lua</span>
<span class="keyword">function</span> <span class="identifier">allwords</span> <span class="operator">(</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">line</span> <span class="operator">=</span> <span class="identifier">io</span><span class="string">.</span><span class="identifier">read</span><span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">current</span> <span class="identifier">line</span>
<span class="keyword">local</span> <span class="identifier">pos</span> <span class="operator">=</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">current</span> <span class="identifier">position</span> <span class="keyword">in</span> <span class="identifier">the</span> <span class="identifier">line</span>
<span class="keyword">return</span> <span class="keyword">function</span> <span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">iterator</span> <span class="keyword">function</span>
<span class="keyword">while</span> <span class="identifier">line</span> <span class="keyword">do</span> <span class="comment">-- </span><span class="keyword">repeat</span> <span class="keyword">while</span> <span class="identifier">there</span> <span class="identifier">are</span> <span class="identifier">lines</span>
<span class="keyword">local</span> <span class="identifier">s</span><span class="operator">,</span> <span class="identifier">e</span> <span class="operator">=</span> <span class="identifier">string</span><span class="string">.</span><span class="identifier">find</span><span class="operator">(</span><span class="identifier">line</span><span class="operator">,</span> <span class="operator">"</span><span class="operator">%</span><span class="identifier">w</span><span class="operator">+</span><span class="operator">"</span><span class="operator">,</span> <span class="identifier">pos</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="identifier">s</span> <span class="keyword">then</span> <span class="comment">-- </span><span class="identifier">found</span> <span class="identifier">a</span> <span class="identifier">word</span><span class="operator">?</span>
<span class="identifier">pos</span> <span class="operator">=</span> <span class="identifier">e</span> <span class="operator">+</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">update</span> <span class="identifier">next</span> <span class="identifier">position</span>
<span class="keyword">return</span> <span class="identifier">string</span><span class="string">.</span><span class="identifier">sub</span><span class="operator">(</span><span class="identifier">line</span><span class="operator">,</span> <span class="identifier">s</span><span class="operator">,</span> <span class="identifier">e</span><span class="operator">)</span> <span class="comment">-- </span><span class="keyword">return</span> <span class="identifier">the</span> <span class="identifier">word</span>
<span class="keyword">else</span>
<span class="identifier">line</span> <span class="operator">=</span> <span class="identifier">io</span><span class="string">.</span><span class="identifier">read</span><span class="operator">(</span><span class="operator">)</span> <span class="comment">-- </span><span class="identifier">word</span> <span class="keyword">not</span> <span class="identifier">found</span><span class="operator">;</span> <span class="identifier">try</span> <span class="identifier">next</span> <span class="identifier">line</span>
<span class="identifier">pos</span> <span class="operator">=</span> <span class="number">1</span> <span class="comment">-- </span><span class="identifier">restart</span> <span class="identifier">from</span> <span class="identifier">first</span> <span class="identifier">position</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">return</span> <span class="keyword">nil</span> <span class="comment">-- </span><span class="identifier">no</span> <span class="identifier">more</span> <span class="identifier">lines</span><span class="operator">:</span> <span class="keyword">end</span> <span class="identifier">of</span> <span class="identifier">traversal</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">function</span> <span class="identifier">prefix</span> <span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span>
<span class="keyword">return</span> <span class="identifier">w1</span> <span class="operator">..</span> <span class="operator">'</span> <span class="operator">'</span> <span class="operator">..</span> <span class="identifier">w2</span>
<span class="keyword">end</span>
<span class="keyword">local</span> <span class="identifier">statetab</span>
<span class="keyword">function</span> <span class="identifier">insert</span> <span class="operator">(</span><span class="identifier">index</span><span class="operator">,</span> <span class="identifier">value</span><span class="operator">)</span>
<span class="keyword">if</span> <span class="keyword">not</span> <span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span> <span class="keyword">then</span>
<span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span> <span class="operator">=</span> <span class="operator">{</span><span class="identifier">n</span><span class="operator">=</span><span class="number">0</span><span class="operator">}</span>
<span class="keyword">end</span>
<span class="identifier">table</span><span class="string">.</span><span class="identifier">insert</span><span class="operator">(</span><span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">index</span><span class="operator">]</span><span class="operator">,</span> <span class="identifier">value</span><span class="operator">)</span>
<span class="keyword">end</span>
<span class="keyword">local</span> <span class="identifier">N</span> <span class="operator">=</span> <span class="number">2</span>
<span class="keyword">local</span> <span class="identifier">MAXGEN</span> <span class="operator">=</span> <span class="number">10000</span>
<span class="keyword">local</span> <span class="identifier">NOWORD</span> <span class="operator">=</span> <span class="operator">"</span><span class="operator">\n</span><span class="operator">"</span>
<span class="comment">-- </span><span class="identifier">build</span> <span class="identifier">table</span>
<span class="identifier">statetab</span> <span class="operator">=</span> <span class="operator">{</span><span class="operator">}</span>
<span class="keyword">local</span> <span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">NOWORD</span><span class="operator">,</span> <span class="identifier">NOWORD</span>
<span class="keyword">for</span> <span class="identifier">w</span> <span class="keyword">in</span> <span class="identifier">allwords</span><span class="operator">(</span><span class="operator">)</span> <span class="keyword">do</span>
<span class="identifier">insert</span><span class="operator">(</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">,</span> <span class="identifier">w</span><span class="operator">)</span>
<span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">w2</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">w</span><span class="operator">;</span>
<span class="keyword">end</span>
<span class="identifier">insert</span><span class="operator">(</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">,</span> <span class="identifier">NOWORD</span><span class="operator">)</span>
<span class="comment">-- </span><span class="identifier">generate</span> <span class="identifier">text</span>
<span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">NOWORD</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">NOWORD</span> <span class="comment">-- </span><span class="identifier">reinitialize</span>
<span class="keyword">for</span> <span class="identifier">i</span><span class="operator">=</span><span class="number">1</span><span class="operator">,</span><span class="identifier">MAXGEN</span> <span class="keyword">do</span>
<span class="keyword">local</span> <span class="identifier">list</span> <span class="operator">=</span> <span class="identifier">statetab</span><span class="operator">[</span><span class="identifier">prefix</span><span class="operator">(</span><span class="identifier">w1</span><span class="operator">,</span> <span class="identifier">w2</span><span class="operator">)</span><span class="operator">]</span>
<span class="comment">-- </span><span class="identifier">choose</span> <span class="identifier">a</span> <span class="identifier">random</span> <span class="identifier">item</span> <span class="identifier">from</span> <span class="identifier">list</span>
<span class="keyword">local</span> <span class="identifier">r</span> <span class="operator">=</span> <span class="identifier">math</span><span class="string">.</span><span class="identifier">random</span><span class="operator">(</span><span class="identifier">table</span><span class="string">.</span><span class="identifier">getn</span><span class="operator">(</span><span class="identifier">list</span><span class="operator">)</span><span class="operator">)</span>
<span class="keyword">local</span> <span class="identifier">nextword</span> <span class="operator">=</span> <span class="identifier">list</span><span class="operator">[</span><span class="identifier">r</span><span class="operator">]</span>
<span class="keyword">if</span> <span class="identifier">nextword</span> <span class="operator">==</span> <span class="identifier">NOWORD</span> <span class="keyword">then</span> <span class="keyword">return</span> <span class="keyword">end</span>
<span class="identifier">io</span><span class="string">.</span><span class="identifier">write</span><span class="operator">(</span><span class="identifier">nextword</span><span class="operator">,</span> <span class="operator">"</span> <span class="operator">"</span><span class="operator">)</span>
<span class="identifier">w1</span> <span class="operator">=</span> <span class="identifier">w2</span><span class="operator">;</span> <span class="identifier">w2</span> <span class="operator">=</span> <span class="identifier">nextword</span>
<span class="keyword">end</span>
</pre></body></html>
|