+ p 코드 해석


15

최근 다른 두 문자 언어에 대한 열풍에서 영감을 얻은 ;#

소개

커뮤니티 합의 에 따르면 이 사이트에서 허용되는 답변은 최소한 다음과 같은 프로그래밍 언어를 사용해야합니다.

  1. 자연수가 소수인지 확인할 수 있습니다
  2. 두 개의 자연수를 더할 수 있습니다
  3. 단일 숫자뿐만 아니라 숫자의 목록 / 튜플을 나타낼 수 있습니다

이 도전의 목적으로, 우리는 # 3을 무시할 것입니다. 따라서,이 사이트 (# 3를 무시)에서 사용할 수있는 간단한 언어는 정확히 두 개의 명령을, 것 isPrime하고 add. 해석 및 바이트 수를 쉽게하기 isPrime위해 pand add에 할당합시다 +. 따라서 우리는 우리의 언어를 가지고 있습니다 +p. 당신의 도전은 일부 +p코드 를 해석하는 것 입니다.

행동

  • +add명령들을 추가 두 숫자를 취하고, 그 결과를 출력한다
  • pisPrime명령어는 단일 번호를 받아, 출력 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 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ábor Fekete

휴리스틱 프라임 테스트를 사용할 수 있습니까? 즉 isprime줄리아.
Rɪᴋᴇʀ

나는 그 열풍을 시작했다! 하지만 ... 무슨 짓을 한거야? 로봇 ... 아니!
caird coinheringaahing

흥미롭게도 나는 도전 과 정반대
였다

@ GáborFekete 그들은? 그들은 나에게 잘 보인다 ...
Socratic Phoenix

답변:


31

05AB1E , 5 바이트

vy.V,

온라인으로 사용해보십시오!

설명

이 도전은 장갑처럼 05AB1E에 맞습니다. :)

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

6
작업에 꼭 맞는 도구입니다.
Outgolfer Erik

1
이것은 건방진 것 같습니다 ... 정말 의미합니다.
Christopher

@Christopher : 다행히 +p수단을 추가 하고 isPrime 에서 05AB1E :
Emigna

@Emigna 05AB1E를 사용한 적이 없으므로 전혀 몰랐습니다! 영리한 답변 :)
Socratic Phoenix

@Emigna 당신은 수수께끼였습니까?
Christopher

7

파이썬 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

Kundor 덕분에 -2 바이트


i,j=0,0중복입니까? 그렇지 i,j=0않습니까?
Pavel

1
@ 피닉스 : 아니요, 작동하지 않습니다. 그래도 할 수 있습니다 i=j=0.
Nick Matteo


5

하스켈, 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 덕분에 9 바이트 절약 (# 56433)

나는 아직도 Haskell을 배우고있다. 골프 팁 감사합니다!


함수에 접두사 표기법을 사용하는 이 팁 은 일부 바이트를 절약 할 수 있습니다. 또한 기본 사례 i _[]=[]는 마지막 패턴 일치 규칙으로 이동 한 다음로 단축 표기법으로 전환 한 후 i _ e=e와 같이 단축 될 수 있습니다 _!e=e.
Laikoni

(min$product ...일 수 있습니다 min(product ....
Laikoni

product$map(mod a)로 단축 할 수 있습니다 foldr((*).mod a)1.
Laikoni

4

루비 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

펄 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++  
}


0

Q 기본, 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입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.