Skip to content

Instantly share code, notes, and snippets.

@seanlynch
Created August 18, 2010 18:05
Show Gist options
  • Save seanlynch/535655 to your computer and use it in GitHub Desktop.
Save seanlynch/535655 to your computer and use it in GitHub Desktop.
#!/usr/bin/env escript
%% -*- erlang -*-
main([FileName]) ->
{ok, Bin} = file:read_file(FileName),
String = binary_to_list(Bin),
bf([], String, [], []).
bf(_, [], _, _) ->
ok;
bf(L, R, A, B) ->
[H|T] = R,
case H of
$> ->
[X|Y] = peek(B),
bf([H|L], T, [X|A], Y);
$< ->
[X|Y] = peek(A),
bf([H|L], T, Y, [X|B]);
$+ ->
[X|Y] = peek(B),
bf([H|L], T, A, [X+1|Y]);
$- ->
[X|Y] = peek(B),
bf([H|L], T, A, [X-1|Y]);
$. ->
X = head(B),
io:put_chars([X]),
bf([H|L], T, A, B);
$, ->
C = case io:get_chars("", 1) of
[X] -> X;
_ -> -1
end,
bf([H|L], T, A, poke(C, B));
$[ ->
case head(B) of
0 ->
{L1, R1} = closing_bracket([H|L], T, 1),
bf(L1, R1, A, B);
_ ->
bf([H|L], T, A, B)
end;
$] ->
case head(B) of
0 ->
bf([H|L], T, A, B);
_ ->
{L1, R1} = opening_bracket(L, R, 1),
bf(L1, R1, A, B)
end;
_ ->
bf([H|L], T, A, B)
end.
closing_bracket(L, R, 0) ->
{L, R};
closing_bracket(L, [$]|R], N) ->
closing_bracket([$]|L], R, N-1);
closing_bracket(L, [$[|R], N) ->
closing_bracket([$[|L], R, N+1);
closing_bracket(L, [H|R], N) ->
closing_bracket([H|L], R, N).
head([]) ->
0;
head([H|_]) ->
H.
peek([]) ->
[0];
peek(L) ->
L.
poke(C, []) ->
[C];
poke(C, [_|T]) ->
[C|T].
opening_bracket(L, R, 0) ->
{L, R};
opening_bracket([$[|L], R, N) ->
opening_bracket(L, [$[|R], N-1);
opening_bracket([$]|L], R, N) ->
opening_bracket(L, [$]|R], N+1);
opening_bracket([H|L], R, N) ->
opening_bracket(L, [H|R], N).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment