+ P kodunu yorumla


15

Son iki çılgınlıktan başka iki karakter dilinden esinlenerek, ;#

giriş

Topluluk konsensüsüne göre , bu sitedeki kabul edilebilir cevaplar, en azından aşağıdakileri yapan programlama dillerini kullanmalıdır:

  1. Doğal bir sayının asal olup olmadığını belirleyebilir
  2. Birlikte iki doğal sayı ekleyebilir
  3. Bir listeyi / sayı dizisini ve tek bir sayıyı temsil edebilir

Bu meydan okuma amacıyla # 3'ü görmezden geleceğiz. Bu nedenle, bu sitede kullanılabilecek en basit dilin (# 3 dikkate alınmadan) tam olarak iki komutu olacaktır isPrimeve add. Yorumlanması ve bayt sayısı kolaylığı için, 's ata izin isPrimeiçin pve addiçin +. Böylece dilimiz var +p. Zorluğunuz bazı +pkodları yorumlamaktır .

davranış

  • +addtalimat ekler, iki sayıyı alır ve sonucunu çıktı
  • pisPrimetalimat tek bir sayı alır ve çıkışı 1o asal sayı ise, ve 0eğer değilse

kurallar

  • Bir karakter dizisi verildiğinde, bu dizeyi +pkod olarak yorumlayan bir program / işlev yazmalısınız . İyi biçimlendirilmiş girdi (yalnızca +ve pkarakterler) varsayabilirsiniz .
  • Giriş esnektir. Programı bir dize, karakter dizisi, tam sayı kod noktaları dizisi, vb. Olarak alabilirsiniz. Yorumlanan programın girişi de esnektir. Bir tamsayı dizisi alabilir ve program yürütülürken up girişlerini kullanabilirsiniz veya her komut ( +ve p) ayrı ayrı giriş isteyebilir. Her talimat için yeterli girdi olacağını varsayabilirsiniz. Girdinin 0 ile 200 arasındaki sayılardan oluşması garanti edilir (ancak algoritmalarınız teorik olarak herhangi bir pozitif tamsayı girişi için çalışmalıdır).
  • Çıktı da esnektir. Sonuçları yazdırabilir, liste olarak döndürebilir, tüm sonuçları içeren bir dize döndürebilirsiniz, vb. Yazdırılır veya dize olarak döndürülürse, çıktı yeni bir satır gibi rakam olmayan, tutarlı bir ayırıcıyla ayrılmalıdır. sekme, boşluk veya ,karakter. Sondaki bir ayırıcıya veya sondaki boşluklara sahip olabilirsiniz. Ayrıca, psen yerine, çalışan dille tanımlanan 'ın çıkış, herhangi truthy veya Falsey değeri olabilir 1ya 0.
  • Tercüman sonlanabilir veya bitmeyebilir (eğer tam bir programsa), ancak tüm talimatlar yorumlandıktan sonra yazdırmayı durdurmalıdır. (Ayırıcıyı sonsuza kadar veya boş karakter vb. Yazdırmaya devam edemez).
  • Bu standart boşluklar varsayılan olarak yasaklanmıştır
  • Bu , en az bayt ile cevap kazanır

Test Durumları

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

Çok, çok, çok uzun test senaryoları

Test senaryoları oluşturmak için kullanılan java kodu

Misal

Aşağıda yorumlanacak bir ungolfed java işlevi vardır +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;
}

Not: Arama sorgusunu kullanarak, prime AND add AND interpret is:questionbu sorunun kopyaları görünmüyor. Eğer varsa, üzgünüm.


Çıktılarınızda, ps sonuçları ayırıcı olmadan birleştirilir, bu amaçlanıyor mu?
Gábor Fekete

Sezgisel bir başlangıç ​​testi kullanabilir miyiz? yani isprimejulia'da.
Rɪᴋᴇʀ

Bu çılgınlığı başlattım! Ama ... ne yaptı? Robotlar ... hayır!
Caird coinheringaahing

