Interpretuj + kod p

15

Zainspirowany niedawnym szaleństwem nad innym dwuznakowym językiem, ;#

Wprowadzenie

Zgodnie z konsensusem społecznym , akceptowalne odpowiedzi na tej stronie muszą używać języków programowania, które przynajmniej:

  1. Potrafi ustalić, czy liczba naturalna jest liczbą pierwszą
  2. Można dodać dwie liczby naturalne razem
  3. Może reprezentować listę / krotkę liczb, a także pojedynczy numer

Na potrzeby tego wyzwania zignorujemy # 3. Dlatego najprostszy język, którego można by użyć na tej stronie (ignorując # 3), miałby dokładnie dwie komendy, isPrimei add. Aby ułatwić interpretację i liczbę bajtów, przypiszmy isPrimedo pi adddo +. Tak więc, mamy języka +p. Twoim zadaniem jest interpretacja +pkodu.

Zachowanie

  • +addnauka trwa dwa numery, dodaje je i wysyła wynik
  • pisPrimenauka trwa jeden numer i wyprowadza 1jeśli to jest pierwsza, a 0jeśli nie jest to

Zasady

  • Musisz napisać program / funkcję, która, biorąc pod uwagę ciąg znaków, interpretuje ten ciąg jako +pkod. Można założyć, dobrze uformowany (tylko wejście +i pznaków).
  • Dane wejściowe są elastyczne. Możesz wziąć program jako ciąg znaków, tablicę znaków, tablicę liczb całkowitych punktów kodowych itp. Wprowadzanie interpretowanego programu jest również elastyczne. Możesz wziąć tablicę liczb całkowitych i wykorzystać wpisy podczas wykonywania programu lub każda instrukcja ( +i p) może indywidualnie zażądać wprowadzenia. Możesz założyć, że będzie wystarczająca ilość danych wejściowych dla każdej instrukcji. Dane wejściowe są gwarantowane, że składają się z liczb od 0 do 200 (ale twoje algorytmy powinny teoretycznie działać dla każdej dodatniej liczby całkowitej).
  • Dane wyjściowe są również elastyczne. Możesz wydrukować wyniki, zwrócić je jako listę, zwrócić ciąg zawierający wszystkie wyniki itp. Jeśli zostanie wydrukowany lub zwrócony jako ciąg, dane wyjściowe muszą być oddzielone jakimś niezerowym, spójnym separatorem, takim jak nowy wiersz, tabulator, spacja lub ,znak. Możesz mieć końcowy separator lub końcowe białe znaki. Ponadto, pwynikiem może być dowolna wartość prawdy lub fałszu, zdefiniowana przez język, w którym pracujesz, a nie 1lub 0.
  • Tłumacz może, ale nie musi, zakończyć (jeśli jest to pełny program), ale musi przestać drukować po interpretacji wszystkich instrukcji. (Nie można kontynuować drukowania separatora na zawsze ani znaku zerowego itp.).
  • Te standardowe luki są domyślnie zabronione
  • To jest , wygrywa odpowiedź z najmniejszą liczbą bajtów

Przypadki testowe

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

Wiele, wiele bardzo długich przypadków testowych

Kod Java używany do generowania przypadków testowych

Przykład

Poniżej znajduje się funkcja Javy, która interpretuje +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;
}

Uwaga: przy użyciu zapytania wyszukiwania prime AND add AND interpret is:questionnie wydaje się, aby były duplikaty tego pytania. Jeśli jest, przepraszam.

Socratic Phoenix
źródło
W twoich wynikach wyniki ps są łączone bez separatora, czy to jest zamierzone?
Gábor Fekete
Czy możemy zastosować heurystyczny test główny? tj. isprimew Julii.
Rɪᴋᴇʀ
Zacząłem to szaleństwo! Ale ... co to zrobiło? Roboty ... nie!
caird coinheringaahing
Co ciekawe, zrobiłem coś wręcz przeciwnego do wyzwania
Cairair coinheringaahing
@ GáborFekete Oni są? Wyglądają mi dobrze ...
Socratic Phoenix,

Odpowiedzi:

31

05AB1E , 5 bajtów

vy.V,

Wypróbuj online!

Wyjaśnienie

To wyzwanie pasuje do 05AB1E jak rękawiczka :)

vy      # for each instruction in the program
  .V    # execute as 05AB1E code
    ,   # print
Emigna
źródło
6
Zdecydowanie właściwe narzędzie do pracy.
Erik the Outgolfer,
1
To wygląda na oszustwo ... Mam na myśli naprawdę.
Christopher
@Christopher: Na szczęście +i poznacza add i isPrime w 05AB1E :)
Emigna
@Emigna Nigdy nie korzystałem z 05AB1E, więc nie miałem pojęcia! Sprytna odpowiedź :)
Socratic Phoenix,
@Emigna Poczekaj, czy byłeś Enigmą?
Christopher
7

Python 2, 135 133 bajtów

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 bajty dzięki kundor

HyperNeutrino
źródło
i,j=0,0jest zbędny, prawda? Nie mogło być i,j=0?
Pavel
1
@Phoenix: Nie, to nie zadziała. Możesz to zrobić i=j=0.
Nick Matteo
5

Haskell, 88 79 bajtów

('+':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] do użycia.

  • Zapisano 9 bajtów dzięki @Laikoni (# 56433)

Wciąż uczę się Haskell; Doceniamy wskazówki golfowe!

Quelklef
źródło
Ta wskazówka dotycząca używania notacji infix dla funkcji może zaoszczędzić trochę bajtów. Również skrzynka podstawowa i _[]=[]może zostać przesunięta, aby była ostatnią regułą dopasowywania wzorca, a następnie zostać skrócona i _ e=elub coś w stylu _!e=epo zmianie notacji infix.
Laikoni
(min$product ...może być min(product ....
Laikoni
product$map(mod a)można skrócić do foldr((*).mod a)1.
Laikoni
4

Ruby 2.4, 77 + 7 = 84 bajtów

Używa -rprimeflagi.

->g,i{g.chars.map{|c|c==?p?i.shift.prime?? 1:0: c==?+?i.shift(2).sum: p}-[p]}
Wartość tuszu
źródło
4

Perl 6 , 70 bajtów

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

Najpierw rotormetoda służy do podziału listy danych wejściowych na części o wielkości 1 lub 2 w zależności od tego, czy następny znak programu jest, pczy nie. Następnie ta podzielona lista jest mapowana; fragmenty wielkości 2 są sumowane, a fragmenty wielkości 1 mają swój jedyny element przetestowany pod kątem pierwotności.

Sean
źródło
3

C #, 130 129 bajtów

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

Wypróbuj online!

  • Zapisano 1 bajt, curryjąc funkcję (dzięki Cyoce)
Mormegil
źródło
nie wiem, jak C # działa, ale można zmienić (p,d)=>, aby p=>d=>zapisać bajt i zrobić curry funkcji?
Cyoce
Racja, dzięki. (Można dyskutować, ile wymaganej liczby bitu C # należy uwzględnić w liczbie bajtów, ale tak, można to napisać. (Zobacz powiązane TIO.))
Mormegil
2

PowerShell 3+, 151 121 bajtów

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

Program PowerShell nie ma najlepszych wbudowanych funkcji, więc musiałem uruchomić własne. Moja pierwsza wersja była okropna i wziąłem od większości innych, które testują 0 wśród wyników modułu, co dużo oszczędza. Sabatował także kilka bajtów, używając -notinzamiast, -notcontainsale oznacza to, że PowerShell v2 jest niedostępny.

Wyjaśnienie oparte na komentarzach

# $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++  
}
Matt
źródło
1

F #, 130 bajtów

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)

Wypróbuj online!

Brunner
źródło
0

QBasic, 122 bajty

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

Pobiera kod jako wiersz wprowadzania, a następnie przyjmuje każdy numer wejścia w osobnym wierszu. Wyjścia są przeplatane z danymi wejściowymi, ponieważ są drukowane natychmiast po ich obliczeniu. Prawdziwa wartość to -1; falsey jest 0.

DLosc
źródło