O desafio
Escreva um programa ou função que use dois números inteiros de entrada, i
e j
, e emita seu maior divisor comum; calculado usando o algoritmo euclidiano (veja abaixo).
Entrada
A entrada pode ser tomada como uma representação de string delimitada por espaço i
e / j
ou como dois números inteiros separados. Você pode assumir que números inteiros serão menores ou iguais a 10.000. Você também pode assumir que os números inteiros de entrada não serão primos um do outro.
Repartição Euclidiana
O número maior entre i
e j
é dividido pelo menor tantas vezes quanto possível. Em seguida, o restante é adicionado. Esse processo é repetido com o restante e o número anterior, até que o restante se torne 0
.
Por exemplo, se a entrada foi 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
O número final,, 13
é o maior divisor comum dos dois números inteiros de entrada. Pode ser visualizado assim:
Saída
Sua saída deve ser o detalhamento no formulário acima, seguido por uma nova linha e o GCD. Pode ser produzido através de qualquer meio.
Exemplos
Entradas
18 27
50 20
447 501
9894 2628
Saídas
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
Nota: As saídas não precisam ser espaçadas, pois estão acima. O espaçamento é apenas para maior clareza. Parênteses são obrigatórios.
Bônus
Se sua saída estiver espaçada como acima, você poderá adicionar um bônus de -10% à sua pontuação.
Respostas:
Pitão, 33 bytes
Experimente on-line: demonstração ou Test Suite
Explicação:
fonte
CJam,
464339 bytesExperimente online no intérprete CJam .
Como funciona
fonte
Python 2, 70
Uma função recursiva que retorna uma seqüência de linhas múltiplas. A função cria a primeira linha e a anexa ao resultado recursivo com o próximo par de números no algoritmo euclidiano. Quando o segundo número é zero, tomamos a sequência do outro número como o caso base, fazendo com que seja impresso em sua própria linha no final.
A formatação é feita através da substituição de cadeias, usando a divisão inteira para obter o multiplicando.
Um soluço está precisando começar com o número maior sendo modificado, o número menor. Convenientemente, se os números estão na ordem errada, o primeiro passo do algoritmo euclidiano os vira. Para impedir que essa etapa seja exibida, adicione a linha atual apenas se o primeiro número for pelo menos o segundo (é necessária igualdade para, por exemplo,
f(9,9)
).fonte
awk,
7877A classificação da entrada por tamanho requer muitos bytes: /
Tudo se resume a isso:
Saída
Apenas por diversão, também fiz uma versão com espaçamento adequado, obtendo uma pontuação de 233 * 0,9 == 209,7 bytes.
Atualização Consegui reduzi-lo de 285 bytes e agora ele funciona para números arbitrariamente longos se chamar gawk4 com a
-M
opçãoMas ainda tenho a sensação de que encontrei algum bloqueio mental em algum lugar ...
Saída (gawk4 chamado com
awk -M -f code.awk
)Algumas novas linhas e guias adicionadas
Eu posso salvar os comprimentos dos valores iniciais para x, ye x% y no início, porque eles só podem diminuir a cada etapa. Mas para o fator eu tenho que determinar o comprimento máximo antes de imprimir qualquer coisa, porque ele pode variar. Eu uso
$i
como uma matriz aqui, porque ele salva dois caracteres em comparação ao uso de um [i] toda vez.fonte
C ++, compilador GCC, 171 bytes (-10%, portanto, 154 bytes)
ok então minha primeira tentativa ..
dicas para codificar golfe apreciado.
PS É necessário contar bytes de arquivos de cabeçalho padrão e int main enquanto estiver usando c ++? Excluindo, reduz 50 bytes
fonte
T-SQL (2012+), 268 bytes
Implementado como uma função de tabela embutida que executa uma CTE recursiva. Pode valer a pena tentar colocar a formatação para o bônus de 10%, mas isso terá que esperar.
Explicação e uso:
fonte
Rev 1: Ruby, 86
Algoritmo recursivo, graças à dica da Maçaneta da porta.
Rev 0: Ruby, 93
Isso realmente não deu certo. O
while
loop ocupa muitos caracteres, especialmente com oend
. Não vejo uma maneira de evitá-lo. A recursão exigiria uma função nomeada em vez de uma lambda, que também consumiria muitos caracteres.Chame assim:
fonte
a=->i,j{...}
e chamadaa
viaa[1,2]
- não tenho certeza se isso salvaria seus caracteres.f.call
). Na verdade, é um pouco mais curto, mas ainda está muito longe do Python.PowerShell, 84
Um bloco de código recursivo, armazenado em uma variável. Invoque-o com
& $e num1 num2
, por exemplo:De uma forma mais legível, ele faz o seguinte (por exemplo, para um código mais claro, coloquei os nomes completos dos comandos, mais espaços na sequência e expliquei os comandos de saída do pipeline):
Um aborrecimento do ponto de vista do codegolf; O PoSh não possui divisão inteira, 10/3 retorna um Duplo, mas converte o resultado em um inteiro e nem sempre arredonda para baixo. arredonda N.5 para o número par mais próximo - para cima ou para baixo. Então
[int](99/2) == 50
.Isso deixa duas opções embaraçosas:
É por isso que eu tenho que gravar alguns personagens fazendo:
Além disso, é o número de
Eu também tenho uma versão iterativa que, bastante bem, também possui 84 caracteres:
Codeblock completamente anônimo, então execute-o com
fonte
PHP, 118 bytes
Experimente online!
PHP, 131 bytes
Experimente online!
-4 bytes substituídos
list(,$n,$m)=$argv
pelas[,$n,$m]=$argv
necessidades PHP> = 7.1fonte
Japonês ,
434241 bytesMinhas novas "habilidades" japonesas parecem estar piorando, não melhores!
Experimente online
fonte
JavaScript (ES6),
7450626155 bytesTente
Explicação
fonte
JS, 151
fonte
C, 83 bytes
teste e resultados
fonte
Java 133
Não faz o algoritmo euclidiano regular. Em vez disso, ele usa o módulo e calcula o segundo número para multiplicar quando impresso. Você também pode tornar isso mais curto, transformando-o em uma expressão lambda, mas não sei como.
fonte
public
, alterar o segundoprintln
paraprint
e alterard!=0
parad>0
. Além disso, está atualmente fornecendo uma saída incorreta para as primeiras linhas. Isso pode ser corrigido adicionandoif(d!=i)
na frente deSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. Assim, no total: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 bytes e corrigidos)