Напишите код, который при получении положительного числа качестве ввода выводит наибольший положительный делитель x, меньший или равный квадратному корню из x .
Другими словами, найдите наибольшее такое, что
(Существует большее или равное n, такое что m умноженное на n равно x )
Например, если на входе было делителей, это 1 , 2 , 3 , 4 , 6 и 12 . 1 , 2 и 3 все умножаются на большие числа, чтобы получить 12 , но 3 является наибольшим, поэтому мы возвращаем 3 .
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет считаться лучшим результатом.
Тестовые случаи
(1,1)
(2,1)
(3,1)
(4,2)
(5,1)
(6,2)
(7,1)
(8,2)
(9,3)
(10,2)
(11,1)
(12,3)
(13,1)
(14,2)
(15,3)
(16,4)
(17,1)
(18,3)
(19,1)
(20,4)
(21,3)
(22,2)
(23,1)
(24,4)
(25,5)
(26,2)
(27,3)
(28,4)
(29,1)
(30,5)
(31,1)
(32,4)
(33,3)
(34,2)
(35,5)
(36,6)
(37,1)
(38,2)
(39,3)
(40,5)
(41,1)
(42,6)
(43,1)
(44,4)
(45,5)
(46,2)
(47,1)
(48,6)
(49,7)
(50,5)
Ответы:
Python3 ,
4947 байтобъяснение
l=x**.5//1
→ Назначитьl
наибольшее целое число меньше, чем квадратный корень изx
while x%l:l-=1
→ Покаl
не делится поровнуx
, уменьшатьl
.Правки
...//1
чтобы сохранить два байта. (Десятичные числа в порядке! Спасибо @Rod)источник
input
/print
вместоdef
/return
, вы также можете заменитьint(...)
на,...//1
чтобы сохранить больше байтов, как вы можете видеть здесьMATL , 7 байт
Попробуйте онлайн!
Для этого объяснения мы будем использовать «12» в качестве примера ввода. Объяснение:
Это работает из-за большого количества счастливых совпадений.
<n>)
будем индексироватьисточник
Z\J2/)
(J2/
или эквивалентно.5j
означает,end/2
когда используется в качестве индекса)C (gcc)
-lm
, 35 байтПопробуйте онлайн!
источник
sqrt
как встроенной функции. С-fno-builtin-sqrt
, gcc предполагаетint sqrt(int)
, и не передаетdouble
. На x86-64double
передается в другом регистре, чем целое число. На 32-битном, adouble
будет занимать 2 слота в стеке, так что вы также будете пропускать мусор (или субнормальное с целым числом в качестве нижней части мантиссы, если верхние 32 бита были нулевыми). Это также не работает, если вы не делаете отладочную сборку, потому что она использует неоптимизированный код по умолчанию gcc для вычисления выражений в регистре возвращаемого значения.sqrt()
вопрос иначе: мне было интересно , как это удалось на работу, потому что абонент должен знать каким - то образом преобразоватьint
вdouble
. Я отправил ответ на это в качестве комментария на случай, если кому-то еще будет интересно. Эффективно gcc имеетsqrt
(включая прототип) в качестве встроенного, иначе это не сработало бы по причинам, которые мы иногда видим в SO asm Qsi;f(n){for(i=0;++i<n/i||n%i;);}
имеет значение 31B и работает сgcc -O
x86-64 (стоит 2 или 3 байта для параметра командной строки.) Использование||
вместо|
заставляет gcc оставитьn/i
результатidiv
в EAX, регистр возвращаемого значения ( godbolt.org/g/RJYeui ).++i
Случается неопределенное поведение без точки последовательности. (Произведенный asm в основном такой же, как мой ответ с машинным кодом x86 .) С помощью-O0
gcc всегда кажется, что он уходитi
в EAX, но, возможно, мы можем использовать это ...05AB1E , 5 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник
APL (Dyalog Unicode) ,
161412 байтЯ рад, что смог написать какой-то ответ в APL, так как я только что узнал об этом. Большое, большое спасибо Адаму за помощь в игре в гольф. Предложения по гольфу очень приветствуются. Попробуйте онлайн!
Чтобы узнать больше об APL, взгляните на APL Orchard .
РЕДАКТИРОВАТЬ: -2 байта для устранения проблемы с моим кодом. Спасибо H.PWiz за указание на эту проблему. -2 байта от повторного сокращения.
Ungolfing
источник
Шелуха , 4 байта
Попробуйте онлайн!
объяснение
источник
R ,
4533 байтаПопробуйте онлайн!
Оригинал:
Попробуйте онлайн!
источник
32-битный (IA32) машинный код x86:
1816 байтchangelog:
n=1
правильно обработать контрольный пример, сохранить 2 байта и вернуться в EAX.Считайте до
n/i <= i
(т. Е. Когда мы достигнем sqrt), и используйте первый точный делитель после этого.64-битная версия этого вызывается из C с соглашением о вызовах System V x86-64, as
int squarish_root_countup(int edi)
.nasm -felf32 -l/dev/stdout squarish-root.asm
:Попробуйте онлайн! с вызывающей программой asm, которая использует первый байт argv [1] как целое число напрямую и использует результат как состояние завершения процесса.
источник
Japt
-h
,86 байтПопытайся
2 байта спасены благодаря Оливеру
объяснение
источник
Желе , 5 байт
Попробуйте онлайн!
источник
JavaScript ES7,
3331 байтПопробуйте онлайн
источник
Снеговик , 38 байт
Попробуйте онлайн!
источник
DC , 24
Попробуйте онлайн!
Объяснение:
источник
J,
2419 байт-5 байт благодаря идее Шерлока GCD
Попробуйте онлайн!
оригинальный ответ
Попробуйте онлайн!
разобранный
объяснение
1 + i.@<.@%:
дает диапазон1 .. floor(sqrt)
.(A) B
образует зацепку, с указанным выше диапазоном, переданным как правый аргумент]
A, и исходным числом, переданным как его левый аргумент[
. Таким образом , ...] | [
дает остаток каждого элемента в диапазоне, разделенном на исходный аргумент.0 = ] | [
дает делители без остатка.] #~ ...
затем фильтрует диапазон, оставляя только те.{:
дает последний элемент в списке, т.е. самый большой.источник
Желе , 5 байт
Попробуйте онлайн!
источник
Haskell , 36 байт
Попробуйте онлайн!
[1..]
[1..y]
источник
QBasic (4.5), 52 байта
источник
Forth (gforth) , 53 байта
Самый короткий путь, кажется, использует стек с плавающей запятой, и
fsqrt
самый короткий путь, который я мог получить без него, был 62 байтами, используя/mod
и проверяя, было ли частное больше делителя.Попробуйте онлайн!
объяснение
Код Объяснение
источник
F #,
5549 байтовПопробуйте онлайн!
Seq.findBack
Возвращает последний элемент, для которого возвращается данная функцияTrue
. Функция в этом случае проверяет, является ли число фактором фактора.источник
Brain-Flak , 144 байта
Попробуйте онлайн!
Я не совсем уверен, что этот ответ очень хороший. Я чувствую, что может быть хороший способ решить эту задачу, но я не достаточно умен.
объяснение
Я попытался сделать ответ в разобранном виде, но движущихся частей было так много, что это было не очень поучительно, поэтому вот объяснение того, что делает код.
Первый важный момент это
Следующая часть - умножение, взятое с модификацией из вики . Это умножение является особенным, поскольку оно сохраняет существующие значения, не разрушая их. Это идет как:
Итак, мы умножаем все эти упорядоченные пары. Для каждого результата мы проверяем, равен ли он входу. Если это так, мы прекращаем и возвращаем меньший элемент в паре.
источник
Python 2 , 41 байт
Попробуйте онлайн!
источник
Желе , 6 байт
Попробуйте онлайн!
источник
Perl 5
-p
, 26 байтПопробуйте онлайн!
источник
Ржавчина,
7170 байтПредварительно улучшенная версия
Правки
> 0
более чем!= 0
. (Спасибо @CatWizard)источник
!=
заменить на>
?Japt , 8 байт
Попробуйте онлайн!
источник
Треугольность , 49 байтов
Попробуйте онлайн!
источник
Pyret , 93 байта
Вы можете попробовать это онлайн, скопировав его в онлайн-редактор Pyret !
Выше оценивается анонимная функция. Когда он применяется к целому числу, он возвращает результат в соответствии со спецификацией.
источник
На самом деле 7 байтов
На основании моего ответа APL здесь . Предложения по игре в гольф приветствуются! Попробуйте онлайн!
Ungolfing
источник
Порт этого Mathematica ответа .
Желе , 11 байт
Попробуйте онлайн!
Это (11 байт) также работает и не зависит от
³
:К сожалению
½Ḟ÷@Ċ÷@ʋÐL
(10 байт) не работает. И видимоƬ
иÐĿ
не совсем то же самое (когда ссылка диадическая)источник
Java 8,
6554 байтаПорт @hunteke 's Python 3 ответа .
Попробуйте онлайн.
Старый 65-байтовый ответ:
Попробуйте онлайн.
Объяснение:
источник