Прекрасне випробування, яке ЛІТЕРАЛЬНО просто


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"?! ???
адіцу

5
Ви говорите про символи та кодові сторінки. Символ Unicode завжди має однакову точку коду, незалежно від того, яке кодування використовується для його представлення. Що стосується символів, що не належать до ASCII, їм слід присвоїти значення у відповідному кодуванні. змушує мене думати, що ти насправді хочеш, щоб сума байтових значень була первинною
Денніс

Відповіді:




6

Мікроскрипт II, 2 байти (сума 137)

N;

Мікроскрипт 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
Перетворили його на повну самостійну програму.
квартал

::IO IntДійсно не повинно бути необхідним , якщо це не самий короткий шлях ви можете отримати основну суму.
Ørjan Johansen

Гарний дзвінок. Однак ми отримуємо якийсь код, який 'хешує' на рівне значення. Додавання пробілів чи нових рядків нічого не робить (навіть значення), а також зміна назви змінної (вона з’являється чотири рази, тому заміна її коду (скажімо, с) означає віднімання 4 * c та додавання 4 * c ', залишаючи Сума навіть. Однак це можна змінити, перервавши лінії, і все ж бути коротшим, що я і зробив
квартал

1
47 байт з іншим тестом на первинність: Спробуйте в Інтернеті! (зауважте, що замість пробілів є вкладки, щоб правильно рахувати кількість).
Лайконі

Також ласкаво просимо до PPCG!
Лайконі




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якщо ні.

СпробуйтеItOnline!

Байти в шістнадцятковій кількості є 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

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

The Функціональність таким чином, що негативні числа повернення мінус один, нуль повертає нуль і цілі позитивні числа повертають один.

Таким чином, обидві функції повертають однакове значення для простих ліній.

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

Тестування рівності за допомогою =(рівних), e(існує в) або (невекторизуючих рівних) для 5 байт також не дають програм програміст-суми.


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

Якщо обмеження вводу / виводу все ж дозволяють повноцінним програмам, які беруть аргументи.

Æḍ⁼Ṡ

... використовуючи той же принцип, що і вище, де невекторизуюча рівність (невекторизуючий аспект не має ефекту, оскільки векторизувати все одно немає). Значення шестигранні є 0D D5 8C CDякі 13 213 140 205в десяткової системі числення, сума яких дорівнює 571, штрихом.

Ще раз зауважте, що двобайтова програма ÆPне має простої суми (93).


ƓÆPG(311) і ÆPF(163), гадаю?
Лінн

Як Unicode, для ƓÆḍ,ṠE, значення є 16183, яке випадково є простим!
Художник

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

1
... Якщо обидва такі речі добре, то ÆP¥це 3 байти і 97.
Джонатан Алан


1

Математика, 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 bytes, 4583

Pretty straight-forward. Outputs * if prime, otherwise it outputs a space. Does not work for 1.

-2 thanks to l4m2

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

Try it online!


1
n;main(i){for(scanf("%d",&n);++i<n;)n=n%i?n:0;puts("*"+!n);} may need to change some variable name for prime sum
l4m2

@l4m2 Nice one!
gastropner

1

AWK, 36 bytes, byte-sum 2239

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

Try it online!

Outputs 0 if not prime and 1 for prime. Definitely not the most efficient code, since it checks every integer greater than 1 to see if it divides the input.


1

Excel (57 bytes, code sum 3547)

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

Excel doesn't really have an "input" as such, but this formula expects the number to be tested to be in A1 and outputs to whatever cell you drop it in. It's an array formula, so press Ctrl-Shift-Enter to enter it, rather than Enter.


1

Java 8, 114 bytes, 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);}}

Try it online.

Explanation:

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)

I've used x instead of i to make the unicode sum a prime. Verify the unicode sum here.



0

SmileBASIC, 42 bytes, 2687

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

Outputs 1 (true) if the number is prime, otherwise 0 (false).

The variable names were not just chosen to make the program prime. N is the number to test, D is the divisor, and P keeps track of whether N is prime.



0

Rust, 190 bytes, 15013 score

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);
}

Does not work for 1



0

Whispers v2, 33 bytes

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

Try it online!

  1. Score: 44381
  2. Only 6 bytes/2 characters added to make it valid!
  3. 1 is not prime

How it works

This is shown in the order it is executed in:

		; 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.