UNPKG

null.js

Version:
145 lines (144 loc) 4.8 kB
"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;