首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为“解释器”编写一个解释器

为“解释器”编写一个解释器
EN

Code Golf用户
提问于 2021-02-26 09:00:56
回答 7查看 638关注 0票数 0

我只是当场创造了一种语言,叫做“解释器”。因为唯一有效的单词是“解释器”!“解释器”中的示例程序如下所示:

代码语言:javascript
复制
interpreter interpreterinterpreter interpreterinterpreterinterpreter interpreterinterpreterinterpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter

它看起来可能毫无意义,但语言的工作原理如下:

  • interpreter将累加器初始化为零。
  • interpreterinterpreter向累加器添加一个。
  • interpreterinterpreterinterpreter从累加器中减去一个。
  • interpreterinterpreterinterpreterinterpreter将累加器乘以2。
  • interpreterinterpreterinterpreterinterpreterinterpreter将累加器除以2。
  • interpreterinterpreterinterpreterinterpreterinterpreterinterpreter输出累加器。

规则

  • 标准漏洞是被禁止的。
  • 以字节为单位的最短程序获胜。
  • 您的程序应该适用于所有测试用例。
  • 您可以假设输入的所有代码都是有效的。
  • 第一个命令总是interpreter
  • 每个命令之间总是有一个空格。
  • 浮点除法,而不是整数除法。
  • 允许尾随的新行。

测试案例

代码语言:javascript
复制
interpreter interpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter -> 1
interpreter interpreterinterpreter interpreterinterpreter interpreterinterpreterinterpreterinterpreter interpreterinterpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter -> 3
interpreter interpreterinterpreterinterpreterinterpreterinterpreter interpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter -> 1
interpreter interpreterinterpreter interpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter interpreterinterpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter interpreter interpreterinterpreter interpreterinterpreterinterpreterinterpreterinterpreterinterpreter -> outputs 2, then outputs 1, then outputs 1
EN

回答 7

Code Golf用户

发布于 2021-02-26 09:58:50

JavaScript (V8),71字节

代码语言:javascript
复制
s=>s.split` `.map(i=>(n=i.length%6)?s=[,s/2,s*2,s-1,s+1,0][n]:print(s))

在网上试试!

怎么做?

解释器指令的长度是11\times k,\:1\le k \le 6,它给出了[11,22,33,44,55,66]。当应用模块化6时,这将映射到[5,4,3,2,1,0]。这比用11除法要短,并且允许我们很容易地识别输出指令(大小66,映射到0),它的行为与其他指令不同。

JavaScript (V8),80字节

此版本还基于指令模块6的长度,但不使用任何查找表。它用一条语句更新累加器,使用算术和按位操作。

这在JS中是毫无意义的,但在是否用C保存了几个字节 (与三值操作符链相反)。

代码语言:javascript
复制
s=>s.split` `.map(i=>(n=i.length%6)?A=A*(6&9/n|n<2)/2+(3>>n-3^2)-2:print(A),A=0)

在网上试试!

代码语言:javascript
复制
           | n =        | multiply by:  | add:
 operation | length % 6 | (6&9/n|n<2)/2 | (3>>n-3^2)-2
-----------+------------+---------------+--------------
 clear     |      5     |       0       |      0
 increment |      4     |       1       |      1
 decrement |      3     |       1       |     -1
 double    |      2     |       2       |      0
 halve     |      1     |      0.5      |      0
票数 7
EN

Code Golf用户

发布于 2021-05-12 00:23:34

维沙尔 rDO,13字节

代码语言:javascript
复制
⌈vL`…½d‹›0`İĖ

在网上试试!

@凯恩斯共同继承应答的05AB1E答案的Vyxal端口。

解释:

代码语言:javascript
复制
               # Implicit input
⌈              # Split on " "
 vL            # Length of each command
   `…½d‹›0`    # Push "…½d‹›0" 'D' flag - treat as raw string
           İ   # Index into string
            Ė  # Exec as Vyxal code
               # 'O' flag - disable implicit output


The commands in `…½d‹›0`:
… - Print without popping
½ - Halve
d - Double
‹ - Decrement
› - Increment
0 - Push 0
票数 2
EN

Code Golf用户

发布于 2021-02-26 11:23:40

木炭,31字节

代码语言:javascript
复制
F⪪S ≡№ιi¹≔⁰θ²≦⊕θ³≦⊖θ⁴≦⊗θ⁵≦⊘θ⟦Iθ

在网上试试!解释:

代码语言:javascript
复制
F⪪S 

分割空格上的输入并在每个单词上循环。

代码语言:javascript
复制
≡№ιi

统计每个单词中is的数量。

代码语言:javascript
复制
¹≔⁰θ²≦⊕θ³≦⊖θ⁴≦⊗θ⁵≦⊘θ⟦Iθ

根据is的数量对累加器执行适当的操作。

注意,switch比在数组中查找结果短,因为我不需要初始化累加器。

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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