解释+ p代码


15

受最近对另外两种字符语言的热潮启发, ;#

介绍

根据社区的共识,此站点上可接受的答案必须使用至少以下语言:

  1. 可以确定自然数是否为素数
  2. 可以将两个自然数相加
  3. 可以代表数字的列表/元组,以及单个数字

为了这个挑战,我们将忽略#3。因此,可以在此站点上使用的最简单的语言(忽略#3)将只有两个命令,isPrimeadd。为了便于解释和字节计数,让我们分配isPrimepadd+。因此,我们有了自己的语言+p。您的挑战是解释一些+p代码。

行为

  • +add指令取两个数字,将它们相加,然后输出结果
  • p所述isPrime指令需要一个单一的数,并将其输出1它是否为素数,并且0,如果它不是

规则

  • 您必须编写一个给定字符串的程序/函数,将该程序/函数解释为+p代码。您可以假设格式正确的输入(仅包含+p字符)。
  • 输入是灵活的。您可以将程序作为字符串,字符数组,代码点的整数数组等形式使用。正在解释的程序的输入也很灵活。您可以采用整数数组,并在程序执行时用完条目,或者每个指令(+p)都可以单独请求输入。您可能会假设每条指令都有足够的输入。确保输入由0到200之间的数字组成(但理论上,您的算法应适用于任何正整数输入)。
  • 输出也很灵活。您可以打印结果,将它们作为列表返回,返回包含所有结果的字符串,等等。如果以字符串形式打印或返回,则输出必须用一些非数字的,一致的分隔符分隔,例如换行,标签,空格或,字符。您可能有尾随分隔符或一些尾随空格。另外,p的输出可能是您使用的语言所定义的任何真或假值,而不是10
  • 解释器可能会终止也可能不会终止(如果它是一个完整的程序),但是在解释完所有指令之后必须停止打印。(它无法永远继续打印分隔符或空字符等)。
  • 默认情况下,这些标准漏洞是禁止的
  • 这是,用最少的字节数获胜的答案

测试用例

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 91 
----------------------------------
Program: p
Input: [29]
Output: 1 
----------------------------------
Program: pp
Input: [176, 12]
Output: 0 0 
----------------------------------
Program: ++++p
Input: [32, 16, 69, 197, 73, 171, 21, 178, 72]
Output: 48 266 244 199 0 
----------------------------------
Program: pp+++p+pp+
Input: [151, 27, 119, 189, 198, 107, 174, 15, 166, 106, 134, 108, 169, 55, 42]
Output: 1 0 308 305 189 0 240 0 0 97 
----------------------------------
Program: p+p+++++++pp+p
Input: [143, 67, 30, 149, 178, 52, 112, 122, 55, 122, 142, 199, 20, 175, 138, 80, 116, 180, 50, 116, 15, 92, 74]
Output: 0 97 1 230 234 177 341 195 218 296 0 0 107 0 
----------------------------------
Program: ++p++p+pp+++++p+p+pp++
Input: [120, 177, 23, 116, 163, 52, 65, 98, 177, 16, 96, 131, 160, 48, 153, 0, 139, 33, 62, 49, 129, 86, 99, 135, 187, 80, 137, 130, 113, 136, 0, 1, 186, 100, 38, 153]
Output: 297 139 1 117 275 0 227 0 0 153 172 111 215 234 0 217 0 249 0 0 286 191 
----------------------------------
Program: ++p+++++p+p+++++++
Input: [181, 169, 6, 84, 68, 171, 129, 107, 106, 114, 197, 58, 11, 88, 156, 169, 43, 77, 49, 43, 102, 78, 93, 51, 91, 37, 64, 93, 82, 126, 181, 81, 44]
Output: 350 90 0 300 213 311 69 244 0 120 0 145 171 142 101 175 307 125 
----------------------------------
Program: ++p+
Input: [131, 127, 115, 40, 113, 196, 83]
Output: 258 155 1 279 
----------------------------------
Program: +ppp++p+ppp+p++++++++p+p+++pp+ppp++
Input: [6, 9, 187, 168, 96, 167, 178, 139, 86, 148, 99, 103, 166, 18, 119, 15, 132, 77, 16, 88, 139, 34, 58, 90, 43, 69, 68, 152, 59, 106, 134, 49, 155, 100, 52, 55, 27, 188, 41, 77, 23, 49, 171, 23, 193, 84, 111, 165, 80, 18, 63, 23, 116, 112, 119]
Output: 15 0 0 0 345 225 0 202 0 0 0 147 0 104 173 148 112 220 165 183 255 0 82 0 118 72 194 1 0 276 0 0 0 139 231 
----------------------------------
Program: ++++++++p++++++++++++
Input: [156, 5, 34, 25, 117, 98, 139, 131, 88, 82, 191, 13, 1, 170, 51, 116, 144, 85, 92, 170, 25, 94, 149, 131, 19, 161, 115, 160, 8, 6, 195, 101, 11, 185, 87, 50, 33, 140, 188, 135, 164]
Output: 161 59 215 270 170 204 171 167 0 177 195 243 150 276 168 201 112 272 83 328 299 
----------------------------------

