Skip to content

Instantly share code, notes, and snippets.

@PhiBabin
Last active August 29, 2015 14:22
Show Gist options
  • Save PhiBabin/b2f906edc48149a6d5e0 to your computer and use it in GitHub Desktop.
Save PhiBabin/b2f906edc48149a6d5e0 to your computer and use it in GitHub Desktop.
-module(brainfuck).
-export([brainfuck/1]).
%% Hello, world:
%%brainfuck:brainfuck("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.").
brainfuck(Codes) ->
start(string:substr(Codes, 1, 1), 1, Codes, 1, array:new([{size, 3000},{default, 0}])).
start([], N, Codes, P, Data) ->
io:fwrite("~n");
start("<", N, Codes, P, Data) ->
% io:fwrite("<"),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P - 1, Data);
start(">", N, Codes, P, Data) ->
% io:fwrite(">"),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P + 1, Data);
start("+", N, Codes, P, Data) ->
% io:fwrite("+"),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, array:set(P, array:get(P, Data) + 1, Data));
start("-", N, Codes, P, Data) ->
% io:fwrite("-"),
% io:fwrite(io_lib:format("p=~p", [P])),
% io:fwrite(io_lib:format("*p=~p", [array:get(P, Data)])),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, array:set(P, array:get(P, Data) - 1, Data));
start(".", N, Codes, P, Data) ->
% io:fwrite("."),
io:fwrite([array:get(P, Data)]),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data);
start(",", N, Codes, P, Data) ->
% io:fwrite(","),
{ok, [X]} = io:fread("\ninput : ", "~d"),
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, array:set(P, X, Data));
start("[", N, Codes, P, Data) ->
% io:fwrite("["),
Pvalue = array:get(P, Data),
if
Pvalue == 0 ->
% {ok, [X]} = io:fread("\ninputo : ", "~d"),
findStopBraket(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data, 0);
true ->
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data)
end;
start("]", N, Codes, P, Data) ->
% io:fwrite("]"),
% io:fwrite(io_lib:format("*p=~p~n", [array:get(P, Data)])),
% {ok, [X]} = io:fread("\ninput : ", "~d"),
Pvalue = array:get(P, Data),
if
Pvalue == 0 ->
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data);
true ->
findStartBraket(string:substr(Codes, N - 1, 1), N - 1, Codes, P, Data, 0)
end;
start(C, N, Codes, P, Data) ->
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data).
findStartBraket("[", N, Codes, P, Data, 0)->
start(string:substr(Codes, N, 1), N, Codes, P, Data);
findStartBraket("]", N, Codes, P, Data, EndBracketCount)->
findStartBraket(string:substr(Codes, N - 1, 1), N - 1, Codes, P, Data, EndBracketCount + 1);
findStartBraket("[", N, Codes, P, Data, EndBracketCount)->
findStartBraket(string:substr(Codes, N - 1, 1), N - 1, Codes, P, Data, EndBracketCount - 1);
findStartBraket(C, N, Codes, P, Data, EndBracketCount)->
findStartBraket(string:substr(Codes, N - 1, 1), N - 1, Codes, P, Data, EndBracketCount).
findStopBraket("]", N, Codes, P, Data, 0)->
start(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data);
findStopBraket("[", N, Codes, P, Data, EndBracketCount)->
findStopBraket(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data, EndBracketCount + 1);
findStopBraket("]", N, Codes, P, Data, EndBracketCount)->
findStopBraket(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data, EndBracketCount - 1);
findStopBraket(C, N, Codes, P, Data, EndBracketCount)->
findStopBraket(string:substr(Codes, N + 1, 1), N + 1, Codes, P, Data, EndBracketCount).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment