null.js
Version:
Node.js NULL runtime
76 lines (75 loc) • 2.39 kB
JavaScript
;
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;