ตีความรหัส + p


15

แรงบันดาลใจจากความนิยมล่าสุดในภาษาตัวละครอีกสองภาษา ;#

Intro

ตามมติของชุมชนคำตอบที่ยอมรับได้ในเว็บไซต์นี้ต้องใช้ภาษาโปรแกรมอย่างน้อยที่สุด:

  1. สามารถระบุได้ว่าจำนวนธรรมชาติเป็นจำนวนเฉพาะหรือไม่
  2. สามารถบวกสองจำนวนธรรมชาติเข้าด้วยกัน
  3. สามารถแสดงรายการ / tuple ของตัวเลขเช่นเดียวกับตัวเลขเดียว

สำหรับจุดประสงค์ของการท้าทายนี้เราจะเพิกเฉย # 3 ดังนั้นภาษาที่ง่ายที่สุดที่สามารถนำมาใช้ในเว็บไซต์นี้ (ไม่สนใจ # 3) จะได้ว่าสองคำสั่งและisPrime addเพื่อความสะดวกในการตีความและการนับไบต์ให้กำหนดของisPrimeการpและการadd ดังนั้นเรามีภาษาของเรา+ +pความท้าทายของคุณคือการตีความ+pรหัสบางอย่าง

พฤติกรรม

  • +การaddเรียนการสอนใช้ตัวเลขสองตัวเพิ่มและส่งออกผลลัพธ์
  • pการisPrimeเรียนการสอนใช้ตัวเลขจำนวนเดียวและเอาท์พุท1ถ้ามันเป็นนายกและ0ถ้ามันไม่ได้

กฎระเบียบ

  • คุณต้องเขียนโปรแกรม / ฟังก์ชั่นซึ่งให้สตริงของอักขระตีความสตริงนั้นเป็น+pรหัส คุณอาจสมมติว่าอินพุตที่มีรูปแบบถูกต้อง (เฉพาะ+และpตัวอักษร)
  • อินพุตมีความยืดหยุ่น คุณอาจใช้โปรแกรมเป็นสตริงอักขระอาร์เรย์อาร์เรย์จำนวนเต็มของ codepoints ฯลฯ อินพุตสำหรับโปรแกรมที่กำลังตีความนั้นมีความยืดหยุ่นเช่นกัน คุณอาจใช้อาร์เรย์จำนวนเต็มและใช้รายการมากขึ้นในขณะที่โปรแกรมดำเนินการหรือแต่ละคำสั่ง ( +และp) อาจขออินพุตเป็นรายบุคคล คุณอาจคิดว่าจะมีอินพุตเพียงพอสำหรับทุกคำสั่ง อินพุตรับประกันว่าจะประกอบด้วยตัวเลขระหว่าง 0 ถึง 200 (แต่อัลกอริทึมของคุณควรทำงานในเชิงทฤษฎีสำหรับอินพุตจำนวนเต็มบวกใด ๆ )
  • ผลผลิตยังมีความยืดหยุ่น คุณสามารถพิมพ์ผลลัพธ์ส่งคืนเป็นรายการส่งคืนสตริงที่มีผลลัพธ์ทั้งหมด ฯลฯ หากพิมพ์หรือส่งคืนเป็นสตริงเอาต์พุตต้องถูกคั่นด้วยตัวคั่นที่ไม่ใช่ตัวเลขหลักที่สอดคล้องกันเช่นบรรทัดใหม่ แท็บช่องว่างหรือ,ตัวอักษร คุณอาจมีตัวคั่นต่อท้ายหรือบางช่องว่างต่อท้าย นอกจากนี้p's การส่งออกอาจจะ truthy ใด ๆ หรือค่า falsey ตามที่กำหนดโดยภาษาที่คุณกำลังทำงานอยู่ในมากกว่าหรือ10
  • ล่ามอาจยุติหรือไม่ (ถ้าเป็นโปรแกรมเต็มรูปแบบ) แต่จะต้องหยุดพิมพ์หลังจากตีความคำแนะนำทั้งหมดแล้ว (มันไม่สามารถทำการพิมพ์ตัวคั่นต่อไปเรื่อย ๆ หรืออักขระ null เป็นต้น)
  • ช่องโหว่มาตรฐานเหล่านี้ถูกห้ามใช้โดยปริยาย
  • นี่คือคำตอบที่มีจำนวนไบต์น้อยที่สุดชนะ

