首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写一个脑筋弹的经典解释器!

写一个脑筋弹的经典解释器!
EN

Code Golf用户
提问于 2016-05-09 02:26:37
回答 3查看 2.4K关注 0票数 19

脑Flak ( Brainf**k和Flak之间的交叉)是一种基于堆栈的深奥语言。自从这一挑战被发布以来,语言已经进化和更新,但是这一语言的第一次修订被称为“大脑攻击经典”。

您必须编写一个程序或函数,该程序或函数接受一串Brain-Flak经典代码,并对其进行评估。它还将接受一个(可能为空的)整数列表。大脑-Flak经典程序的输入。

语言

大脑-Flak有两个堆栈,称为“左”和“右”。活动堆栈从左侧开始。如果一个空堆栈被弹出或查看,它将返回0。没有变数。当程序启动时,每个输入按顺序推入活动堆栈(因此最后一个输入位于堆栈的顶部)。

在Brain程序中唯一有效的字符是()[]{}<>,它们必须始终是平衡。如果有无效字符,或者括号不匹配,则会得到未定义的行为。任何东西都是有效的。

有两种类型的函数:Nilad和Monads。nilad是一个接受0参数的函数。以下是所有的小插曲:

  • () +1.
  • [] -1。
  • {}弹出活动堆栈。
  • <>切换活动堆栈。

当对它们进行评估时,它们将连接在一起。因此,如果在活动堆栈的顶部有一个'3‘,那么这个片段:

代码语言:javascript
复制
()(){}

将计算结果为1 + 1 + active.pop(),计算结果为5。<>计算结果为0。

单子们采取了一个论点,一大块大脑-Flak代码。下面是所有的单子:

  • (n)将'n‘推到活动堆栈上。
  • [n]打印'n‘作为整数和换行符。
  • {foo}而active.peek() = 0,执行foo。计算值为0。
  • <foo>执行foo,但将其计算为0。

这些函数还将返回它们内部的值,因此

代码语言:javascript
复制
(()()())

会推3和

代码语言:javascript
复制
[()()()]

会打印3,但是

代码语言:javascript
复制
[(()()())]

打印并推送3。

执行程序时,活动堆栈上的每个值都打印为整数,中间有一个换行符。忽略另一个堆栈上的值。

规则:

  • 您的程序必须支持(-128,127)范围内的数字,并且堆栈大小至少为255。如果你支持更大的,很好。
  • 未定义下溢/溢流。

示例IO:

空程序:

投入:无

产出:无

加法。来源:

代码语言:javascript
复制
({}{})

输入:

代码语言:javascript
复制
2, 3

输出:

代码语言:javascript
复制
5

减法。来源:

代码语言:javascript
复制
({}<>){({}[])<>({}[])<>}<>

输入:

代码语言:javascript
复制
2, 3

输出:

代码语言:javascript
复制
-1

乘法。来源:

代码语言:javascript
复制
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>

输入:

代码语言:javascript
复制
7, 8

输出:

代码语言:javascript
复制
56

斐波纳契。来源:

代码语言:javascript
复制
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>

输入:

代码语言:javascript
复制
5

输出:

代码语言:javascript
复制
13
8
5
3
2
1
1

真理机

代码语言:javascript
复制
{[({})]}

应用标准漏洞,以字节为单位的最短答案将获胜。

  • 这实际上是我的一个错误。{...}应该评估它的所有运行,这是最酷的特点之一的大脑攻击。但是,就此挑战而言,假设{...}的计算结果为0。
EN

回答 3

Code Golf用户

发布于 2017-10-10 17:25:07

Dyalog经典,146个字节

代码语言:javascript
复制
↑⍕¨s⊣{⍎⍕1 ¯1'(s↓⍨←1)⊢⊃s' '0⊣s t←t s' 's,⍨←+/∇¨a' '⎕←+/∇¨a' '∇{×⊃s:∇⍺⍺¨a⋄0}0' '0⊣+/∇¨a'[(⊃⍵)+4×⍬≢a←1↓⍵]}¨⍎∊(')',⍨'(',¨⍕¨⍳4)[0,4,⍨'([{<'⍳⍞]⊣s←⌽⎕⊣t←⍬

在网上试试!

一部经典诠释另一部:)

票数 8
EN

Code Golf用户

发布于 2016-05-13 00:41:35

Python3429字节

代码语言:javascript
复制
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循环占用了代码中的大量字节。

票数 6
EN

Code Golf用户

发布于 2016-05-10 01:34:24

Python,616字节

使用说明:

  1. 与python一起运行
  2. [1,2,...]格式输入列表,然后按enter键
  3. 粘贴/写入程序,然后再次按enter键
  4. 完成

基本上,这个程序所做的是递归地“编译”大脑激活的代码到嵌套列表中,并递归地解释这个列表。也许有办法把两者结合起来..。

我稍后再试着重做逻辑。

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/79625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档