Евклидов алгоритм является широко известным алгоритмом вычисления наибольшего общего делителя (GCD) двух натуральных чисел.
Алгоритм
Для целей этой задачи алгоритм описывается следующим образом:
Отображение двух входных данных в виде смежных строк определенного символа,
например вход3,4
может быть представлен соседними строками000
и0000
Превратите первые
length(short_line)
символы в более длинной строке в другого персонажа, скажем,-
теперь он выглядит000
и---0
Удалите первые
length(short_line)
символы в длинной строке.
Теперь000
,0
Повторите шаг 2 и 3 до двух имеют одинаковую длину, используя более короткие и более длинные строки после каждой итерации, например
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Вы можете выбрать, останавливаться ли здесь или продолжить итерацию и превратить одну из строк в пустую.
Каждый из этих шагов должен быть разделен интервалом от 0,3 с до 1,5 с.
Соревнование
Напишите программу, которая, учитывая два натуральных числа в качестве входных данных, создает выходные данные, которые выглядят точно так же, как выходные данные алгоритма выше. Вы можете использовать другие печатные символы ASCII, не являющиеся пробельными символами, кроме 0
и -
, но будьте последовательны и используйте только два символа. Вы также можете использовать альтернативные алгоритмы при условии, что выходные данные, включая временные характеристики, будут точно такими же, как и при использовании алгоритма выше.
Примеры
Это пример с входными 24,35
данными, которые являются взаимно простыми, поэтому их GCD равен 1.
Это пример с вводом 16,42
, который имеет GCD 2.
правила
- Это код-гольф , поэтому выигрывают самые короткие байты
- Применяются стандартные лазейки
- Вы можете считать входные данные положительными десятичными целыми числами
Разъяснения
- Строки, которые представляют числа, должны оставаться в их исходном порядке, то есть первая и вторая строки первого отображаемого «кадра» должны быть соответственно первой и второй строками во всех последующих кадрах.
- После завершения алгоритма никакая дополнительная видимая сущность не должна появляться. Однако это также означает, что все строки можно очищать, если вы убедитесь, что последний «кадр» отображается в течение, по крайней мере, того же промежутка времени, что и все остальные кадры, перед тем, как отключиться.
:-)
Ответы:
Желе , 29 байт
Попробуйте онлайн!
Это определяет функцию
2Ŀ
(не полную программу; ссылка TIO содержит нижний колонтитул, который преобразует функцию в программу), которая принимает список из двух элементов в качестве входных данных и отображает выходные данные на экране (один из наших допустимых методов ввода / вывода и тот, который вроде необходим для этого вызова, потому что он говорит о появлении на экране). Это предполагает, что программа запускается в терминале, который соответствует стандарту ANSI (я использовал,gnome-terminal
но большинство будет работать), и что терминал изначально пуст (что кажется наиболее разумным значением по умолчанию); обратите внимание, что попробуйте онлайн! никак не соответствует этим предположениям, и , таким образом , выходной сигнал искажается там (я запускал программу локально , чтобы убедиться , что она одушевляет , как и ожидалось). Я использую1
там, где используется вопрос0
, и2
на месте-
.объяснение
Вспомогательная функция
1Ŀ
(при наличии списка из двух списков цифр выводит их в первой и второй строках экрана, затем ждет 0,5 секунды; возвращает свой ввод)Строка «\ x1bc» при отправке на ANSI-совместимый терминал интерпретируется как управляющий код для сброса терминала; это очистит экран и переместит курсор в верхний левый угол (таким образом, терминал будет готов к следующему выводу).
Вспомогательная функция названа
1Ŀ
(Jelly автоматически генерирует имена этой формы для функций, и на самом деле нет другого способа присвоить им имена), но ее можно ссылаться просто какÇ
из основной программы (поскольку в языке есть сокращение для функций с числами рядом ).Основная функция
2Ŀ
(реализует задачу, заданную в вопросе)источник
JavaScript (ES6),
128124 байтаисточник
Python 2 ,
152146 байтПопробуйте онлайн!
Принимает два целых числа через запятую
источник
Javascript (ES6),
215 194...135 129127 байтиспользование
Это принимает вклад в вариации на карри. Чтобы использовать это, сначала присвойте функцию переменной (например
G
), затем вызовите ее так:объяснение
Несколько рекурсивная функция, которая вызывает себя через 1 секунду, пока алгоритм еще не завершен. Он отслеживает третью переменную,
c
которая определяет, нужно лиa
иb
нужно ли изменять (еслиc
есть1
, пришло время для изменений).Сначала функция что-то записывает в консоль. Если
c
есть0
, он записывает две строки нулей с новой строкой между ними. Так какc
инициализируется0
, мы можем воспользоваться этим, и установить глобальные переменныеf
иg
которые держат некоторые строки Нам нужно часто (как0
иrepeat
).В противном случае он создает строку с нулями и минусами. Все такие строки состоят из двух частей: сначала некоторые (называют эту сумму
A
) минусы, затем некоторые (называют эту суммуB
) нули, затем символ новой строки, затем некоторые (называют эту суммуD
) минусы и, наконец, некоторые (называют эту суммуE
) нули.Если первый вход меньше, чем второй, нам нужно удалить нули со второго входа, поэтому он
A
равен нулю,B
равен первому входу,D
равен первому входу иE
равен второму входу минус первый вход. Если первый вход не меньше второго входа, применяется обратное (A
второй вход,B
первый вход минус второй вход и т. Д.).С этими новыми значениями для входа и переключаемой переменной
c
запланирован повторный вызов функции в1e3
миллисекундах, что равно одной секунде.Примечания
alert
для вывода0
и-
, как в примерахПопробуйте онлайн
Попробуй это здесь!
источник
Python 2 ,
208204194 байта-4 с благодарностью @math_junkie за подлый трюк с
time.sleep
-10 с благодарностью @busukxuan за разъяснение правила «очистки экрана».
Попробуйте онлайн!
Уверен, что это может быть больше в гольфе. Больно мне , чтобы дублировать
print
иfor
петлю , чтобы создать паузу , но я не могу найти способ вокруг него в данный момент.Примечания
источник
import time
,s=time.sleep
иs(1)
вместо того, чтобы петли для задержкиtime.sleep
но пропустил. Попробую.Perl,
161149 байт... без отступов и переносов:
Поместите его в файл gcd.pl и запустите так:
источник
-M5.010
Флаг Perl свободен, так что вы можете сэкономить несколько байт, используяsay
болееprint…\n
. Кроме того, я уверен, что лучше дать вашей анонимной подпрограмме имя, а не сохранять его в переменной.GNU Sed (с
e
расширением xec), 88Оценка включает в себя +3 для
-zrf
вариантовsed
.Входные данные даны в виде двух одинарных целых чисел, разделенных новой строкой, с использованием верхнего регистра в
O
качестве цифрНапример, пример 16, 42 может быть запущен как:
Согласно последним комментариям, я не очищаю экран между итерациями.
источник
V ,
4744 байтаПопробуйте онлайн!
Верхний и нижний колонтитулы в TIO просто изменяются,
gs
чтобы скопировать две текущие строки в нижнюю часть экрана, а затем удалить первые две в конце. Это визуализирует операцию для TIO, но если вы запустили ее в V (без верхнего и нижнего колонтитула), она просто подождет секунду между каждой операцией.источник
ò
?