CES source
Jump to navigation
Jump to search
Note: This page may be updated at any time due to CES updates. The CES update log can also be found.
utils.py
from copy import deepcopy
class ExpandableList:
"""A list that expands when indexed out of bounds.
ExpandableList(default) -> object"""
def __init__(self, default):
self.items = [deepcopy(default)]
self.default = default
def __expand_to(self, pos):
if pos < 0: self.items = [deepcopy(self.default) for _ in range(-pos)] + self.items
elif pos >= len(self.items): self.items += [deepcopy(self.default) for _ in range(pos-len(self.items)+1)]
return max(pos, 0)
def __getitem__(self, pos):
pos = self.__expand_to(pos)
return self.items[pos]
def __setitem__(self, pos, item):
pos = self.__expand_to(pos)
self.items[pos] = item
def __len__(self):
return len(self.items)
def __repr__(self):
return repr(self.items)
class Tape(ExpandableList):
"""An ExpandableList with a pointer.
Tape(default) -> object"""
def __init__(self, default):
super().__init__(default)
self.ptr = 0
def move_right(self, count=1):
self.ptr += count
self.current
def move_left(self, count=1):
self.ptr -= count
self.current
self.ptr = max(self.ptr,0)
@property
def current(self):
return self[self.ptr]
@current.setter
def current(self, current):
self[self.ptr] = current
class BoundedTape(Tape):
"""A bounded list with a pointer.
BoundedTape(default, size) -> object"""
def __init__(self, default, size):
self.default = default
self.items = [deepcopy(default) for _ in range(size)]
self.ptr = 0
def move_right(self, count=1):
if self.ptr + count >= len(self.items): raise IndexError
self.ptr += count
def move_left(self, count=1):
if self.ptr - count < 0: raise IndexError
self.ptr -= count
class Stack:
"""A stack.
Stack() -> object"""
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def __combine_dicts(d1, d2): return dict(list(d1.items())+list(d2.items()))
def __get_jump_dict_single_match(code, from_char, to_char):
jumps = {}
to_add = []
for pos in range(len(code)):
c = code[pos]
if c == from_char: to_add.append(pos)
elif c == to_char: jumps[to_add.pop()] = pos
return jumps
def get_jump_dict(code, matches, bidi=True):
"""Gets the jump dictionary for code.
Arguments:
code: The code to find jumps in.
matches: A dictionary of jump characters
(e.g. to jump from [ to ], {'[':']'})
bidi: Whether or not the jumps are bidirectional."""
total = {}
for fc, tc in matches.items():
new_jumps = __get_jump_dict_single_match(code, fc, tc)
total = __combine_dicts(total, new_jumps)
if bidi:
reversed_total = {v:k for k,v in total.items()}
total = __combine_dicts(total, reversed_total)
return total
char_esolang.py
def make_char_esolang(file):
with open(file+".ces") as f: ces_data = [line.rstrip("\n").replace(" ","\t") for line in f.readlines()]
sections = {}
current_section = None
for line in ces_data:
if line.startswith("## ") and line.endswith(" ##"):
current_section = line[3:-3]
sections[current_section] = []
elif line: sections[current_section].append(line)
ces_py = ""
if "UTILS" in sections.keys(): ces_py += "from utils import %s\n"%(", ".join(sections["UTILS"]))
ces_py += "import sys\n\ndef __get_input(default):\n\tglobal __prgm_input\n\t"
ces_py += "if not __prgm_input: __prgm_input += input()\n\t"
ces_py += "if not __prgm_input: return default\n\t"
ces_py += "output, __prgm_input = __prgm_input[0], __prgm_input[1:]\n\t"
ces_py += "return output\n\n"
ces_py += "def run_%s(CODE):\n\tglobal __prgm_input\n\t"%file
ces_py += "\n\t".join(sections.get("DECLARE",[]))+"\n\t"
ces_py += "__ip = 0\n\t__prgm_input = \"\"\n\t"
ces_py += "while __ip<len(CODE):\n\t\t__instr = CODE[__ip]\n\t\t"
instrs = ""
for instr in sections["INSTRUCTIONS"]:
if len(instr) == 1: instrs += "elif __instr == \"%s\":\n"%instr
elif instr.startswith("\t"): instrs += instr + "\n"
else: instrs += "elif __instr == \"%s\":\n\t%s\n"%(instr[0],instr[2:])
instrs = instrs[2:-1].replace("\n","\n\t\t")
instrs = instrs.replace("JUMP","__ip = JUMPS[__ip]")
instrs = instrs.replace("GET_CHAR","__get_input")
instrs = instrs.replace("HALT","sys.exit()")
between = "\n\t\t".join(sections.get("BETWEEN",[]))
ces_py += instrs+"\n\t\t"+between+"\n\t\t__ip += 1"
with open(file+".py","w") as f: f.write(ces_py)
brainfuck.ces
## UTILS ##
Tape
get_jump_dict
## DECLARE ##
tape = Tape(0)
JUMPS = get_jump_dict(CODE, {"[":"]"})
## INSTRUCTIONS ##
+ tape.current = (tape.current+1)%256
- tape.current = (tape.current-1)%256
> tape.move_right()
< tape.move_left()
, tape.current = ord(GET_CHAR(chr(0)))
. print(chr(tape.current), end="")
[ if tape.current == 0: JUMP
] if tape.current != 0: JUMP
Other .ces files can be found on the CES files page.
Notes
All CES pages:
- CES
- CES files
- CES source (you are here)
- CES updates