Langton's ant: Difference between revisions
Content added Content deleted
(→{{header|Vim Script}}: Add implementation) |
|||
Line 5,543: | Line 5,543: | ||
:End |
:End |
||
</lang> |
</lang> |
||
=={{header|Vim Script}}== |
|||
<lang vim>" return character under cursor |
|||
function! CurrChar() |
|||
return matchstr(getline('.'), '\%' . col('.') . 'c.') |
|||
endfunction |
|||
" draw all-white grid (arguments are characters to use for white and black) |
|||
function! LangtonClear(white, black) |
|||
let l:bufname = 'langtons.ant' |
|||
if bufexists(l:bufname) |
|||
let l:winnum = bufwinnr(l:bufname) |
|||
if l:winnum == -1 |
|||
execute 'sbuffer ' . bufnr(l:bufname) |
|||
else |
|||
execute l:winnum . 'wincmd w' |
|||
endif |
|||
else |
|||
execute 'new ' . l:bufname |
|||
end |
|||
execute '1,$ delete _' |
|||
call append(0, repeat(a:white,100)) |
|||
execute 'normal! 1Gyy99p' |
|||
goto 5100 |
|||
let b:directions = [ 'k', 'l', 'j', 'h' ] |
|||
let b:direction = 0 |
|||
let b:white = a:white |
|||
let b:black = a:black |
|||
endfunction |
|||
" move the ant one step |
|||
function! LangtonStep() |
|||
let l:ch = CurrChar() |
|||
if l:ch == b:white |
|||
let l:ch = b:black |
|||
let b:direction = (b:direction + 1) % 4 |
|||
elseif l:ch == b:black |
|||
let l:ch = b:white |
|||
let b:direction = (b:direction + 3) % 4 |
|||
endif |
|||
execute 'normal! r'.l:ch.b:directions[b:direction] |
|||
endfunction |
|||
" run until we hit the edge |
|||
" optional arguments specify white and black characters; |
|||
" default . and @, respectively. |
|||
function! RunLangton(...) |
|||
let l:white='.' |
|||
let l:black='@' |
|||
if a:0 > 0 |
|||
let l:white=a:1 |
|||
if a:0 > 1 |
|||
let l:black=a:2 |
|||
endif |
|||
endif |
|||
call LangtonClear(l:white, l:black) |
|||
while 1 |
|||
let l:before = getpos('.') |
|||
call LangtonStep() |
|||
let l:after = getpos('.') |
|||
if l:before == l:after |
|||
break |
|||
endif |
|||
endwhile |
|||
endfunction</lang> |
|||
=={{header|Whitespace}}== |
=={{header|Whitespace}}== |