null.js
Version:
Node.js NULL runtime
145 lines (144 loc) • 4.8 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.VM = void 0;
const prime_1 = require("./prime");
const fs_1 = __importDefault(require("fs"));
class VM {
stdin;
stdout;
x = 0n;
y = 1n;
queues = [[], [], []];
constructor(stdin = 0, stdout = 1) {
this.stdin = stdin;
this.stdout = stdout;
}
getc() {
const buffer = Buffer.alloc(1);
fs_1.default.readSync(this.stdin, buffer, {
offset: 0,
length: 1,
});
return buffer[0];
}
putc(char) {
const buffer = Buffer.from([char]);
fs_1.default.writeSync(this.stdout, buffer);
}
reset() {
this.x = 0n;
this.y = 1n;
this.queues[0].length = 0;
this.queues[1].length = 0;
this.queues[2].length = 0;
}
execute(src) {
if (typeof src == "number") {
src = BigInt(src);
}
this.x = src;
run: for (let i = 0;; i++) {
const p = BigInt((0, prime_1.getp)(i));
if (this.x == 1n) {
break run;
}
div: while (this.x % p == 0n) {
this.x /= p;
this.y *= p;
switch (i % 14) {
case 0: {
this.queues.push(this.queues.shift());
break;
}
case 1: {
this.queues.unshift(this.queues.pop());
break;
}
case 2: {
const queue = this.queues[0];
this.putc(queue[0] ?? 0);
break;
}
case 3: {
const queue = this.queues[0];
queue[0] = this.getc();
break;
}
case 4: {
const queue = this.queues[0];
this.y -= BigInt(queue[0] ?? 0);
if (this.y < 0) {
this.y = 0n;
}
break;
}
case 5: {
const queue = this.queues[0];
this.y += BigInt(queue[0] ?? 0);
break;
}
case 6: {
const queue = this.queues[0];
if (queue.length == 0) {
queue[0] = 0;
}
queue[0] += Number(this.y % 256n);
queue[0] %= 256;
break;
}
case 7: {
const queue = this.queues[0];
const next = this.queues[1];
next.push(queue.shift() ?? 0);
break;
}
case 8: {
const queue = this.queues[0];
const prev = this.queues[2];
prev.push(queue.shift() ?? 0);
break;
}
case 9: {
const queue = this.queues[0];
queue.shift();
break;
}
case 10: {
const queue = this.queues[0];
queue.push(Number(this.y % 256n));
break;
}
case 11: {
const queue = this.queues[0];
if (!queue[0]) {
for (let j = i;; j++) {
const pp = BigInt((0, prime_1.getp)(j));
if (this.x % pp == 0n) {
this.x /= pp;
this.y *= pp;
break;
}
}
}
break;
}
case 12: {
const tmp = this.y;
this.y = this.x;
this.x = tmp;
i = -1;
break div;
}
case 13: {
break run;
}
}
}
}
console.log();
}
}
exports.VM = VM;