Напишите программу, которая запрашивает у пользователя четное целое число больше 2.
Учитывая гипотезу Гольдбаха о том, что каждое четное целое число, большее 2, может быть выражено как сумма двух простых чисел, выведите два простых числа, которые при сложении вместе дают запрошенное четное число. Изменить: программа должна распечатать только пару простых чисел, а не все. Например:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 или 3 + 7
Ответы:
APL, 34 или 44 байта
Первая версия имеет длину 34 символа и ограничена символами из исходных однобайтовых кодировок APL, например, поддерживаемых в Dyalog APL:
Объяснение:
Вторая версия имеет длину всего 22 символа, потому что она использует
π
функцию для проверки простых чисел, но она доступна только в NARS2000, который использует Unicode, поэтому число байтов равно 44 в UCS-2:Объяснение:
Примеры
(⎕: запрос на ввод номера)
источник
¯2π⍳2πn
работать в качестве основного генератора?π
точно делает оператор?π
переключается с⍺
:¯2πx
вычисляет x-е простое число,¯1πx
первое простое число меньше x,0πx
проверяет x на простоту,1πx
первое простое число больше x,2πx
является числом простых чисел меньше x,10πx
является числом делителей x,11πx
является суммой из всех делителей x,12πx
и13πx
являются функции Мёбиуса и totient, соответственно. И последнее, но не менее важное: монадическоеπx
возвращает простую факторизацию x.Python 2,
7571 байтПроверьте это на Ideone .
Как это устроено
Мы используем следствие теоремы Вильсона :
Во все времена переменная m равна квадрату факториала k - 1 ; k начинается со значения 1, а m со значения 0! ² = 1 . Множество p будет состоять из 0 и всех простых чисел вплоть до текущего значения k .
На каждой итерации мы сначала проверяем, принадлежат ли n - k и k к p , что верно тогда и только тогда, когда разность множеств {nk, k} и p пуста. Если это так, условие ложно, и цикл продолжается.
Обратите внимание, что k> 0 и {n - k, k} будут удовлетворять условию для некоторого положительного значения n - k (при условии, что гипотеза Гольдбаха верна), поэтому 0 в p не приведет к ложным срабатываниям.
В цикле мы обновляем k и m . Новое значение m равно m × k² = (k - 1)! ² × k² = k! ² , а новое значение k равно k + 1 , поэтому m = (k - 1)! ² сохраняется до и после обновление.
Затем мы выполняем объединение множеств, чтобы добавить значение m% k × k к p . По следствию из теоремы Вильсона это добавит 1 × k = k, если k простое, и 0 × k = 0, если нет.
Когда цикл заканчивается, мы печатаем последние значения n - k и k , которые будут простыми числами с суммой n .
источник
Рубин 2.0 (65)
источник
PHP - 73 байта
Ввод принимается в качестве аргумента командной строки.
Пример использования:
источник
GolfScript
413332Принимает аргумент командной строки, например
Находит все соответствующие разделы входного номера с помощью:
и затем находит первый раздел, где никакие числа НЕ являются простыми с:
где составной проверочный блок
np
:этот блок фильтрует все числа, которые равномерно делят данное число. Если таких чисел нет (так что число простое), результат
[]
будет неправильным в GolfScript.источник
Perl 6: 69
источник
R,
17011283 символовОтступ:
Использование:
Старое решение на 112 символов, для потомков
Отступ:
источник
Питон - 107
В основном улучшение второй части ответа нутрии (я запустил это на 2.7, но я думаю, что это также должно работать на 3.x)
источник
:
обязательных?JavaScript (ES6) (Regex), 105
Теперь у вас есть регулярное выражение, которое проверяет гипотезу Гольдбаха, которая требует низких требований к специальным функциям (базовая обратная поддержка, положительный и отрицательный прогноз).
Это использует
String.prototype.repeat()
, что является частью предложения EcmaScript 6th edition. В настоящее время этот код работает только в Firefox.Мне действительно нужен лучший язык, который имеет краткую команду при работе с регулярными выражениями ...
источник
Scala,
286192172148 символовНе самый быстрый, но это работает. Вызовите g (10), чтобы получить список пар Гольдбаха для 10.
Преобразование в C ++ является простым.
источник
C -
139129 знаковисточник
int
объявления в вашей функцииi
. Вы можете сохранить еще 2 символа, удаливif
и добавив еще один двойной амперсанд:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Я никогда не привыкну к глушению типа аргумента ...)newLISP -
169148 символоввключает в себя код для его запуска. Результаты чрезмерно щедры ...
источник
Шалфей, 60
Схожи по баллам и ощущениям с решением res , но я думаю, что это достаточно отличается для публикации.
источник
Шалфей ,
6562С указанным выше в файле
goldbach.sage
, выполните его с Sage, работающим в терминале:Спасибо @boothby за
p=is_prime
идею.источник
p=is_prime
.Haskell, 97C
Объяснение:
g
это функция "goldbach". призваниеg n
дает вам пару простых чисел, которые складываются вn
.p
это функция, которая генерирует список простых чисел меньше, чемn
.c
является основной функцией проверки, используемой для определенияp
.Пример работы:
источник
Mathematica 56
Это возвращает все решения для входного целого числа.
Например, когда вводится 1298…
Как написано, он возвращает каждое решение дважды.
источник
Юлия, 62 символа (85 с подсказкой)
источник
g(int(readline(STDIN)))
БРГ , 31
Для вашего калькулятора TI-84
Нет простых встроенных модулей.
Пример работает
источник
JavaScript,
139137136источник
return;
return 0;
Python 3 -
150143 персонажаСтарая версия (150 символов):
Новая версия (благодаря ProgramFOX):
Он печатает каждую комбинацию, например:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
источник
|
может безопасно использоваться с логическим типом, так(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(печатает список кортежей, чья сумма равна n). Экономит 8 байт.r=range(2,n)
и ссылкиr
сохраняют еще несколько.q [116 символов]
Нет встроенной функции, чтобы найти простое число.
вход
Выход
источник
Питон - 206
Немного опоздал на вечеринку, но я практикую свои навыки игры в гольф.
Я фактически закодировал это прежде, чем нашел этот вопрос! Так что у меня нет прекрасной лямбды, которую используют другие решения Python.
источник
J -
3532 символа«Подскажите пользователю» - проклятие каждого игрока в гольф. Там идут все мои с трудом заработанные персонажи!
Разъяснение:
".1!:1]1
- прочитать строку (1!:1
) из ввода (дескриптор файла1
) и преобразовать его в число (".
).p:i.n=:
- Присвойте этот номер переменнойn
, а затем возьмите первыйn
простые числа.+/~
- Сделайте сложение стола,n
широкий иn
высокий.i.&n,
- превратить таблицу в один список, а затем найти индекс первого появленияn
, который существует, если гипотеза Гольдбаха верна.p:(n,n)#:
- Получить строку и столбец из индекса и взять соответствующие простые числа.Использование:
Если бы подсказка не была обязательной, вот глагол из 25 символов:
источник
Желе , 8 байт (не конкурирует)
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Юлия,
5049 байтовПопробуйте онлайн!
Если бы функция была приемлемой, код можно было бы сократить до 32 байт :
Как это устроено
~=primes
создает псевдоним для встроенной функции простых чисел, которая возвращает список всех простых чисел вплоть до своего аргумента.n=ARGS[]|>int
разбирает первый аргумент командной строки, так как сохраняет его в n .Чтобы найти подходящую пару простых чисел, мы сначала вычисляем вышеупомянутый простой диапазон с помощью
~n
. Тогда,n-~n
дает все различия этих простых чисел и п .Пересекая (
∩
) результат с самим простым диапазоном, мы убеждаемся, что остальные простые числа p таковы, что n - p также простое число.Наконец,
extrema
принимает самое низкое и самое высокое простое в пересечении, поэтому их сумма должна быть n .источник
SQL,
295284В postgresql:
Должен быть в состоянии сделать это в половине пространства, хотя, если бы не такие вещи, как «нет левого внешнего соединения в рекурсии», «нет подзапроса в рекурсии» ...
Вот вывод:
источник
Партия - 266
Изложите аккуратно -
источник
Perl 5, 58 байт
57, плюс 1 для
-nE
Вход и выход в унарном виде. Пример:
Шапка-наконечник.
источник
Oracle SQL 11.2, 202 байта
Un-golfed
источник
Python 3, 107 байт
b (x) - это критерий простоты для x, а g (x) просматривает числа, чтобы найти два подходящих простых числа.
источник