Questions tagged «interpreter»

涉及为各种语言或形式编写口译员的任务。

10
为我的深奥语言撰写翻译
我想过深奥的语言跳线。稍后您将了解原因。 它以字节为单元的随机存取存储器工作。RAM是零索引的,最初填充零。 尝试使用负索引访问单元时,将显示错误并终止程序。 尝试从比上一个更大的索引处读取时,应返回零。 尝试以比上一个更大的索引进行写入时,RAM应该增加到1024的倍数,并且新单元格要填充零(从技术上讲,您可以将RAM不能增加到1024的倍数,原因是性能得到了提高,因此如果花费很多字符,不能做到1024的倍数)。 程序还具有指向RAM中单元的指针,该指针最初为零 程序开始执行时,将显示输入字符串的提示(或从命令行参数获取输入,这取决于您)。输入字符串不应包含空字符(零字节)。然后将输入字符串从零索引处开始写入RAM。 当程序结束时,显示带有程序输出的框-RAM的内容从零索引到第一个零字节(不包括在内)。 现在,最有趣的部分是语法。 程序由命令(一元运算符-前缀)及其参数组成。命令和参数可以用空格或换行符分隔,但不是必需的。但是,参数内部的空格无效,例如,# 2 = 4有效但# 2 = 4 4无效。 程序之间可以有注释()。注释不能嵌套-例如,(abc(def)ghi)注释为中(abc(def)。注释可以放在任何地方。 #123 将RAM指针设置为123(任何正十进制整数或零)。 >123 将RAM指针增加123(任何正十进制整数)。 <123 将RAM指针减123(任何正十进制整数)。 =123 在当前单元格中写入123(任何无符号的8位十进制整数)。 +123 将123(任何无符号的8位十进制整数)添加到当前单元格(模256)。 -123 从当前单元格中减去123(任何无符号的8位十进制整数)(取模256)。 :123-“ goto”-转到命令号123(第一个为0)。您只能使用goto来控制程序的流程-它必须跳转-这就是为什么我决定将这种语言称为Jumper。 如果缺少参数,请考虑为><+-命令指定1 或为0 #=:。 此外,还有命令修饰符- ?(命令前缀),仅当当前单元格不为零时才执行下一个命令,否则跳过该命令。可以应用于任何命令。 例如,?:17如果当前单元格不为零,则-转到命令17。 如果程序无效或在运行期间发生错误,则会显示消息“错误”。因为是CodeGolf,所以这样的短消息就可以了。 你的任务 为此语言编写最短的口译员。 一些测试程序 (prints "Hello world!" regardless of input) =72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>= (appends …

6
实施Anyfix注释!
在前缀表示法中,运算符位于参数之前,因此您可以想象该运算符next()会以递归方式调用。在后缀表示法中,运算符在参数之间移动,因此您可以简单地将其想象为解析树。在后缀表示法中,运算符位于参数之后,因此您可以将其想象为基于堆栈的。 用anyfix表示法,操作员可以在任何地方*。如果操作员出现并且没有足够的参数,则操作员将等待直到有足够的参数。对于这一挑战,您将实现一个非常基本的anyfix评估程序。(请注意,anyfix是我放弃的一种娱乐语言,您可以在此处试用或在此处查看) 您将需要支持以下命令: (Arity 1) 重复 负 (Arity 2) 加成 乘法 相等:返回0或1。 您可以选择对这些命令使用任何五个非空白符号。出于演示目的,我将使用"重复项,×乘法和+加法。 对于文字,您仅需要支持非负整数,但是您的解释器必须能够包含所有整数(在您语言的(合理的)整数范围内)。 让我们来看一个示例:10+5。该存储应表现为堆栈,而不是队列。因此,首先,堆栈从开始[],而排队的操作员列表从开始[]。然后,对文字10进行求值,从而使stack成为可能[10]。接下来,对运算符+进行求值,它需要两个参数。但是,堆栈上只有一个参数,因此排队的运算符列表变为['+']。然后,对文字5进行求值,从而使stack成为可能[10, 5]。在这一点上,'+'可以对运算符进行评估,使它成为堆栈[15]和队列[]。 最终的结果应该是[15]为+ 10 5,10 + 5和10 5 +。 让我们来看一个更困难的示例:10+"。堆栈和队列从[]和开始[]。10首先被评估,这使堆栈[10]。接下来,+对进行评估,它不会更改堆栈(因为没有足够的参数),并使队列成为['+']。然后,"进行评估。这样就可以立即运行,从而形成堆栈[10, 10]。+现在可以求值,以使堆栈成为[20]和队列[]。最终结果是[20]。 操作顺序如何? 让我们来看看×+"10 10。堆栈和队列都以[]: ×:堆栈未更改,队列变为['×']。 +:堆栈未更改,队列变为['×', '+']。 ":堆栈未更改,队列变为['×', '+', '"']。 10:堆栈变为[10]。即使×应该是第一个要评估的运算符,因为它首先出现,但"可以立即运行,并且没有运算符可以运行,因此可以对其进行评估。堆栈变为[10, 10]并排队['×', '+']。×现在可以求值,这使堆栈[100]和队列成为可能['+']。 10:堆栈变为[100, 10],可以+对其进行求值。堆栈变为[110]并排队[]。 最终结果是[110]。 这些演示中使用的命令与anyfix语言的命令一致。但是,由于我的解释器中的错误,最后一个示例将无法正常工作。(免责声明:您的提交将不会在anyfix解释器中使用) 挑战 选择一组5个非空白非数字字符,并根据上述规范创建一个anyfix解释器。您的程序可以输出奇异数组或包含的值;确保值栈在执行结束时仅包含单个值,并且确保运算符队列在执行结束时为空。 这是代码高尔夫球,因此以字节为单位的最短代码获胜。 测试用例 对于这些测试用例,重复项为",否定为-,加法为+,乘法为×且相等为=。 Input -> Output 1+2×3 …

5
为ais523做BackFlip!
这个挑战是奖ais523为赢得了“ 年度最佳新秀类别”中的“ 最佳PPCG 2016 ”。恭喜你! BackFlip是由ais523用户开发的一种深奥的编程语言,他已经创建了30多种其他有趣的esolang。 BackFlip是一种2D语言,例如Befunge或> <>,其中指令指针遍历文本网格(程序),上下移动,左右移动,并根据其所在的字符改变方向。至关重要的是,BackFlip程序中的网格在遍历时会发生变化,有点像Langton的Ant。 对于此挑战,您可以假定BackFlip程序始终是文本的矩形网格(所有行的长度相同),最小大小为1×1,仅包含字符./\<>^V。(.用于可见性,而不是空间。)语义上,我们将在此处使用的BackFlip与原始规范相同。 BackFlip中的指令指针(IP)始终从程序左上角的左侧开始,一直向右移动。它可以遇到三种命令: .是无人操作。IP继续朝着前进的方向发展。无操作保持无操作。 /并且\是镜子。它们沿其角度指示的方向反射IP,然后变为另一种类型的反射镜。 例如,如果IP头向左\移动,它将开始向上移动,而不是向左移动,然后\变为a /。 <,>,^,和V是箭头。他们将IP重定向到其指向的方向,然后变为箭头,指向IP的来源方向(与IP的移动方向相反)。 例如,如果IP向下进入>,则它开始向右移动而不是向下移动,并且>变为,^因为这就是IP的方向。 当IP超出范围(即脱离网格)时,BackFlip程序终止。事实证明,所有 BackFlip程序最终都会终止,因为不可能进行无限循环。(您可能认为这是真的。) 您在此挑战中的目标是编写一个程序或函数,该程序或函数接受BackFlip程序并输出指令指针在程序终止之前执行的移动次数。也就是说,IP在运行程序的过程中需要采取多少步骤?这包括进入网格的初始步骤和离开网格的最后一步。 例如,指令指针在平凡的网格中采用了5个步骤....: .... <- empty 4×1 grid 012345 <- step number of the IP 因此,输出....为5。 在更复杂的4×2网格中 \... \.>< IP在第9步退出网格,因此输出为9: step grid IP position (@) 0 \... @.... \.>< .... 1 \... @... …

4
使用ASCII艺术图可视化长除法
编写一个程序,以可视化方式用ASCII艺术进行长除法。使用您选择的输入格式,输入由两个整数组成:分子和分母。 例子: 1234÷56: 22 ---- 56|1234 112 --- 114 112 --- 2 1002012÷12: 83501 ------- 12|1002012 96 --- 42 36 -- 60 60 -- 12 12 -- 0÷35 0 - 35|0 规则: 编程语言的除法运算符的用途是允许的。 也允许使用大整数支持。 为了保持一致: 如果商为零,则在跳水板的末端打印一个零。 如果余数为零,请不要打印。 不要在任何数字上打印前导零。 末尾多余的换行符和右边的尾随空格是允许的。 字符最少的解决方案获胜。 限制: 0 <=分子<= 10 72 - 1 1 <=分母<= 9999999 …

11
解释+ p代码
受最近对另外两种字符语言的热潮启发, ;# 介绍 根据社区的共识,此站点上可接受的答案必须使用至少以下语言: 可以确定自然数是否为素数 可以将两个自然数相加 可以代表数字的列表/元组,以及单个数字 为了这个挑战,我们将忽略#3。因此,可以在此站点上使用的最简单的语言(忽略#3)将只有两个命令,isPrime和add。为了便于解释和字节计数,让我们分配isPrime给p和add对+。因此,我们有了自己的语言+p。您的挑战是解释一些+p代码。 行为 +该add指令取两个数字,将它们相加,然后输出结果 p所述isPrime指令需要一个单一的数,并将其输出1它是否为素数,并且0,如果它不是 规则 您必须编写一个给定字符串的程序/函数,将该程序/函数解释为+p代码。您可以假设格式正确的输入(仅包含+和p字符)。 输入是灵活的。您可以将程序作为字符串,字符数组,代码点的整数数组等形式使用。正在解释的程序的输入也很灵活。您可以采用整数数组,并在程序执行时用完条目,或者每个指令(+和p)都可以单独请求输入。您可能会假设每条指令都有足够的输入。确保输入由0到200之间的数字组成(但理论上,您的算法应适用于任何正整数输入)。 输出也很灵活。您可以打印结果,将它们作为列表返回,返回包含所有结果的字符串,等等。如果以字符串形式打印或返回,则输出必须用一些非数字的,一致的分隔符分隔,例如换行,标签,空格或,字符。您可能有尾随分隔符或一些尾随空格。另外,p的输出可能是您使用的语言所定义的任何真或假值,而不是1或0。 解释器可能会终止也可能不会终止(如果它是一个完整的程序),但是在解释完所有指令之后必须停止打印。(它无法永远继续打印分隔符或空字符等)。 默认情况下,这些标准漏洞是禁止的 这是代码高尔夫球,用最少的字节数获胜的答案 测试用例 Program: + Input: [56, 50] Output: 106 ---------------------------------- Program: p Input: [12] Output: 0 ---------------------------------- Program: p Input: [13] Output: 1 ---------------------------------- Program: ++ Input: [172, 120, 33, 58] Output: 292 …

8
图灵机模拟器
编写一个图灵机模拟器。 为简单起见,我们可以假设状态为整数,符号为char,空白符号等于空格 当前状态,输入符号,下一个状态,输出符号,方向(左或右)形式的5元组不是强制性的,而是指定是否交换 达到未知状态时,机器必须停止,不允许其他停止条件。 磁带在两个方向上都是无限的,您始终可以读取一个空字符。 输入:初始磁带,初始状态和程序。您可以随意从任何地方以自己喜欢的格式读取数据 输出:程序执行后的录像带 必需:在模拟器顶部运行的示例程序 这是一个代码集,因此最短的代码获胜。 我将在接下来的几个小时内发布实现和一些示例程序。

12
实施Glob Matcher
实现要匹配的模式和字符串的功能,如果模式与WHOLE字符串匹配,则返回true,否则返回false。 我们的全局模式语法为: ? 匹配任何一个字符 + 匹配一个或多个字符 * 匹配零个或多个字符 \ 逃脱 规则: 没有评估,没有转换为正则表达式,没有调用系统glob函数。 不需要I / O:您只需编写一个函数 最短的胜利 例子: glob('abc', 'abc') => true glob('abc', 'abcdef') => false IMPORTANT! glob('a??', 'aww') => true glob('a*b', 'ab') => true glob('a*b', 'agwijgwbgioeb') => true glob('a*?', 'a') => false glob('?*', 'def') => true glob('5+', '5ggggg') => true …

4
解释StackyMath!
是时候实施我新的基于堆栈的语言了!它称为StackyMath。这将是一种基于堆栈的语言,在堆栈上有8种操作以及向堆栈中添加数字的方式。 操作清单: /:司。在堆栈的前2个数字上执行。将结果推回堆栈。 *:乘法。在堆栈的前2个数字上执行。将结果推回堆栈 -:减法。在堆栈的前2个数字上执行。将结果推回堆栈 +:加法。在堆栈的前2个数字上执行。将结果推回堆栈 ^:求幂。在堆栈的前2个数字上执行。将结果推回堆栈 %:模数。在堆栈的前2个数字上执行。将结果推回堆栈 !:阶乘。在堆栈上的最高编号上执行。将结果推回堆栈 D:复制堆栈上的最高编号 用伪代码定义的操作: /: push(pop divided by pop) *: push(pop times pop) -: push(pop minus pop) +: push(pop plus pop) ^: push(pop to the pop) %: push(pop mod pop) !: push(factorial pop) D: t = pop; push(t); push(t) 如何将数字压入堆栈: 将数字添加到堆栈很容易,只需将原始数字放在您需要的程序中即可。如果您需要在堆栈上放置多个数字,可以用逗号(,)分隔它们。您的程序将不需要处理-输入中的数字,如果用户想要一个数字,则应按想要取反的数字,然后按0和-。程序输入中的数字也限制为正整数。 输入: 您的程序应从命令行或从std …

4
那几乎是Lisp!
挑战 您的挑战是为一种类似Lisp的语言设计一个解释器,此后将被创造出来:GLisp。GLisp的程序代码将包含任意数量的由方括号表示的嵌套表达式,格式如下: (func arg1 arg2 ...) 注意,解释器必须在方括号,函数和参数之前和之后允许多余的空格字符。 种类 您将实现四种类型,整数,列表,布尔值和函数。可以使用自己的语法将整数和布尔值显式插入源代码中。您的解释器必须假设一系列数字字符表示一个整数(您不必实现显式插入负整数的语法)。您的解释器还必须假定true和false被指定为布尔值。用户无法明确定义函数,它们将始终返回单个值(任何长度的列表都计为单个值)。 功能 需要实现以下功能,格式为Function,Arity。如果Arity n以加号开头,则表示一个n或多个参数。除非另有说明,否则您可以假定赋予函数的所有参数都属于同一类型。您还可以假设如果没有为certian类型指定任何行为,则可以假定该函数的任何参数都不会属于该类型。下图将引用参数: (func argument1 argument2 ... argumentn) +,2+ 如果所有参数均为Integer类型,则必须返回参数之和 如果所有参数均为List类型,则必须按升序(arg1+arg2+ ...)返回参数的串联 如果所有参数的类型均为Boolean,则必须返回逻辑上所有参数序列 (+ 1 2 3 4 5) -> 15 (+ (list 1 2) (list 3 4)) -> (list 1 2 3 4) (+ true true true) -> true -,2+ …

6
模拟循环标签系统
一个循环标签系统是由两个符号的字母(我将使用一个微小的,图灵完备的计算模型{0,1}的),一个有限的,非空的循环列表的制作是由这两个符号,以及无限的词也包括那两个符号。 在每一步: 单词中的第一个元素被删除 如果是0当前产量,则跳过 如果是1当前产生式,则附加在该词的末尾。 下一生产活动。如果这是最后一个作品,请返回第一个。 当单词变为空时,系统停止。 一个例子(来自维基百科): Productions: (010, 000, 1111) Initial word: 11001 Generation Production Word (before) Word (after) 0 010 11001 → 1001010 1 000 1001010 → 001010000 2 1111 001010000 → 01010000 3 010 01010000 → 1010000 4 000 1010000 → 010000000 5 1111 010000000 → …

5
模拟任何一维元胞自动机
挑战 您将要编写一个完整的程序,该程序使用来自STDIN的七个数字,并将元胞自动机(CA)的二维历史记录打印到STDOUT。这是代码高尔夫。 输入格式 输入将是七个整数/字符串,以逗号分隔。第一个数字是根据Wolfram代码的规则编号(每个规则的标准名称)。第二个是初始启动配置。第三个和第四个描述了什么模式以及应将多少模式附加到启动配置的左侧。作为填充。第五和第六在右侧也是如此。最后一个数字是运行模拟的世代数。 因此,输入示例为90,11,0,4,0,4,5。这应该告诉您的程序您正在运行规则90。它还应该告诉程序您希望初始配置是11在字符串的0两端都附加4次,因此实际的开始模式是0000110000。它还告诉您的程序将此模拟运行5代。 输出您的程序应该打印每一代的整个单元格数组(用换行符分隔),以便输出是CA的时空图。对于每一代,根据作为输入提供的规则,每个单元的状态由其状态和紧靠左侧和右侧的单元的状态确定。模拟应围绕边缘。首先打印的应该是gen的起始数组。0。 输入90,11,0,4,0,4,5应尽可能精确地产生以下输出。 0000110000 0001111000 0011001100 0111111110 1100000011 0110000110 请注意,起始状态不包括在五代中。还要注意,模拟环绕着边缘。 更多例子 输入: 184,1100,01,2,01,1,4 输出: 0101110001 1011101000 0111010100 0110101010 0101010101 输入: 0,1011,1,0,0,1,2 输出: 10110 00000 00000 有关一维CA如何工作以及如何编号的更多信息

26
简单的高尔夫口译员
挑战: 您的工作是为一种简单的高尔夫语言创建一个简单的解释器。 输入: 输入将采用以空格分隔的字符串形式。 您可以用所需的空格代替空格 输出: 输出执行所有操作后获得的结果(数字或字符串)。如果有多个输出,则将在一起将得到一个结果(没有分隔符)。变量的初始值始终为零。即:它开始于0 语言语法: 该语言具有以下运算符: inc ---> add one to variable dec ---> remove one from variable mult ---> multiply variable by 2 half ---> divide the variable by 2 Pri ---> print the variable to console (or whatever your language has) exit ---> end the …

