Phiên dịch + mã p


15

Lấy cảm hứng từ cơn sốt gần đây về ngôn ngữ hai nhân vật khác, ;#

Giới thiệu

Theo sự đồng thuận của cộng đồng , các câu trả lời chấp nhận được trên trang web này phải sử dụng các ngôn ngữ lập trình tối thiểu:

  1. Có thể xác định nếu một số tự nhiên là số nguyên tố
  2. Có thể cộng hai số tự nhiên lại với nhau
  3. Có thể đại diện cho một danh sách / bộ số, cũng như một số duy nhất

Đối với mục đích của thử thách này, chúng tôi sẽ bỏ qua # 3. Do đó, ngôn ngữ đơn giản nhất có thể được sử dụng trên trang web này (bỏ qua số 3) sẽ có chính xác hai lệnh isPrimeadd. Để dễ giải thích và đếm byte, chúng ta hãy assign của isPrimeđể paddđể +. Vì vậy, chúng tôi có ngôn ngữ của chúng tôi +p,. Thách thức của bạn là giải thích một số +pmã.

Hành vi

  • +các addhướng dẫn phải mất hai con số, cho biết thêm họ, và kết quả đầu ra kết quả
  • pcác isPrimehướng dẫn có một số duy nhất, và kết quả đầu ra 1nếu nó là số nguyên tố, và 0nếu nó không phải là

Quy tắc

  • Bạn phải viết một chương trình / hàm, đưa ra một chuỗi ký tự, diễn giải chuỗi đó dưới dạng +pmã. Bạn có thể giả sử đầu vào được hình thành tốt (chỉ +pký tự).
  • Đầu vào là linh hoạt. Bạn có thể tham gia chương trình dưới dạng một chuỗi, mảng ký tự, mảng số nguyên của các điểm mã, v.v. Đầu vào cho chương trình đang được diễn giải cũng linh hoạt. Bạn có thể lấy một mảng số nguyên và sử dụng hết các mục khi chương trình thực thi hoặc mỗi lệnh ( +p) có thể yêu cầu đầu vào riêng lẻ. Bạn có thể cho rằng sẽ có đủ đầu vào cho mỗi hướng dẫn. Đầu vào được đảm bảo bao gồm các số từ 0 đến 200 (nhưng về mặt lý thuyết, thuật toán của bạn sẽ hoạt động cho bất kỳ đầu vào số nguyên dương nào).
  • Đầu ra cũng linh hoạt. Bạn có thể in kết quả, trả về dưới dạng danh sách, trả về chuỗi chứa tất cả kết quả, v.v ... Nếu được in hoặc trả về dưới dạng chuỗi, đầu ra phải được phân tách bằng một số dấu tách không có chữ số, nhất quán, chẳng hạn như một dòng mới, tab, không gian hoặc ,ký tự. Bạn có thể có một dấu phân cách hoặc một khoảng trắng ở cuối. Ngoài ra, pđầu ra có thể là bất kỳ giá trị trung thực hoặc falsey nào, như được xác định bởi ngôn ngữ bạn đang làm việc, thay vì 1hoặc 0.
  • Trình thông dịch có thể hoặc không thể chấm dứt (nếu đó là một chương trình đầy đủ), nhưng nó phải dừng in sau khi tất cả các hướng dẫn được diễn giải. (Không thể tiếp tục in dấu phân cách mãi mãi hoặc ký tự null, v.v.).
  • Những sơ hở tiêu chuẩn này bị cấm theo mặc định
  • Đây là , câu trả lời có ít byte nhất sẽ thắng

Các trường hợp thử nghiệm

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

Nhiều, rất nhiều, rất lâu

Mã java được sử dụng để tạo các trường hợp thử nghiệm

Thí dụ

Dưới đây là một hàm java không được mã hóa sẽ diễn giải +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;
}

Lưu ý: Sử dụng truy vấn tìm kiếm prime AND add AND interpret is:question, dường như không có bất kỳ bản sao nào cho câu hỏi này. Nếu có một, xin lỗi.


Trong kết quả đầu ra của bạn, kết quả pcủa s được nối mà không có dấu phân cách, điều này có được dự định không?
Gábor Fekete

Chúng ta có thể sử dụng một bài kiểm tra chính heuristic? tức là isprimetrong julia.
Rɪᴋᴇʀ

