Skip to content

Instantly share code, notes, and snippets.

@tiago
Last active September 26, 2016 04:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiago/d153791776043abced21f1aca1f87793 to your computer and use it in GitHub Desktop.
Save tiago/d153791776043abced21f1aca1f87793 to your computer and use it in GitHub Desktop.
Pixels Camp Challenge #2 - Factor-out redundancy
var c = (program = '') => {
var register = undefined;
var memory = [0];
var memory_pointer = 0;
var instruction_pointer = 0;
var find_matching = (start, stop, direction) => {
var level = 1;
instruction_pointer += direction;
while(level > 0 && instructions[instruction_pointer]) {
instruction_pointer += direction;
if (instructions[instruction_pointer] === start) level++;
if (instructions[instruction_pointer] === stop) level--;
}
};
var commands = {
moo: () => {
find_matching('moo', 'MOO', -1);
instruction_pointer--;
},
mOo: () => {
memory_pointer && memory_pointer--;
},
moO: () => {
memory_pointer++;
memory[memory_pointer] = memory[memory_pointer] || 0;
},
mOO: () => {
var index = memory[memory_pointer];
var instruction = tokens[index];
if (instruction && index != 3) {
commands[instruction]();
} else {
instructions = [];
}
},
Moo: () => {
if (memory[memory_pointer] === 0) {
memory[memory_pointer] = input_char();
} else {
output_char(String.fromCharCode(memory[memory_pointer]));
}
},
MOo: () => {
memory[memory_pointer]--;
},
MoO: () => {
memory[memory_pointer]++;
},
MOO: () => {
if (memory[memory_pointer] === 0) {
find_matching('MOO', 'moo', 1);
}
},
OOO: () => {
memory[memory_pointer] = 0;
},
MMM: () => {
if(register === undefined) {
register = memory[memory_pointer];
} else {
memory[memory_pointer] = register;
register = undefined;
}
},
OOM: () => {
Array.from(memory[memory_pointer]+'').map(output_char);
},
oom: () => {
memory[memory_pointer] = input_char();
}
};
var tokens = Object.keys(commands);
var instructions = program.match(new RegExp(tokens.join('|'), 'g')) || [];
while (instruction_pointer >= 0 && instruction_pointer < instructions.length) {
var instruction = instructions[instruction_pointer];
commands[instruction]();
instruction_pointer++;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment