Time for an 2014 update…
This commit is contained in:
parent
372c577f83
commit
09687c4926
2520 changed files with 34227 additions and 7318 deletions
60
Task/Execute-Brain----/AWK/execute-brain----.awk
Normal file
60
Task/Execute-Brain----/AWK/execute-brain----.awk
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
BEGIN {
|
||||
compile(ARGV[1])
|
||||
execute()
|
||||
}
|
||||
|
||||
# Strips non-instructions, builds the jump table.
|
||||
function compile(s, i,j,k,f) {
|
||||
c = split(s, src, "")
|
||||
j = 0
|
||||
for(i = 1; i <= c; i++) {
|
||||
if(src[i] ~ /[\-\+\[\]\<\>,\.]/)
|
||||
code[j++] = src[i]
|
||||
|
||||
if(src[i] == "[") {
|
||||
marks[j] = 1
|
||||
} else if(src[i] == "]") {
|
||||
f = 0
|
||||
for(k = j; k > 0; k--) {
|
||||
if(k in marks) {
|
||||
jump[k-1] = j - 1
|
||||
jump[j-1] = k - 1
|
||||
f = 1
|
||||
delete marks[k]
|
||||
break
|
||||
}
|
||||
}
|
||||
if(!f) {
|
||||
print "Unmatched ]"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function execute( pc,p,i) {
|
||||
pc = p = 0
|
||||
while(pc in code) {
|
||||
i = code[pc]
|
||||
|
||||
if(i == "+")
|
||||
arena[p]++
|
||||
else if(i == "-")
|
||||
arena[p]--
|
||||
else if(i == "<")
|
||||
p--
|
||||
else if(i == ">")
|
||||
p++
|
||||
else if(i == ".")
|
||||
printf("%c", arena[p])
|
||||
else if(i == ",") {
|
||||
"dd bs=1 count=1 2>/dev/null | xd -1d" | getline
|
||||
sub(/^0*/, "", $2)
|
||||
arena[p] = 0 + $2
|
||||
close("dd bs=1 count=1 2>/dev/null | xd -1d")
|
||||
} else if((i == "[" && arena[p] == 0) ||
|
||||
(i == "]" && arena[p] != 0))
|
||||
pc = jump[pc]
|
||||
pc++
|
||||
}
|
||||
}
|
||||
41
Task/Execute-Brain----/BASIC/execute-brain----.basic
Normal file
41
Task/Execute-Brain----/BASIC/execute-brain----.basic
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
0 ON NOT T GOTO 20 : FOR A = T TO L : B = PEEK(S + P) : ON C%(ASC(MID$(C$, A, T))) GOSUB 1, 2, 3, 4, 5, 8, 6, 7 : NEXT A : END
|
||||
1 P = P + T : ON P < E GOTO 11 : O = 1E99
|
||||
2 P = P - T : ON P > M GOTO 11 : O = 1E99
|
||||
3 B = B + T : B = B - (B > U) * B : GOTO 9
|
||||
4 B = B - T : B = B - (B < 0) * (B - U) : GOTO 9
|
||||
5 PRINT CHR$(B); : RETURN
|
||||
6 D = T : ON NOT B GOTO 10 : RETURN
|
||||
7 D = M : ON NOT NOT B GOTO 10 : RETURN
|
||||
8 GET B$ : B = LEN(B$) : IF B THEN B = ASC(B$)
|
||||
9 POKE S + P, B : RETURN
|
||||
10 FOR K = D TO 0 STEP 0 : A = A + D : K = K + D%(ASC(MID$(C$, A, T))) : NEXT K : RETURN
|
||||
11 RETURN
|
||||
20 HIMEM: 38401
|
||||
21 LOMEM: 8185
|
||||
22 DIM C%(14999) : CLEAR
|
||||
23 POKE 105, PEEK(175)
|
||||
24 POKE 106, PEEK(176)
|
||||
25 POKE 107, PEEK(175)
|
||||
26 POKE 108, PEEK(176)
|
||||
27 POKE 109, PEEK(175)
|
||||
28 POKE 110, PEEK(176)
|
||||
29 HIMEM: 8192
|
||||
30 T = 1
|
||||
31 M = -1
|
||||
32 S = 8192
|
||||
33 E = 30000
|
||||
34 U = 255
|
||||
35 DIM C%(255), D%(255)
|
||||
43 C%(ASC("+")) = 3
|
||||
44 C%(ASC(",")) = 6
|
||||
45 C%(ASC("-")) = 4
|
||||
46 C%(ASC(".")) = 5
|
||||
60 C%(ASC("<")) = 2
|
||||
62 C%(ASC(">")) = 1
|
||||
91 C%(ASC("[")) = 7
|
||||
92 D%(ASC("[")) = 1
|
||||
93 C%(ASC("]")) = 8
|
||||
94 D%(ASC("]")) = -1
|
||||
95 C$ = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>->+>>+[<]<-]>>.>>---.+++++++..+++.>.<<-.>.+++.------.--------.>+.>++.+++."
|
||||
98 L = LEN(C$)
|
||||
99 GOTO
|
||||
102
Task/Execute-Brain----/Limbo/execute-brain----.limbo
Normal file
102
Task/Execute-Brain----/Limbo/execute-brain----.limbo
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
implement Bf;
|
||||
|
||||
include "sys.m"; sys: Sys;
|
||||
include "draw.m";
|
||||
|
||||
Bf: module {
|
||||
init: fn(nil: ref Draw->Context, args: list of string);
|
||||
ARENASZ: con 1024 * 1024;
|
||||
EXIT, INC, DEC, JZ, JNZ, INCP, DECP, READ, WRITE: con iota;
|
||||
};
|
||||
|
||||
init(nil: ref Draw->Context, args: list of string)
|
||||
{
|
||||
sys = load Sys Sys->PATH;
|
||||
args = tl args;
|
||||
if(args == nil || len args != 1) {
|
||||
sys->fprint(sys->fildes(2), "usage: bf program");
|
||||
raise "fail:usage";
|
||||
}
|
||||
code := compile(hd args);
|
||||
execute(code, array[ARENASZ] of { * => byte 0 });
|
||||
}
|
||||
|
||||
compile(p: string): array of int
|
||||
{
|
||||
marks: list of int = nil;
|
||||
code := array[len p * 2 + 1] of { * => EXIT };
|
||||
pc := 0;
|
||||
for(i := 0; i < len p; i++) {
|
||||
case p[i] {
|
||||
'-' => code[pc++] = DEC;
|
||||
'+' => code[pc++] = INC;
|
||||
'<' => code[pc++] = DECP;
|
||||
'>' => code[pc++] = INCP;
|
||||
',' => code[pc++] = READ;
|
||||
'.' => code[pc++] = WRITE;
|
||||
'[' =>
|
||||
code[pc++] = JZ;
|
||||
marks = pc++ :: marks;
|
||||
']' =>
|
||||
if(marks == nil) {
|
||||
sys->fprint(sys->fildes(2), "bf: unmatched ']' at character %d.", pc);
|
||||
raise "fail:errors";
|
||||
}
|
||||
c := hd marks;
|
||||
marks = tl marks;
|
||||
code[pc++] = JNZ;
|
||||
code[c] = pc;
|
||||
code[pc++] = c;
|
||||
}
|
||||
}
|
||||
if(marks != nil) {
|
||||
sys->fprint(sys->fildes(2), "bf: unmatched '['.");
|
||||
raise "fail:errors";
|
||||
}
|
||||
return code;
|
||||
}
|
||||
|
||||
execute(code: array of int, arena: array of byte)
|
||||
{
|
||||
pc := 0;
|
||||
p := 0;
|
||||
buf := array[1] of byte;
|
||||
stopreading := 0;
|
||||
for(;;) {
|
||||
case code[pc] {
|
||||
DEC => arena[p]--;
|
||||
INC => arena[p]++;
|
||||
DECP =>
|
||||
p--;
|
||||
if(p < 0)
|
||||
p = len arena - 1;
|
||||
INCP =>
|
||||
p = (p + 1) % len arena;
|
||||
READ =>
|
||||
if(!stopreading) {
|
||||
n := sys->read(sys->fildes(0), buf, 1);
|
||||
if(n < 1) {
|
||||
arena[p] = byte 0;
|
||||
stopreading = 1;
|
||||
} else {
|
||||
arena[p] = buf[0];
|
||||
}
|
||||
}
|
||||
WRITE =>
|
||||
buf[0] = arena[p];
|
||||
sys->write(sys->fildes(1), buf, 1);
|
||||
JNZ =>
|
||||
if(arena[p] != byte 0)
|
||||
pc = code[pc + 1];
|
||||
else
|
||||
pc++;
|
||||
JZ =>
|
||||
if(arena[p] == byte 0)
|
||||
pc = code[pc + 1];
|
||||
else
|
||||
pc++;
|
||||
EXIT => return;
|
||||
}
|
||||
pc++;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
bf[program_, input_] :=
|
||||
Module[{p = Characters[program], pp = 0, m, mp = 0, bc = 0,
|
||||
instr = StringToStream[input],
|
||||
instr = StringToStream[input]},
|
||||
m[_] = 0;
|
||||
While[pp < Length@p,
|
||||
pp++;
|
||||
|
|
@ -9,7 +9,7 @@ bf[program_, input_] :=
|
|||
"<", mp--,
|
||||
"+", m[mp]++,
|
||||
"-", m[mp]--,
|
||||
".", BinaryWrite[OutputStream["stdout", 1], m[mp]],
|
||||
".", BinaryWrite["stdout", m[mp]],
|
||||
",", m[mp] = BinaryRead[instr],
|
||||
"[", If[m[mp] == 0,
|
||||
bc = 1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue