Ваша задача состоит в том, чтобы найти самое гладкое число в заданном диапазоне. Другими словами, найдите число, у которого наибольший главный фактор наименьший.
Гладкий номер один , чей наибольший простой множитель мал. Числа этого типа полезны для алгоритма быстрого преобразования Фурье, криптоанализа и других приложений.
Например, в диапазоне 5, 6, 7, 8, 9, 10
8 - это самое гладкое число, потому что наибольшее простое число 8 равно 2, тогда как все остальные числа имеют простое число 3 или больше.
Входные данные: входными данными будут два натуральных числа, которые определяют диапазон. Минимально допустимое целое число в диапазоне - 2. Вы можете выбрать, является ли диапазон включающим, исключительным, полуисключительным и т. Д., Если в пределах вашего языка может быть указан произвольный диапазон. Вы можете получить числа с помощью функции input, stdin, аргумента командной строки или любого другого эквивалентного метода для вашего языка. Нет кодирования дополнительной информации на входе.
Выход: вернуть, вывести или эквивалентно одно или несколько целых чисел во входном диапазоне, которые являются максимально гладкими (минимальный наибольший коэффициент). Возвращать несколько результатов необязательно, но если вы решите это сделать, результаты должны быть четко разграничены. Нативный формат вывода подходит для нескольких результатов.
Пожалуйста, укажите в своем ответе, как вы принимаете вход и даете вывод.
Подсчет очков: код гольфа. Считать по символам, если написано в ASCII, или 8 * байт / 7, если не в ASCII.
Тестовые случаи:
Примечание. Это диапазоны в стиле Python, включая нижний, но не верхний. Измените в соответствии с вашей программой. Нужен только один результат.
smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002
источник
Ответы:
CJam - 13
Попробуйте это на http://cjam.aditsu.net/
Пример ввода:
2001 2014
Пример вывода:
2002
Объяснение:
q~
читает и оценивает входные данные, помещая 2 числа в стек (скажем, min и max),,
массив [0 1 ... max-1]>
разбивает массив, начиная с min, что приводит к [min ... max-1]{…}$
сортирует массив, используя блок для вычисления ключа сортировки,mf
получает массив со всеми простыми множителями числа, по порядкуW=
получает последний элемент массива (W = -1), получая, таким образом, наибольший простой множитель, который будет использоваться в качестве ключ сортировки0=
получает первый элемент (отсортированного) массиваисточник
mfW
кто-то решил это за 13 символов.Regex ( аромат
.NETPCRE),183129 байтНе пытайтесь делать это дома!
Это не совсем претендент на победу. Но Эрик Тресслер предложил решить эту проблему с помощью регулярных выражений, и я не удержался, чтобы попробовать. Это
может бытьвозможно и в PCRE (и даже короче, см. Ниже), но я выбрал .NET, потому что мое решение нуждается в взглядах произвольной длины. Вот так:Входные данные кодируются в виде включенного диапазона через запятую, где оба числа даны в унарной записи с использованием
1
s. Матч будет в концеS
1, гдеS
это самое гладкое число в диапазоне. Галстуки разрываются в пользу наименьшего числа.Таким образом, вторым примером из этого вопроса будет следующая строка (соответствие подчеркнуто)
Он основан на (теперь достаточно известном) регулярном выражении проверки , вариации которого встроены в него 6 раз.
Вот версия, использующая свободное пространство и комментарии для тех, кто хочет знать, что происходит.
Вы можете проверить это онлайн здесь . Не пытайтесь использовать слишком большие входные данные, я не даю никаких гарантий относительно производительности этого монстра.
Редактировать:
Я закончил тем, что портировал это на PCRE (который требует только двух шагов), и сократил регулярное выражение почти на треть. Вот новая версия:
Это по сути то же самое, с двумя изменениями:
MIN
в группу1
). ТемPCRE
не менее, есть поддержка,\K
которая сбрасывает начало совпадения к текущей позиции курсора. Следовательно(?<=^(1+),.*)
становится^(1+),.*?\K
, который уже сохраняет два байта.(?n)
для сопоставления группыn
снова, аналогично вызову подпрограммы. Поскольку исходное регулярное выражение содержало код для нахождения наибольшего простого множителя числа дважды, я смог заменить большую часть второго простым(?2)
.источник
3
или7
) на самом деле является простым. Это требует наличия еще одной копии фактора после его первого захвата, что не относится к простым числам. В то время как я работаю над этим в .NET, поместив где-то там вид сзади, чтобы я мог немного откатиться назад для проверки, это не было бы возможно в более короткой версии PCRE из-за отсутствия видоискателей переменной длины. Вероятно , можно сократить этот бит, но я не думаю, что просто перейти+
на*
работу.(.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+
99 байтов в PCRE. Кроме того, я встречал много вашей работы на этом сайте, и я большой поклонник: D С нетерпением жду битвы с регулярными выражениями в будущем!\4$
вынув из упреждения и вставив его после отрицательного опережения, но это сильно влияет на производительность (каждая подгруппа цифр <= \ 4 проверяется на композитность, а не только на \ 4) и не работает на более длинных входах.Регекс (PCRE аромат), 66 (65🐌) байт
Вдохновленный тем, что Мартин Эндер и jaytea , два гения regex, написали решения regex для этого гольф-кода, я написал свой собственный с нуля. Знаменитое регулярное выражение проверки не появляется нигде в моем решении.
Не читайте это, если вы не хотите испортить вам магию унарных регулярных выражений. Если вы действительно хотите сами разобраться с этой магией, я настоятельно рекомендую начать с решения некоторых проблем в регулярном выражении ECMAScript:
( Движок регулярных выражений, который я написал, может быть полезен, так как он очень быстр в унарных математических регулярных выражениях и включает унарный числовой режим, который может проверять диапазоны натуральных чисел (но также имеет строковый режим, который может оценивать неунарные регулярные выражения, или унарный с разделителями.) По умолчанию он совместим с ECMAScript, но имеет необязательные расширения (которые могут выборочно добавлять подмножества PCRE, или даже молекулярную перспективу, то, чего нет у других движков регулярных выражений).)
В противном случае, читайте дальше, а также читайте эту GitHub Gist (предупреждение, много спойлеров), в которой рассказывается о том, как подтолкнуть регулярное выражение ECMAScript для решения функций с натуральными числами возрастающей сложности (начиная с набора головоломок teukon, не все из которых математические, что вызвало это поездка).
Как и в других решениях регулярных выражений для этой задачи, входные данные задаются в виде двух чисел в биективном унарном виде, разделенных запятой, представляющей инклюзивный диапазон. Только один номер возвращается. Регулярное выражение можно изменить так, чтобы оно возвращало все числа, которые имеют одинаковый наименьший по величине простой фактор, в виде отдельных совпадений, но для этого требовалось бы смотреть назад с переменной длиной и либо заглядывать вперед, либо
\K
возвращать результат в виде захвата вместо совпадения.Используемая здесь техника повторного неявного деления на наименьший простой множитель идентична той, которая используется в строках Match, длина которых является четвертым степенным ответом, который я опубликовал некоторое время назад.
Без дальнейших церемоний:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Вы можете попробовать это здесь.
И свободная версия, с комментариями:
Алгоритм можно легко перенести в ECMAScript, заменив вызов подпрограммы копией подпрограммы и вернув совпадение в качестве группы захвата вместо использования \ K. Результат длиной 80 байт:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Попробуйте онлайн!
Обратите внимание, что
((.+).*)
это можно изменить((.+)+)
, уменьшив размер на 1 байт (от 66 до 65 байт ) без потери правильной функциональности, но регулярное выражение экспоненциально взрывается в медленности.Попробуйте онлайн! (79-байтовая версия ECMAScript с экспоненциальным замедлением)
источник
Python 2, 95
Находит плавность чисел путем пробного деления до тех пор, пока число не станет 1.
i
сохраняет наименьшую гладкость,j
хранит число, которое дало эту гладкость.Спасибо @xnor за игру в гольф.
источник
if/else
должно быть сокращено. Моя первая мысльb=a%p<1;p+=1-b;a/=p**b
. Или exec, который запускает один из двух в чередующейся строке. Также, возможно,while~-a
работает.s,p=a,2
,i,j=p,s
, @ идей XNOR, удаляя избыточные отступы и Поставив то время как блок в одну линии выходов 95 символов. Не уверен, как вы пришли с 98 ...J,
22 2019 символовНапример
(Функции, принимающие два аргумента, являются инфиксными в J.)
источник
(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
{:
же, как>./
и 1 байт.Haskell,
9694938680 символовиспользование через GHCi (оболочка Haskell):
РЕДАКТИРОВАТЬ: теперь гораздо более простой алгоритм.
это решение включает оба числа в диапазоне (так
8 # 9
и7 # 8
есть 8)объяснение:
Функция (%) принимает два параметра, x и y. когда у равен 2, функция возвращает гладкость х.
Алгоритм отсюда прост - получить объединенный список всех гладкостей чисел на входе с каждой гладкостью, хранящей ссылку на его исходное число, затем отсортировать, чтобы получить наименьшее, и вернуть его ссылочное число.
Вот версия javascript без гольфа с тем же алгоритмом:
источник
m l=minimum l
Mathematica,
614539 символовОчень простая реализация спецификации как безымянной функции.
источник
Луа - 166 символов
У
меня небыло (пока!) Достаточно репутации, чтобы комментировать решение AndoDaan , но вот некоторые улучшения в его кодеИзменения:
n%d==0
С помощьюn%d<1
которого эквивалентна в этом случаеtable.insert(f,d)
наf[#f+1]=d
(#f
это количество элементов f)источник
Bash + coreutils, 56 байт
Входные данные поступают только из двух аргументов командной строки (спасибо @ nyuszika7h !!!). Вывод - единственный результат, напечатанный в STDOUT.
seq
предоставляет диапазон чисел, по одному на строку, из аргументов командной строки.factor
читает эти числа и выводит каждое число, за которым следует двоеточие и отсортированный список простых факторов этого числа. Таким образом, самый большой главный фактор находится в конце каждой строки.sed
удаляет двоеточие и все, кроме последнего / наибольшего простого множителя, поэтому оставляет список каждого числа (столбец 1) и его наибольшего простого множителя (столбец 2).sort
численно в порядке возрастания по столбцу 2.sed
соответствует строке 1 (число, у которого наибольший простой множитель является наименьшим в списке), удаляет все, включая и после первого пробела, затем выходит.sed
автоматически печатает результат этой замены перед выходом.Выход:
Диапазоны Примечание В этом контексте с учетом обеих конечных точек.
источник
seq $@
на 3 байта короче, если вы можете предположить, что есть только два аргумента.Python 2, 67
Размышления о другом гольфе дали мне идею нового алгоритма проверки гладкости, отсюда и поздний ответ.
Первичная факторизация факториала
i!
включает в себя не более чем простые числаi
. Таким образом, еслиn
это произведение различных простых чисел, его гладкость (наибольший простой множитель) является наименьшим,i
для которогоn
делителем являетсяi!
. Чтобы учесть повторяющиеся простые факторы вn
, мы можем вместо этого использовать достаточно высокую степеньi!
. В частности,(i!)**n
хватает.Код пытается увеличить факториалы
F=i!
, обновляется рекурсивно. Мы фильтруем делителиF
во входном диапазоне и выводим их, если они есть, и в противном случае переходим к(i+1)!
.Прецедент:
источник
С,
14995Отредактированный ответ:
Я не могу претендовать на кредит за это решение. Этот обновленный ответ заимствует прекрасный метод, используемый isaacg в своем решении Python. Я хотел бы видеть , если это было возможно , чтобы записать его в C в виде вложенной
for
/while
петли с не фигурными скобками, и это!Объяснение:
R(a,b,n,q,p,m)
сканирует диапазонa
доb-1
и возвращает первый найденный номер гладкий. Вызов требует соблюдения следующего вида:R(a,b,a,b,2,0)
так что переменные внутри функции эффективно инициализируется следующим образом :n=a;q=b;p=2;m=0;
.Оригинальный ответ :
Это был мой оригинальный ответ ...
Объяснение:
P(n,f,p)
проверяет значениеn
на простоту и возвращает истину (ненулевое), еслиn
простое, или ложь (ноль), еслиn
не простое.f
иp
оба должны быть переданы как 1.G(n,f)
возвращает наибольший простой множительn
.f
должен быть передан какn
.R(a,b,p,n)
сканирует диапазонa
доb-1
и возвращает первый найденный номер гладкий.p
должен быть передан как 1.n
может быть любым значением.Тестовый водитель:
Выход:
источник
Haskell - 120
Пример использования:
источник
<1
вместо==0
?Q, 91 символовK, 78 символовК, вероятно, побрил бы дюжину символов
редактировать: действительно, рассматривая верхнюю границу как не включающую на этот раз
источник
Примечание: этот ответ недопустим.
Этот ответ использует несколько функций Pyth, добавленных после того, как задан вопрос.
Я добавил еще одну новую функцию - вызов унарного диапазона в кортеже из 2 элементов, который сокращает решение на два символа:
Пиф , 7
Ввод теперь взят через запятую. В остальном то же самое.
В этом ответе используется особенность Pyth, которая была добавлена после того, как был задан этот вопрос, особенно после просмотра замечательного решения CJam от @ aditsu. При этом я хотел продемонстрировать, что добавление этой функции сделало возможным. Эта функция - функция
P
arity-1, которая при целочисленном вводе возвращает список всех основных факторов ввода, отсортированных от наименьшего к наибольшему.Пиф , 9
Использует диапазоны в стиле Python, разделенные новой строкой на STDIN. Выводит наименьшее решение для STDOUT.
Объяснение:
тесты:
источник
Lua - 176 символов
Я действительно должен прекратить играть в гольф в Луа. Нет никакого смысла.
источник
Clojure -
173170 символовЯ новичок в Clojure. Golfed:
Образцы прогонов:
Диапазоны включают нижний предел, исключая верхний: [a, b) печатает только одно из самых гладких чисел, если встречается несколько.
выходы:
Ungolfed:
источник
Руби,
6562С извинениями за https://codegolf.stackexchange.com/a/36484/6828 , это версия игры в гольф (и немного упрощенная). Использует инклюзивный диапазон, так как он короче.
И спасибо YenTheFirst за сохранение трех символов.
источник
C # LINQ:
317303289262Ungolfed:
Он берет начало и длину из командной строки и возвращает наибольшее гладкое число.
Я использовал ответы здесь и здесь, чтобы сделать свой ответ.
Спасибо VisualMelon за то, что он настроил его и сбрил 12 байтов! Я также избавился от скобок в сохраняющих 2 байта, и CodeInChaos указал на некоторые очевидные вещи, которые я пропустил (спасибо еще раз).
источник
F
, определивint b
рядом с m. В нескольких местах выполнения сравненияa%b==0
, аa
иb
всегда положительны вы можете вырезать байт для каждого, проверяя , если это меньше , чем 1a%b<1
. Вы также можете сохранить байт, увеличивb
условие if,a%++b<0
а не for, установив его в 1. Я также думаю, что в этом случае дешевле просто полностью квалифицироватьсяSystem.Console.WriteLine
и избежатьnamespace
предложения.m=...:m;
штука выпадает из цикла while. Следовательно, вы можете сброситьm=0,
и заменитьreturn m;
наreturn m=b>m?b:m;
. Затем вы можете отказаться отm=...:m;
целиком.Aggregate
работает, я просто попробовал его, увидев его в другом ответе, чтобы добраться до моего нового объекта вместо одного поля внутри него, и просто получилось отлично работать :)Р, 83
где нижняя часть входного диапазона назначена,
a
а верхняя (включительно) назначенаb
.gmp
это пакет, который доступен на CRAN. Это было грязно, пока я не увидел эту абсурднуюmf
функцию в CJam. Установите, набравinstall.packages("gmp")
в консоли.источник
lapply
3 раза, вы можете использовать псевдоним (то есть,l=lapply
а затем использоватьl(...
). Точно так же, посколькуfactorize
это единственная функция, которую вы используете из пакета, которуюgmp
вы можете использоватьgmp::factorize
вместо загрузки библиотеки и последующего использованияfactorize
. Таким образом, ваш код стал быl=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]
69 байтами.PowerShell - 85
Это позволит отсортировать диапазон чисел (включительно) на основе максимального простого множителя каждого числа. Возвращает самый низкий отсортированный элемент.
источник
J - 16 символов
Использование стиля диапазона ( начало , длина ), как разрешено в комментариях.
Для использования в качестве двоичного глагола: левый аргумент - начало , правый - длина .
Решение ( начало , конец ) составляет +2 символа и исключает конец; включая конец +2 больше. Но с другой стороны, это выглядит довольно красиво, поскольку мы сопоставляем все {фигурные скобки}.
источник
Серьезно, 8 * 14/7 = 16 (неконкурентный)
Серьезно был создан после этого конкурса, но я хотел опубликовать этот ответ, потому что он иллюстрирует тип задач, в которых Серьезно хорош.
Попробуйте онлайн!
Объяснение:
источник
Pyth , 7 байт
Попробуй это здесь!
}
r
источник
Кобра - 150
Даже не уверен, почему я беспокоился, Кобра просто не может конкурировать здесь.
источник
Рубин - 113 символов
Использование stdlib. Возвращает один результат. Проверено на ruby 2.1.2.
источник
Perl (5,10+), 83
(разрыв строки может быть удален). Принимает две конечные точки инклюзивного диапазона на двух строках стандартного ввода (потому что
<>
это дешевле, чем доступARGV
) и выводит самый плавный вывод на стандартный вывод. Если есть галстук для самых гладких, печатает самые маленькие. Могли печатать самые большие по стоимости одного персонажа.Алгоритм - это, по сути, способ Исаака найти самый главный фактор, хотя мы и придумали его независимо. Эта часть великолепно сводится к одному утверждению в perl, а остальная часть требует больше времени, чем хотелось бы.
Должно быть использовано под преамбулой
perl -E
или сuse 5.012
преамбулой. Если вы не можете этого сделать, заменитеsay$r
наprint$r,$/
.источник
Python 2 (84)
Решение @ isaacg , но с
min
помощью функциональной клавиши вместо явного поиска мин и рекурсивной функции, выполняющей роль итерации.Запустите в Stackless Python, чтобы избежать ограничений рекурсии.
Выглядит расточительно, используя условие парантезирования
(n%p<1)
, затем повторяя его отрицание также и в парантезах(n%p>0)
, но это было лучшее, что я получил. Я пробовал разные вещи, но они оказались хуже.Я приветствую любые улучшения, о которых вы можете подумать.
источник
Java 8 - 422
454символаЯ изучаю Java 8, и хотел дать этому шанс относительно Java (или даже потоков Java 8).
По сравнению с другими языками это жестокое, но интересное упражнение.
Golfed:
Ungolfed:
пример запуска с использованием:
источник
MATL ( неконкурентный ), 20 байтов
Этот язык был разработан после испытания
Диапазон включительно на обоих концах. Числа взяты как два отдельных входа.
Попробуйте онлайн!
объяснение
источник
&:[]y"@YfX>h]&X<)
или, возможно, 16:[]y"@YfX>h]&X<)
.&
Действительно была отличная идея (и я предполагаю ,y
не был доступен тогда?).Yf
с префиксом 1 также была бы полезна и здесь, но этого, вероятно, недостаточно, чтобы решить, что это хорошая идея в целом. :)y
или&
. Благодарю Suever за очень полезную семантику последнего (моей первоначальной идеей было сделать так, чтобы это означало «один вход больше, чем по умолчанию»). Если мы увидим больше случаев, когдаYf
было бы полезно добавить их, возможно, стоит добавить эту функцию. Проблема в том, что есть около 34 ответов, которые используютYf
(согласно этому сценарию ), поэтому трудно сказатьЖеле , 7 байт, оценка = 7 ÷ 7 × 8 = 8, вызов языковых постдатантов
Попробуйте онлайн!
Принимает нижнюю и верхнюю конечные точки диапазона как два отдельных аргумента. Выводит список всех самых гладких чисел в диапазоне. (Это можно рассматривать как функцию, в этом случае выходные данные представляют собой список Jelly, или как полную программу, и в этом случае выходные данные используют то же представление списка, что и JSON.)
объяснение
Те времена, когда ваша программа Jelly - это буквальный перевод спецификации…
источник