Interpretar código + p

15

Inspirado pela mania recente sobre outra linguagem de dois caracteres, ;#

Introdução

De acordo com o consenso da comunidade , as respostas aceitáveis ​​neste site devem usar linguagens de programação que, no mínimo:

  1. Pode determinar se um número natural é primo
  2. Pode adicionar dois números naturais juntos
  3. Pode representar uma lista / tupla de números, bem como um único número

Para os propósitos deste desafio, ignoraremos o item 3. Portanto, a linguagem mais simples que poderia ser usada neste site (ignorando o item 3) teria exatamente dois comandos, isPrimee add. Para facilitar a interpretação e a contagem de bytes, vamos atribuir isPrimea pe addpara +. Assim, nós temos nossa linguagem +p. Seu desafio é interpretar algum +pcódigo.

Comportamento

  • +a addinstrução pega dois números, os adiciona e gera o resultado
  • pa isPrimeinstrução pega um único número e gera 1se for primo e 0se não for

Regras

  • Você deve escrever um programa / função que, dada uma sequência de caracteres, interprete essa sequência como +pcódigo. Você pode assumir uma entrada bem formada (apenas +ep caracteres).
  • A entrada é flexível. Você pode considerar o programa como uma string, matriz de caracteres, matriz inteira de pontos de código, etc. A entrada para o programa que está sendo interpretado também é flexível. Você pode receber uma matriz inteira e usar entradas à medida que o programa é executado, ou cada instrução ( +e p) pode solicitar entrada individualmente. Você pode assumir que haverá entrada suficiente para todas as instruções. A entrada é garantida para consistir em números entre 0 e 200 (mas seus algoritmos devem teoricamente funcionar para qualquer entrada inteira positiva).
  • A saída também é flexível. Você pode imprimir os resultados, retorná-los como uma lista, retornar uma sequência que contenha todos os resultados etc. Se impressa ou retornada como uma sequência, a saída deve ser separada por algum separador consistente, que não seja um dígito, como uma nova linha, guia, espaço ou ,caractere. Você pode ter um separador à direita ou algum espaço em branco à direita. Além disso, pa saída pode ser qualquer valor de verdade ou falsey, conforme definido pelo idioma em que você está trabalhando, em vez de 1ou 0.
  • O intérprete pode ou não terminar (se for um programa completo), mas deve parar de imprimir depois que todas as instruções forem interpretadas. (Ele não pode continuar imprimindo o separador para sempre, ou um caractere nulo etc.).
  • Essas brechas padrão são proibidas por padrão
  • Isso é , a resposta com o mínimo de bytes ganha

Casos de teste

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

Muitos, muitos, casos de teste muito longos

O código java usado para gerar casos de teste

Exemplo

Abaixo está uma função java não destruída que interpretará +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;
}

Nota: Usando a consulta de pesquisa prime AND add AND interpret is:question, não parece haver duplicatas para esta pergunta. Se houver um, desculpe.

Phoenix socrático
fonte
Nas suas saídas, os resultados de ps são concatenados sem separador, isto é pretendido?
Gábor Fekete 25/05
Podemos usar um teste de heurística? ie isprimeem julia.
Rɪᴋᴇʀ
Comecei essa mania! Mas ... o que isso fez? Os robôs ... não!
caird coinheringaahing
Curiosamente, eu fiz um oposto ao desafio
caird coinheringaahing
@ GáborFekete Eles são? Eles me parecem bem ...
Phoenix socrático

Respostas:

31

05AB1E , 5 bytes

vy.V,

Experimente online!

Explicação

Este desafio encaixou 05AB1E como uma luva :)

vy      # for each instruction in the program
  .V    # execute as 05AB1E code
    ,   # print
Emigna
fonte
6
Definitivamente, a ferramenta certa para o trabalho.
Erik the Outgolfer
1
Isso parece barato ... quero dizer realmente.
Christopher
@Christopher: Felizmente +e pmeios adicionar e isPrime em 05AB1E :)
Emigna
@Emigna Eu nunca usei 05AB1E, então não fazia ideia! Resposta inteligente :)
Socratic Phoenix
@Emigna Espera, você estava Enigma?
25417 Christopher
7

Python 2, 135 133 bytes

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 bytes graças ao kundor

HyperNeutrino
fonte
i,j=0,0é redundante, certo? Não poderia ser i,j=0?
Pavel
1
@ Phoenix: Não, isso não vai funcionar. Você pode fazer i=j=0embora.
Nick Matteo
5

Haskell, 88 79 bytes

('+':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] para uso.

  • Guardado 9 bytes graças a @Laikoni (# 56433)

Eu ainda estou aprendendo Haskell; dicas de golfe apreciado!

Quelklef
fonte
Esta dica para usar a notação infix para funções pode economizar alguns bytes. Além disso, o caso base i _[]=[]pode ser movido para ser a última regra de correspondência de padrões e, em seguida, ser encurtado para i _ e=e, ou algo parecido _!e=eapós a mudança para a notação de infixo.
Laikoni
(min$product ...pode ser min(product ....
Laikoni
product$map(mod a)pode ser reduzido para foldr((*).mod a)1.
Laikoni
4

Ruby 2.4, 77 + 7 = 84 bytes

Usa a -rprimebandeira.

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

Perl 6 , 70 bytes

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

Primeiro, o rotormétodo é usado para dividir a lista de entrada em pedaços de tamanho 1 ou 2, dependendo se o próximo caractere do programa é pou não. Em seguida, essa lista fragmentada é mapeada; pedaços de tamanho 2 são somados e pedaços de tamanho 1 têm seu único elemento testado quanto à primalidade.

Sean
fonte
3

C #, 130 129 bytes

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

Experimente online!

  • Economizou 1 byte ao currying da função (graças a Cyoce)
Mormegil
fonte
não sei como C # obras, mas você poderia mudar (p,d)=>para p=>d=>salvar um byte e fazer uma função curry?
Cyoce
Certo, obrigado. (É discutível quanto do C # clichê necessária deve ser incluído na contagem de bytes, mas sim, você pode escrever que (Veja o TIO ligada)..)
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++}

O PowerShell não possui embutidos principais, então eu tive que usar os meus. Minha primeira versão foi terrível e tirei da maioria das outras que testam 0 entre os resultados do módulo, o que economiza muito. Também sabed alguns bytes usando em -notinvez de, -notcontainsmas isso significa que o PowerShell v2 está fora.

Explicação baseada em comentários

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

F #, 130 bytes

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)

Experimente online!

Brunner
fonte
0

QBasic, 122 bytes

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

Pega o código como uma linha de entrada e pega cada número de entrada em sua própria linha. As saídas são intercaladas com as entradas porque são impressas assim que são calculadas. O valor verdadeiro é -1; Falsey é 0.

DLosc
fonte