很多很多很长的测试用例

用于生成测试用例的Java代码

以下是将解译的ungolfed java函数+p

public static void interpret(String program, int[] input) {
    int index = 0;
    for (char inst : program.toCharArray()) {
        switch (inst) {
            case '+':
                System.out.print((input[index++] + input[index++]) + " ");
                break;
            case 'p':
                int n = input[index++];
                System.out.print((isPrime(n) ? 1 : 0) + " ");
                break;
        }
    }
}

public static boolean isPrime(long n) { //Taken from /programming//a/2385999/4484294
    if (n < 2) return false;
    if (n == 2 || n == 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    long sqrtN = (long) Math.sqrt(n) + 1;
    for (long i = 6L; i <= sqrtN; i += 6) {
        if (n % (i - 1) == 0 || n % (i + 1) == 0) return false;
    }
    return true;
}

注意:使用搜索查询prime AND add AND interpret is:question,似乎与该问题没有任何重复。如果有一个,抱歉。


在您的输出中,将ps的结果连接起来,不带分隔符,这是故意的吗?
加伯·费克特(GáborFekete)

我们可以使用启发式素数测试吗?即isprime在朱莉娅。
Rɪᴋᴇʀ

我开始疯狂!但是...做了什么?机器人...不!
Caird coinheringaahing

有趣的是,我提出了挑战完全相反的建议
Caird coinheringaahing

@GáborFekete他们是?他们对我来说看起来不错……
苏格拉底凤凰城,

Answers:


31

05AB1E,5个字节

vy.V,

在线尝试!

说明

像手套一样适合挑战05AB1E :)

vy      # for each instruction in the program
  .V    # execute as 05AB1E code
    ,   # print

6
绝对是工作的正确工具。
暴民埃里克(Erik the Outgolfer)'17年

1
这看起来很狡猾...我的意思是真的。
Christopher

@Christopher:幸运+p手段添加isPrime05AB1E :)
Emigna

@Emigna我从未使用过05AB1E,所以我不知道!聪明的答案:)
苏格拉底凤凰城

@Emigna等待你是谜吗?
Christopher

7

Python 2中,135个 133字节的

l,p=input()
i=j=0
while len(l)-i:print(int(all(l[i]%k for k in range(2,l[i])))if p[j]=='p'else l[i]+l[i+1]);i+=1+'p+'.find(p[j]);j+=1

-2个字节,感谢kundor


i,j=0,0是多余的,对吗?是不是i,j=0
帕维尔

1
@凤凰:不,那是行不通的。你可以这样做i=j=0,但。
尼克·马特奥


5

Haskell,88 79字节

('+':r)!(a:b:c)=a+b:r!c
('p':r)!(a:c)=min(foldr((*).mod a)1[2..a-1])1:r!c
_!e=e

