Перенесено, простые числа, о боже!


15

Задача проста: ваша программа читает целое число в качестве входных данных и печатает, является ли оно простым или нет. Вы можете напечатать «да / нет», «правда / ложь» или что угодно, что однозначно идентифицирует результат.

Проблема в том, что код должен работать со своими транспонированными строками и столбцами.

Чтобы исключить очевидное решение (самое короткое «простое» решение, повторяющееся вертикально за символом с использованием комментариев), метрика немного отличается от обычного кода-гольфа:

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

int main()   
{            
    return 0;
}            

будет иметь размер 4 * 13 = 52 (и, очевидно, он не соответствует ни одному из двух критериев: простое обнаружение и транспонирование.)

Наименьший размер побеждает.

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

Редактировать:

Хотя победителем, скорее всего, станет решение от Golfscript, я получу награду в 50 баллов за лучшее решение на C или C ++!


Ваша метрика прямоугольника не препятствует очевидному решению - лучше было бы взять самую длинную сторону стороны. Хотя, это уменьшило бы ответ GS до 4 баллов
Boothby

Вы правы. Следующая транспонированная задача должна иметь другую метрику и запрещать симметричные решения. Однако я думаю, что даже тогда найдется кто-то, кто обойдет правила или, по крайней мере, найдет решение, которого QA не ожидал при составлении правил.
вс

Ответы:


7

GolfScript, 13 × 1

~.,2>{1$\%!}?

GolfScript поражает снова!

Повторяет ввод, если он является простым, иначе печатает ввод, соединенный с его наименьшим правильным делителем. Да, я знаю, что это растягивает определение «всего, что однозначно идентифицирует результат», но выполнение чего-то более сложного стоило бы несколько дополнительных символов. Если вы хотите более приятный вывод, добавление трех символов ;]!в код приводит 1к простым и 0сложным числам.

Алгоритм действительно неэффективен, просто пробное деление методом грубой силы от 2 до n − 1. Большинство операторов GolfScript являются только одиночными символами, поэтому этот код работает так же хорошо, как и транспонированный. Досадно, однако, что оператор присваивания :не допускает пробелов между собой и его целью, поэтому мне пришлось делать это полностью без переменных.


«Любое более дорогое стоило бы нескольких дополнительных символов» - вы можете получить логическое значение в стиле GolfScript всего за 2.
Питер Тейлор

@Peter: Вы имеете в виду что-то вроде моего редактирования выше, только без !? Или ты задумал что-то более замысловатое?
Илмари Каронен

1
Я думал )до того, ,что всегда найдет делитель и =в конце.
Питер Тейлор

:сопровождаемый символом новой строки, присваивает символ новой строки - так что это не значит, что пробел не разрешен, это просто то, что ему присваивается
пробел

@gnibbler: Технически, мы оба правы. :не допускает пробелов или чего-либо еще между собой и его целью: то, что сразу следует за ним, будь то пробел или любой другой токен (да, даже числа, строки или кодовые блоки), это то, что присваивается. Тем не менее, пробел - это то, о чем официально предупреждает официальная документация, и на то есть веская причина - поскольку в большинстве других мест добавление пробела между токенами в GolfScript ничего не делает (обычно, если оно не назначено ...).
Илмари Каронен

21

С, 2 * 70, 2 * 60

Принты yдля простых чисел, ничего другого.
РЕДАКТИРОВАТЬ : Изменен код, чтобы сохранить 10 символов. Должен быть запущен без параметров (так m=1).

main(m,n){for(scanf("%d",&n);n%++m&&n>1;);n-m||puts("y");}/*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ 

Метод обработки транспонирования довольно универсален и может применяться к любой программе.
Это основано на преобразовании этого:

abcd/*
\\\\*/

К этому:

a\
b\
c\
d\
/*
*/

И оба значат просто abcd.


вау, умное неправильное использование конкатенации строк :)
vsz

2
Это сайт для игры в гольф / пазлы. Нет такой вещи как неправильное использование.
Бут

2
@ boothby, я думаю, он имеет в виду насилие. Но я не спорю с комплиментами.
Угорен

14

C - 13x13

Читает входные данные из стандартного ввода и печатает 1для простого и0 для не простого.

////m(i;(a=)<
////aans")a;2
//:Di)tc%;;p)
//O n{ adfau+
main//bn"o%t4
(a){///f,r-c8
int b///&(-h)
;scanf///bba;
("%d",&///;r}
a);for(b///( 
=a;a%--b;//( 
);putchar((b 
<2)+48);}    

edit: теперь компилируется с gcc и clang, другие компиляторы не тестировались


12

С, 12x12 символов

Двумерное решение, в отличие от моего другого ответа , основано на том же коде (и, как он, печатает yдля простого, ничего для составного).
Структура похожа на ответ Quasimodo , но мой код короче, и я думаю, что мое использование comemnts немного более эффективно, поэтому я могу уместить 12x12.

////m()s";np
////am{c%n>u
////i,fad%1t
////nnon"+;s
main//rf,+)(
(m,n//((&m;"
){for(//n&ny
scanf(//)&-"
"%d",&n)//m)
;n%++m&&//|;
n>1;);n-m|| 
puts("y"); }

7

Perl, 14 х 14

Я думаю, что я понимаю это. Укажите число в качестве аргумента командной строки, output 0или 1. Вероятно, больше возможностей для улучшения.

$   n=pop;$p|=
 !  ($n%$_)for
  2 ..$n/2;   
   print!$p+m~
n(.r          
=$.i          
pn$n          
o%nt          
p$/!          
;_2$          
$);p          
pf +          
|o m          
=r ~          

3

Q

Неправильные комментарии для симметричного, неэффективного по характеру решения.

/{/////////////////////////////////
{(~)any 0=mod[x;2+(!)x-2]}"I"$(0:)0
/~
/)
/a
/n
/y
/ 
/0
/=
/m
/o
/d
/[
/x
/;
/2
/+
/(
/!
/)
/x
/-
/2
/]
/}
/"
/I
/"
/$
/(
/0
/:
/)
/0

Принимает входные данные из STDIN, возвращает логическое значение.


Заметил sqrtтам. При поиске простых чисел в коде-гольфе обычно выгодно (расточительно) делить весь путь до n, а не останавливаться на sqrt n.
Гнибблер

Очень верно, спасибо. У меня еще не было возможности попытаться получить лучший результат.
skevey

Вы должны включить оценку в свой ответ
FlipTack

2

Желе , квадрат 2х2

PÆ
ÆP

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

Я думаю, что у меня есть часть транспонирования, и если это так, то транспонированная версия этого

PÆ
ÆP

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

(это тот же код)


4
Это является недопустимым: « Вы можете использовать любой язык, и любой библиотеки функции , кроме , если единственная цель этой функции найти, генерировать, или обнаружить простые числа . »
Кевин Cruijssen

1

05AB1E , 1x5 1x3 ( 5 3 байта )

Это не одна большая программа; каждая строка представляет собой отдельную альтернативную программу для выполнения первичной проверки (без использования встроенной первичной проверки).

ÑPQ
ÒgΘ
ÒQP
ÕαΘ
fQO
fs¢
f`Q

-2 байта благодаря Грими .

Пробелы между строками не используются в 05AB1E, и, поскольку я использую только однобайтовые команды, это прекрасно работает после транспонирования.

Выходы 1/ 0для правды / фальси соответственно.

Попробуйте первый онлайн или проверьте еще несколько тестовых примеров для всех из них (с встроенным eval .V) .
Транспонирование: попробуйте первый онлайн .

Объяснение:

Ñ    # Get a list of all divisors of the (implicit) input-integer
     # (which would be only 1 and the integer itself for primes)
 P   # Take the product of that list
  Q  # And check if it's equal to the (implicit) input-integer

Ò    # Get a list of all prime factors of the (implicit) input-integer 
 g   # Get the amount of those prime factors by taking the length of the list
  Θ  # Check if that's equal to 1 (so only itself is a prime factor)

Ò    # Get a list of all prime factors of the (implicit) input-integer including duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
     # (1 if truthy; 0 if falsey)
  P  # Take the product of those checks (resulting in either 1 or 0 as well)

Õ    # Get the Euler totient of the (implicit) input-integer
 α   # Take the absolute difference with the (implicit) input-integer
  Θ  # Check if that's equal to 1

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
  O  # And take the sum of that (resulting in either 1 or 0)

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 s   # Swap to get the (implicit) input-integer
  ¢  # And count how many time it occurs in the list

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 `   # Dump all the content of this list onto the stack
  Q  # Check if the top two values are equal, or if only a single value is present, it will
     # use the (implicit) input-integer as second value

     # For all these program the same applies at the end:
     # (implicitly output the result with trailing newline)

Примечание: Если только / значение falsey truthy является действительным, и это не нужно есть , чтобы быть различны, либо , Ògили Õαможет быть использовано в качестве действительного 2-byters, так как только 1это truthy в 05AB1E, а все остальное falsey: Попробуйте оба их для некоторых тестовых случаев .

Если бы встроенные функции были разрешены, одного pбыло бы достаточно: попробуйте онлайн или проверьте еще несколько тестов .


1
ÑPQили ÒgΘили ÒQPза 3 байта. ( Ñи Òоба имеют другие цели, кроме «найти, сгенерировать или обнаружить простые числа», поэтому, по моим сведениям, они не включены в бан).
Grimmy

1
Больше 3- х byters: ÕαΘ, fQO, fs¢,f`Q
Grimmy

@ Грими Ах, не могу поверить, что я не думал о делителях или встроенных простых множителях ... Я ответил слишком быстро, наверное. ÕαХотя не знал о ! Это довольно мило.
Кевин Круйссен

0

Рунические чары , 7 × 1

v̀i'PA@

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

Руника не заботится о ваших слабых попытках перестановки источников! В соответствии с требованием все еще функционировать после транспонирования источника стоимость +3 байта (+2 ширины прямоугольника) для модификатора отражения и точки входа.

Транспонированный или транспонированный, но оставляющий объединяющий символ прикреплен к его родителю .





0

APL (Dyalog Unicode) , 10x11

{⍵∊∘.×⍨1↓⍳⍵          
           
           
 .          
 ×          
           
 1          
           
           
          }

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

Исправлена ​​функция для соответствия спецификациям. Спасибо @ Adám за хедз-ап.

Возвращает 0 для правдивых, 1 для ложных .

Как

{⍵∊∘.×⍨1↓⍳⍵  Dfn. everything below this is a noop up until closing the brace
         ⍳⍵  Range [1..arg]
       1    Dropping the first element (yields [2..arg])
   ∘.×⍨      Multiplication table for each element in the vector
 ⍵∊          Check if the argument is in the table.

Транспонированная версия точно такая же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.