задача
Напишите функцию, которая принимает два целых числа, a,b
которые представляют гауссово целое число z = a+ib
(комплексное число). Программа должна возвращать true или false в зависимости от того, a+ib
является ли гауссово простое число или нет .
Определение:
a + bi
простое гауссово тогда и только тогда, когда оно удовлетворяет одному из следующих условий:
a
иb
оба ненулевые иa^2 + b^2
простыеa
ноль,|b|
простое и|b| = 3 (mod 4)
b
ноль,|a|
простое и|a| = 3 (mod 4)
Детали
Вы должны только написать функцию. Если в вашем языке нет функций, вы можете предположить, что целые числа хранятся в двух переменных, и распечатать результат или записать его в файл.
Вы не можете использовать встроенные функции вашего языка, такие как isprime
или prime_list
или nthprime
или или factor
. Наименьшее количество байтов побеждает. Программа должна работать для a,b
которой a^2+b^2
является 32 - битной (подпись) целое и должны закончить в значительно не более 30 секунд.
Главный список
Точки представляют простые числа на плоскости Гаусса ( x
= действительная, y
= мнимая ось):
Некоторые большие простые числа:
(9940, 43833)
(4190, 42741)
(9557, 41412)
(1437, 44090)
factor
в Bashmf
иmF
в CJam, ...)Ответы:
Haskell -
77/108107 символовИспользование: в обоих решениях ввод% b вернет, является ли a + bi гауссовым штрихом.
самое низкое, что мне удалось, но без творчества или производительности (77 символов)
это решение просто проходит через все числа ниже n, чтобы проверить, простое ли оно.
версия без золота:
следующее решение имеет дополнительную функцию - запоминание. как только вы проверили, простое ли целое число n, вам не нужно будет пересчитывать «простоту» всех чисел, меньших или равных n, поскольку они будут храниться на компьютере.
(107 символов. Комментарии для ясности)
версия без золота:
здесь используется сито Эратосфена для вычисления бесконечного списка всех простых чисел (в коде это называется l для списка). (бесконечные списки - хорошо известный трюк с haskell).
как можно иметь бесконечный список? в начале программы список не оценивается, и вместо хранения элементов списков компьютер сохраняет способ их вычисления. но когда программа обращается к списку, она частично оценивает себя до запроса. поэтому, если бы программа запрашивала четвертый элемент в списке, компьютер вычислял бы все простые числа до четвертого, которые еще не были оценены, сохранял их, а остальное оставалось бы без оценки, сохраняясь как способ вычисления их один раз необходимо.
обратите внимание, что все это дается свободно ленивой природой языка Haskell, ничего из этого не видно из самого кода.
обе версии программы перегружены, поэтому они могут обрабатывать данные произвольного размера.
источник
C,
149118 знаковОтредактированная версия (118 символов):
Это единственная функция:
Он складывает тест целочисленной простоты в выражение
n/d/d|n<2
скрытое в вычислении возвращаемого значения. Этот гольф-код также используетa*b
в качестве заменыa&&b
(другими словамиa!=0 && b!=0
) и других приемов, связанных с приоритетом оператора и целочисленным делением. Напримерn/d/d
более короткий способ сказатьn/d/d>=1
, что переполнение безопасным способом сказатьn>=d*d
илиd*d<=n
или в сущностиd<=sqrt(n)
.Оригинальная версия (149 символов):
Функции:
Q ( n ) возвращает 0 (false), если n простое число, или 1 (true), если n не простое число. Это вспомогательная функция для G ( a , b ).
G ( а , b ) возвращает 1 (true), если a + bi - простое гауссово, или 0 (false) в противном случае.
Пример вывода (увеличен на 200%) для | |, | б | ≤ 128:
источник
d++
не происходило как часть условия, иначе это портит логику следования. Кроме того, перемещениеd=2
внутриfor
цикла на самом деле увеличивает количество символов, а не уменьшает его, потому чтоd
все еще нужно объявить какint
доfor
цикла. Я что-то пропустил?G(a,b){int s=abs(a)+abs(b),n=a*b?a*a+b*b:s,d=2;for(;n/d/d&&n%d;d++);return n>1>n/d/d&&s%4/3|a*b;}
получается всего 97 символов.APL (Dyalog Unicode) ,
36474849474328 байтПринимает массив из двух целых чисел
a b
и возвращает логическое значение оператораa+bi is a Gaussian integer
.Изменить: +11 байт, потому что я неправильно понял определение простого гауссова. +1 байт от исправления ответа снова. +1 байт из третьего исправления ошибки. -2 байта из-за использования поезда вместо dfn. -4 байта благодаря ngn благодаря использованию охранника
condition: if_true ⋄ if_false
вместоif_true⊣⍣condition⊢if_false
. -15 байт благодаря ngn благодаря нахождению совершенно другого способа записи условия if-else как полноценного поезда.Попробуйте онлайн!
объяснение
источник
Haskell - 121 символ (включая новые строки)
Вот сравнительно простое решение на Haskell, которое не использует никаких внешних модулей и использует как можно больше.
Вызовите как,
ghci ./gprimes.hs
а затем вы можете использовать его в интерактивной оболочке. Примечание: отрицательные числа являются привередливыми и должны быть заключены в скобки. Т.е.источник
Питон -
121120 символовp
проверяет,abs(x)
простое ли , перебирая все числа от 2 доabs(x)**.5
(что естьsqrt(abs(x))
). Он делает это, уступаяx % s
каждомуs
.all
затем проверяет, являются ли все полученные значения ненулевыми, и прекращает генерировать значения, когда встречает делительx
. Вf
,f(b,a)
заменяет случайb==0
, вдохновленный ответом Хаскелла @killmous .-1 символ и исправление от @PeterTaylor
источник
s<abs(x)**.5
на 2s*s<abs(x)
для экономии. Хотя на самом деле вы должны проверять<=
, так что это, вероятно, глючит в настоящее время.f(0,15)
даетTypeError: unsupported operand type(s) for &: 'bool' and 'generator'
с моим переводчиком. :(f(0,15)
даетFalse
для меня, как на 2.7.6 и 3.4.1 (на OS X). На какой версии вы находитесь?Python 2,7 ,
341301253 байта, оптимизирован для скоростиПопробуйте онлайн!
Спасибо: 40 +48 - вся игра в гольф для Джо Кинга
источник
f
Лямбда также uneccesary, наряду сlist
вызовом. 257 байт без таковых, плюс некоторое удаление пробелов. Это, возможно, уже не так эффективноPerl -
110107105 символовНадеюсь, я правильно следовал приведенному определению ...
Ungolfed:
Объяснение, потому что кто - то спросил: Я прочитал аргументы (
@_
) и поместить их абсолютные значения в$a
,$b
, потому что функция не нуждается в их знак. Каждый из критериев требует проверки простоты числа, но это число зависит от того , равны ли они нулю$a
или$b
нет, что я попытался выразить кратчайшим образом и вставить$n
. Наконец, я проверяю,$n
является ли простое число, подсчитывая, сколько чисел между 2 и само делит его без остатка (этоgrep...<2
часть), а затем дополнительно проверяю, что если одно из чисел равно нулю, то другое равно 3 по модулю 4. Функция возвращаемое значение по умолчанию является значением его последней строки, и эти условия возвращают некоторое истинное значение, если все условия были выполнены.источник
$a%4>2
вместо$a%4==3
.Golflua
147141Приведенный выше счет не учитывает добавленные мной новые строки, чтобы увидеть различные функции. Несмотря на настойчивость не делать этого, я брут-форс решаю простые числа внутри случаев.
Возвращает 1, если истина, и 0, если нет.
Версия Lua без роли,
источник
tonumber(io.read())
в качестве аргументаg
в конце, и еще 2, удалив символы новой строкиa
где,|a| <= |z|
еслиa | z
(еслиa
делитz
).APL (NARS), 99 символов, 198 байтов
тестовое задание:
источник
Рунические чары , 41 байт
Попробуйте онлайн!
В итоге оказалось намного проще, чем я думал, и не было много места для игры в гольф. Исходная программа, которую я заблокировал, была:
Я попытался сравнить оба входа одновременно (что позволило сохранить все один 1 байт), но когда это упало в раздел «один из них равен нулю», не было хорошего способа выяснить, какой элемент был ненулевым, чтобы выполнить последнюю проверку, тем более способ сделать это, не тратя как минимум 1 байт (без общей экономии).
источник
Mathematica, 149 персонажей
Код не использует никаких стандартных функций простых чисел mathematica, вместо этого он подсчитывает количество целых чисел в списке {n / 1, n / 2, ..., n / n}; если число 1 или 2, то n простое число. Разработанная форма функции:
Бонусный график всех гауссовых простых чисел от -20 до 20:
источник
Рубин
-rprime
,656080 байтНе заметил правила "не могу использовать isPrime" ...
Попробуйте онлайн!
источник
Питон -
117 122121источник
==3
с>2