首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写个鸡肉翻译!

写个鸡肉翻译!
EN

Code Golf用户
提问于 2016-06-22 14:22:34
回答 1查看 1.2K关注 0票数 8

您必须为一种叫做鸡肉的很酷的语言编写一个解释器!

您应该从文件、标准输入、程序或函数参数或任何对您的语言最方便的内容以及对程序的输入中读取小鸡程序。

你应该打印或返回根据鸡语言规范解释程序的结果。

关于该语言的更多描述

鸡项目概述

小鸡在一个堆栈上运行,这就构成了它的整个内存模型。在执行指令时,程序将从堆栈中推送和弹出值,但也有指令允许程序随意修改堆栈的其他部分。

堆栈中有三个段:

  1. 寄存器位于索引0和1。索引0是对堆栈本身的引用,索引1是对用户输入的引用。主要用于指示6(见下文)。
  2. 加载代码:对于每一行代码,这段中有单元格,其中包含行中的“小鸡”S的数量。这是一个0(终止程序的操作码)在末尾填充。
  3. 实际的程序堆栈,其中值在程序运行时被推送/弹出。请注意,这些段并不是孤立的,这意味着可以从堆栈空间的此段创建自修改代码或执行代码。

ISA

小鸡的指令集是基于“小鸡”这个词出现在程序的每一行上的次数。空行终止程序并打印堆栈中的最顶层值。

鸡指令集,按“鸡”S数每一行:

  1. 将文字字符串“鸡肉”推到堆栈中。
  2. 将前两个堆栈值添加为自然数,并推送结果。
  3. 减去前两个值作为自然数,并推送结果。
  4. 将前两个值相乘为自然数,并推送结果。
  5. 比较两个顶值是否相等,如果它们相等,则按1,否则为0。
  6. 查看下一条指令,确定要从哪个源加载:从堆栈加载0,从用户输入加载1。堆栈顶部指向要从给定源加载的address/index;加载该值并将其推到堆栈上。由于这是一个双宽指令,指令指针跳过用于确定源的指令。
  7. 堆栈顶部指向要存储到的地址/索引。下面的值将弹出并存储在给定索引处的堆栈中。
  8. 堆栈顶部是要跳转到的相对偏移量。如果低于该值是真实的,那么程序跳过偏移量。
  9. 将堆栈的顶部解释为ascii并推送相应的字符。
  10. (10 + N)将文字数字n-10推到堆栈上。

示例

假设程序是:

代码语言:javascript
复制
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)

( cat程序)注意,空行是必需的,因为前面的一行有6“鸡肉”)。

为鸡项目提供的投入

代码语言:javascript
复制
Chicken

输出

代码语言:javascript
复制
Chicken

Chicken.js参考实现

检错

解释器应该留下一个错误,并在源中出现任何单词而不是“鸡肉”时终止。

祝好运!

EN

回答 1

Code Golf用户

发布于 2016-06-23 15:37:44

Javascript ES6,398字节

到目前为止,这是我所做过的最长的高尔夫球,我相信这是可以改进的,但是我的大脑在这一点上除了chicken什么都认不出来。

代码语言:javascript
复制
(a,b)=>{for(c='chicken',s=[j=0,b,...A=a.split`
`.map(m=>m.split(c).length-1)],i=A.length+2;j<A.length;([_=>s[++i]=c,_=>s[--i]=s[i]+s[i+1],_=>s[--i]=s[i]-s[i+1],_=>s[--i]=s[i]*s[i+1],_=>s[--i]=s[i]==s[i+1],_=>s[i]=s[2+j++]?b[s[i]]:s[s[i]],_=>s[s[i--]]=s[i--],_=>j+=s[--i]?s[--i+2]:0,_=>s[i]=String.fromCharCode(s[i])][s[j+2]-1]||(_=>s[++i]=s[j+1]-10))(j++));return /[^chicken \n]\w/g.test(a)?0:s[i]}

当我的大脑重新开始运作时,我会编辑解释。这是一个暂时不太流行的版本。

输出不属于chicken的所有事物的falsey值(0)

代码语言:javascript
复制
(a,b)=>{
    for(c='chicken',s=[j=0,b,...A=a.split`
    `.map(m=>m.split(c).length-1)],i=A.length+2; // loop init
    j<A.length; // loop condition
    ( // everything else
        [
            _=>s[++i]=c,
            _=>s[--i]=s[i]+s[i+1],
            _=>s[--i]=s[i]-s[i+1],
            _=>s[--i]=s[i]*s[i+1],
            _=>s[--i]=s[i]==s[i+1],
            _=>s[i]=s[2+j++]?b[s[i]]:s[s[i]],
            _=>s[s[i--]]=s[i--],
            _=>j+=s[--i]?s[--i+2]:0,
            _=>s[i]=String.fromCharCode(s[i])
        ][s[j+2]-1]
        ||(_=>s[++i]=s[j+1]-10)
    )(j++)
);
return /[^chicken \n]\w/g.test(a)?0:s[i]}

在这里试试

代码语言:javascript
复制
f=
  (a,b)=>{for(c='chicken',s=[j=0,b,...A=a.split`
`.map(m=>m.split(c).length-1)],i=A.length+2;j<A.length;([_=>s[++i]=c,_=>s[--i]=s[i]+s[i+1],_=>s[--i]=s[i]-s[i+1],_=>s[--i]=s[i]*s[i+1],_=>s[--i]=s[i]==s[i+1],_=>s[i]=s[2+j++]?b[s[i]]:s[s[i]],_=>s[s[i--]]=s[i--],_=>j+=s[--i]?s[--i+2]:0,_=>s[i]=String.fromCharCode(s[i])][s[j+2]-1]||(_=>s[++i]=s[j+1]-10))(j++));return /[^chicken \n]\w/g.test(a)?0:s[i]}

i.innerHTML = f(`chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
`, 'Hello world!')
代码语言:javascript
复制
<pre id=i>
票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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