กรณีทดสอบ

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 ที่ใช้ในการสร้างกรณีทดสอบ

ตัวอย่าง

ด้านล่างเป็นฟังก์ชัน java ungolfed ซึ่งจะตีความ+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จะไม่ปรากฏซ้ำกับคำถามนี้ หากมีหนึ่งขอโทษ


ในผลลัพธ์ของคุณผลลัพธ์pของการต่อกันโดยไม่มีตัวคั่นนี่คือจุดประสงค์หรือไม่
Gábor Fekete

เราสามารถใช้แบบทดสอบการเรียนรู้แบบฮิวริสติกได้หรือไม่? เช่นisprimeในจูเลีย
Rɪᴋᴇʀ

ฉันเริ่มที่บ้าคลั่ง! แต่ ... มันทำอะไรลงไป? หุ่นยนต์ ... ไม่!
caird coinheringaahing

น่าสนใจพอฉันได้ทำสิ่งที่ตรงกันข้ามกับความท้าทายอย่างแน่นอน
2560

@GáborFeketeพวกเขาคืออะไร? พวกเขาดูดีสำหรับฉัน ...
357252 Socratic Phoenix

คำตอบ:


31

05AB1E , 5 ไบต์

vy.V,

ลองออนไลน์!

คำอธิบาย

ความท้าทายนี้พอดีกับ 05AB1E เหมือนถุงมือ :)

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

6
เป็นเครื่องมือที่เหมาะสมสำหรับงานนี้อย่างแน่นอน
Erik the Outgolfer

1
นี่มันช่างดูโกง ... ฉันหมายถึงจริงๆ
Christopher

@ คริสโตเฟอร์ : โชคดี+และpหมายถึงเพิ่มและisPrimeใน05AB1E :)
Emigna

@Emigna ฉันไม่เคยใช้ 05AB1E ดังนั้นฉันจึงไม่รู้เลย! คำตอบที่ฉลาด :)
Socratic Phoenix

@Emigna คุณรอ Enigma ไหม?
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เหรอ
Pavel

1
@ ฟีนิกซ์: ไม่นั่นไม่ได้ผล คุณสามารถทำได้i=j=0แม้ว่า
Nick Matteo


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] สำหรับการใช้งาน

  • บันทึกแล้ว 9 ไบต์ขอบคุณ @Laikoni (# 56433)

ฉันยังคงเรียนรู้ Haskell; เคล็ดลับการเล่นกอล์ฟชื่นชม!


เคล็ดลับในการใช้สัญลักษณ์มัดสำหรับฟังก์ชั่นนี้สามารถช่วยให้คุณประหยัดบางไบต์ นอกจากนี้ยังi _[]=[]สามารถย้ายเคสพื้นฐานไปเป็นกฎการจับคู่รูปแบบสุดท้ายจากนั้นย่อให้สั้นลงi _ e=eหรือคล้ายกับ_!e=eหลังจากที่คุณเปลี่ยนเป็นสัญกรณ์มัด
Laikoni

(min$product ...min(product ...สามารถ
Laikoni

product$map(mod a)foldr((*).mod a)1สามารถลงไป
Laikoni


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

ค#, 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+, 151 121 ไบต์

$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

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

ใช้รหัสเป็นบรรทัดอินพุตจากนั้นรับแต่ละหมายเลขอินพุตในบรรทัดของตนเอง เอาท์พุทจะถูกสลับกับอินพุตเพราะพิมพ์ทันทีที่คำนวณ ค่า truthy คือ-1; falsey 0คือ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.