Вдохновленный недавним увлечением еще двумя языками персонажей, ;#
вступление
Согласно общему мнению , приемлемые ответы на этом сайте должны использовать языки программирования, которые, как минимум:
- Можно определить, является ли натуральное число простым
- Можно добавить два натуральных числа вместе
- Может представлять список / кортеж чисел, а также одно число
В целях этой проблемы мы будем игнорировать # 3. Поэтому самый простой язык, который можно использовать на этом сайте (игнорируя № 3), будет иметь ровно две команды, isPrime
и add
. Для удобства интерпретации и количества байтов, давайте назначим isPrime
к p
и add
к +
. Таким образом, у нас есть наш язык +p
. Ваша задача - интерпретировать некоторый +p
код.
Поведение
+
add
инструкция принимает два числа, складывает их и выводит результатp
isPrime
инструкция занимает одно число и выводит ,1
если он является простым, и0
если это не
правила
- Вы должны написать программу / функцию, которая, учитывая строку символов, интерпретирует эту строку как
+p
код. Вы можете принять правильно сформированный ввод (только+
иp
символы). - Ввод гибкий. Вы можете использовать в программе строку, массив символов, целочисленный массив кодовых точек и т. Д. Ввод для интерпретируемой программы также является гибким. Вы можете взять целочисленный массив и использовать записи во время выполнения программы, или каждая инструкция (
+
иp
) может индивидуально запрашивать ввод. Вы можете предположить, что для каждой инструкции будет достаточно ввода. Входные данные гарантированно состоят из чисел от 0 до 200 (но ваши алгоритмы теоретически должны работать для любого положительного целочисленного ввода). - Выход также гибкий. Вы можете распечатать результаты, вернуть их в виде списка, вернуть строку, содержащую все результаты, и т. Д. Если вы печатаете или возвращаете в виде строки, выходные данные должны быть разделены каким-то нецифровым, непротиворечивым разделителем, таким как новая строка, табуляция, пробел или
,
символ. У вас может быть конечный разделитель или какой-то конечный пробел. Кроме того,p
выводом может быть любое истинное или ложное значение, определяемое языком, на котором вы работаете, а не1
или0
. - Переводчик может прекратить или не прекратить (если это полная программа), но он должен прекратить печать после того, как все инструкции будут интерпретированы. (Невозможно продолжить печать разделителя навсегда или нулевой символ и т. Д.).
- Эти стандартные лазейки по умолчанию запрещены
- Это код-гольф , выигрывает ответ с наименьшим количеством байтов
Тестовые случаи
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
----------------------------------
Много, много, очень длинных тестовых случаев
Java-код, используемый для генерации тестовых случаев
пример
Ниже приведена функция Java, которая не будет обрабатываться +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;
}
Примечание. При использовании поискового запроса prime AND add AND interpret is:question
дубликаты этого вопроса, по-видимому, отсутствуют. Если есть, извините.
источник
p
s объединяются без разделителя, это предназначено?isprime
в джулию.Ответы:
05AB1E , 5 байтов
Попробуйте онлайн!
объяснение
Этот вызов подходит 05AB1E как перчатка :)
источник
+
иp
средства добавления и IsPrime в 05AB1E :)Python 2,
135133 байта-2 байта благодаря кундору
источник
i,j=0,0
избыточно, верно? Не может ли это бытьi,j=0
?i=j=0
хотяPython 2 , 91 байт
Попробуйте онлайн!
источник
Haskell,
8879 байтов"commands" ! [args]
для использования.Я все еще изучаю Хаскель; советы по гольфу приветствуются!
источник
i _[]=[]
можно переместить, чтобы он стал последним правилом сопоставления с образцом, а затем его можно сократитьi _ e=e
или сделать что-то вроде_!e=e
того, что вы сделали после перехода на инфиксную запись.(min$product ...
может бытьmin(product ...
.product$map(mod a)
можно сократить доfoldr((*).mod a)1
.Ruby 2,4, 77 + 7 = 84 байта
Использует
-rprime
флаг.источник
Perl 6 , 70 байт
Сначала
rotor
метод используется для разбиения списка ввода на куски размером 1 или 2 в зависимости от того, является ли следующий символ программыp
или нет. Затем этот чанкованный список отображается на карте; куски размера 2 суммируются, а куски размера 1 имеют единственный элемент, проверенный на первичность.источник
Желе , 18 байт
Попробуйте онлайн!
Альтернативное решение, 18 байтов
Попробуйте это онлайн!
источник
C #,
130129 байтовПопробуйте онлайн!
источник
(p,d)=>
чтобыp=>d=>
сохранить байты и сделать каррированную функцию?PowerShell 3+,
151121 байтPowerShell не имеет простых встроенных модулей, поэтому мне пришлось свернуть свои собственные. Моя первая версия была ужасной, и я взял у большинства других, которые проверяют на 0 среди результатов модуля, что экономит много. Также можно использовать несколько байтов
-notin
вместо,-notcontains
но это означает, что PowerShell v2 отсутствует.Объяснение на основе комментариев
источник
F #, 130 байт
Попробуйте онлайн!
источник
QBasic, 122 байта
Принимает код как строку ввода, затем принимает каждый номер ввода в своей строке. Выходные данные чередуются с входными данными, потому что они печатаются сразу после расчета. Значение truthy является
-1
; фальси есть0
.источник