O algoritmo euclidiano é um algoritmo amplamente conhecido para calcular o maior divisor comum (MDC) de dois números inteiros positivos.
O algoritmo
Para os propósitos deste desafio, o algoritmo é descrito abaixo:
Exiba as duas entradas como linhas adjacentes de um determinado caracter,
por exemplo, uma entrada de3,4
pode ser representada pelas linhas adjacentes000
e0000
Transforme os primeiros
length(short_line)
caracteres na linha mais longa em outro, diga-
agora que parece000
e---0
Elimine os primeiros
length(short_line)
caracteres na linha mais longa.
agora000
,0
Repetir os passos 2 e 3 até que os dois têm a mesma duração, utilizando as linhas mais curtas e mais longas depois de cada iteração, por exemplo
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Você pode optar por parar aqui ou continuar a iteração e transformar uma das linhas em uma linha vazia.
Cada uma dessas etapas deve ser separada por um intervalo entre 0,3s e 1,5s.
O desafio
Escreva um programa que, dados dois números naturais como entrada, crie uma saída exatamente igual à saída do algoritmo acima. Você pode usar outros caracteres ASCII imprimíveis que não sejam espaços em branco além de 0
e -
, mas seja consistente e use apenas dois caracteres. Você também pode usar algoritmos alternativos, desde que a saída, incluindo o tempo, seja exatamente a mesma que seria produzida pelo algoritmo acima.
Exemplos
Este é um exemplo com entrada 24,35
, que são coprimes, portanto seu GCD é 1.
Este é um exemplo com entrada 16,42
, que possui o GCD 2.
Regras
- Este é um código de golfe , então os bytes mais curtos vencem
- Aplicam-se brechas padrão
- Você pode assumir que a entrada seja um número inteiro decimal positivo
Esclarecimentos
- As linhas que representam os números precisam permanecer em sua ordem original, ou seja, a primeira e a segunda linhas do primeiro "quadro" exibido precisam ser a primeira e a segunda linhas, respectivamente, em todos os quadros subsequentes.
- Depois que o algoritmo termina, nenhuma entidade visível adicional deve aparecer. No entanto, isso também significa que não há problema em deixar as linhas em branco, se você garantir que o último "quadro" seja exibido pelo menos na mesma quantidade de tempo que todos os outros quadros antes de apagar.
:-)
Respostas:
Gelatina , 29 bytes
Experimente online!
Isso define uma função
2Ŀ
(não um programa completo; o link TIO contém um rodapé que converte uma função em um programa) que pega uma lista de dois elementos como entrada e exibe a saída na tela (um dos nossos métodos legais de E / S , e que é meio que necessário para esse desafio, porque fala sobre a aparência na tela). Isso pressupõe que o programa seja executado em um terminal que esteja em conformidade com o padrão ANSI (eu usei,gnome-terminal
mas a maioria funcionará) e que o terminal esteja inicialmente vazio (o que parece ser o padrão mais sensato); note que Experimente online! não está de acordo com essas suposições e, portanto, a saída é distorcida (executei o programa localmente para verificar se ele anima como esperado). Eu uso1
onde a pergunta usa0
e2
no lugar de-
.Explicação
Função auxiliar
1Ŀ
(dada uma lista de duas listas de dígitos, as gera na primeira e na segunda linhas da tela e aguarda 0,5 segundos; retorna sua entrada)A cadeia "\ x1bc", quando enviada para um terminal compatível com ANSI, é interpretada como um código de controle para redefinir o terminal; isso limpa a tela e move o cursor para o canto superior esquerdo (redefinindo assim o terminal pronto para a próxima saída).
A função auxiliar é chamada
1Ŀ
(o Jelly gera automaticamente nomes desse formulário para funções e, de fato, não há outra maneira de nomeá-los), mas pode ser referido simplesmente aÇ
partir do programa principal (porque o idioma possui abreviação de funções com números próximos) )Função principal
2Ŀ
(implementa a tarefa solicitada na questão)fonte
JavaScript (ES6),
128124 bytesfonte
Python 2 ,
152146 bytesExperimente online!
Toma dois números inteiros separados por vírgula como entrada
fonte
Javascript (ES6),
215 194...135 129127 bytesUso
Isso leva em consideração uma variação no curry. Para usá-lo, primeiro atribua a função a uma variável (por exemplo
G
) e chame-a assim:Explicação
Função um pouco recursiva que se chama após 1 segundo, desde que o algoritmo não tenha terminado. Ele controla uma terceira variável
c
que determina sea
eb
deve ser alterada (sec
for1
, é hora de mudar).Primeiro, a função grava algo no console. Se
c
for0
, ele grava duas seqüências de zeros com uma nova linha entre elas. Comoc
é inicializado0
, podemos tirar proveito disso e configurar variáveis globaisf
eg
que contêm algumas strings que precisamos com frequência (como0
erepeat
).Caso contrário, ele cria uma string com zeros e menos. Todas essas strings consistem em duas partes: primeiro alguns (chamam esse valor
A
) menos, depois alguns (chamam esse valorB
) zeros, depois uma nova linha, depois alguns (chamam esse valorD
) menos e, finalmente, alguns (chamam esse valor)E
) zeros.Se a primeira entrada for menor que a segunda entrada, precisamos remover os zeros da segunda entrada, assim
A
é zero,B
igual à primeira entrada,D
igual à primeira entrada eE
igual à segunda entrada menos a primeira entrada. Se a primeira entrada não for menor que a segunda entrada, o inverso será aplicado (A
é a segunda entrada,B
é a primeira entrada menos a segunda entrada etc.).Com esses novos valores para a entrada e uma variável comutada
c
, a função está programada para ser chamada novamente em1e3
milissegundos, o que equivale a um segundo.Notas
alert
para saída0
e-
, assim como nos exemplosExperimente online
Experimente aqui!
fonte
Python 2 ,
208204194 bytes-4 com agradecimentos a @math_junkie pelo truque sorrateiro com
time.sleep
-10 com agradecimentos a @busukxuan por esclarecer a regra "tela limpa".
Experimente online!
Certamente isso poderia ser mais jogado. Dói-me duplicar o
print
e ofor
loop para criar a pausa, mas não consigo encontrar uma maneira de contorná-lo no momento.Notas
fonte
import time
,s=time.sleep
es(1)
em vez de um loop para o atrasotime.sleep
mas perdi essa. Vai tentar.perl,
161149 bytes... sem recuos e novas linhas:
Coloque-o em um arquivo gcd.pl e execute assim:
fonte
-M5.010
sinalizador para perl é gratuito, portanto você pode salvar alguns bytes usandosay
overprint…\n
. Além disso, tenho certeza de que é mais tenso atribuir um nome à sua sub-rotina anônima, em vez de armazená-la em uma variável.GNU Sed (com
e
extensão xec), 88A pontuação inclui +3 para as
-zrf
opções desed
.A entrada é fornecida como dois números inteiros unários separados por nova linha, usando maiúsculas
O
como dígitos.Por exemplo, o exemplo 16, 42 pode ser executado como:
De acordo com os comentários mais recentes, não estou limpando a tela entre as iterações.
fonte
V ,
4744 bytesExperimente online!
O cabeçalho e rodapé no TIO são modificados
gs
para copiar as duas linhas atuais na parte inferior da tela e, em seguida, excluir as duas primeiras no final. Isso visualiza a operação do TIO, mas se você a executasse em V (sem o cabeçalho e o rodapé), esperaria apenas um segundo entre cada operação.fonte
ò
?