Соревнование
Напишите программу или функцию, которая принимает два входных целых числа i
и j
выводит их наибольший общий делитель; рассчитывается с использованием евклидова алгоритма (см. ниже).
вход
Входные данные могут быть приняты в качестве пространства , разделенных строковым представлением i
и j
или в виде двух отдельных целых чисел. Вы можете предположить, что целые числа будут меньше или равны 10000. Вы также можете предположить, что входные целые числа не будут взаимно простыми.
Евклидово расстройство
Большее число между i
и j
делится на меньшее как можно больше раз. Затем остаток добавляется. Этот процесс повторяется с остатком и предыдущим номером, пока остаток не станет 0
.
Например, если вход был 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
Последнее число 13
является наибольшим общим делителем двух входных целых чисел. Это можно представить так:
Выход
Ваш вывод должен быть разбит на форму выше, за которой следует перевод строки и GCD. Он может быть выведен через любой носитель.
Примеры
входные
18 27
50 20
447 501
9894 2628
Выходы
27 = (18 * 1) + 9
18 = (9 * 2) + 0
9
50 = (20 * 2) + 10
20 = (10 * 2) + 0
10
501 = (447 * 1) + 54
447 = (54 * 8) + 15
54 = (15 * 3) + 9
15 = (9 * 1) + 6
9 = (6 * 1) + 3
6 = (3 * 2) + 0
3
9894 = (2628 * 3) + 2010
2628 = (2010 * 1) + 618
2010 = (618 * 3) + 156
618 = (156 * 3) + 150
156 = (150 * 1) + 6
150 = (6 * 25) + 0
6
Примечание. Выходы не обязательно должны располагаться так, как указано выше. Интервал только для ясности. Скобки обязательны.
бонус
Если ваш вывод находится в интервале, как указано выше, вы можете добавить бонус -10% к вашему счету.
Ответы:
Pyth, 33 байта
Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
CJam,
464339 байтПопробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Python 2, 70
Рекурсивная функция, которая возвращает многострочную строку. Функция создает первую строку, а затем добавляет ее к рекурсивному результату со следующей парой чисел в евклидовом алгоритме. Если второе число равно нулю, мы берем строку другого числа в качестве базового случая, в результате чего она будет напечатана в отдельной строке в конце.
Форматирование выполняется путем подстановки строк с использованием целочисленного деления для получения мультипликатора.
Один сбой нужно начинать с большего числа, взятого с меньшего числа. Удобно, если числа находятся в неправильном порядке, первый шаг евклидова алгоритма переворачивает их. Чтобы этот шаг не отображался, добавляйте текущую строку только в том случае, если первое число равно, по крайней мере, второму (например, необходимо равенство
f(9,9)
).источник
awk,
7877Сортировка входных данных по размеру занимает много байтов: /
Это сводится к следующему:
Выход
Просто для удовольствия я также сделал правильно расставленную версию, получив оценку 233 * 0,9 == 209,7 байта.
Обновление Я смог сократить это с 285 байтов, и теперь он работает для произвольно длинных чисел, если вызвать gawk4 с
-M
опцией.Но у меня все еще было чувство, что я где-то столкнулся с каким-то ментальным блоком ...
Выход (gawk4 вызывается с
awk -M -f code.awk
)Добавлено несколько новых строк и вкладок
Я могу сохранить длины начальных значений для x, y и x% y в начале, потому что они могут становиться только короче с каждым шагом. Но для фактора я должен определить максимальную длину, прежде чем что-либо печатать, потому что ее длина может варьироваться. Я использую
$i
в качестве массива здесь, потому что он сохраняет два символа по сравнению с использованием [i] каждый раз.источник
C ++, компилятор GCC, 171 байт (-10%, поэтому 154 байт)
хорошо, так что моя первая попытка ..
Советы по кодированию в гольф приветствуются.
PS Нужно ли подсчитывать байты стандартных заголовочных файлов и int main при использовании c ++? Исключая это уменьшает 50 байтов
источник
T-SQL (2012+), 268 байт
Реализуется как встроенная табличная функция, которая выполняет рекурсивный CTE. Возможно, стоит попытаться использовать форматирование для получения бонуса в 10%, но это должно подождать.
Объяснение и использование:
источник
Ред. 1: Рубин, 86
Рекурсивный алгоритм, благодаря совету от Doorknob.
Ред. 0: Рубин, 93
Это действительно не сработало вообще.
while
Цикл занимает слишком много символов, особенно сend
. Я не вижу способа избежать этого. Рекурсия потребовала бы именованной функции вместо лямбды, которая также потребляла бы много символов.Назовите это так:
источник
a=->i,j{...}
и вызыватьa
черезa[1,2]
- хотя вы не уверены, что это спасет ваших персонажей.f.call
.) На самом деле он немного короче, но все еще далеко от Python.PowerShell, 84
Блок рекурсивного кода, хранящийся в переменной. Вызвать его
& $e num1 num2
, например:В более читаемой форме он выполняет следующие действия (для более ясного кода, я поместил полные имена командлетов, больше пробелов в строке и сделал явными выходные команды конвейера):
Одно раздражение с точки зрения Codegolf; В PoSh нет целочисленного деления, 10/3 возвращает Double, но приводит результат к целому числу, и оно не всегда округляется в меньшую сторону, оно округляет N.5 до ближайшего четного числа - вверх или вниз. Так
[int](99/2) == 50
.Это оставляет два неловких выбора:
Вот почему я должен сжечь некоторых персонажей, делая:
Кроме того, это число
У меня также есть итеративная версия, которая, как ни странно, также состоит из 84 символов:
Полностью анонимный кодовый блок, поэтому запустите его с
источник
PHP, 118 байт
Попробуйте онлайн!
PHP, 131 байт
Попробуйте онлайн!
-4 байта заменить
list(,$n,$m)=$argv
на[,$n,$m]=$argv
потребности PHP> = 7.1источник
Japt ,
434241 байтКажется, что мои вновь обретенные «навыки» Джапта становятся хуже, а не лучше!
Попробуйте онлайн
источник
JavaScript (ES6),
7450626155 байтПопытайся
объяснение
источник
JS, 151
источник
C 83 байта
тест и результаты
источник
Java 133
Это не делает обычный евклидов алгоритм. Вместо этого он использует модуль, а затем вычисляет 2-е число для умножения на время его распечатки. Вы также можете сделать это короче, превратив его в лямбда-выражение, но я не знаю как.
источник
public
, изменить второйprintln
наprint
и изменитьd!=0
наd>0
. Кроме того, в настоящее время он дает неправильный вывод для первых строк. Это можно исправить, добавивif(d!=i)
передSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. Итого всего:void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}
( 131 байт и исправлена ошибка)