Формула
Возьмите, например, число 300
- Основные факторы 300
[2, 3, 5]
(уникальные числа, которые являются факторами 300 и простые) - Квадрат каждого из этих чисел даст вам
[4, 9, 25]
- Суммирование этого списка даст вам
4 + 9 + 25 = 38
- Наконец, вычтите эту сумму (38) из вашего исходного числа
300-38 = 262
(это результат)
вход
Ваш ввод будет положительным целым числом больше 2. Вы должны проверить все числа от 2 до входного значения (включительно) и найти число, которое дает наибольший результат с формулой выше.
Выход
Ваш вывод будет двумя числами, разделенными пробелом, запятой, переводом строки или чем-то, что позволяет ваш язык (разделение необходимо для различения двух чисел). Они могут быть выведены в файл, стандартный вывод или на любой другой язык. Ваша цель состоит в том, чтобы найти число в диапазоне, которое дает максимальный выход при выполнении по формуле выше. Первое отображаемое число должно быть начальным числом (например, 300), а второе число должно быть выводом, полученным по формуле (например, 262).
Тестовые случаи
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Проработанный пример
Рассмотрим ввод 10, мы должны запустить формулу для всех чисел от 2-10 (включительно)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Как вы можете видеть, наибольший результат 4
, который был результатом ввода значения 8
в формулу. Это означает, что вывод для ввода 10
должен быть8, 4
Оценка и правила
Применяются правила по умолчанию для входов и выходов: по умолчанию для Code Golf: методы ввода / вывода
. Стандартные лазейки запрещены: лазейки , которые запрещены по умолчанию.
Представления могут быть функциями или полными программами.
Самый короткий код в байтах выигрывает
50
:35, 48
?Ответы:
Pyth,
1715 байтТестирование.
источник
Java 8 лямбда,
247239233225224219198161 символовЯ думал, что это возможно в менее чем 300 символов, потому что ... вы знаете ... Java!
И это действительно возможно даже в менее чем 200 символов!
Я не знаю, является ли это использование импорта законным, но я предполагаю, что все должно быть в порядке.Вот лямбда, разряженная в класс:Нахождение главного фактора основано на этом ответе . Код использует функциональность наборов, поскольку они сохраняют каждое значение только один раз, поэтому мне не нужно заботиться о добавленных дубликатах позже. Остальная часть кода довольно проста, просто следуя вопросу.
Обновления
Удален перевод строки из вывода.
Спасибо @ogregoire за игру в Integer.MIN_VALUE до 1 << 31!
Посмотрев код снова, я нашел еще несколько мест, где можно играть в гольф.
Спасибо @Blue за трюк от == 0 до <1!
Удалены некоторые оставшиеся пробелы. Также для разделения нужен только один символ, поэтому не нужно тратить один символ.
Еще раз спасибо @ogregoire за указание на то, что я могу вернуть значение вместо того, чтобы распечатать его и собрать объявления! Это спасло много!
Обнаружил, что могу использовать троичного вместо второго, если сохранить еще один символ.
Спасибо @AstronDan за потрясающее использование массива, который сохраняет импорт. Это также дало мне возможность сократить первый, если в тройной.
источник
Integer.MIN_VALUE
можно сократить как1<<31
.int
в одном месте, чтобы избежать повторенияint
несколько раз, и присвойте им их значение там, где это возможно.System.out.println(...)
и верните значение вместо его печати: как упоминается в OP, используется стандартный метод ввода-вывода.На самом деле, 21 байт
Попробуйте онлайн!
Объяснение:
источник
Actually Programming Language
и ничего не нашел даже после просмотра 5-й страницы результатов Google. Что это за язык?MATL , 18 байт
Попробуйте онлайн!
Последний случай занимает слишком много времени для онлайн-компилятора, но он дает правильный результат (это занимает около 11 секунд на моем компьютере, работающем на Matlab):
объяснение
Прямое применение описанной процедуры.
источник
C #, 194 байта
Мой первый Код Гольф :). Я использовал свой любимый язык, несмотря на его многословие. Я начал это как порт функции C # Java @ Frozn, но нашел несколько способов дальнейшего сокращения кода за счет оптимизации.
Это использует массив для хранения основных факторов. Поскольку он индексируется фактором, он заменяет повторяющиеся факторы на копии фактора. Это позволяет функции не иметь импорта. Это даже не требует системы.
источник
Утилиты Bash + GNU, 74
seq
генерирует все целые числа от 2 до nfactor
дает число, за которым следует двоеточие, а затем разделенный пробелами список всех простых факторов, включая дубликаты. например, результат для 1212: 2 2 3
sed
удаляет двоеточие и дубликаты факторов, затем генерирует необходимое арифметическое выражение. например, для 12:12- 2* 2- 3* 3
bc
оценивает этоnl
префиксы n обратно (начиная с 2)sort
по второму столбцу численно в порядке убыванияseq
печатает первую строку и выходит.Ideone.
источник
Брахилог , 48 байт
объяснение
источник
Желе , 13 байт
Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
05AB1E,
191716 байтовКод:
Объяснение:
Попробуйте онлайн
источник
Юлия, 56 байт
Попробуйте онлайн!
Как это устроено
При заданном входном n для каждого целого числа k, такого что 2 ≤ k ≤ n , мы генерируем кортеж (f (k), k) , где f (k) - это разность между k и суммой квадратов его простых множителей. ,
Само по себе вычисляется f (k)
k-sumabs2(k|>factor|>keys)
, который переводит k в Dict простых ключей и значений экспонент, извлекает все ключи (простые множители), берет сумму их квадратов и вычитает полученное целое число из k .Наконец, мы берем лексикографический максимум сгенерированных кортежей и обращаем его к нему, используя индексы 2 и 1 .
источник
Clojure, 215 байтов
Просто следует правилам. Вычисляет главные факторы каждого числа, помещает их в квадрат и суммирует их. После этого создайте список векторов из 2 элементов: начальное число и его результат и найдите элемент с максимальным значением второго элемента.
Вы можете увидеть это онлайн здесь: https://ideone.com/1J9i0y
источник
R 109 байт
Я обманул и использовал пакет
gmp
.источник
CJam, 32 байта
Попробуйте онлайн!
источник
Пайк, 17 байт
Попробуй это здесь!
источник
PowerShell v2 +,
124120117 байтПервая строка вычисляет значения, вторая просто вывод.
Мы начинаем с создания диапазона
2
вплоть до аргумента командной строки$args[0]
и зацикливаем его|%{...}
. В каждом цикле мы устанавливаем вспомогательные переменные, равные нашему текущему значению$y=$z=$_
. Затем мы перебираем все номера2
вплоть до нашего текущего номера. В каждом внутреннем цикле мы проверяем, является ли это число делителем!($z%$_)
и является ли оно простым('1'*$_-match'^(?!(..+)\1+$)..')
, и, если оно и то и другое, мы вычитаем квадрат из$y
(проверки выполняются с использованием логического умножения)Как только мы прошли все простые делители и вычли квадраты, если оставшееся число является наибольшим из тех, что мы видели до сих пор
$y-gt$o
, мы устанавливаем наши выходные переменные$o=$y;$p=$_
. После того, как мы перебрали весь диапазон, мы просто выводим пробел между ними.источник
Haskell, 91 байт
Пример использования:
f 50
->[48,35]
.Функции простого множителя доступны только через
import Data.Numbers.Primes
стоимость, которая стоит слишком много байтов, поэтому я использую простейшую проверку @ Lynn . Остальное прямо вперед: для вводаm
петлиn
через[2..m]
и во внутреннем циклеp
через[2..n]
. Держите все,p
что простое и делитьn
, квадрат и сумма.источник
Python 2,
108105100 байтПроверьте это на Ideone .
источник
JavaScript (ES6),
111105 байтПонятия не имею, почему я не думал делать это рекурсивно раньше.
источник
J, 44 байта
Прямой подход. Также возвращает все значения
n
этого результата в максимальном значении.использование
источник