Задача под рукой, учитывая число n
, найти наименьшее простое число, которое начинается с НАИМЕНЬШЕГО n
числа числа 2
в начале числа. Это последовательность, которую я нашел в OEIS ( A068103 ).
Первые 17 чисел в последовательности даны ниже, если вы хотите больше, мне придется на самом деле реализовать последовательность, что я не против сделать.
0 = 2
1 = 2
2 = 223
3 = 2221
4 = 22229
5 = 2222203
6 = 22222223 # Notice how 6 and 7 are the same!
7 = 22222223 # It must be **AT LEAST** 6, but no more than necessary.
8 = 222222227
9 = 22222222223 # Notice how 9 and 10 are the same!
10 = 22222222223 # It must be **AT LEAST** 9, but no more than necessary.
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221
Просто подумал, что это будет крутая комбинация манипуляции со строками, обнаружения простых чисел и последовательностей. Это код-гольф , наименьшее количество байтов будет объявлено победителем, вероятно, в конце месяца.
x
. Например, если ваш язык поддерживает только 32-разрядные целые числа, вы можете объяснить это.Ответы:
Брахилог ,
1211 байтПопробуйте онлайн!
Это переводит на брахилог на удивление напрямую. Это функция, а не полная программа (хотя предоставление интерпретатора
Z
в качестве аргумента командной строки заставляет его добавить соответствующую обертку для превращения функции в программу; это то, что я сделал, чтобы заставить работать ссылку TIO). Такжеj
весьма прискорбно, что, кажется, индексирован -1 и нуждается в исправлении, чтобы учесть это.Вы можете привести разумный аргумент, что в
=
этом нет необходимости, но я думаю, что, если сформулировать проблему, это так; без, функция, описывающая набор всех простых чисел, которые начинаются с заданного числа2
s, и без какого-либо явного утверждения, что программа должна что- то делать с этим описанием (в данном случае, генерируя первое значение), она, вероятно, не соответствовать спецификации.объяснение
При использовании в качестве функции, возвращающей целое число, ничто никогда не запрашивает значения после первого, поэтому первое, о чем нам следует беспокоиться.
Одна тонкость (указано в комментариях):
:Acb
иb:Ac
математически эквивалентны (так как один удаляется с начала, а другой добавляет к концу, а область между ними никогда не перекрывается); Раньше у меня былоb:Ac
, что более естественно, но оно ломается при вводе 0 (что я предполагаю, потому чтоc
отказывается объединять пустой список с чем-либо; многие встроенные функции Brachylog имеют тенденцию разбиваться на пустые списки по некоторым причинам).:Acb
гарантирует, чтоc
никогда не будет видеть пустой список, а это означает, что регистр ввода 0 теперь тоже может работать.источник
0
ни по какой очевидной причине (по какой-то причине у Brachylog аллергия на нули; я подозреваю, чтоc
это ответственно). Тем не менее, это достаточно легко исправить, поэтому я исправлю это сейчас.b:Ac
не работает, потому что для ввода0
вы получаете2b:Ac
:2b
дает,0
и вы не можете использоватьc
с начальным нулем. Причина этого состоит в том, чтобы избежать бесконечных циклов в общем случае, когда вы всегда можете добавить ноль и получить одинаковые результаты.:2rj
вместо,2:?j
r
; это просто улучшение. Я понимаю, что происходитc
(вы не хотите бесконечно много результатов при запуске назад); тем не менее, вероятное улучшение заключается в том, чтобы запретить вырожденные входные данные, только если они не связаны, и в то же время разрешить их, когда входные данные уже связаны с вырожденным значением.Java (OpenJDK 8) ,
164110 байтСпасибо @FryAmTheEggman за кучу байтов!
Попробуйте онлайн!
источник
new String(new char[i]))
делает унарную строку длины равной числу. Затем регулярное выражение сопоставляет составные числа, проверяя, соответствует ли повторяющийся набор цифр всей строке (в основном, пробное деление). Если я прав, это означает, что у вас должна быть возможность сыграть в гольф во второй части, чтобы не было?
, я обязательно сообщу вам, когда доберусь до компьютера.Pyth, 12 байт
В псевдокоде:
Цикл
lambda
начинается сT=1
, увеличиваясь на 1, пока условие не будет выполнено. Строка2
s должна быть подстрокой с начала строки, то есть метод индекса должен возвращаться0
. Если подстрока не найдена, она возвращает,-1
что удобно и верно, поэтому исключительного случая не существует.Вы можете попробовать это онлайн здесь , но сервер допускает только ввод
4
.источник
Perl, 50 байт
49 байтов кода +
-p
флаг.Предоставить ввод без окончательного перевода строки. Например:
Это займет некоторое время, чтобы запустить числа больше 4, поскольку он проверяет каждое число (есть 2 теста: первый
/^2{$_}/
проверяет, достаточно ли 2 в начале, а второй(1x$\)!~/^1?$|^(11+)\1+$/
проверяет на простоту (с очень плохими характеристиками)).источник
Haskell, 73 байта
Пример использования:
f 3
->2221
.Грубая сила.
[1..n]>>"2"
создает списокn
2
s, который сравнивается с первымиn
символами в строковом представлении текущего простого числа.источник
Mathematica, 103 байта
Безымянная функция, принимающая неотрицательный целочисленный аргумент
#
и возвращающая целое число. Он буквально проверяет все положительные целые числа по очереди, пока не найдет то, которое начинается с#
2 и является простым. Ужасно медленно для входов выше 5.предыдущий результат: Mathematica, 155 байт
Mathematica была бы лучше для игры в гольф, если бы она не была так сильно напечатана; мы должны явно переключаться между типами integer / list / string.
Этот алгоритм работает со списками цифр , как ни странно, начиная с
{2,...,2,1}
. Пока они не являются цифрами простого числа, он добавляет единицу к последней цифре, используя правило{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}
..., а затем вручную реализует перенос числа "один к следующему разряду", пока любой из цифры равны 10, используя правило{a__,b_,10,c___}->{a,b+1,0,c}
... и затем, если мы зашли так далеко, что последний из ведущих2
s превратился в a3
, начинается с другой цифры в конце, используя правило{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b}
. В/. 23->2
конце просто исправляется особый случай ввода1
: большинство простых чисел не может заканчиваться2
, но2
может. (Несколько ошибок выплескиваются на входах0
и1
, но функция находит правильный ответ.)Этот алгоритм довольно быстрый: например, на моем ноутбуке вычисление первого простого числа, начинающегося с 1000
2
с, занимает менее 3 секунд22...220521
.источник
Pyth, 17 байт
Кажется, не может решить через
n = 4
Интернет, но это правильно в теории.объяснение
источник
Perl 6 , 53 байта
Попытайся
Expanded:
источник
Желе , 14 байт
Очень неэффективно. Попробуйте онлайн!
источник
Пайк, 14 байт
Попробуй это здесь!
12 байт после исправления и новой функции
Попробуй это здесь!
источник
Мудрец,
6968 байтИспользует генератор, чтобы найти первое (а следовательно, наименьшее) из бесконечного числа членов.
источник
Japt, 20 байт
Проверьте это онлайн! Он завершается в течение двух секунд на моем компьютере для всех входов до 14, и после этого он естественно теряет точность (JavaScript имеет целочисленную точность до 2 53 ).
Большое спасибо @obarakon за работу над этим :-)
объяснение
В последней версии Japt это может быть 12 байтов:
Проверьте это онлайн! Он заканчивается в течение полсекунды на моей машине для всех входов до 14.
источник
2222203
, только222223
и вскоре после этого2222210
. Он также дает сбой при любом вводе, для которого требуется три или более дополнительных цифр после строки2
s, например, при вводе 15.PHP, 76 байт
принимает входные данные из аргумента командной строки. Беги с
-r
.сломать
источник
Bash (+ coreutils), 53 байта
Работает до 2 ^ 63-1 (9223372036854775807) , занимает значительное время, чтобы закончить для N> 8.
Golfed
Тест
источник
Python 3, 406 байт
тестовый код
тестовый вывод
Я решил пойти на скорости в довольно большом диапазоне, а не в байтовом размере. :) Я использую детерминистический критерий первичности Миллера-Рабина, который гарантирован до 3317044064679887385961981 с этим набором свидетелей. Большие простые числа всегда успешно пройдут тест, но некоторые композиты также могут пройти, хотя вероятность крайне мала. Однако я также проверил выходные числа для i> 22, используя pyecm программу факторизации эллиптической кривой, и они выглядят простыми.
источник
p()
вызов ... Ото, было бы трудно написать значительно меньшую программу , которая может дать правильный выход для г> 20 в течение секунды (что не «обмануть», вызвав встроенную проверка первичности). :)Python 3, 132 байта
Любая надежда на производительность была принесена в жертву ради меньшего количества байтов.
источник
Java, 163 байта
тестовый код
выход:
582,5858 миллисекунд
Объяснение: перебирает целые числа и добавляет их в виде строк в корневую строку, которая является заданной строкой «2», и проверяет, является ли она простой или нет.
источник
isProbablePrime
имеет случайные ложные срабатывания . Это лишит законной силы ответ, поскольку существуют обстоятельства, при которых он возвращает неправильное значение.