"commands" ! [args] 用来。

  • @Laikoni(#56433)节省了9个字节

我还在学习Haskell;高尔夫球技巧表示赞赏!


为功能使用前缀表示法的技巧可以节省一些字节。同样,基本案例i _[]=[]可以移动到最后一个模式匹配规则,然后缩短为i _ e=e,或者类似的_!e=e切换到后缀表示法之后的内容。
Laikoni '17

(min$product ...可以min(product ...
Laikoni '17

product$map(mod a)可以缩短为foldr((*).mod a)1
Laikoni '17

4

Ruby 2.4、77 + 7 = 84字节

使用-rprime标志。

->g,i{g.chars.map{|c|c==?p?i.shift.prime?? 1:0: c==?+?i.shift(2).sum: p}-[p]}

4

Perl 6,70个字节

{@^b.rotor($^a.comb.map(1+(*ne'p'))).map({$_-2??.[0].is-prime!!.sum})}

首先,该rotor方法用于根据程序的下一个字符是否将输入列表分为大小为1或2的块p。然后,将分块列表映射到;大小为2的块被求和,大小为1的块对其唯一性进行了素数测试。



3

C#,130个 129字节

p=>d=>{var i=0;p.Any(c=>{Console.Write((c==43?d[i++]+d[i]:Enumerable.Range(2,d[i]-2).Any(x=>d[i]%x==0)?0:1)+" ");return++i<0;});}

在线尝试!

  • 通过使用函数节省了1个字节(感谢Cyoce)

不知道你是如何C#的作品,但可能会改变(p,d)=>,以p=>d=>保存一个字节,并作出咖喱功能?
Cyoce

对,谢谢 (在字节数中应包含多少所需的C#样板,这是有争议的,但是,可以编写。(请参阅链接的TIO。))
Mormegil,

2

PowerShell 3 +,151121字节

$r,$v=$args;$p={0-notin((2..(($n=0+"$args")-1)|%{$n%$_}))};$i=0;$r|%{if($_-eq"p"){&p $v[$i]}else{$v[$i]+$v[($i+=1)]}$i++}

PowerShell没有主要的内置组件,因此我不得不自己动手。我的第一个版本很糟糕,我从模数结果中测试为0的其他大多数版本中节省了很多。也使用-notin代替来节省一些字节,-notcontains但这意味着PowerShell v2已退出。

基于评论的解释

# $r is the program code. Assumed char array
# $v is the remaining variables in an assumed integer array.
$r,$v=$args
# Anonymous function to determine if a number is a prime or not.
# Test all potential factors. Check if any 0 modulus remainders are present
$p={0-notin((2..(($n=0+"$args")-1)|%{$n%$_}))}
# $i is an index for tracking location in $v
$i=0
# Cycle each of the instructions
$r|%{if($_-eq"p"){
        # Call the prime checking anonymous function on this number
        &p $v[$i]
    }else{
        # Add the next two numbers. Adjust the index accordingly. 
        $v[$i]+$v[($i+=1)]

    }
    # Next number in list. 
    $i++  
}
    # Next number in list. 
    $i++  
}

1

F#,130个字节

let rec r=function|[],_->()|'+'::t,f::s::u->printf"%i "(f+s);r(t,u)|_::t,n::u->printf"%b "(List.exists((%)n>>(=)0)[2..n-1]);r(t,u)

在线尝试!


0

QBasic,122个字节

INPUT p$
FOR i=1TO LEN(p$)
INPUT x
IF"+"=MID$(p$,i,1)THEN INPUT y:?x+y:ELSE f=0:FOR j=2TO x:f=f-(x MOD j=0):NEXT:?f=1
NEXT

将代码作为输入行,然后将每个输入数字放在自己的行上。输出会散布在输入中,因为一旦计算出它们就会立即打印出来。真实价值是-1; 虚假的是0

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.