13
斐波那契产品
您可以将大于0的数字分解为正Fibonacci数字的唯一和。在这个问题中,我们通过重复减去最大可能的正斐波那契数来做到这一点。例如: 1 = 1 2 = 2 3 = 3 4 = 3 + 1 12 = 8 + 3 + 1 13 = 13 100 = 89 + 8 + 3 现在,我将斐波那契乘积称为与上面相同的列表,但加法运算被乘积代替。例如,f(100) = 89 * 8 * 3 = 2136。 编写一个给定正整数n的程序或函数,该函数将返回该数字的斐波那契乘积。 测试用例: 1: 1 2: 2 3: 3 4: …
13 code-golf  math  sequence  fibonacci  code-golf  word  code-golf  cipher  code-golf  string  math  subsequence  code-golf  regular-expression  code-golf  brainfuck  assembly  machine-code  x86-family  code-golf  math  factorial  code-golf  math  geometry  code-golf  math  arithmetic  array-manipulation  math  number  optimization  stack  metagolf  code-golf  tips  assembly  code-golf  tips  lisp  code-golf  number-theory  path-finding  code-golf  number  sequence  generation  code-golf  math  geometry  code-golf  grid  permutations  code-golf  code-golf  graphical-output  geometry  fractal  knot-theory  code-golf  math  arithmetic  code-golf  interpreter  balanced-string  stack  brain-flak  code-golf  math  set-theory  code-golf  math  array-manipulation  code-golf  code-golf  string  natural-language  code-golf  code-golf  math  linear-algebra  matrix  code-golf  string  encode 

1
解决SAS宏变量
在SAS编程语言是笨重的,古老的语言可以追溯到1966年的今天这仍然在使用。原始的编译器是用PL / I编写的,实际上许多语法都来自PL / I。SAS还具有从PL / I的语言衍生而来的预处理器宏语言。在这个挑战中,您将解释SAS宏语言的一些简单元素。 在SAS宏语言中,宏%let关键字是使用关键字定义的,并使用进行打印到日志%put。语句以分号结尾。这里有些例子: %let x = 5; %let cool_beans =Cool beans; %let what123=46.lel"{)-++; 宏变量名称不区分大小写,并且始终与正则表达式匹配/[a-z_][a-z0-9_]*/i。出于此挑战的目的,我们将讲以下内容: 宏变量只能保存完全由可打印ASCII字符组成的值,,和除外 ;。&% 值中将没有前导或尾随空格 值的长度不得超过255个字符 值可能为空 值中的方括号和引号可能不匹配 可以有任何空间量前后=的%let语句和这个空间应该被忽略 可以有空间的任何数量的终端之前;的%let声明,这个空间应该同样被忽略 当调用宏变量时,我们说它“解析”为其值。宏变量通过前置来解决&。有一个可选的结尾.表示标识符的末尾。例如, %put The value of x is &X..; 写入The value of x is 5.日志。请注意,需要两个期间,因为单个期间将被消耗&X.并解析为5。还要注意,即使我们x以小写字母定义,&X也是如此,&x因为宏变量名称不区分大小写。 这就是棘手的地方。&可以将多个s串在一起以解析变量,并且&处于同一嵌套级别的s可以同时解析。例如, %let i = 1; %let coolbeans1 = broseph; …

3
高尔夫紫色口译员
高尔夫紫色口译员 Purple是一种esolang,其设计目的主要有两个: 尽量减少茄子,因为周围没有足够的自修改单指令语言。 承认有可能会出现可怕的小型高尔夫口译员。我在功能相当合理的Python 2解释器上的第一次访问只有702个字节,而且我相信经验丰富的高尔夫球手可以从中获得很多好处。 您的目标是为此语言编写翻译。 紫色信息: 紫色程序是一系列字符,它们放置在一个无限的可寻址存储器阵列中,从而程序的第一个字符位于地址零。数组的其余部分(存储Purple程序的前后)都初始化为零。 Purple中有三个寄存器,分别称为a和b和i,每个寄存器可以保存一个有符号整数,并初始化为零。i还是指令指针,并且始终指向当前正在执行的Purple指令。 每个周期,解释器将从指令指针指示的存储位置开始读取三个连续字符的序列,并尝试将该序列作为Purple指令执行。之后,指令指针总是增加3。 在语法上,Purple指令连续包含三个字符(或其编码),例如“ xyz ”。 第一个字符x可以是以下任意一个: abABio 这些符号具有以下含义: a - Place the result in register a. b - Place the result in register b. A - Place the result in the location in memory referred to by register a. B - Place …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.