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:
- Potrafi ustalić, czy liczba naturalna jest liczbą pierwszą
- Można dodać dwie liczby naturalne razem
- 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, isPrime
i add
. Aby ułatwić interpretację i liczbę bajtów, przypiszmy isPrime
do p
i add
do +
. Tak więc, mamy języka +p
. Twoim zadaniem jest interpretacja +p
kodu.
Zachowanie
+
add
nauka trwa dwa numery, dodaje je i wysyła wynikp
isPrime
nauka trwa jeden numer i wyprowadza1
jeśli to jest pierwsza, a0
jeśli nie jest to
Zasady
- Musisz napisać program / funkcję, która, biorąc pod uwagę ciąg znaków, interpretuje ten ciąg jako
+p
kod. Można założyć, dobrze uformowany (tylko wejście+
ip
znakó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 (
+
ip
) 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,p
wynikiem może być dowolna wartość prawdy lub fałszu, zdefiniowana przez język, w którym pracujesz, a nie1
lub0
. - 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 golf golfowy , 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:question
nie wydaje się, aby były duplikaty tego pytania. Jeśli jest, przepraszam.
isprime
w Julii.
p
s są łączone bez separatora, czy to jest zamierzone?