Регекс (PCRE аромат), 66 (65🐌) байт
Вдохновленный тем, что Мартин Эндер и jaytea , два гения regex, написали решения regex для этого гольф-кода, я написал свой собственный с нуля. Знаменитое регулярное выражение проверки не появляется нигде в моем решении.
Не читайте это, если вы не хотите испортить вам магию унарных регулярных выражений. Если вы действительно хотите сами разобраться с этой магией, я настоятельно рекомендую начать с решения некоторых проблем в регулярном выражении ECMAScript:
- Подберите простые числа (если вы еще не знакомы с этим в регулярных выражениях)
- Совпадение степеней 2 (если вы еще этого не сделали). Или просто проложите себе путь через Regex Golf , который включает в себя Prime и Powers. Удостоверьтесь, что делали и классические, и Teukon.
Найдите кратчайший способ сопоставления степеней N, где N - некоторая постоянная (то есть указанная в регулярном выражении, а не во входных данных), которая может быть составной (но не обязательной). Например, сопоставьте полномочия 6.
Найдите способ сопоставления N-ых степеней, где N - некоторая постоянная> = 2. Например, сопоставьте идеальные квадраты. (Для разминки, сопоставьте главные силы .)
Подходим правильные операторы умножения. Подходим треугольные числа.
Сопоставьте числа Фибоначчи (если вы такой же сумасшедший, как и я), или если вы хотите придерживаться чего-то более короткого, сопоставьте правильные утверждения возведения в степень (для разминки верните в качестве совпадения логарифм в основании 2 степени 2) бонус, сделайте то же самое для любого числа, округляя его, как вам нравится), или факториальные числа (для разминки, сопоставьте примитивные числа ).
Подберите обильные цифры (если вы такой же сумасшедший, как и я)
Вычислите иррациональное число с требуемой точностью (например, разделите входные данные на квадратный корень из 2, возвращая округленный результат как совпадение)
( Движок регулярных выражений, который я написал, может быть полезен, так как он очень быстр в унарных математических регулярных выражениях и включает унарный числовой режим, который может проверять диапазоны натуральных чисел (но также имеет строковый режим, который может оценивать неунарные регулярные выражения, или унарный с разделителями.) По умолчанию он совместим с ECMAScript, но имеет необязательные расширения (которые могут выборочно добавлять подмножества PCRE, или даже молекулярную перспективу, то, чего нет у других движков регулярных выражений).)
В противном случае, читайте дальше, а также читайте эту GitHub Gist (предупреждение, много спойлеров), в которой рассказывается о том, как подтолкнуть регулярное выражение ECMAScript для решения функций с натуральными числами возрастающей сложности (начиная с набора головоломок teukon, не все из которых математические, что вызвало это поездка).
Как и в других решениях регулярных выражений для этой задачи, входные данные задаются в виде двух чисел в биективном унарном виде, разделенных запятой, представляющей инклюзивный диапазон. Только один номер возвращается. Регулярное выражение можно изменить так, чтобы оно возвращало все числа, которые имеют одинаковый наименьший по величине простой фактор, в виде отдельных совпадений, но для этого требовалось бы смотреть назад с переменной длиной и либо заглядывать вперед, либо \K
возвращать результат в виде захвата вместо совпадения.
Используемая здесь техника повторного неявного деления на наименьший простой множитель идентична той, которая используется в строках Match, длина которых является четвертым степенным ответом, который я опубликовал некоторое время назад.
Без дальнейших церемоний:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Вы можете попробовать это здесь.
И свободная версия, с комментариями:
# No ^ anchor needed, because this algorithm always returns a
# match for valid input (in which the first number is less than
# or equal to the second number), and even in /g mode only one
# match can be returned. You can add an anchor to make it reject
# invalid ranges.
((.+).*), # \1 = low end of range; \2 = conjectured number that is the
# smallest number in the set of the largest prime factor of each
# number in the range; note, it is only in subsequent tests that
# this is implicitly confined to being prime.
# We shall do the rest of our work inside the "high end of range"
# number.
(?! # Assert that there is no number in the range whose largest prime
# factor is smaller than \2.
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
( # Subroutine (?3):
# Find the largest prime factor of tail, and leave it in tail.
# It will both be evaluated here as-is, and later as an atomic
# subroutine call. As used here, it is not wrapped in an atomic
# group. Thus after the return from group 3, backtracking back
# into it can increase the value of tail – but this won't mess
# with the final result, because only making tail smaller could
# change a non-match into a match.
( # Repeatedly divide tail by its smallest prime factor, leaving
# only the largest prime factor at the end.
(?=(..+)(\5+$)) # \6 = tool to make tail = \5 = largest nontrivial factor of
# current tail, which is implicitly the result of dividing it
# by its smallest prime factor.
\6 # tail = \5
)*
)
(?!\2) # matches iff tail < \ 2
)
# now, pick a number in the range whose largest prime factor is \2
.*(?=\1) # Cycle tail through all numbers in the range, starting with \1.
\K # Set us up to return tail as the match.
(?3) # tail = largest prime factor of tail
\2$ # Match iff tail == \2, then return the number whose largest
# prime factor is \2 as the match.
Алгоритм можно легко перенести в ECMAScript, заменив вызов подпрограммы копией подпрограммы и вернув совпадение в качестве группы захвата вместо использования \ K. Результат длиной 80 байт:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Попробуйте онлайн!
Обратите внимание, что ((.+).*)
это можно изменить ((.+)+)
, уменьшив размер на 1 байт (от 66 до 65 байт ) без потери правильной функциональности, но регулярное выражение экспоненциально взрывается в медленности.
Попробуйте онлайн! (79-байтовая версия ECMAScript с экспоненциальным замедлением)