Tafsirkan + kode p

15

Terinspirasi oleh kegemaran baru-baru ini atas dua bahasa karakter lain, ;#

Intro

Menurut konsensus komunitas , jawaban yang dapat diterima di situs ini harus menggunakan bahasa pemrograman yang, minimal:

  1. Dapat menentukan apakah bilangan asli prima
  2. Dapat menambahkan dua bilangan alami bersama
  3. Dapat mewakili daftar / tuple angka, serta satu nomor

Untuk tujuan tantangan ini, kami akan mengabaikan # 3. Oleh karena itu, bahasa paling sederhana yang dapat digunakan di situs ini (mengabaikan # 3) akan memiliki dua perintah, isPrimedan add. Untuk memudahkan interpretasi dan jumlah byte, mari tetapkan isPrimeke pdan adduntuk +. Jadi, kami memiliki bahasa kami +p,. Tantangan Anda adalah menafsirkan beberapa +pkode.

Tingkah laku

  • +yang addinstruksi mengambil dua angka, menambahkan mereka, dan output hasilnya
  • pyang isPrimeinstruksi mengambil satu nomor, dan output 1jika prima, dan 0jika tidak

Aturan

  • Anda harus menulis sebuah program / fungsi yang, diberikan string karakter, menafsirkan string itu sebagai +pkode. Anda dapat mengasumsikan input yang terbentuk dengan baik (hanya +dan pkarakter).
  • Input fleksibel. Anda dapat menggunakan program sebagai string, array karakter, integer array codepoints, dll. Input untuk program yang ditafsirkan juga fleksibel. Anda dapat mengambil dalam array integer, dan menggunakan entri saat program dijalankan, atau setiap instruksi ( +dan p) dapat meminta input secara individual. Anda mungkin menganggap akan ada input yang cukup untuk setiap instruksi. Input dijamin terdiri dari angka antara 0 dan 200 (tetapi algoritme Anda harus bekerja secara teoritis untuk input integer positif).
  • Keluaran juga fleksibel. Anda dapat mencetak hasilnya, mengembalikannya sebagai daftar, mengembalikan string yang berisi semua hasil, dll. Jika dicetak atau dikembalikan sebagai string, output harus dipisahkan oleh beberapa, pemisah konsisten non-digit, seperti baris baru, tab, spasi, atau ,karakter. Anda mungkin memiliki pemisah trailing atau spasi spasi tambahan. Juga, poutput mungkin berupa nilai kebenaran atau nilai falsey, seperti yang didefinisikan oleh bahasa tempat Anda bekerja, daripada 1atau 0.
  • Penerjemah mungkin atau mungkin tidak berakhir (jika ini adalah program penuh), tetapi harus berhenti mencetak setelah semua instruksi ditafsirkan. (Ini tidak dapat terus mencetak pemisah selamanya, atau karakter nol, dll.).
  • Celah standar ini dilarang secara default
  • Ini adalah , jawabannya dengan byte paling sedikit menang

Uji Kasus

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

Banyak, banyak, kasus uji yang sangat panjang

Kode java digunakan untuk menghasilkan kasus uji

Contoh

Di bawah ini adalah fungsi java ungolfed yang akan menafsirkan +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;
}

Catatan: Menggunakan kueri pencarian prime AND add AND interpret is:question, tampaknya tidak ada duplikat untuk pertanyaan ini. Jika ada, maaf.

Phoenix Sokrates
sumber
Dalam output Anda, hasil p's digabungkan tanpa pemisah, apakah ini dimaksudkan?
Gábor Fekete
Bisakah kita menggunakan tes prime heuristik? yaitu isprimedi julia.
Rɪᴋᴇʀ
Saya memulai kegemaran itu! Tapi ... apa yang telah dilakukan? Robot ... tidak!
caird coinheringaahing
Cukup menarik, saya membuat kebalikan dari tantangan
caird coinheringaahing
@ GáborFekete Mereka? Mereka terlihat baik-baik saja bagi saya ...
Socratic Phoenix

Jawaban:

31

05AB1E , 5 byte

vy.V,

Cobalah online!

Penjelasan

Tantangan ini cocok dengan 05AB1E seperti sarung tangan :)

vy      # for each instruction in the program
  .V    # execute as 05AB1E code
    ,   # print
Emigna
sumber
6
Jelas alat yang tepat untuk pekerjaan itu.
Erik the Outgolfer
1
Ini terlihat curang ... Maksudku benar-benar.
Christopher
@Christopher: Beruntung +dan pberarti menambah dan isPrime di 05AB1E :)
Emigna
@Emigna Saya belum pernah menggunakan 05AB1E, jadi saya tidak tahu! Jawaban cerdas :)
Socratic Phoenix
@Emigna Tunggu, apakah Anda 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 berkat kundor

HyperNeutrino
sumber
i,j=0,0berlebihan, kan? Tidak bisa itu i,j=0?
Pavel
1
@Phoenix: Tidak, itu tidak akan berhasil. Anda bisa melakukannya i=j=0.
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] untuk digunakan.

  • Disimpan 9 byte berkat @Laikoni (# 56433)

Saya masih belajar Haskell; tips golf dihargai!

Quelklef
sumber
Tip ini untuk menggunakan notasi infiks untuk fungsi dapat menghemat beberapa byte. Juga kasus dasar i _[]=[]dapat dipindahkan menjadi aturan pencocokan pola terakhir dan kemudian disingkat menjadi i _ e=e, atau sesuatu seperti _!e=esetelah Anda beralih ke notasi infiks.
Laikoni
(min$product ...bisa min(product ....
Laikoni
product$map(mod a)dapat disingkat menjadi foldr((*).mod a)1.
Laikoni
4

Ruby 2.4, 77 + 7 = 84 byte

Menggunakan -rprimebendera.

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

Perl 6 , 70 byte

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

Pertama rotormetode ini digunakan untuk membagi daftar input menjadi potongan-potongan ukuran 1 atau 2 tergantung pada apakah karakter program selanjutnya adalah patau tidak. Kemudian daftar yang terpotong itu dipetakan; potongan ukuran 2 dijumlahkan, dan potongan ukuran 1 memiliki elemen tunggal mereka diuji untuk keaslian.

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

Cobalah online!

  • Disimpan 1 byte dengan kari fungsi (terima kasih kepada Cyoce)
Mormegil
sumber
tidak yakin bagaimana C # bekerja, tetapi bisakah Anda beralih (p,d)=>ke p=>d=>untuk menyimpan byte dan membuat fungsi yang dijelajahi?
Cyoce
Benar, terima kasih. (Dapat diperdebatkan berapa banyak C # boilerplate yang diperlukan harus dimasukkan dalam jumlah byte, tetapi ya, Anda dapat menulisnya. (Lihat TIO yang tertaut.))
Mormegil
2

PowerShell 3+, 151 121 Bytes

$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 tidak memiliki built-in utama jadi saya harus memutar sendiri. Versi pertama saya sangat buruk dan saya mengambil dari sebagian besar yang lain yang menguji 0 di antara hasil modulus yang menghemat banyak. Juga sabed beberapa byte dengan menggunakan -notinbukan -notcontainstetapi itu berarti PowerShell v2 keluar.

Penjelasan berdasarkan komentar

# $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++  
}
Mat
sumber
1

F #, 130 byte

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)

Cobalah online!

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

Mengambil kode sebagai jalur input, lalu mengambil setiap nomor input pada jalurnya sendiri. Keluaran diselingi dengan input karena mereka dicetak segera setelah dihitung. Nilai sebenarnya adalah -1; falsey adalah 0.

DLosc
sumber