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:
- Pode determinar se um número natural é primo
- Pode adicionar dois números naturais juntos
- 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, isPrime
e add
. Para facilitar a interpretação e a contagem de bytes, vamos atribuir isPrime
a p
e add
para +
. Assim, nós temos nossa linguagem +p
. Seu desafio é interpretar algum +p
código.
Comportamento
+
aadd
instrução pega dois números, os adiciona e gera o resultadop
aisPrime
instrução pega um único número e gera1
se for primo e0
se não for
Regras
- Você deve escrever um programa / função que, dada uma sequência de caracteres, interprete essa sequência como
+p
có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 (
+
ep
) 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,p
a saída pode ser qualquer valor de verdade ou falsey, conforme definido pelo idioma em que você está trabalhando, em vez de1
ou0
. - 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 é código-golfe , 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.
fonte
p
s são concatenados sem separador, isto é pretendido?isprime
em julia.Respostas:
05AB1E , 5 bytes
Experimente online!
Explicação
Este desafio encaixou 05AB1E como uma luva :)
fonte
+
ep
meios adicionar e isPrime em 05AB1E :)Python 2,
135133 bytes-2 bytes graças ao kundor
fonte
i,j=0,0
é redundante, certo? Não poderia seri,j=0
?i=j=0
embora.Python 2 , 91 bytes
Experimente online!
fonte
Haskell,
8879 bytes"commands" ! [args]
para uso.Eu ainda estou aprendendo Haskell; dicas de golfe apreciado!
fonte
i _[]=[]
pode ser movido para ser a última regra de correspondência de padrões e, em seguida, ser encurtado parai _ e=e
, ou algo parecido_!e=e
após a mudança para a notação de infixo.(min$product ...
pode sermin(product ...
.product$map(mod a)
pode ser reduzido parafoldr((*).mod a)1
.Ruby 2.4, 77 + 7 = 84 bytes
Usa a
-rprime
bandeira.fonte
Perl 6 , 70 bytes
Primeiro, o
rotor
método é usado para dividir a lista de entrada em pedaços de tamanho 1 ou 2, dependendo se o próximo caractere do programa ép
ou 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.fonte
Gelatina , 18 bytes
Experimente online!
Solução alternativa, 18 bytes
Experimente este online!
fonte
C #,
130129 bytesExperimente online!
fonte
(p,d)=>
parap=>d=>
salvar um byte e fazer uma função curry?PowerShell 3+,
151121 BytesO 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
-notin
vez de,-notcontains
mas isso significa que o PowerShell v2 está fora.Explicação baseada em comentários
fonte
F #, 130 bytes
Experimente online!
fonte
QBasic, 122 bytes
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
.fonte