UNPKG

null.js

Version:
76 lines (75 loc) 2.39 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Decompiler = exports.Compiler = void 0; const prime_1 = require("./prime"); const fs_1 = __importDefault(require("fs")); class Compiler { static compile(src, dst) { src = fs_1.default.readFileSync(src, "utf-8"); const instructions = src .split("\n") .map((line) => line.split("//")[0]) .filter((line) => line.trim()) .map((line) => Number(line)); const compiler = new Compiler(); const out = compiler.compile(instructions); fs_1.default.writeFileSync(dst, out); } compile(instructions) { let idx = 0; let out = 1n; for (let i = 0; i < instructions.length;) { let ins = instructions[i]; let j = i + 1; while (instructions[j] == ins) { j++; } while (ins < idx) { ins += 14; } const p = BigInt((0, prime_1.getp)(ins)); for (let k = i; k < j; k++) { out *= p; } i = j; idx = ins; } return String(out); } } exports.Compiler = Compiler; class Decompiler { static decompile(src, dst) { src = fs_1.default.readFileSync(src, "utf-8"); const code = BigInt(src.trim()); const decompiler = new Decompiler(); const { instructions, out } = decompiler.decompile(code); fs_1.default.writeFileSync(dst, out); } decompile(src) { if (typeof src == "number") { src = BigInt(src); } const instructions = []; const primes = []; for (let i = 0;; i++) { const p = BigInt((0, prime_1.getp)(i)); if (src == 1n) { break; } while (src % p == 0n) { src /= p; instructions.push(i % 14); primes.push(Number(p)); } } const out = instructions .map((ins, i) => `${String(ins).padEnd(2, " ")}\t\t// ${primes[i]}`) .join("\n"); return { instructions, out }; } } exports.Decompiler = Decompiler;