Я работал над математическим вопросом с моим другом, и мы решили написать сценарий, который найдет ответ. Оригинальный вопрос заключается в следующем:
Разница двух натуральных чисел - 2010, и их наибольший общий знаменатель в 2014 году меньше их наименьшего общего множителя. Найдите все возможные решения.
Мы начали писать программу независимо друг от друга, и когда она сработала, мы решили использовать ее, чтобы получить как можно меньше байтов. Мы закончили с этой прекрасной строкой кода с изумительными 89 байтами.
from fractions import*;print[i for i in range(10**6)if i*(i+2010)/gcd(i,i+2010)**2==2014]
Мы хотели посмотреть, удастся ли кому-нибудь написать более короткий фрагмент кода, который перечисляет первые 1 миллион я. Если вы достаточно смелы, чтобы конкурировать, вы можете использовать любой язык, который вам нравится, но мы бы предпочли, чтобы Python 2 мог сравнивать ваш код с нашим.
Применяются обычные правила, выигрывают кратчайшие байты. Применяются стандартные кодовые гольф-лазейки. Стандартные "лазейки", которые больше не смешны
Радоваться, веселиться!
Ответы:
Mathematica, 8 байт
Доказательство того, что 4 и 5092 являются единственными решениями: исходная проблема может быть переписана как
Давайте запишем x как 2 a 2 3 a 3 5 a 5 … и x + 2010 как 2 b 2 3 b 3 5 b 5 … Тогда уравнение становится
С 2014 года = 2 × 19 × 53 мы имеем
таким образом
таким образом
Есть только 8 возможных вариантов, и мы можем легко проверить, что 4 и 5092 являются единственными положительными целочисленными решениями.
Подожди, я слышу, как люди кричат в стандартную лазейку ...
Mathematica, 45 байт
источник
Pyth
2725Попробуйте онлайн.
Это использует ваш алгоритм довольно наивно ... Я мог бы придумать что-то лучше ...
В основном отфильтровывает значения, которые не соответствуют критерию из
range(10**6)
Спасибо @xnor за то, что указал в чате, что
gcd(x,x+2010)==gcd(x,2010)
источник
Python 3, 84 байта
FryAmTheEggman уже предложил, как сделать ваше решение 88 байтов, поэтому я не буду это публиковать. Но я решил показать, как можно получить еще меньше байтов в Python 3:
(Спасибо за FryAmTheEggman за советы)
Это не работает в Python 2, потому что
print
это не функция.Я не уверен, что нам разрешено, но если бы мы могли использовать
9**9
вместо10**6
этого был бы другой байт.источник
and
/or
... хотя бы не подумал о Python 3;) Еще по теме: Если порядок не имеет значения, я думаю, установкаx=10**6
и выполнениеwhile x:x-=1;...
на один байт короче.R, 75 символов
С переносами строк:
источник
GolfScript (41 байт)
Позвоните по номерам
am
иbm
гдеgcd(a, b) = 1
и влогb > a
. Тогда разница естьm(b-a) = 2010
иlcm(am, bm) = abm = 2014m
такab=2014
.Факторами 2014 года являются
и те, которые имеют различия, которые делятся на 2010
Поскольку я работаю на языке, который не имеет встроенного GCD или LCM, я думаю, что этот анализ, вероятно, сокращает программу:
где
44
находитсяfloor(sqrt(2014))
.Можно подойти довольно близко, используя наивный цикл:
источник
Perl6
6158565452Достаточно прямой перевод вашего источника дает
gcd
это инфиксный оператор в Perl6.^10**6
сокращенно0 ..^ 10**6
, где^
средства исключают это число из диапазона.Конечно так
i gcd (i+2010)
же, какi gcd 2010
и я могу сохранить 3 символаЕсли я использую
$_
вместоi
я могу сохранить еще пару символов. (.say
сокращение от$_.say
)Я могу сохранить еще пару символов, используя
... && .say
вместо.say if ...
, потому что мне не нужны пробелы с обеих сторон,&&
как для меняif
.Поскольку я выполнил обе предыдущие «оптимизации», я могу использовать форму модификатора оператора
for
, что означает, что я могу удалить{
и}
.Я думаю, что это так коротко, как я могу обойтись без использования другого алгоритма.
источник
J, 26 байт
Эти проклятые 2-байтовые глаголы ... :)
источник
Дьялог АПЛ, 29 знаков
источник
PARI / GP, 42 байта
Я чувствую, что есть чрезвычайно элегантное решение, использующее
fordiv
конструкцию GP, но оно не может конкурировать с этим решением за явную краткость.источник
Ракетка, 72 символа
источник
λ
считается 1 байт.Haskell, 52 символа
Работает в интерактивной среде Haskell GHCi.
источник