Переводчик - Интерпретировать Код +P

  • Автор темы Navruz_23
  • Обновлено
  • 23, Oct 2024
  • #1

Вдохновленный недавним увлечением еще одним двухсимвольным языком,

 
 prime AND add AND interpret is:question 

Введение

В соответствии с консенсус сообществаприемлемые ответы на этом сайте должны использовать языки программирования, которые как минимум:

  1. Может определить, является ли натуральное число простым
  2. Можно сложить два натуральных числа
  3. Может представлять список/кортеж чисел, а также одно число.

Для целей этой задачи мы проигнорируем №3. Следовательно, самый простой язык, который можно использовать на этом сайте (игнорируя пункт 3), будет иметь ровно две команды: 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 https://stackoverflow.com/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; } и +p . Для простоты интерпретации и подсчета байт присвоим 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 ---------------------------------- to 0 и 1 to p . Итак, у нас есть свой язык, , . Your challenge is to interpret some p код.

Поведение

  • + the p инструкция принимает два числа, складывает их и выводит результат
  • + the +p инструкция принимает одно число и выводит 0 if it is prime, and 1 если это не так

Правила

  • Вы должны написать программу/функцию, которая, учитывая строку символов, интерпретирует эту строку как isPrime code. You may assume well-formed input (only p and add characters).
  • Ввод гибкий. Вы можете принять программу в виде строки, массива символов, целочисленного массива кодовых точек и т. д. Входные данные для интерпретируемой программы также являются гибкими. Вы можете взять целочисленный массив и использовать записи по мере выполнения программы или каждую инструкцию ( + and +p ) может индивидуально запросить ввод. Вы можете предположить, что для каждой инструкции будет достаточно входных данных. Входные данные гарантированно состоят из чисел от 0 до 200 (но теоретически ваши алгоритмы должны работать для любого входного положительного целого числа).
  • Выход также является гибким. Вы можете распечатать результаты, вернуть их в виде списка, вернуть строку, содержащую все результаты, и т. д. При печати или возврате в виде строки выходные данные должны быть разделены каким-либо нецифровым последовательным разделителем, например новой строкой, табуляция, пробел или +p character. You may have a trailing separator or some trailing whitespace. Also, + Вывод может быть любым правдивым или ложным значением, как определено языком, на котором вы работаете, а не add or p .
  • Интерпретатор может завершить работу, а может и не завершить работу (если это полная программа), но он должен прекратить печать после того, как все инструкции будут интерпретированы. (Он не может продолжать печатать разделитель, нулевой символ и т. д. вечно).
  • Эти стандартные лазейки запрещены по умолчанию
  • Это значит, что побеждает ответ с наименьшим количеством байтов.

Тестовые случаи

isPrime

Много, много, очень длинных тестовых примеров

Код Java, используемый для создания тестовых примеров

Пример

Ниже приведена неиспользуемая Java-функция, которая будет интерпретировать add :

isPrime

Примечание. Использование поискового запроса ;# , there do not appear to be any duplicates to this question. If there is one, sorry.

#код-гольф #код-гольф #переводчик

Navruz_23


Рег
07 Sep, 2011

Тем
60

Постов
175

Баллов
505
  • 26, Oct 2024
  • #2

05AB1E, 5 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 listen to S
X's0
while S at X
let X be+1
listen to N
if "+" is S at X-1
listen to I
say N/1+I/1
else
let D be N
let P be N aint 1
while P and D-2
let D be-1
let M be N/D
turn up M
let P be N/D aint M

say P
 

Попробуйте онлайн!

Объяснение

Этот вызов подошёл 05AB1E как нельзя лучше :)

Ëø²эVv j:Vv +Vv ||answer||

Питон 2, 135 133 байта

false

-2 байта благодаря kundor

 

R.Death


Рег
05 Jun, 2014

Тем
73

Постов
196

Баллов
581
  • 26, Oct 2024
  • #4

Хаскель, 88 79 байт

0

-1 for use.

  • Сэкономлено 9 байт благодаря @Laikoni (#56433).

Я все еще изучаю Haskell; советы по игре в гольф оценены!

 

Koster_2


Рег
16 Oct, 2006

Тем
68

Постов
180

Баллов
540
  • 26, Oct 2024
  • #5

Руби 2.4, 77+7 = 84 байта

Использует 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 flag.

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

Перл 6, 70 байт

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

Сначала -notcontains method is used to split the input list into chunks of size 1 or 2 depending on whether the next character of the program is -notin или нет. Затем этот фрагментированный список сопоставляется; фрагменты размера 2 суммируются, а единственный элемент фрагментов размера 1 проверяется на простоту.

 

Ulyana_Pichkar


Рег
07 Apr, 2011

Тем
73

Постов
213

Баллов
598
  • 26, Oct 2024
  • #6

Asiasi


Рег
15 Jan, 2007

Тем
77

Постов
183

Баллов
588
  • 26, Oct 2024
  • #8

PowerShell 3+, 151 121 байт

ÆP,+/ị@L OḂ‘Bṁ@Ç€K

В PowerShell нет основных встроенных модулей, поэтому мне пришлось создать свою собственную. Моя первая версия была ужасной, и я взял из большинства других, которые проверяют 0 среди результатов по модулю, что очень экономит. Также сократилось несколько байтов, используя p instead of rotor но это означает, что PowerShell v2 вышла из строя.

Объяснение на основе комментариев

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

Ф#, 130 байт

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

Попробуйте онлайн!

 

Datus


Рег
21 Mar, 2011

Тем
68

Постов
183

Баллов
543
  • 26, Oct 2024
  • #9

QBasic, 122 байта

-rprime

Принимает код как строку ввода, затем каждое входное число помещается в отдельную строку. Выходные данные перемежаются с входными, поскольку они печатаются сразу после расчета. Истинное значение – это "commands" ! [args] ; falsey is ('+':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 .

 

Igor_korn


Рег
23 Jun, 2004

Тем
85

Постов
199

Баллов
654
  • 26, Oct 2024
  • #10

Япт, 15 байты

Принимает программу как массив символов, выводит p,i=input() for c in p:n=i.pop(0);print all(n%k for k in range(2,n))if c>'+'else n+i.pop(0) or 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 для основного теста.

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

Попробуйте это (Заголовок разбивает программу на массив)

 

Kazanova1985


Рег
11 Jan, 2011

Тем
79

Постов
177

Баллов
572
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно