base32 thing, weird image esolang
This commit is contained in:
parent
d8ddcc6c3e
commit
c6d8e69ef9
|
@ -0,0 +1,86 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import random
|
||||||
|
import collections
|
||||||
|
import subprocess
|
||||||
|
import ctypes
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import os.path
|
||||||
|
import base64
|
||||||
|
|
||||||
|
class CWrapper:
|
||||||
|
def __init__(self, file):
|
||||||
|
self.filename = file
|
||||||
|
def __enter__(self):
|
||||||
|
self.tempfile = tempfile.mktemp(prefix="shlib-")
|
||||||
|
print("Compiling C file", self.filename)
|
||||||
|
if subprocess.run(["gcc", self.filename, "-o", self.tempfile , "-shared", "-fPIC"]).returncode != 0:
|
||||||
|
raise ValueError("compilation failed")
|
||||||
|
library = ctypes.CDLL(self.tempfile)
|
||||||
|
self.function = entry = library.entry
|
||||||
|
entry.restype = ctypes.c_char_p
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __call__(self, s): return self.function(ctypes.c_char_p(s.encode("ascii"))).decode("ascii")
|
||||||
|
def __repr__(self): return f"<wrapper for C solution {self.filename}>"
|
||||||
|
def __exit__(self, type, value, traceback): os.unlink(self.tempfile)
|
||||||
|
|
||||||
|
class JavaWrapper:
|
||||||
|
main = """
|
||||||
|
import java.io.*;
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
|
||||||
|
try {
|
||||||
|
while (true) {
|
||||||
|
String line = br.readLine();
|
||||||
|
if (line == null) { return; }
|
||||||
|
System.err.println("got");
|
||||||
|
System.err.println(line);
|
||||||
|
System.out.println(Entry.entry(line));
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
System.err.println(ioe);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, file):
|
||||||
|
self.filename = file
|
||||||
|
def __enter__(self):
|
||||||
|
self.tempdir = tempfile.mkdtemp(prefix="javacompile-")
|
||||||
|
code_path = os.path.join(self.tempdir, "Entry.java")
|
||||||
|
shutil.copyfile(self.filename, code_path)
|
||||||
|
main_path = os.path.join(self.tempdir, "Main.java")
|
||||||
|
with open(main_path, "w") as f:
|
||||||
|
f.write(JavaWrapper.main)
|
||||||
|
print("Compiling Java file", self.filename)
|
||||||
|
if subprocess.run(["javac", code_path, main_path]).returncode != 0:
|
||||||
|
raise ValueError("compilation failed")
|
||||||
|
main_class_path = os.path.join(self.tempdir, "Main.class")
|
||||||
|
self.process = subprocess.Popen(["java", "-cp", self.tempdir, "Main"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __call__(self, s):
|
||||||
|
self.process.stdin.write(s.encode("ascii") + os.linesep.encode("ascii"))
|
||||||
|
self.process.stdin.flush()
|
||||||
|
return self.process.stdout.readline().decode("ascii")
|
||||||
|
def __repr__(self): return f"<wrapper for Java solution {self.filename}>"
|
||||||
|
def __exit__(self, type, value, traceback):
|
||||||
|
shutil.rmtree(self.tempdir)
|
||||||
|
self.process.kill()
|
||||||
|
|
||||||
|
def test(entry):
|
||||||
|
for _ in range(500):
|
||||||
|
s = "".join(chr(random.randint(32, 126)) for _ in range(random.randint(1, 256)))
|
||||||
|
answer = base64.b32encode(s.encode("ascii")).decode("ascii")
|
||||||
|
result = entry(s)
|
||||||
|
assert answer == result, f"test failed for {entry}: got {result}, should be {answer}, for {s}"
|
||||||
|
print(entry, "passed all tests")
|
||||||
|
|
||||||
|
import base32
|
||||||
|
test(base32.entry)
|
|
@ -0,0 +1,22 @@
|
||||||
|
import string, re
|
||||||
|
|
||||||
|
def entry(argv):
|
||||||
|
argv = argv.encode("utf-8")
|
||||||
|
modulus = len(argv) % 5
|
||||||
|
if modulus > 0:
|
||||||
|
argv += b"\x00" * (5-modulus)
|
||||||
|
chars = string.ascii_uppercase + "234567"
|
||||||
|
historyLen = 1
|
||||||
|
|
||||||
|
b = 0
|
||||||
|
for c in reversed(argv):
|
||||||
|
b += c * historyLen
|
||||||
|
historyLen *= 256
|
||||||
|
data = []
|
||||||
|
while b != 0:
|
||||||
|
data.append(chars[b % 32])
|
||||||
|
b //= 32
|
||||||
|
data = "".join(reversed(data))
|
||||||
|
|
||||||
|
checksum = { 0: 0, 1: 6, 2: 4, 3: 3, 4: 1 }
|
||||||
|
return re.sub("A{%d}$" % checksum[modulus], lambda str: str.group(0).replace("A", "="), data)
|
|
@ -0,0 +1,76 @@
|
||||||
|
from PIL import Image
|
||||||
|
import enum
|
||||||
|
import random
|
||||||
|
|
||||||
|
rng = random.Random()
|
||||||
|
def randomize(x, pos, m):
|
||||||
|
rng.seed(bytes(x) + pos[0].to_bytes(4, "little") + pos[1].to_bytes(4, "little"), 2)
|
||||||
|
return rng.randint(0, m), rng.randint(0, 255)
|
||||||
|
|
||||||
|
class Command(enum.Enum):
|
||||||
|
DIV = 0
|
||||||
|
DRP = 1
|
||||||
|
SDIZ = 2
|
||||||
|
MOD = 3
|
||||||
|
READ_IN = 4
|
||||||
|
ADD = 5
|
||||||
|
PUSH = 6
|
||||||
|
MUL = 7
|
||||||
|
ROT = 8
|
||||||
|
UNROT = 9
|
||||||
|
DUP = 10
|
||||||
|
CWROTATE = 11
|
||||||
|
ACWROTATE = 12
|
||||||
|
SETDIR = 13
|
||||||
|
UNASSIGNED_1 = 14
|
||||||
|
EXIT = 15
|
||||||
|
OUT = 16
|
||||||
|
SWP = 17
|
||||||
|
NOP = 18
|
||||||
|
|
||||||
|
dirs = { "up": (0, -1), "down": (0, 1), "right": (1, 0), "left": (-1, 0), "downright": (1, 1), "upright": (1, -1), "up2": (0, -2), "upleft": (-1, -1), "up3": (0, -3) }
|
||||||
|
def setdir(d):
|
||||||
|
x, y = dirs[d]
|
||||||
|
x, y = x + 3, y + 3
|
||||||
|
return (x << 3) + y
|
||||||
|
|
||||||
|
def go(d): return Command.SETDIR, setdir(d)
|
||||||
|
|
||||||
|
inp = [
|
||||||
|
[ Command.ACWROTATE, Command.ROT, (Command.SETDIR, setdir("right")), (Command.SETDIR, setdir("down"))],
|
||||||
|
[ Command.NOP, (Command.PUSH, 32), Command.UNROT, Command.NOP ],
|
||||||
|
[ (Command.PUSH, 0) , Command.UNROT, Command.DUP, Command.MUL ],
|
||||||
|
[ (Command.PUSH, 1), Command.DRP, Command.ROT , Command.UNROT , go("down"), Command.NOP, (Command.SETDIR, setdir("left")) ],
|
||||||
|
[ (Command.SETDIR, setdir("right")), Command.READ_IN, Command.CWROTATE , Command.ADD, go("right"), (Command.PUSH, 128), Command.ADD, Command.MUL ],
|
||||||
|
[ go("down"), Command.EXIT, Command.NOP, Command.ROT, Command.NOP ],
|
||||||
|
[ Command.DUP, go("upleft") , Command.NOP, go("upright") ],
|
||||||
|
[ Command.UNROT, (Command.SDIZ, setdir("up2"))],
|
||||||
|
[ Command.DUP , Command.NOP ],
|
||||||
|
[ Command.ROT , Command.NOP],
|
||||||
|
[ Command.MOD , Command.NOP],
|
||||||
|
[ Command.OUT , Command.NOP ],
|
||||||
|
[ Command.DUP, Command.NOP ],
|
||||||
|
[ Command.UNROT, go("up") ],
|
||||||
|
[ Command.DIV, Command.SWP ],
|
||||||
|
[ go("right"), go("up") ],
|
||||||
|
[ None, go("up3") ]
|
||||||
|
]
|
||||||
|
|
||||||
|
im = Image.new("RGB", (max(map(len, inp)), len(inp)))
|
||||||
|
px = im.load()
|
||||||
|
for y, row in enumerate(inp):
|
||||||
|
for x, op in enumerate(row):
|
||||||
|
if op:
|
||||||
|
param = None
|
||||||
|
if isinstance(op, tuple):
|
||||||
|
op, param = op
|
||||||
|
print(x, y, op, param)
|
||||||
|
# brute force muahahaha
|
||||||
|
command_id = op.value
|
||||||
|
while True:
|
||||||
|
rgb = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
||||||
|
cmd, arg = randomize(rgb, (x, y), Command.NOP.value)
|
||||||
|
if cmd == command_id and (param is None or arg == param):
|
||||||
|
px[x, y] = rgb
|
||||||
|
break
|
||||||
|
im.save("/tmp/out.png")
|
|
@ -0,0 +1,122 @@
|
||||||
|
from PIL import Image
|
||||||
|
import random
|
||||||
|
|
||||||
|
im = Image.open("/tmp/out.png")
|
||||||
|
px = im.load()
|
||||||
|
|
||||||
|
rng = random.Random()
|
||||||
|
def randomize(x, pos, m):
|
||||||
|
rng.seed(bytes(x) + pos[0].to_bytes(4, "little") + pos[1].to_bytes(4, "little"), 2)
|
||||||
|
return rng.randint(0, m), rng.randint(0, 255)
|
||||||
|
|
||||||
|
COMMANDS = 18
|
||||||
|
size = im.size
|
||||||
|
position = (0, 0)
|
||||||
|
direction = (1, 0)
|
||||||
|
matrix_1 = ((0, 1), (-1, 0))
|
||||||
|
matrix_2 = ((0, -1), (1, 0))
|
||||||
|
def rotate(matrix):
|
||||||
|
global direction
|
||||||
|
a = direction[0] * matrix[0][0] + direction[1] * matrix[0][1]
|
||||||
|
b = direction[0] * matrix[1][0] + direction[1] * matrix[1][1]
|
||||||
|
direction = (a, b)
|
||||||
|
stack = []
|
||||||
|
inbuf = ["b", "e", "e", "s", "i", "n", "c", "u", "r", "s", "e"]
|
||||||
|
|
||||||
|
class Command(__import__("enum").Enum):
|
||||||
|
DRP = 1
|
||||||
|
SDIZ = 2
|
||||||
|
MOD = 3
|
||||||
|
READ_IN = 4
|
||||||
|
ADD = 5
|
||||||
|
PUSH = 6
|
||||||
|
MUL = 7
|
||||||
|
ROT = 8
|
||||||
|
UNROT = 9
|
||||||
|
DUP = 10
|
||||||
|
CWROTATE = 11
|
||||||
|
ACWROTATE = 12
|
||||||
|
SETDIR = 13
|
||||||
|
EXIT = 15
|
||||||
|
UNASSIGNED_1 = 14
|
||||||
|
DIV = 0
|
||||||
|
OUT = 16
|
||||||
|
SWAP = 17
|
||||||
|
NOP = 18
|
||||||
|
|
||||||
|
while True:
|
||||||
|
command, param = randomize(px[position], position, COMMANDS)
|
||||||
|
print(command, position, direction, stack, Command(command))
|
||||||
|
if command == 4:
|
||||||
|
# read input
|
||||||
|
if len(inbuf) > 0:
|
||||||
|
stack.append(ord(inbuf.pop(0)))
|
||||||
|
else:
|
||||||
|
rotate(matrix_1)
|
||||||
|
elif command == 5:
|
||||||
|
# add
|
||||||
|
if len(stack) >= 2:
|
||||||
|
stack.append(stack.pop() + stack.pop())
|
||||||
|
else:
|
||||||
|
rotate(matrix_2)
|
||||||
|
elif command == 3:
|
||||||
|
# mod
|
||||||
|
if len(stack) >= 2:
|
||||||
|
stack.append(stack.pop() % stack.pop())
|
||||||
|
else:
|
||||||
|
rotate(matrix_2)
|
||||||
|
elif command == 0:
|
||||||
|
# div
|
||||||
|
if len(stack) >= 2:
|
||||||
|
stack.append(stack.pop() // stack.pop())
|
||||||
|
else:
|
||||||
|
rotate(matrix_2)
|
||||||
|
elif command == 6: # push
|
||||||
|
stack.append(param)
|
||||||
|
elif command == 8:
|
||||||
|
# rot
|
||||||
|
if len(stack) > 0:
|
||||||
|
stack = [stack.pop()] + stack
|
||||||
|
elif command == 9:
|
||||||
|
# unrot
|
||||||
|
if len(stack) > 0:
|
||||||
|
stack.append(stack.pop(0))
|
||||||
|
elif command == 10:
|
||||||
|
stack.extend([stack.pop()] * 2)
|
||||||
|
elif command == 7:
|
||||||
|
# mul
|
||||||
|
if len(stack) >= 2:
|
||||||
|
stack.append(stack.pop() * stack.pop())
|
||||||
|
else:
|
||||||
|
rotate(matrix_2)
|
||||||
|
elif command == 11:
|
||||||
|
rotate(matrix_1)
|
||||||
|
elif command == 12:
|
||||||
|
rotate(matrix_2)
|
||||||
|
elif command == 13: # setdir
|
||||||
|
arg = param
|
||||||
|
lowbits = (arg & 0b111) - 3
|
||||||
|
highbits = ((arg >> 3) & 0b111) - 3
|
||||||
|
direction = highbits, lowbits
|
||||||
|
elif command == 2: # setdir if zero
|
||||||
|
if len(stack) > 0 and stack[-1] == 0:
|
||||||
|
arg = param
|
||||||
|
lowbits = (arg & 0b111) - 3
|
||||||
|
highbits = ((arg >> 3) & 0b111) - 3
|
||||||
|
direction = highbits, lowbits
|
||||||
|
elif command == 16:
|
||||||
|
inbuf.append(chr(stack.pop()))
|
||||||
|
elif command == 17:
|
||||||
|
if len(stack) >= 2:
|
||||||
|
a, b = stack.pop(), stack.pop()
|
||||||
|
stack.append(a)
|
||||||
|
stack.append(b)
|
||||||
|
elif command == 1:
|
||||||
|
if len(stack) > 0: stack.pop()
|
||||||
|
elif command == 15:
|
||||||
|
break
|
||||||
|
|
||||||
|
position = (position[0] + direction[0], position[1] + direction[1])
|
||||||
|
while position[0] < 0 or position[1] < 0 or position[0] >= size[0] or position[1] >= size[1]:
|
||||||
|
position = (position[0] % size[0], position[1] % size[1])
|
||||||
|
print(stack, inbuf)
|
Loading…
Reference in New Issue