Из всех тех лет, в которых я принимал участие в этом испытании, 2017 год - это первый год, который стал лучшим номером. Так что вопрос будет о простых числах и их свойствах.
Ваша задача состоит в том, чтобы создать программу или функцию, которая будет принимать произвольно большое положительное целое число в качестве входных данных и выводить или возвращать, независимо от того, является ли число 2,017-хрупким, то есть, равен ли самый большой простой коэффициент в этом числе 2,017 или меньше.
Некоторые примеры входов и их выходов:
1 (has no prime factors)
true
2 (= 2)
true
80 (= 2 x 2 x 2 x 2 x 5)
true
2017 (= 2017)
true
2019 (= 3 x 673)
true
2027 (= 2027)
false
11111 (= 41 x 271)
true
45183 (= 3 x 15061)
false
102349 (= 13 x 7873)
false
999999 (= 3 x 3 x 3 x 7 x 11 x 13 x 37)
true
1234567 (= 127 x 9721)
false
4068289 (= 2017 x 2017)
true
Ваша программа не должна буквально выводить true
и false
- любые значения «истина» или «ложь», и фактически любые два разных вывода, которые согласуются между истинными и ложными случаями, хороши.
Тем не менее, вы не можете использовать какие-либо простые числа в вашем исходном коде. Простые числа бывают двух типов:
Символы или последовательности символов, представляющие литералы простых чисел.
Символы
2
,3
,5
и7
являются незаконными в языках , где числа являются допустимыми лексемы.Число
141
является незаконным, потому что оно содержит41
, хотя1
и4
в противном случае действительны.Символы
B
иD
(илиb
иd
) являются недопустимыми в языках, где они обычно используются как 11 и 13, таких как CJam или Befunge.
Символы, которые имеют простые значения Unicode или содержат простые байты в их кодировке.
Символы
%)+/5;=CGIOSYaegkmq
являются недопустимыми в ASCII, а также символ возврата каретки.Символ
ó
недопустим в UTF-8, потому что0xb3
в нем есть его кодировка . Однако в ISO-8859-1 его кодировка проста0xf3
, что является составной и, следовательно, все в порядке.
Самый короткий код для выполнения вышеуказанного на любом языке выигрывает.
=
правил исключает большинство стандартных языков ...Ответы:
Желе , 8 байт
Попробуйте онлайн! Обратите внимание, что тестовые случаи 11111 и выше - это слишком много для TIO.
верификация
Тестовый пример 999999 работал в течение 13 часов. Я пессимистично отношусь к вычислениям 2025 года! 4068289 ...
Как это работает
источник
(2^n)!
. Это также требует данных шести размеров, но, по крайней мере, входные данные представлены в десятичном алфавите, а не в двоичном.Желе , 8 символов, 14 байтов UTF-8
Попробуйте онлайн!
Jelly обычно использует свою собственную кодовую страницу для программ. Тем не менее, большинство встроенных встроенных функций начинаются с
Æ
кодовой точки 13; не очень полезно К счастью, интерпретатор также поддерживает UTF-8, который имеет более дружественную кодировку.верификация
Эта программа, в UTF-8, hexdumps, как это:
Проверка того, что все байты являются составными:
Проверка того, что все кодовые точки Unicode являются составными:
Только лексема анализируется как число
90
. Ни один из9
,0
и90
не простые.объяснение
Основное математическое понимание здесь состоит в том, что 45² - это 2025, который аккуратно падает между 2017 (текущий год) и 2027 (следующий штрих). Таким образом, мы можем взять квадратный корень каждого простого множителя числа и посмотреть, превышает ли оно 45. К сожалению, мы не можем писать
45
из-за литерала5
, поэтому мы должны удвоить его и сравнить с 90 вместо этого.источник
u
является составным, поэтому нужно просто изменить счет, а не что-то, что делает его недействительным.)Mathematica,
625855 байтПоследние три сохраненных байта полностью принадлежат Мартину Эндеру!
Безымянная функция, принимающая положительный целочисленный аргумент и возвращающая
True
илиFalse
.Рекурсивный алгоритм,
#4<4
являющийся истинным базовым случаем (нам нужно только вернутьTrue
значение 1, но с дополнительными базовыми случаями все в порядке). В противном случае мы вычисляем второй наименьший делитель (который обязательно является простым) для ввода с помощьюDivisors[#][[6-4]]
; если оно больше, чем 2024 (44*46
), то мы завершаем работу с помощьюFalse
, в противном случае мы вызываем функцию рекурсивно (используя#6
set to#0
) на входе, деленном на этот маленький простой множитель#
(который мы должны выразить как#^-1
время ввода#4
, поскольку/
это запрещено).Конструктивно, первая половина
#4<4||#<44*46&[#^-1#4]&
является анонимная функция из шести аргументов, вызывается с аргументамиDivisors[#][[6-4]]
,Null
,Null
,#
,Null
, и#0
; это обойти запрет на персонажах2
,3
и5
.Предыдущая версия, которая сохранила четыре байта путем замены
8018-6000
на44*46
, вдохновлена ответом желе от ais523 (Мартин Эндер также, кажется, был вдохновлен комментарием ais523):Это было довольно неприятно: я до сих пор не знаю, как на самом деле установить переменную в Mathematica при таких ограничениях! Как
=
иe
вSet
отвергнуты. Избежать+
и)
было тоже проблемой, но не слишком сложно обойтись за счет большего количества байтов.источник
#2
это также будет запрещено, поэтому вам нужно быть осторожным с тем, как вложены ваши лямбды, и отсутствие скобок может сделать это трудным.)#4<4||#<44*46&[#^-1#4]&[Divisors[#][[6-4]],,,#,,#0]&
выдает кучу предупреждений, потому что теперь он пытаетсяDivisors[#][[2]]
до того, как убедиться, что ввод больше 1 (или 3), но результат по-прежнему правильный.Хаскелл,
4847 байтовВ основном перевод Денниса Желе ответ . xnor сохранил байт.
Используется
[…]!!0
в круглых скобках, потому что)
это запрещено, иsnd
+,divMod
потому чтоm
вmod
иrem
запрещено.источник
!!0<1
с<[1]
. Но, похоже, он замкнут для использования вdiv
качестве[\p n->p^n`div`n*n>p^n-1]!!0$product[1..44*46]
.\n->[0|p<-[product[1..44*46]^n],0<-[p,p-n..0]]
, который использует, что выходные данные должны только быть последовательными.Пайк,
10879 байтПопробуй это здесь!
Сохранено 1 байт, используя способ генерации Денниса 2025
источник
Брахилог ,
910 байтПопробуйте онлайн!
В основном использую тот же алгоритм, что и мой другой ответ.
$ph
находит первый (h
) простой фактор ($p
); это самый большой главный фактор, поскольку списки главных факторов Брахилога идут от самого большого к наименьшему. Затем я беру квадратный корень ($r
), double (*
) и проверяю, не меньше ли 90 (<90
).Сначала мне пришлось удвоить ввод, потому что у 1 нет простых факторов (и, следовательно, нет первого простого фактора). Это добавляет дополнительный простой коэффициент 2, который не может повлиять на то, является ли число пригодным для 2017 года, но предотвращает сбой при обработке 1.
источник
На самом деле , 9 байтов
Спасибо Деннису за большое количество байтов!
Попробуйте онлайн!
Объяснение:
источник
Математика,
6674 байтаСпасибо Деннису за указание на то, что
U+F4A1
это запрещено.Объяснение:
Divisors@#
: Список целочисленных делителей первого аргумента#
.0<1
: Гольф дляTrue
(также избегает использования буквыe
).Divisors@d^0
: Список формы{1, 1, ..., 1}
с длиной, равной количеству делителейd
.Tr
Для плоского спискаTr
возвращает сумму этого списка. Таким образомTr[Divisors@d^0]
возвращает число делителейd
.Function[{x,d},And[x,Tr[Divisors@d^0]>6-4||d<44*46]]
: Анонимная функция с двумя аргументамиx
иd
. Идея заключается в том, чтоd
это делитель,#
и мы проверяем, является ли он составным или меньше или равен2017
(включительно).2017
хрупкость эквивалентна всем делителям, удовлетворяющим этому условию. Как обнаружил ais523 , простое число меньше или равно2017
эквивалентно простому числу меньше2025
. Как отметил Грег Мартин , достаточно проверить, меньше ли оно2024=44*46
. Аргументx
действует как накопитель того, удовлетворяют ли все встречающиеся до сих пор делители этому свойству. Мы тогда уехалиFold
эту функцию через все делители#
с начальным значениемTrue
, поскольку у нас нет доступа ни к,Map
ни/@
.источник
05AB1E , 10 байтов
Возвращает 1, если истина, 0 в противном случае.
Попробуйте онлайн!
объяснение
источник
MATL , 15 байт
Выходные данные не
0
для 2017 года или1
для 2017 года.Попробуйте онлайн! Или проверьте все тестовые случаи .
Эта программа проверяет, что все байты являются составными.
объяснение
источник
Баш, 144 байта
Кодировка ASCII:
Как обычно для оболочки, код выхода указывает на успех (0) или сбой (не 0).
Это фактически другое написание
Мы получаем самый большой фактор с
factor $1|grep -o '[0-9]*$'
;tr -d :
является специальным случаем для ввода =1
.Выражение
$[6*6*69-466]
оценивается до 2018 года.Было сложно использовать
tr
для имен команд и все еще использовать подстановку команд - я не мог использовать форму вложенности$( )
, поэтому я закончил тем, что отправил трубку в другой Bash, чтобы оценить результат.Результаты теста:
Подтверждение кодов символов:
источник
Pyth, 11 байт
Попробуйте онлайн. Тестирование.
Использует трюк Денниса, чтобы получить 2025, а затем проверяет, нет ли главных факторов ввода больше.
источник
Юлия 0,4 ,
843837 байтОжидающая BigInt в качестве аргумента.
Попробуйте онлайн! или убедитесь, что ни один байт не является простым .
источник
Japt , 14 байт
Возвращает 1, если истина, 0, если ложь.
Попробуй это здесь .
источник
k
имеет первостепенное значениеBraingolf , 11 байт [очень неконкурентный]
Попробуйте онлайн!
Не читается из-за
ߢ
какие винты с числами, однако все еще работает в интерпретаторе.Я даже не заметил ограничений на символы, когда писал это, но все, что мне нужно было сделать, это изменить странный символ юникода с 2017 года на 2018 год.
Учитывая, что 2018 не простое число, любое простое число
<= 2018
также<= 2017
объяснение
источник