脑Flak ( Brainf**k和Flak之间的交叉)是一种基于堆栈的深奥语言。自从这一挑战被发布以来,语言已经进化和更新,但是这一语言的第一次修订被称为“大脑攻击经典”。
您必须编写一个程序或函数,该程序或函数接受一串Brain-Flak经典代码,并对其进行评估。它还将接受一个(可能为空的)整数列表。大脑-Flak经典程序的输入。
大脑-Flak有两个堆栈,称为“左”和“右”。活动堆栈从左侧开始。如果一个空堆栈被弹出或查看,它将返回0。没有变数。当程序启动时,每个输入按顺序推入活动堆栈(因此最后一个输入位于堆栈的顶部)。
在Brain程序中唯一有效的字符是()[]{}<>,它们必须始终是平衡。如果有无效字符,或者括号不匹配,则会得到未定义的行为。任何东西都是有效的。
有两种类型的函数:Nilad和Monads。nilad是一个接受0参数的函数。以下是所有的小插曲:
() +1.[] -1。{}弹出活动堆栈。<>切换活动堆栈。当对它们进行评估时,它们将连接在一起。因此,如果在活动堆栈的顶部有一个'3‘,那么这个片段:
()(){}将计算结果为1 + 1 + active.pop(),计算结果为5。<>计算结果为0。
单子们采取了一个论点,一大块大脑-Flak代码。下面是所有的单子:
(n)将'n‘推到活动堆栈上。[n]打印'n‘作为整数和换行符。{foo}而active.peek() = 0,执行foo。计算值为0。<foo>执行foo,但将其计算为0。这些函数还将返回它们内部的值,因此
(()()())会推3和
[()()()]会打印3,但是
[(()()())]打印并推送3。
执行程序时,活动堆栈上的每个值都打印为整数,中间有一个换行符。忽略另一个堆栈上的值。
空程序:
投入:无
产出:无
加法。来源:
({}{})输入:
2, 3输出:
5减法。来源:
({}<>){({}[])<>({}[])<>}<>输入:
2, 3输出:
-1乘法。来源:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>输入:
7, 8输出:
56斐波纳契。来源:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>输入:
5输出:
13
8
5
3
2
1
1{[({})]}应用标准漏洞,以字节为单位的最短答案将获胜。
{...}应该评估它的所有运行,这是最酷的特点之一的大脑攻击。但是,就此挑战而言,假设{...}的计算结果为0。发布于 2017-10-10 17:25:07
发布于 2016-05-13 00:41:35
import re
S='s+=[v];v=0';T='v+=s.pop()';i=0
d={'()':'v+=1','(':S,')':'a+=[v];'+T,'[]':'v-=1','[':S,']':'print(v);'+T,'<>':'a.reverse()','<':S,'>':T,'{}':'v+=0if a[-1]==""else a.pop()','{':S+';while a[-1]:','}':T}
def r(m):global i;t=m.group();i-=(t=='}');s=' '*i;i+=(t=='{');return''.join(s+r+'\n'for r in d[t].split(';'))
def g(c,*a):
a,s,v=['']+list(a),[],0;exec(re.sub(r'[<({[]?[]})>]?',r,c));
while a[-1]!="":print(a.pop())像g('[{}{}]', 2, 3)一样使用
它使用re.sub“编译”大脑攻击源到python,然后执行python。(为了进行调试,将exec替换为print以获得python代码的清单)
正确地缩进嵌套的while循环占用了代码中的大量字节。
发布于 2016-05-10 01:34:24
使用说明:
[1,2,...]格式输入列表,然后按enter键基本上,这个程序所做的是递归地“编译”大脑激活的代码到嵌套列表中,并递归地解释这个列表。也许有办法把两者结合起来..。
我稍后再试着重做逻辑。
y="([{<)]}>"
w,z,g=print,len,input
def c(s):
if z(s)<1:return[]
t,i,o=[],1,0
t.append(y.index(s[0]))
while z(t)>0:
x=y.index(s[i])
if x<4:t.append(x)
else:o=t.pop()
i+=1
r=[[o,c(s[1:i-1])]]
r.extend(c(s[i:]))
return r
p=lambda t:t.pop()if z(t)>0 else 0
k=lambda t:t[z(t)-1]if z(t)>0 else 0
r,l=[],eval(g())
a=l
def i(u):
v=0
global a
for t,n in u:
if t<1:
if n:o=i(n);v+=o;a.append(o)
else:v+=1
if t==1:
if n:o=i(n);v+=o;w(o)
else:v-=1
if t==2:
if n:
while k(a)!=0:i(n)
else:v+=p(a)
if t>2:
if n:i(n)
elif a==l:a=r
else:a=l
return v
i(c(g()))
for n in a:w(n)https://codegolf.stackexchange.com/questions/79625
复制相似问题