//brainf const std = @import("std"); const io = std.io; const fs = std.fs; const process = std.process; pub fn main() !void { var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); var allocator = arena.allocator(); defer arena.deinit(); var out = io.getStdOut().writer(); var in = io.getStdIn().reader(); var args = process.args(); defer args.deinit(); _ = args.skip(); const prog_path = args.next() orelse { try io.getStdErr().writer().writeAll("i need a program path :(\n"); process.exit(1); }; var prog_file = try fs.cwd().openFile(prog_path, .{}); const prog_unfiltered = try prog_file.readToEndAlloc(allocator, 1 << 24); var prog = try allocator.alloc(u8, prog_unfiltered.len); var prog_len: u32 = 0; for (prog_unfiltered) |c| { if (c == '+' or c == '-' or c == '>' or c == '<' or c == '[' or c == ']' or c == '.' or c == ',') { prog[prog_len] = c; prog_len += 1; } } var mem = try allocator.alloc(u8, 1 << 16); for (mem) |*m| { m.* = 0; } var mp: u16 = 0; var ip: u32 = 0; while (ip < prog_len) { switch (prog[ip]) { '+' => mem[mp] +%= 1, '-' => mem[mp] -%= 1, '>' => mp +%= 1, '<' => mp -%= 1, '[' => { if (mem[mp] == 0) { var depth: i16 = 1; ip += 1; while (depth > 0) : (ip += 1) { depth += switch (prog[ip]) { ']' => -1, '[' => 1, else => 0, }; } ip -= 1; } }, ']' => { if (mem[mp] != 0) { var depth: i16 = 1; ip -= 1; while (depth > 0) : (ip -= 1) { depth += switch (prog[ip]) { '[' => -1, ']' => 1, else => 0, }; } ip += 1; } }, '.' => try out.writeByte(mem[mp]), ',' => mem[mp] = in.readByte() catch 0, else => unreachable, } ip += 1; } }