İlginç bir şekilde, meydan okumaya tam tersini yaptım
caird coinheringaahing

@ GáborFekete Onlar? Bana iyi görünüyorlar ...
Socratic Phoenix

Yanıtlar:


31

05AB1E , 5 bayt

vy.V,

Çevrimiçi deneyin!

açıklama

Bu meydan okuma eldiven gibi 05AB1E uygun :)

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

6
Kesinlikle iş için doğru araç.
Outgolfer Erik

1
Bu ucuz görünüyor ... Yani gerçekten.
Christopher

@Christopher: Neyse +ve paraçlar ekleyebilir ve isPrime içinde 05AB1E :)
Emigna

@Emigna Hiç 05AB1E kullanmadım, bu yüzden hiçbir fikrim yoktu! Zekice cevap :)
Sokratik Phoenix

@Emigna Bekle sen Enigma mıydın?
Christopher

7

Python 2, 135 133 bayt

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 sayesinde -2 bayt


i,j=0,0gereksiz, değil mi? Öyle değil mi i,j=0?
Pavel

1
@Phoenix: Hayır, işe yaramayacak. i=j=0Yine de yapabilirsiniz .
Nick Matteo


5

Haskell, 88 79 bayt

('+':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] kullanmak için.

  • @Laikoni (# 56433) sayesinde 9 bayt kaydedildi

Hala Haskell öğreniyorum; golf ipuçları takdir!


Fonksiyonlar için infix gösterimi kullanmak için bu ipucu size bazı bayt kaydedebilirsiniz. Ayrıca temel durum i _[]=[]son kalıp eşleme kuralı olarak taşınabilir ve daha sonra kısaltma nota geçtikten sonra i _ e=eveya kısaltılabilir _!e=e.
Laikoni

(min$product ...olabilir min(product ....
Laikoni

product$map(mod a)kısaltılabilir foldr((*).mod a)1.
Laikoni

4

Yakut 2.4, 77 + 7 = 84 bayt

-rprimeBayrağı kullanır .

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

4

Perl 6 , 70 bayt

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

İlk olarak rotoryöntem, giriş listesini programın bir sonraki karakterinin olup olmamasına bağlı olarak 1 veya 2 boyutlu parçalara bölmek için kullanılır p. Sonra o yığılmış liste eşlenir; 2 boyutlu parçalar toplanır ve 1 boyutundaki parçalar tek unsurları öncelik açısından test edilir.



3

C #, 130 129 bayt

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

Çevrimiçi deneyin!

  • İşlevi kırarak 1 bayt tasarruf (Cyoce sayesinde)

emin nasıl C # çalışır, ancak değişebilir (p,d)=>için p=>d=>bir byte kaydetmek ve Körili işlevi yapmak için?
Cyoce

Doğru, teşekkürler. (Gerekli C # kazan plakasının ne kadarının bayt sayısına dahil edilmesi gerektiği tartışmalıdır, ancak evet, bunu yazabilirsiniz. (Bkz. Bağlantılı TIO.))
Mormegil

2

PowerShell 3+, 151121 Bayt

$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'de yerleşik bir yerleşik yok, bu yüzden kendiminkini yuvarlamak zorunda kaldım. İlk versiyonum korkunçtu ve çok fazla tasarruf sağlayan modül sonuçları arasında 0 için test eden diğerlerinin çoğundan aldım. -notinBunun yerine kullanarak birkaç bayt sabed etti , -notcontainsancak bu PowerShell v2'nin dışarıda olduğu anlamına geliyor.

Yorum tabanlı açıklama

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

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)

Çevrimiçi deneyin!


0

QBasic, 122 bayt

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

Kodu bir giriş satırı olarak alır, ardından her bir giriş numarasını kendi satırında alır. Çıktılar, girişlerle serpiştirilir, çünkü hesaplanır hesaplanmaz yazdırılırlar. Gerçek değer -1; falsey olduğunu 0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.