Премьер-тест, который буквально премьер


23

Напишите программу, которая проверит простоту указанного числа и выдаст вывод в виде логического значения (True - простое число). Ваш основной тест может (но не обязан) быть действительным для числа 1.

Вот подвох: ваша программа сама должна суммировать до простого числа. Преобразуйте каждый символ (включая пробелы) в его значение Unicode / ASCII ( таблица ). Затем сложите все эти числа вместе, чтобы получить сумму вашей программы.

Например, возьмем эту не очень хорошую программу, которую я написал в Python 3.3:

q=None
y=int(input())
for x in range(2,int(y**0.5)+1):
    if y%x==0:
        q=False
if not q:
    q=True
print(q)

Если вы преобразуете все символы в соответствующие им значения Unicode / ASCII, вы получите:

113 61 78 111 110 101 10 121 61 105 110 116 40 105 110 112 117 116 40 41 41 10 102 111 114 32 120 32 105 110 32 114 97 110 103 101 40 50 44 105 110 116 40 121 42 42 48 46 53 41 43 49 41 58 10 32 32 32 32 105 102 32 121 37 120 61 61 48 58 10 32 32 32 32 32 32 32 32 113 61 70 97 108 115 101 10 105 102 32 110 111 116 32 113 58 10 32 32 32 32 113 61 84 114 117 101 10 112 114 105 110 116 40 113 41 

Затем вы можете найти сумму этих чисел вручную или с помощью своей собственной программы. Эта конкретная программа суммирует 8293, что является простым числом.

Конечно, это Code Golf, поэтому чем меньше вы можете сделать свою программу, тем лучше. Как отмечают другие пользователи, эта программа не очень удачная.

Несколько правил:

Допустимые входные данные включают STDIN и подсказки (без функций, это просто способ добавить дополнительный дополнительный код). Пробелы разрешены, но только если они имеют решающее значение для функциональности вашей программы. Вывод должен быть выводом, а не просто храниться в переменной или возвращаться (используйте print, STDOUT и т. Д.)

Флаги могут быть использованы и должны учитываться буквально, а не расширяться. Комментарии не допускаются. Что касается не-ASCII символов, им следует присвоить значение в соответствующей кодировке.

Обязательно перечислите размер вашей программы и сумму программы. Я проверю, чтобы убедиться, что программы действительны.

Удачи!

Вот фрагмент кода для подсчета суммы вашей программы и проверки ее простоты:


12
В языках, не связанных с игрой в гольф, похоже, что вы можете просто взять самый короткий код выбора простых чисел и изменять имена переменных до тех пор, пока сумма не станет простой.
xnor

5
Почему ограничения на ввод / вывод?
Джонатан Аллан

2
Что такое "Unibyte value"?! ???
aditsu

5
Вы говорите о символах и кодовых страницах. Символ Unicode всегда имеет одну и ту же кодовую точку, независимо от того, какая кодировка используется для ее представления. Что касается не-ASCII символов, им следует присвоить значение в соответствующей кодировке. заставляет меня думать, что вы на самом деле хотите, чтобы сумма значений байтов была простой
Деннис

Ответы:




6

Microscript II, 2 байта (сумма 137)

N;

Microscript II, 4 байта (сумма 353)

N;ph

Я на самом деле очень удивлен, что оба из них оказались с байтовыми суммами.



4

Pyth, 2 байта, 127

/P

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

Выходы 1для простых чисел, 0для не простых чисел.

/имеет кодовую точку 47. Pимеет кодовую точку 80.

Как это работает:

/P
/PQQ    Implicit variables.
        Q = input
 PQ     Prime factorize Q.
/  Q    Count how many times Q appears. 1 if prime, 0 if not.

4

Haskell, 52 байта, 4421

main=do
 k<-readLn
 print$product[1..k-1]`rem`k==k-1

Теорема Вильсона.


2
Превратил это в полноценную автономную программу.
fquarp

На ::IO Intсамом деле не должно быть необходимости, если это не самый короткий способ получить простую сумму.
Эрджан Йохансен,

Хороший звонок. Однако затем мы получаем некоторый код, который "хэширует" четное значение. Добавление пробелов или новых строк ничего не делает (даже значения), а также не меняет имя переменной (она появляется четыре раза, поэтому замена ее кода (скажем, с) означает вычитание 4 * c и добавление 4 * c ', оставляя Сумма даже. Однако, это может быть изменено, ломая линии и все еще быть короче, что я и сделал
fquarp

1
47 байт с другим тестом на простоту: попробуйте онлайн! (обратите внимание, что для правильного подсчета есть вкладки вместо пробелов).
Лайкони

Также добро пожаловать в PPCG!
Лайкони

4

Python 2, 50 байт, 4201

Работает для 1. Выход положительный, если простое, или ноль, если нет.

p=input();print all(p%m for m in range(2,p))*~-p;p

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


Python 2, 44 байта, 3701

Не работает для 1. Выводит логическое значение.

p=input();print all(p%k for k in range(2,p))

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



3

05AB1E , 2 байта,173

p=

Объяснение:

p  # Checks if number is prime - returns 1 if true and 0 if false. Uses implicit input.
 = # Wouldn't usually be required for this sort of program, but I added it to make the sum prime.

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


Что-то что-то "комментарии не разрешены", но я думаю, что эффективные no-ops работают нормально: D
Value Ink

2

PHP, 38 байт, сумма 2791

Интересный факт: если $hвместо $c, сумма будет 2801(также простое число), и ее двоичное представление, 101011110001читаемое как десятичное, также будет простым числом.

for($b=$c=$argv[1];$c%--$b;);echo$b<2;

принимает аргумент командной строки, печать 1или пустую строку. Беги с -r.

Код взят из моей собственной основной функции (посмотрите оригинальный пост, если можете).


@Artyer Это исправлено.
Тит

2

R, 27 32 байта, сумма 2243 2609

Сохранено 5 байт благодаря @rturnbull

cat(gmp::isprime(scan(),r=43)>0)

Это использует функцию isprime библиотеки gmp.

> sum(as.integer(charToRaw('cat(!!gmp::isprime(scan()))')))
[1] 2243
> cat(!!gmp::isprime(scan()))
1: 2243
2: 
Read 1 item
TRUE
> 

cat(!!gmp::isprime(scan()))на 5 байт короче, и суммы 2243тоже простые.
rturnbull

@rturnbull спасибо за это :)
MickyT


1

Желе 6 байт , байт-сумма 691

ƓÆḍ,ṠE

печатает, 1если премьер и 0если нет.

TryItOnline!

Байты в шестнадцатеричном формате 93 0D D5 2C CD 45(см. Кодовую страницу ) или в десятичном виде представляют собой 147 13 213 44 205 69сумму, равную 691, что является простым числом .

Как?

ƓÆḍ,ṠE - Main Link: no arguments
Ɠ      - read and evaluate a line from STDIN (integer expected)
 Æḍ    - proper divisor count
   ,   - paired with
    Ṡ  - sign
     E - all equal? - returns a boolean (1 or 0)
       - implicit print

ÆḍФункциональность таким образом, что простые числа и их отрицаний возвращать одно , а другие целые числа не (композитов и их отрицаний возвращают число больше , чем один, один и минус одного возврата ноль и ноль возвращается, как ни странно, минус один).

Функциональность таким образом, что отрицательные числа возврата минус один, ноль возвращает ноль и целые положительные числа возвращают один.

Таким образом, две функции возвращают одно и то же значение для простых чисел.

Обратите внимание, что 3-байтовая программа ƓÆP которая непосредственно проверяет, является ли входной сигнал из STDIN простым, к сожалению, не является программой с простой суммой (240).

Проверка на равенство с использованием =(equals), e(существует в) или (non-vectorizing equals) для 5 байтов также не дает программ с простой суммой.


Альтернатива (возможно, не приемлемая) 4 байта, сумма 571

Если ограничения ввода / вывода все еще разрешают полные программы, которые принимают аргумент.

Æḍ⁼Ṡ

... используя тот же принцип, что и выше, где равенство невекторизируется (аспект невекторизации не имеет никакого эффекта, так как в любом случае нечего векторизовать). Шестнадцатеричные значения - 0D D5 8C CDэто 13 213 140 205десятичные числа, сумма которых равна 571, простое число.

Еще раз отметим, что 2-байтовая программа ÆPне имеет простой суммы (93).


ƓÆPG(311) и ÆPF(163) должно быть в порядке, я думаю?
Линн

Как и в Юникоде, для ƓÆḍ,ṠEзначения есть 16183, что по простому совпадению!
Artyer

@Lynn Да, похоже, «ненужное ограничение кода» (за исключением символа пробела) снято, что делает ƓÆPGОК. Я также спросил, приемлема ли программа, принимающая ввод, а не использующая STDIN.
Джонатан Аллан

1
... Если обе эти вещи в порядке, то ÆP¥это 3 байта и 97.
Джонатан Аллан


1

Mathematica, 21 байт, 1997

Print@*PrimeQ@Input[]

Input[]читает строку ввода (из STDIN , если не используется передний конец, через диалоговое окно , если используется передний конец Mathematica), Print@*PrimeQпредставляет собой композицию ( @*) из Printи PrimeQфункций, и @является функцией префикса обозначения.


1

Perl 6 , 24 22 байта,1949

say .is-prime
for +get

Все три пробельных символа обязательны.
(Perl 6 не волнует, что это за символы пробела, поэтому я выбрал новую строку вместо более часто используемого пробела для второго ...)



1

Пип , 8 байт,511

0Na%,a=1

Я написал главный чекер, и сумма была простой. Удобный. Проверьте ввод 1-30: попробуйте онлайн!

объяснение

          a is first command-line argument
    ,a    Numbers from 0 to a-1
  a%      Take a mod each of those numbers (a%0 gives nil)
