Seu desafio é criar um programa ou função que produza o GCD de suas entradas em um idioma e o LCM de suas entradas em outro. Builtins para GCD ou LCM (estou olhando para você, Mathematica) são permitidos, mas não incentivados. Haverá 2 entradas, que sempre serão números inteiros positivos, nunca maiores que 1000.
Casos de teste
Cada linha é um caso de teste no formato x y => GCD(x,y) LCM(x,y)
:
1 1 => 1 1
1 2 => 1 2
4 1 => 1 4
3 4 => 1 12
7 5 => 1 35
18 15 => 3 90
23 23 => 23 23
999 1000 => 1 999000
1000 999 => 1 999000
1000 1000 => 1000 1000
Veja esta pasta para todas as entradas possíveis com 0 < x, y < 31
. Observe que versões diferentes dos mesmos idiomas contam como idiomas diferentes.
if
é permitido baseado em uma versão do idioma, se armazenado em uma variável?Respostas:
Gelatina / Na verdade , 2 bytes
Este é um hexdump (xxd) do programa enviado. Não pode ser testado online porque o TIO não suporta a codificação CP437. A @Mego teve a gentileza de verificar se isso funciona no Cygwin, que implementa o CP437 como pretendido na verdade.
Geléia: GCD
Jelly usa a página de código Jelly , para ver os seguintes caracteres.
Experimente online!
Como funciona
œ
é um token incompleto e, portanto, ignorado.g
é o GCD embutido.Na verdade: LCM
Na verdade, usa o CP 437 , para ver os seguintes caracteres.
Experimente online!
Como funciona
▲
é a entrada LCM. Comog
(GCD) requer duas entradas inteiras, ele não é executado.fonte
C / C ++,
797873 bytesAgradecemos a @ETHproductions por salvar um byte!
C calcula o GCD: Experimente online!
C ++ calcula o LCM: Experimente online!
Em C,
auto e=.5
declara uma variável inteira com a classe de armazenamento automático (que é o padrão), que é inicializada como 0, enquanto que em C ++ 11 declara um duplo, inicializado como 0,5. Portanto, o valor da variável será verdadeiro em C ++ e falso em C.A função calcula o GCD com o algoritmo de Euclid e o LCM dividindo o produto de aeb pelo GCD.
A omissão da declaração de retorno funciona pelo menos no GCC. A solução de 78 bytes abaixo deve funcionar com qualquer compilador:
fonte
for(;a;b=c)c=a,a=b%a;
for
em vez dewhile
;)Na verdade / geléia , 3 bytes
Este é um hexdump (xxd) do programa enviado.
Experimente online! 1
Na verdade: GCD
Na verdade, usa o CP 437 , para ver os seguintes caracteres.
Experimente online!
Como funciona
Geléia: LCM
Jelly usa a página de código Jelly , para ver os seguintes caracteres.
Experimente online!
Como funciona
Nota: A fórmula GCD (a, b) lcm (a, b) = ab segura porque um e b são positivos.
1 O TIO realmente usa UTF-8 para Na verdade. Como os caracteres ASCII e CP437 0x11 e 0x1c não estão atribuídos, o programa funciona mesmo assim.
fonte
Alice e Jelly , 9 bytes
Alice calcula o LCM:
Experimente online!
O que parece um espaço é realmente
0x7F
oDEL
personagem de controle.Jelly calcula o GCD. Como o Jelly usa sua própria página de códigos, compatível apenas com ASCII imprimível, o avanço de linha e o caractere DEL se transformam em
½
avanço de linha, respectivamente:Experimente online!
Explicações
A geléia é trivial: a primeira linha define um link auxiliar sem sentido, a segunda linha é o programa real e simplesmente contém o GCD embutido.
Alice é um pouco mais complicada, mas também usa um built-in:
fonte
What looks like a space
realmente não parece um espaço.Oitava / MATLAB,
6661 bytesEconomizou 5 bytes graças a Foon.
(x*y)^any()
era obviamente mais curto que1+(x*y-1)*any()
.Bem, pelo menos ele não usa o built-in para
lcm
.Explicação:
Isso usa o builtin
gcd
para calcular o maior divisor comum.Na oitava, isso é levado ao poder de
1-2*any(version==82)
.any(version==82)
está0
na oitava, então isso é simplesgcd(x,y)^1
. É multiplicado por(x*y)^any(version==82)
, ou(x*y)^0 = 1
.Para o MATLAB,
gcd
é elevado ao poder de1-2*any(version==82)
.any(version==82)
está1
no MATLAB, então estágcd(x,y)^-1
. É multiplicado por(x*y)^any(version==82)
, ou(x*y)^1 = x*y
. Isso fornece o menor múltiplo comum, já quelcm(x,y) == x*y/gcd(x,y)
para números positivos.fonte
Geléia e MATL ,
65 bytesEste é um programa completo em um dos dois idiomas. Ele calcula o GCD no Jelly ( Experimente online! ) E o LCM no MATL ( Experimente online! ). O programa MATL sai com um erro (permitido por padrão) após produzir a saída correta.
Somente caracteres ASCII são usados e, portanto, correspondem aos mesmos bytes codificados nos dois idiomas.
Explicação do GCD em Jelly
Explicação do LCM no MATL
fonte
Julia 0.4 / Julia 0.5 , 18 bytes
Avalia
gcd
em Julia 0.4 ( Experimente online! ) Elcm
em Julia 0.5 ( Experimente online! ).Como funciona
Em Julia 0.4,
log.(1)
é uma abreviação degetfield(log,1)
, que retorna a localização da memória dolog
builtin, por exemplo, o ponteiroPtr{Void} @0x00007f2846cb6660
. O resultado é, portanto, diferente de zero, a comparação é falsa e a expressão é avaliada comogcd
.Na Julia 0.5, uma nova sintaxe de vetorização de função foi introduzida.
log.(1)
agora é uma abreviação parabroadcast(log,1)
, que - como1
não é iterável - simplesmente avalialog(1)
. O resultado é, portanto, zero, a comparação é verdadeira e a expressão é avaliada comolcm
.fonte
Oitava / MATLAB,
444241 bytesIsso define uma função anônima para GCD (
@gcd
) na oitava e para LCM (@lcm
) no MATLAB.Exemplo no Octave (ou Experimente online! ):
Exemplo no MATLAB:
fonte
JS (ES6), CGL (linguagem de golfe CGL) , 31 bytes (não concorrente)
O recurso LCM do CGL foi adicionado após esse desafio.
O que parece um espaço é, na verdade, um espaço sem quebra, um comentário para o CGL. JS calcula o GCD:
E o CGL calcula o LCM:
Experimente:
fonte