  lua-l archive

• Subject: Lua Tutor? Porting Python code to Lua.
• From: sessile@...
• Date: Sat, 21 Sep 2002 21:02:18 -0400

```A nifty little script was posted to the Python Tutor list a few days
ago and for practice I decided to rewrite it using Lua-5.0-alpha.
The conversion was simple except that I couldn't think of an elegant
way to emulate the tuple-indexed dictionary.  The initialization of
STARTING_ROW doesn't feel quite right either though it does work (and
that, I suppose, is the most important part).

How would you have written this in Lua?  My working attempt is included
at the bottom.

=== begin ascii-art.py ===

"""A small ascii-art program in Python.
Danny Yoo (dyoo@hkn.eecs.berkeley.edu)

See:

http://www.wolframscience.com/preview/nks_pages/?NKS0032.gif

fascinating topic.
"""

import sys

"""Wolfram's automaton uses eight rules for generating the next row of
output.  Let's take a look at them."""
RULE_100 = { (1, 1, 1) : 0,
(1, 1, 0) : 1,
(1, 0, 1) : 1,
(1, 0, 0) : 0,
(0, 1, 1) : 1,
(0, 1, 0) : 1,
(0, 0, 1) : 1,
(0, 0, 0) : 0 }

def drawRow(row):
for character in row:
if character: sys.stdout.write('O')
else: sys.stdout.write('.')
sys.stdout.write('\n')

STARTING_ROW = *2 + *70 +  + *2

def applyRuleOnRow(rule, row):
new_row = 
for i in range(1, len(row)-1):
triple = (row[i-1], row[i], row[i+1])
new_row.append(rule[triple])
new_row.append(0)
return new_row

if __name__ == '__main__':
row = STARTING_ROW
for i in range(70):
drawRow(row)
row = applyRuleOnRow(RULE_100, row)

=== end ascii-art.py ===

=== begin ascii-art.lua ===

RULE_100 = { ["111"] = 0,
["110"] = 1,
["101"] = 1,
["100"] = 0,
["011"] = 1,
["010"] = 1,
["001"] = 1,
["000"] = 0 }

function drawRow(row)
for _,character in ipairs(row) do
if character == 1 then io.write('O')
else io.write('.')
end
end
io.write('\n')
end

STARTING_ROW = {}
for i=1,75 do
if i ~= 73 then table.insert(STARTING_ROW,0)
else table.insert(STARTING_ROW,1)
end
end

function applyRuleOnRow(rule, row)
local new_row = {0}
for i = 2, table.getn(row)-1 do
local triple = string.format("%s%s%s", row[i-1], row[i], row[i+1])
table.insert(new_row, rule[triple])
end
table.insert(new_row,0)
return new_row
end

if arg then
local row = STARTING_ROW
for i = 1, 70 do
drawRow(row)
row = applyRuleOnRow(RULE_100, row)
end
end

=== end ascii-art.lua ===

Thanks,
Dean.

--
E-Mail:  sessile@in-gen.net

```