0N        Count number of times 0 occurs in that list
      =1  If 0 occurs only 1 time (for a%1), then a is prime


1

J, 18 байт, 1103

echo 1&p:".(1!:1)1

Не далеко от оптимального, по крайней мере, я мог сыграть в гольф тест на первичность по полной программе - 17 байт: echo(p:[:".1!:1)1 , что, к сожалению, составляет 1133 = 11 * 103.

К сожалению, я не могу понять, как заставить ввод с клавиатуры работать на TIO, так что никакой ссылки пока нет.

Объяснение:

echo 1&p:".(1!:1)1  | Full program
           (1!:1)1  | Read a line of input from keyboard
         ".         | Evaluate (converts string to int)
     1&p:           | 1 for prime, 0 for composite
echo                | Print result. The space is required, as 'echo1' would be interpreted as a variable

Проверка программы:

   1 p:+/u:inv'echo 1&p:".(1!:1)1'  NB. Convert to ints, sum, and test primality
1

1

C (gcc) , 62 60 байтов, 4583

Довольно просто. Выходные данные * если простые, в противном случае выводится пробел. Не работает на 1.

-2 благодаря l4m2

p;main(i){for(scanf("%d",&p);++i<p;)p=p%i?p:0;puts("*"+!p);}

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


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);}возможно, потребуется изменить имя переменной для простой суммы
l4m2

@ l4m2 Хороший!
гастропнер

1

AWK , 36 байтов, байтовая сумма 2239

{for(a=1;$0%++a&&a<$0;);$0=(a==$0)}1

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

Выходы, 0если не простые и 1простые. Определенно, не самый эффективный код, так как он проверяет каждое целое число больше, чем 1чтобы увидеть, делит ли он ввод.


1

Excel (57 байт, кодовая сумма 3547)

=XOR(0<PRODUCT(MOD(A1,ROW(OFFSET(D2,0,,SQRT(A1))))),3>A1)

В Excel на самом деле нет «входных данных» как таковых, но эта формула предполагает, что проверяемое число будет в A1, и выводится в любую ячейку, в которую вы его поместили. Это формула массива, поэтому нажмите Ctrl-Shift-Enter для ввода это, а не Enter.


1

Java 8, 114 байт, Prime 10037

interface M{static void main(String[]a){long n=new Long(a[0]),x=2;for(;x<n;n=n%x++<1?0:n);System.out.print(n>1);}}

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

Объяснение:

interface M{                     // Class
  static void main(String[]a){   //  Mandatory main-method
    long n=new Long(a[0]),       //   The first argument as number
    x=2;for(;x<n;n=n%x++<1?0:n); //   Check if `n` is a prime
    System.out.print(n>1);}}     //   Print whether `n` was a prime
                                 //    (if `n` is still the same: it's a prime;
                                 //     if `n` is now 0 or 1: it's not a prime)

Я использовал xвместо того, iчтобы сделать сумму Unicode простым. Проверьте сумму Unicode здесь.



0

SmileBASIC, 42 байта, 2687

INPUT N:FOR D=2TO N/2P=P+!(N MOD D)NEXT?!P

Выводит 1 (true), если число простое, в противном случае 0 (false).

Имена переменных были выбраны не просто для простоты программы. Nявляется п умбра к испытанию, Dявляется д ivisor, и Pотслеживает ли п р изморозь.



0

Ржавчина, 190 байт, 15013 баллов

fn main(){let A=&mut"".into();std::io::stdin().read_line(A);let(B,mut C)=(A.trim().parse::<u64>().unwrap(),true);for H in 2..((B as f64).sqrt()+1.0) as u64{if B%H==0{C=false}}print!("{}",C)}

Ungolfed

fn main() {
    let input = &mut "".into();
    std::io::stdin().read_line(input);
    let (number, mut prime) = (input.trim().parse::<u64>().unwrap(), true);

    for x in 2..((number as f64).sqrt() + 1.0) as u64 {
        if number % x == 0 {
            prime = false;
        }
    }

    print!("{}", prime);
}

Не работает на 1


0

|pQработает на счет 317. Если допускается обмен правдой / ложью, то |p!работает и на 269.
Khuldraeseth na'Barya

Спасибо. Я не думаю, что вызов требует, чтобы счет был минимизирован, поэтому я не настраивал эту часть.
Вейцзюнь Чжоу

0

Whispers v2 , 33 байта

>>> ⊤ℙ∘ℕ
> Input
>> 1∘2

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

  1. Гол: 44381
  2. Только 6 байтов / 2 символа добавлены, чтобы сделать его действительным!
  3. 1 не простое

Как это работает

Это показано в порядке выполнения:

		; Line 3:
>>  ∘		; Compose...
   1            ; Line 1 with
     2          ; The result of line 2

		; Line 2:
> Input		; Retrieve a line of input

		; Line 1:
>>> ⊤		; The input is...
     ℙ		; Prime
      ∘		; And it is...
       ℕ	; Natural
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.