Tôi bắt đầu cơn sốt đó! Nhưng ... nó đã làm gì? Các robot ... không!
caird coinheringaahing

Thật thú vị, tôi đã thực hiện một điều hoàn toàn ngược lại với thử thách
caird coinheringaahing

@ GáborFekete Họ là ai? Chúng trông ổn đối với tôi ...
Socratic Phoenix

Câu trả lời:


31

05AB1E , 5 byte

vy.V,

Hãy thử trực tuyến!

Giải trình

Thử thách này phù hợp với 05AB1E như một chiếc găng tay :)

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

6
Chắc chắn là công cụ phù hợp cho công việc.
Erik the Outgolfer

1
Điều này có vẻ gian lận ... Ý tôi là thực sự.
Christopher

@Christopher: May mắn +pcó nghĩa là thêmisPrime trong 05AB1E :)
Emigna

@Emigna Tôi chưa bao giờ sử dụng 05AB1E, vì vậy tôi không có ý tưởng! Câu trả lời thông minh :)
Phoenix Socratic

@Emigna Chờ đã bạn Enigma?
Christopher

7

Python 2, 135 133 byte

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 byte nhờ kundor


i,j=0,0là dư thừa, phải không? Có phải vậy i,j=0không?
Pavel

1
@Phoenix: Không, nó sẽ không hoạt động. Bạn có thể làm i=j=0mặc dù.
Nick Matteo


5

Haskell, 88 79 byte

('+':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] để sử dụng.

  • Đã lưu 9 byte nhờ @Laikoni (# 56433)

Tôi vẫn đang học Haskell; lời khuyên chơi golf đánh giá cao!


Mẹo này để sử dụng ký hiệu infix cho các hàm có thể giúp bạn tiết kiệm một số byte. Ngoài ra, trường hợp cơ sở i _[]=[]có thể được chuyển thành quy tắc khớp mẫu cuối cùng và sau đó được rút ngắn thành i _ e=e, hoặc đại loại như _!e=esau khi bạn chuyển sang ký hiệu infix.
Laikoni

(min$product ...có thể min(product ....
Laikoni

product$map(mod a)có thể rút ngắn thành foldr((*).mod a)1.
Laikoni

4

Ruby 2.4, 77 + 7 = 84 byte

Sử dụng -rprimecờ.

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

4

Perl 6 , 70 byte

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

Đầu tiên rotorphương thức được sử dụng để chia danh sách đầu vào thành các khối có kích thước 1 hoặc 2 tùy thuộc vào ký tự tiếp theo của chương trình có phay không. Sau đó, danh sách chunked được ánh xạ; các khối có kích thước 2 được tính tổng và các khối kích thước 1 có phần tử duy nhất được kiểm tra tính nguyên thủy.



3

C #, 130 129 byte

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;});}

Hãy thử trực tuyến!

  • Đã lưu 1 byte bằng cách xáo trộn chức năng (nhờ Cyoce)

không chắc chắn cách C # công trình, nhưng bạn có thể thay đổi (p,d)=>để p=>d=>tiết kiệm một byte và thực hiện một chức năng cà ri?
Cyoce

Phải, cảm ơn. (Đó là gây tranh cãi bao nhiêu C # soạn sẵn cần phải được nằm trong số lượng byte, nhưng yeah, bạn có thể viết rằng (Xem TIO liên kết)..)
Mormegil

2

PowerShell 3+, 151 121 byte

$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 không có phần mềm dựng sẵn nên tôi phải tự lăn. Phiên bản đầu tiên của tôi rất tệ và tôi đã lấy từ hầu hết các phiên bản khác kiểm tra 0 trong số các kết quả mô đun giúp tiết kiệm rất nhiều. Cũng phá hoại một vài byte bằng cách sử dụng -notinthay vì-notcontains nhưng điều đó có nghĩa là PowerShell v2 đã hết.

Nhận xét dựa trên giải thích

# $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

QBasic, 122 byte

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

Lấy mã làm một dòng đầu vào, sau đó lấy từng số đầu vào trên dòng riêng của nó. Các đầu ra được xen kẽ với các đầu vào vì chúng được in ngay khi chúng được tính toán. Giá trị trung thực là -1; falsey là 0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.