Эта задача достаточно проста , что это в основном все в названии: вы дали положительное целое число N и вы должны вернуть наименьшее положительное целое число , которое не является делителем N .
Пример: делители N = 24 есть 1, 2, 3, 4, 6, 8, 12, 24
. Наименьшее положительное целое число, которого нет в этом списке, равно 5 , так что это результат, который должно найти ваше решение.
Это последовательность OEIS A007978 .
правила
Вы можете написать программу или функцию и использовать любой из наших стандартных методов получения ввода и предоставления вывода.
Вы можете использовать любой язык программирования , но учтите, что эти лазейки по умолчанию запрещены.
Это код-гольф , поэтому самый короткий действительный ответ - измеренный в байтах - выигрывает.
Тестовые случаи
Первые 100 терминов:
2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2,
3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3,
2, 3, 2, 4, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2,
3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3
В частности, убедитесь, что ваш ответ работает для входов 1 и 2, и в этом случае результат будет больше, чем вход.
И для некоторых более крупных тестовых случаев:
N f(N)
1234567 2
12252240 19
232792560 23
источник
Ответы:
Mathematica, 19 байт (кодировка UTF-8)
Безымянная функция, принимающая ненулевой целочисленный аргумент и возвращающая положительное целое число. Вертикальная черта примерно посередине - это фактически трехбайтовый символ U + 2223, который обозначает отношение делимости в Mathematica. Объяснение:
Отредактировано, чтобы добавить: ngenisis указывает, что
//.
, по умолчанию, будет повторяться максимум 65536 раз. Таким образом, эта реализация работает для всех входных чисел, меньших наименьшего общего кратного целого числа от 1 до 65538 (в частности, для всех чисел, содержащих не более 28436 цифр), но технически не для всех чисел. Можно заменитьx//.y
с ,ReplaceRepeated[x,y,MaxIterations->∞]
чтобы исправить этот недостаток, но , очевидно , за счет 34 дополнительных байтов.источник
For
,While
и т.д.Pyth, 3 байта
По сути,
f
циклы кода до%QT
(Q % T
гдеT
переменная итерации) истина.Попробуйте это онлайн здесь.
источник
.V1In%Qb0bB
увидел твой ответ и больше не чувствовал себя таким крутым.JavaScript (ES6),
2523 байтаПримечание: одна интересная вещь здесь заключается в том, что
k
параметр инициализируется ex nihilo на первой итерации. Это работает, потому чтоn % undefined
естьNaN
(ложь, как и ожидалось) и-~undefined
равно1
. На следующих итерациях,-~k
по сути, эквивалентноk+1
.Контрольная работа
Показать фрагмент кода
источник
Python,
433635 байтисточник
Гексагония , 12 байт
Embiggened:
Попробуйте онлайн!
источник
R, 28 байт
Довольно просто, ничего особенного. Принимает ввод из стандартного ввода, увеличивает значение
T
до тех пор, покаi
по модулю неT
будет ноль.Если вы хотите что-то более модное, то для 29 байтов есть следующее :
Разъяснение:
источник
which.min
, но потом я увидел редактирование, и, похоже,match
выполняет аналогичную работу.T
, избавляя от необходимости определять его передwhile
циклом.while
подход, и это хорошо, так как он требует большого объема памяти для больших N.T
Уловка - это одно из тех удовольствий, которое отлично подходит для игры в гольф, но абсолютно ужасно для реального программирования. (И, конечно, вы можете использовать его,F
когда вам нужно0
.)%%
приоритет имеет приоритет+
, поэтому по-прежнему необходимы символы Paren :(0:i+1)
с тем же числом байтов, что и1:(i+1)
. Первоначально у меня был первый, но я сменил его на второй, так как его легче читать.Haskell, 26 байтов
Все забывают о
until
!источник
Брахилог , 10 байт
Попробуйте онлайн!
Это получилось очень похоже (но короче) на оригинальное решение Fatalize. С тех пор Fatalize переключился на другой алгоритм, который связывается с этим другим способом, поэтому мне придется объяснить это самому:
Когда мы инвертируем функцию, меняя местами «вход» и «выход», мы получаем довольно разумный алгоритм (только что выраженный неуклюжим образом): «попробуйте возможные натуральные числа в их естественном порядке (то есть 1 вверх), пока не найдете тот, который не может быть умножен на что-либо, чтобы произвести ввод ". Brachylog не выполняет вычисления с плавающей точкой, если не известны все входные данные, поэтому он будет учитывать только целое число A.
источник
Брахилог ,
1110 байтПопробуйте онлайн!
объяснение
источник
COW, 174 байта
Попробуйте онлайн!
Этот код только частично мой - он реализует алгоритм модуля, который я портировал из brainfuck. Остальная часть кода принадлежит мне. Однако, поскольку я не писал алгоритм модуля, я действительно не исследовал, как он работает, и не могу документировать эту часть кода. Вместо этого я приведу свою обычную разбивку с последующим более подробным объяснением того, почему код работает.
Разбивка кода
объяснение
Код сначала читает целое число в [0]. Каждая итерация основного цикла (строки 2–26) увеличивает [1], а затем копирует все необходимое в алгоритм модуля, который выводит свой результат в [5]. Если [5] содержит какое-либо значение, то [1] - это число, которое нам нужно напечатать. Мы печатаем его, а затем принудительно завершаем работу программы.
Поскольку COW - это производная от мозгового удара, она функционирует относительно аналогично тому, как работает мозговой гребень - бесконечная полоса ленты, вы можете перемещаться влево или вправо, увеличивать или уменьшать и «зацикливать», пока текущее значение ленты не равно нулю. В дополнение к Brainfuck, COW поставляется с парой полезных функций.
Настоящая достопримечательность здесь - инструкция 3
mOO
,. Интерпретатор считывает текущее значение ленты и выполняет инструкцию на основе этого значения ленты. Если значение меньше 0, больше 11 или равно 3, интерпретатор завершает программу. Мы можем использовать это как быстрое принудительное завершение основного цикла (и программы целиком), как только мы нашли наш неделитель. Все, что нам нужно сделать, это распечатать наш номер, очистить [1] (сOOO
), уменьшить его до -1 сMOo
, а затем выполнить инструкцию -1, с помощьюmOO
которой программа завершается.Сама лента для этой программы работает следующим образом:
Алгоритм модуля естественно очищает [2], [3], [6] и [7] в конце операции. Содержимое [4] перезаписывается вставкой регистра в строке 4, и [5] равно нулю, когда [0] делится на [1], поэтому нам не нужно его очищать. Если [5] не равен нулю, мы принудительно завершаем работу в строке 23, поэтому нам не нужно об этом беспокоиться.
источник
05AB1E , 7 байтов
Попробуйте онлайн!
объяснение
источник
Желе , 5 байт
Попробуйте онлайн!
Объяснение:
Это ужасное злоупотребление
#
; в этой программе много операторов, но тонны пропущенных операндов.#
действительно хочет,1
чтобы по какой-то причине было дано явно (в противном случае он пытается ввести значение по умолчанию для ввода); однако все остальное, что не указано в программе, по умолчанию является входом программы. (Так, например, если вы зададите 24 в качестве входных данных, эта программа найдет первые 24 числа, которые не делят 24, а затем вернет первое; отчасти расточительно, но это работает.)источник
2%@1#
C
3235 байтРедактировать: добавлено
i=1
в циклиспользование
Полная версия программы, 64 байта:
источник
C #,
3937 байтСохранено два байта благодаря Мартину!
источник
Perl, 19 байт
18 байт кода +
-p
флаг.Чтобы запустить это:
Не очень подробные объяснения:
-
$.
это специальная переменная, значением по умолчанию которой является номер текущей строки последнего доступного дескриптора файла (здесь вводится stdin), поэтому после чтения первой строки ввода она устанавливается в 1.-
$_
содержит ввод и неявно печатается в конце (спасибо-p
флагу).-
redo
(в этом контексте) считает, что программа находится в цикле и повторяет текущую итерацию (только$.
будет другой, так как она была увеличена).- Таким образом, если мы нашли наименьшее число (сохраненное в
$.
), которое не делится$_
, то мы установим$_
его, в противном случае мы попробуем следующее число (спасибоredo
).источник
Октава / MATLAB,
2624 байтаfind(...,1)
возвращает индекс (на1
основе) первого ненулевого элемента вектора в первом аргументе. Первый аргумент:[n mod 1, n mod 2, n mod 3, n mod 4,...,n mod (n+1)]
Это означает, что мы должны добавить+1
к индексу, так как мы начинаем тестирование с1
. Спасибо @Giuseppe за -2 байта.Попробуйте онлайн!
источник
@(n)find(mod(n,1:n+1),1)
короче, не так ли?Желе , 6 байт
Попробуйте онлайн!
Объяснение:
источник
[1, 1, 1, 1, 5, ...]
.Perl 6 , 17 байт
Попробуй
Expanded:
источник
05AB1E , 6 байтов
Попробуйте онлайн!
Кроме того, это заклинание "ССЫЛКА!" ... Вид ...
источник
Желе , 5 байт
Попробуйте онлайн!
Как это устроено
источник
Python 2.7.9, 32 байта
Тест на идеоне
Рекурсивно подсчитывает потенциальные неделители
d
. Короче рекурсивно увеличивать результат, чем выводитьd
. Смещение от1
достигается булевым значениемTrue
, равным1
, но, посколькуd==1
оно всегда является делителем, выходные данные всегда преобразуются в число.Python 2.7.9 используется, чтобы разрешить
0or
. Версии, начинающиеся с 2.7.10, будут пытаться проанализировать0or
как начало восьмеричного числа и получить синтаксическую ошибку. Смотрите это на Ideone .источник
На самом деле 7 байтов
Попробуйте онлайн! (примечание: это очень медленное решение, и оно займет много времени для больших тестовых случаев)
Объяснение:
источник
Haskell , 29 байт
Выражение
[k|k<-[2..]]
просто создает бесконечный список[2,3,4,5,...]
. С условиемmod n k>0
мы разрешаем только теk
из списка, которые не делятсяn
. Добавление!!0
только возвращает первую запись (запись в индексе0
) из этого списка.Попробуйте онлайн!
источник
Dyalog APL , 8 байт
1⍳⍨
Положение первого Правда в0≠
ненулевые значения⍳|
остатки деления 1 ... N при делении на⊢
NПопробуй APL онлайн!
Примечание: это работает для 1 и 2, потому что
1⍳⍨
возвращает 1 + длину его аргумента, если ничего не найдено.источник
джулия, 28 байт
Примечание: так
1:N+2
как не выделяет память, проблемN
с памятью для большого s- @flawr нет,
N+2
за исключением нескольких байтов- предложение @Martin сохранило 1 байт
источник
QBIC , 14 байтов
Объяснение:
источник
PHP, 30 байт
если запустить из консоли с
-r
опцией (thx to @ ais523)32 байта
спасибо @manatwork за удаление 1 байта
33 байта (оригинал)
источник
<?
это не должно быть частью вашего количества байтов (потому что PHP имеет режим командной строки, который не требует этого).<1
а не==0
.for(;!($argv[1]%$i);$i++);echo$i;
. Твоя естественная эволюция моя. Это мой голос!Cubix ,
1412 байтСохранено 2 байта благодаря MickyT.
Попробуй
объяснение
В форме куба код:
По сути, это просто берет вход и запускает счетчик. Затем он проверяет каждое последующее значение счетчика, пока не найдет значение, которое не является фактором ввода.
источник
I2/L/);?%<@O
на пару байтов меньше. Тот же общий процесс, просто другой путь> <> , 15 +3 = 18 байт
Ожидается, что ввод будет в стеке при запуске программы, поэтому +3 байта для
-v
флага. Попробуйте онлайн!источник
Медуза ,
1210 байтПринимает ввод из STDIN и выводит в STDOUT. Попробуйте онлайн!
Мартин Эндер сэкономил 2 байта, спасибо!
объяснение
Эта часть является одной функцией, которая использует входное значение в своем определении.
Эта
~
-клетка получает функцию, поэтому она переворачивает свои аргументы: она создает двоичную функцию «левый аргумент, modulo (|
) правый аргумент». Встроенная функция по модулю в Jellyfish принимает аргументы в обратном порядке.Эта
~
-клетка получает значение и функцию, поэтому она выполняет частичное применение: она создает двоичную функцию "input (i
) по модулю правого аргумента". Давайте назовем эту функцию f .Для
\
-cell даны две функции, поэтому она выполняет итерацию: она генерирует унарную функцию «increment (>
) до тех пор, пока функция f, примененная к предыдущим и текущим значениям, не даст верный (ненулевой) результат, а затем вернет текущее значение». Это означает, что аргумент увеличивается до тех пор, пока он не разделит входные данные.Наконец, мы применяем эту функцию к начальному значению
1
и выводим результат с помощьюp
.источник