有没有人用 COW 编写过长或短的程序来演示它的功能?当然,语言是个笑话;不过既然是图灵完备的,可能有人写过一种高级语言,可以翻译成COW。在编写了一个至少显示您在屏幕上输入的简短实用程序之后,人们会认为有人用该语言编写了一个更有趣的应用程序。
MoOMOOmoOMooMooOOOmOomoo
最佳答案
DDX 进一步增加了 COW 的功能,当翻译成 EZ COW 时,它更容易阅读。接下来是一个 EZ DDX COW 程序,其中注释很好地散布在代码中。
This is the first word.
N = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++P++
U = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++P++
M = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++P++
= M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++P++
= = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++P++
= M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++
Show the prompt.
P--P--P--P--P--
LOP
I/O
P++
END
Get and store the input.
INP
REG (or "wiz")
M=0
M++
S++
This is the second word.
D = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++P++
I = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++P++
V = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++P++
= M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++P++
= = M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++P++
= M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++
Show the prompt.
P--P--P--P--P--
LOP
I/O
P++
END
Get the input and setup for calculation.
INP
S++
M--
WIZ
Display the results.
(this stomach is no longer needed)
S--
M=0
(string)
M++M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++
P--P--P--P--P--P--
(print)
LOP
I/O
P++
END
S--
OUT
S++
(string)
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++M++M++M++P++
M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++M++
M++M++M++M++M++M++
P--P--P--P--P--
(print)
LOP
I/O
P++
END
S++
OUT
下面是一个用 Python 编写的简单解释器。它可以采用上面列出的“divide.cow”文件并足够快地运行它以与程序进行实时交互。仍然欢迎其他示例 COW 程序!
INS = ['moo', 'mOo', 'moO', 'mOO', 'Moo', 'MOo',
'MoO', 'MOO', 'OOO', 'MMM', 'OOM', 'oom',
'MMm', 'MmM', 'Oom', 'oOm',
'OoM', 'oOM', 'ooo', 'mmm']
HLP = dict((s, i) for i, s in enumerate(INS))
import sys
import msvcrt
################################################################################
class COD:
def __init__(self, code):
for ins in code:
assert 0 <= ins < len(INS)
self.cod = code
self.pos = 0
def get(self):
return self.cod[self.pos]
def inc(self):
self.pos += 1
if self.pos == len(self.cod):
sys.exit()
def dec(self):
self.pos -= 1
assert self.pos >= 0
################################################################################
class MEM:
def __init__(self):
self.mem = {}
self.pos = 0
def get(self):
if self.pos in self.mem:
return self.mem[self.pos]
return 0
def set(self, value):
if value:
self.mem[self.pos] = value
elif self.pos in self.mem:
del self.mem[self.pos]
def inc(self):
self.pos += 1
def dec (self):
self.pos -= 1
################################################################################
class DDX:
STOMACHS = 7
def __init__(self):
self.mem = [MEM() for stomach in range(self.STOMACHS)]
self.pos = 0
def __getattr__(self, name):
return getattr(self.mem[self.pos], name)
def ddx_prv(self):
self.pos = (self.pos - 1 + self.STOMACHS) % self.STOMACHS
def ddx_nxt(self):
self.pos = (self.pos + 1) % self.STOMACHS
def ddx_dec(self):
for stomach in self.mem:
stomach.dec()
def ddx_inc(self):
for stomach in self.mem:
stomach.inc()
def ddx_sub(self):
for stomach in self.mem:
stomach.set(stomach.get() - 1)
def ddx_add(self):
for stomach in self.mem:
stomach.set(stomach.get() + 1)
def ddx_nul(self):
for stomach in self.mem:
stomach.set(0)
def ddx_reg(self, reg):
if reg is None:
return sum(map(MEM.get, self.mem))
else:
all_zero = True
for stomach in self.mem:
if stomach.get():
all_zero = False
break
if all_zero:
for stomach in self.mem:
stomach.set(reg)
else:
weighting = sum(map(MEM.get, self.mem))
base, remainder = divmod(reg, weighting)
for stomach in self.mem:
temp = stomach.get()
if temp < 0:
stomach.set(abs(temp) * remainder)
else:
stomach.set(temp * base)
return None
################################################################################
def parse(string):
index = 0
code = []
ins = string[index:index+3]
while len(ins) == 3:
if ins in INS:
code.append(INS.index(ins))
index += 3
else:
index += 1
ins = string[index:index+3]
return tuple(code)
DECODE = ['END', 'P--', 'P++', 'EXE', 'I/O', 'M--',
'M++', 'LOP', 'M=0', 'REG', 'OUT', 'INP',
'S--', 'S++', 'AP-', 'AP+',
'AM-', 'AM+', 'A=0', 'WIZ']
def decode(code):
for ins in code:
print(INS[ins] + '\t' + DECODE[ins])
print()
def engine(code):
global REG
REG = None
mem = DDX()
cod = COD(code)
ins = cod.get()
while True:
ins = run(mem, cod, ins)
def run(mem, cod, ins):
global REG
# INS - 0 - moo
if ins == 0:
cod.dec()
cod.dec()
# INIT
level = 1
temp = cod.get()
if temp == HLP['moo']:
level += 1
elif temp == HLP['MOO']:
level -= 1
while level:
# LOOP
cod.dec()
temp = cod.get()
if temp == HLP['moo']:
level += 1
elif temp == HLP['MOO']:
level -= 1
return HLP['MOO']
# INS - 1 - mOo
elif ins == 1:
mem.dec()
cod.inc()
return cod.get()
# INS - 2 - moO
elif ins == 2:
mem.inc()
cod.inc()
return cod.get()
# INS - 3 - mOO
elif ins == 3:
temp = mem.get()
assert temp != 3
if 0 <= temp < len(INS):
return run(mem, cod, temp)
else:
sys.exit()
# INS - 4 - Moo
elif ins == 4:
temp = mem.get()
if temp:
msvcrt.putch(bytes([temp & 127]))
else:
char = get_char()
mem.set(char & 127)
cod.inc()
return cod.get()
# INS - 5 - MOo
elif ins == 5:
mem.set(mem.get() - 1)
cod.inc()
return cod.get()
# INS - 6 - MoO
elif ins == 6:
mem.set(mem.get() + 1)
cod.inc()
return cod.get()
# INS - 7 - MOO
elif ins == 7:
temp = mem.get()
if temp:
cod.inc()
return cod.get()
else:
cod.inc()
cod.inc()
# INIT
level = 1
temp = cod.get()
if temp == HLP['moo']:
level -= 1
elif temp == HLP['MOO']:
level += 1
while level:
# LOOP
cod.inc()
temp = cod.get()
if temp == HLP['moo']:
level -= 1
elif temp == HLP['MOO']:
level += 1
cod.inc()
return cod.get()
# INS - 8 - OOO
elif ins == 8:
mem.set(0)
cod.inc()
return cod.get()
# INS - 9 - MMM
elif ins == 9:
if REG is None:
REG = mem.get()
else:
mem.set(REG)
REG = None
cod.inc()
return cod.get()
# INS - 10 - OOM
elif ins == 10:
print_int(mem.get())
cod.inc()
return cod.get()
# INS - 11 - oom
elif ins == 11:
mem.set(get_int())
cod.inc()
return cod.get()
# INS - 12 - MMm
elif ins == 12:
mem.ddx_prv()
cod.inc()
return cod.get()
# INS - 13 - MmM
elif ins == 13:
mem.ddx_nxt()
cod.inc()
return cod.get()
# INS - 14 - Oom
elif ins == 14:
mem.ddx_dec()
cod.inc()
return cod.get()
# INS - 15 - oOm
elif ins == 15:
mem.ddx_inc()
cod.inc()
return cod.get()
# INS - 16 - OoM
elif ins == 16:
mem.ddx_sub()
cod.inc()
return cod.get()
# INS - 17 - oOM
elif ins == 17:
mem.ddx_add()
cod.inc()
return cod.get()
# INS - 18 - ooo
elif ins == 18:
mem.ddx_nul()
cod.inc()
return cod.get()
# INS - 19 - mmm
elif ins == 19:
REG = mem.ddx_reg(REG)
cod.inc()
return cod.get()
# ERROR
else:
raise Exception('Bad instruction!')
def print_int(number):
for char in str(number):
msvcrt.putch(bytes([ord(char) & 127]))
msvcrt.putch(b' ')
def get_char():
while msvcrt.kbhit():
msvcrt.getch()
func = False
char = msvcrt.getch()[0]
if char in (0x00, 0xE0):
func = True
while func:
msvcrt.getch()
func = False
char = msvcrt.getch()[0]
if char in (0x00, 0xE0):
func = True
return char if char != 13 else 10
def get_int():
while msvcrt.kbhit():
msvcrt.getch()
buff = ''
char = chr(msvcrt.getch()[0])
while char != '\r' or not buff:
if '0' <= char <= '9':
msvcrt.putch(bytes([ord(char) & 127]))
buff += char
char = chr(msvcrt.getch()[0])
sys.stdout.write('\n')
return int(buff)
################################################################################
def main():
path = input('Run File: ') + '.cow'
code = parse(open(path).read())
decode(code)
engine(code)
################################################################################
if __name__ == '__main__':
INS, DECODE = DECODE, INS
try:
main()
except SystemExit:
input()
except:
import traceback
input(traceback.format_exc())
关于esoteric-languages - 实用的COW示例程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1805176/