You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
5.9 KiB
198 lines
5.9 KiB
# .tlv file generated by https://github.com/akkartik/teliva |
|
# You may edit it if you are careful; however, you may see cryptic errors if you |
|
# violate Teliva's assumptions. |
|
# |
|
# .tlv files are representations of Teliva programs. Teliva programs consist of |
|
# sequences of definitions. Each definition is a table of key/value pairs. Keys |
|
# and values are both strings. |
|
# |
|
# Lines in .tlv files always follow exactly one of the following forms: |
|
# - comment lines at the top of the file starting with '#' at column 0 |
|
# - beginnings of definitions starting with '- ' at column 0, followed by a |
|
# key/value pair |
|
# - key/value pairs consisting of ' ' at column 0, containing either a |
|
# spaceless value on the same line, or a multi-line value |
|
# - multiline values indented by more than 2 spaces, starting with a '>' |
|
# |
|
# If these constraints are violated, Teliva may unceremoniously crash. Please |
|
# report bugs at http://akkartik.name/contact |
|
- __teliva_timestamp: original |
|
check: |
|
>function check(x, msg) |
|
> if x then |
|
> Window:addch('.') |
|
> else |
|
> print('F - '..msg) |
|
> print(' '..str(x)..' is false/nil') |
|
> teliva_num_test_failures = teliva_num_test_failures + 1 |
|
> -- overlay first test failure on editors |
|
> if teliva_first_failure == nil then |
|
> teliva_first_failure = msg |
|
> end |
|
> end |
|
>end |
|
- __teliva_timestamp: original |
|
check_eq: |
|
>function check_eq(x, expected, msg) |
|
> if eq(x, expected) then |
|
> Window:addch('.') |
|
> else |
|
> print('F - '..msg) |
|
> print(' expected '..str(expected)..' but got '..str(x)) |
|
> teliva_num_test_failures = teliva_num_test_failures + 1 |
|
> -- overlay first test failure on editors |
|
> if teliva_first_failure == nil then |
|
> teliva_first_failure = msg |
|
> end |
|
> end |
|
>end |
|
- __teliva_timestamp: original |
|
eq: |
|
>function eq(a, b) |
|
> if type(a) ~= type(b) then return false end |
|
> if type(a) == 'table' then |
|
> if #a ~= #b then return false end |
|
> for k, v in pairs(a) do |
|
> if b[k] ~= v then |
|
> return false |
|
> end |
|
> end |
|
> for k, v in pairs(b) do |
|
> if a[k] ~= v then |
|
> return false |
|
> end |
|
> end |
|
> return true |
|
> end |
|
> return a == b |
|
>end |
|
- __teliva_timestamp: original |
|
str: |
|
>-- smarter tostring |
|
>-- slow; used only for debugging |
|
>function str(x) |
|
> if type(x) == 'table' then |
|
> local result = '' |
|
> result = result..#x..'{' |
|
> for k, v in pairs(x) do |
|
> result = result..str(k)..'='..str(v)..', ' |
|
> end |
|
> result = result..'}' |
|
> return result |
|
> elseif type(x) == 'string' then |
|
> return '"'..x..'"' |
|
> end |
|
> return tostring(x) |
|
>end |
|
- __teliva_timestamp: original |
|
render: |
|
>function render(window) |
|
> window:clear() |
|
> local lines, cols = window:getmaxyx() |
|
> local line = math.floor(lines/2) |
|
> local col = math.floor(cols/4) |
|
> for i,t in ipairs(tower) do |
|
> render_tower(window, line, i*col, i, t) |
|
> end |
|
> window:refresh() |
|
>end |
|
- __teliva_timestamp: original |
|
lines: |
|
>function lines(window) |
|
> local lines, cols = window:getmaxyx() |
|
> return lines |
|
>end |
|
- __teliva_timestamp: original |
|
pop: |
|
>function pop(array) |
|
> return table.remove(array) |
|
>end |
|
- __teliva_timestamp: original |
|
Window: |
|
>Window = curses.stdscr() |
|
- __teliva_timestamp: original |
|
render_tower: |
|
>function render_tower(window, line, col, tower_index, tower) |
|
> window:attron(curses.A_BOLD) |
|
> window:mvaddch(line+2, col, string.char(96+tower_index)) |
|
> window:attroff(curses.A_BOLD) |
|
> window:attron(curses.color_pair(15)) |
|
> window:mvaddstr(line+1, col-6, " ") |
|
> window:attroff(curses.color_pair(15)) |
|
> for i, n in ipairs(tower) do |
|
> render_disk(window, line, col, n) |
|
> line = line - 1 |
|
> end |
|
> for i=1,5-len(tower)+1 do |
|
> window:attron(curses.color_pair(15)) |
|
> window:mvaddstr(line, col, " ") |
|
> window:attroff(curses.color_pair(15)) |
|
> line = line - 1 |
|
> end |
|
>end |
|
- __teliva_timestamp: original |
|
tower: |
|
>tower = {{6, 5, 4, 3, 2}, {}, {}} |
|
- __teliva_timestamp: original |
|
render_disk: |
|
>function render_disk(window, line, col, size) |
|
> col = col-size+1 |
|
> for i=1,size do |
|
> window:attron(curses.color_pair(size)) |
|
> window:mvaddstr(line, col, " ") |
|
> window:attroff(curses.color_pair(size)) |
|
> col = col+2 |
|
> end |
|
>end |
|
- __teliva_timestamp: original |
|
main: |
|
>function main() |
|
> curses.assume_default_colors(238, 139) |
|
> for i=1,7 do |
|
> curses.init_pair(i, 0, i) |
|
> end |
|
> curses.init_pair(15, 0, 250) -- tower frames |
|
> |
|
> while true do |
|
> render(Window) |
|
> update(Window) |
|
> end |
|
>end |
|
- __teliva_timestamp: original |
|
len: |
|
>function len(array) |
|
> local result = 0 |
|
> for k in pairs(array) do |
|
> result = result+1 |
|
> end |
|
> return result |
|
>end |
|
- __teliva_timestamp: original |
|
update: |
|
>function update(window) |
|
> window:mvaddstr(lines(window)-2, 5, "tower to remove top disk from? ") |
|
> local from = window:getch() - 96 |
|
> window:mvaddstr(lines(window)-1, 5, "tower to stack it on? ") |
|
> local to = window:getch() - 96 |
|
> make_move(from, to) |
|
>end |
|
- __teliva_timestamp: original |
|
make_move: |
|
>function make_move(from, to) |
|
> local disk = pop(tower[from]) |
|
> table.insert(tower[to], disk) |
|
>end |
|
- __teliva_timestamp: original |
|
cols: |
|
>function cols(window) |
|
> local lines, cols = window:getmaxyx() |
|
> return cols |
|
>end |
|
- __teliva_timestamp: |
|
>Thu Feb 17 20:07:06 2022 |
|
doc:blurb: |
|
>Single-player game: the Towers of Hanoi |
|
> |
|
>Move disks around from one tower A to tower B, under one constraint: a disk can never lie above a smaller disk. |
|
> |
|
>https://en.wikipedia.org/wiki/Tower_of_Hanoi
|
|
|