Poligloty GCD / LCM!

26

Wyzwanie polega na stworzeniu programu lub funkcji, która wyprowadza GCD swoich danych wejściowych w jednym języku i LCM swoich danych wejściowych w innym języku. Wbudowane dla GCD lub LCM (patrzę na ciebie, Mathematica) są dozwolone, ale nie zachęcane. Będą 2 wejścia, które zawsze będą dodatnimi liczbami całkowitymi, nigdy nie większymi niż 1000.

Przypadki testowe

Każda linia to jeden przypadek testowy w formacie 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

Zobacz tę pastebin dla wszystkich możliwych danych wejściowych z 0 < x, y < 31. Pamiętaj, że różne wersje tych samych języków są liczone jako różne języki.

programmer5000
źródło
Tak więc ... ifoparty na wersji języka, jeśli jest przechowywany w zmiennej, jest dozwolony?
IllidanS4 chce odzyskać Monikę
@ illidanS4 w porządku.
programista

Odpowiedzi:

24

Galaretka / Właściwie 2 bajty

00000000: 1e 67                                            .g

To jest zrzut heksadecymalny (xxd) przesłanego programu. Nie można go przetestować online, ponieważ TIO nie obsługuje kodowania CP437. @Mego był na tyle uprzejmy, aby sprawdzić, czy to działa na Cygwin, który implementuje CP437 zgodnie z przeznaczeniem dla Faktycznie.

Galaretka: GCD

Galaretka używa strony kodowej Galaretka , więc widzi następujące znaki.

œg

Wypróbuj online!

Jak to działa

œjest niekompletnym tokenem i dlatego jest ignorowany. gjest wbudowany w GCD.

Właściwie: LCM

Właściwie używa CP 437 , więc widzi następujące znaki.

▲g

Wypróbuj online!

Jak to działa

to wejście LCM. Ponieważ g(GCD) wymaga dwóch liczb całkowitych, nie jest wykonywane.

Dennis
źródło
27

C / C ++, 79 78 73 bajtów

Dzięki @ETHproductions za uratowanie bajtu!

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;c=e?d/b:b;}

C oblicza GCD: Wypróbuj online!

C ++ oblicza LCM: Wypróbuj online!

W C auto e=.5deklaruje zmienną całkowitą z klasą automatycznego przechowywania (która jest domyślną), która jest następnie inicjowana na 0, podczas gdy w C ++ 11 deklaruje podwójną, która jest inicjowana na 0,5. Tak więc wartość zmiennej będzie prawdziwa w C ++, a fałsz w C.

Funkcja oblicza GCD z algorytmem Euclida i LCM, dzieląc iloczyn aib przez GCD.

Pominięcie instrukcji return działa przynajmniej w GCC. Poniższe 78-bajtowe rozwiązanie powinno działać z dowolnym kompilatorem:

int f(int a,int b){int c,d=a*b;for(;a;b=c)c=a,a=b%a;auto e=.5;return e?d/b:b;}
Steadybox
źródło
1
wyjaśnienie byłoby fajne, jeśli możesz
kot
@cat Dodano wyjaśnienie.
Steadybox
1
Jeśli się nie mylę, możesz uratować bajt za pomocąfor(;a;b=c)c=a,a=b%a;
ETHproductions
@ETHproductions Dzięki! Wiedziałem, że jest powód, aby korzystać forzamiast while;)
Steadybox 18.04.17
18

Właściwie / galaretka , 3 bajty

00000000: 11 1c 67                                         ..g

To jest zrzut heksadecymalny (xxd) przesłanego programu.

Wypróbuj online! 1

Właściwie: GCD

Właściwie używa CP 437 , więc widzi następujące znaki.

◄∟g

Wypróbuj online!

Jak to działa

     (implicit) Read a and b from STDIN and push them on the stack.
◄    Unassigned. Does nothing.
 ∟   Unassigned. Does nothing.
  g  Pop a and b and push gcd(a,b).
     (implicit) Write the result to STDOUT.

Galaretka: LCM

Galaretka używa strony kodowej Galaretka , więc widzi następujące znaki.

×÷g    

Wypróbuj online!

Jak to działa

×÷g  Main link. Left argument: a. Right argument: b

×      Multiply; yield ab.
  g    GCD; yield gcd(a,b).
 ÷     Division; yield ab/gcd(a,b) = lcm(a,b).

Uwaga: Wzór GCD (a, b), LCM (a, b) = AB posiada ponieważ i b są dodatnie.


1 TIO faktycznie korzysta z UTF-8. Ponieważ zarówno znaki ASCII, jak i znaki CP437 0x11 i 0x1c są nieprzypisane, program działa mimo to.

Dennis
źródło
9

Alice and Jelly , 9 bajtów

Alice oblicza LCM:

//L
oi@g

Wypróbuj online!

Co wygląda jak przestrzeń jest naprawdę 0x7FThe DELznak kontrolny.

Galaretka oblicza GCD. Ponieważ Jelly używa własnej strony kodowej, która jest kompatybilna tylko z drukowalnym ASCII, znaki linefeed i DEL zmieniają się odpowiednio w ½linefeed i linefeed:

//L½oi@
g

Wypróbuj online!

Objaśnienia

Galaretka jest trywialna: pierwsza linia definiuje bezsensowne łącze pomocnicze, druga linia to rzeczywisty program i po prostu zawiera wbudowany GCD.

Alicja jest nieco trudniejsza, ale korzysta również z wbudowanego:

/   Reflect to SE. Switch to Ordinal.
    While in Ordinal mode, the IP bounces diagonally up and down through the grid.
i   Read all input as a single string.
L   Compute the shortest common superstring of an empty string and the input. That
    is simply the input itself, so this does nothing.
    After two more bounces, the IP hits the top right corner and turns
    around, continuing to bounce up and down while moving west.
L   Still does nothing.
i   Try to read more input, but this simply pushes an empty string.
/   Reflect to W. Switch to Cardinal.
    The IP wraps to the last column.
L   Implicitly discard the empty string and convert the input to two integers.
    Compute their LCM.
/   Reflect to NW. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SW instead.
o   Implicitly convert the LCM to a string and print it.
    Reflect off the bottom left corner and move back NE.
/   Reflect to S. Switch to Cardinal.
i   Try to read a byte, but we're at EOF, so this pushes -1 instead. Irrelevant.
    The IP wraps back to the first line.
/   Reflect to NE. Switch to Ordinal.
    The IP immediately reflects off the top boundary to move SE instead.
@   Terminate the program.
Martin Ender
źródło
What looks like a spacetak naprawdę nie wygląda jak przestrzeń.
Erik the Outgolfer
@EriktheOutgolfer zależy od czcionki.
Martin Ender
Dla mnie 0x7F (duh mini-markdown) nigdy nie wyglądał jak spacja w dowolnej czcionce, przynajmniej z mojego doświadczenia. Ale zawsze wstawia dodatkowe odstępy między wierszami poniżej wiersza, w którym się znajduje ...
Erik the Outgolfer
7

Octave / MATLAB, 66 61 bajtów

@(x,y)gcd(x,y)^(1-2*any(version==82))*(x*y)^any(version==82))

Zaoszczędź 5 bajtów dzięki Foon. (x*y)^any()był oczywiście krótszy niż 1+(x*y-1)*any().


Cóż, przynajmniej nie używa wbudowanego lcm.

Wyjaśnienie:

Używa wbudowanego gcddo obliczania największego wspólnego dzielnika.

W Octave jest to podniesione do potęgi 1-2*any(version==82). any(version==82)jest 0w Octave, więc to jest po prostu gcd(x,y)^1. Mnoży się przez (x*y)^any(version==82)lub (x*y)^0 = 1.

W przypadku MATLAB gcdjest podniesiony do potęgi 1-2*any(version==82). any(version==82)jest 1w MATLAB, więc tak jest gcd(x,y)^-1. Pomnożono przez (x*y)^any(version==82), lub (x*y)^1 = x*y. Daje to najmniejszą wspólną wielokrotność, ponieważ lcm(x,y) == x*y/gcd(x,y)dla liczb dodatnich.

Stewie Griffin
źródło
5

Galaretka i MATL , 6 5 bajtów

ZmD
g

Jest to pełny program w jednym z dwóch języków. Oblicza GCD w Jelly ( Wypróbuj online! ) I LCM w MATL ( Wypróbuj online! ). Program MATL kończy działanie z błędem (domyślnie dozwolonym) po wygenerowaniu prawidłowego wyniku.

Używane są tylko znaki ASCII, więc odpowiadają one tym samym bajtom zakodowanym w dwóch językach.

Objaśnienie GCD w galarecie

ZmD    Unused link
g      Main link (gets called automatically). Builtin GCD function (g)

Objaśnienie LCM w MATL

ZmD    Compute LCM (builtin function Zm) and display immediately (D)
g      Tries to implicitly take input to do something with it (depending
       on the type of the input). Since there is no input, it errors out
Luis Mendo
źródło
5

Julia 0.4 / Julia 0.5 , 18 bajtów

log.(1)==0?lcm:gcd

Ocenia gcdw Julia 0.4 ( Wypróbuj online! ) lcmOraz w Julia 0.5 ( Wypróbuj online! ).

Jak to działa

W Julii 0.4 log.(1)jest skrótem getfield(log,1), który zwraca lokalizację logwbudowanej pamięci , np Ptr{Void} @0x00007f2846cb6660. Wskaźnika . Wynik jest zatem niezerowy, porównanie jest fałszywe, a wyrażenie ocenia na gcd.

W Julii 0.5 wprowadzono nową składnię wektoryzacji funkcji. log.(1)jest teraz skrótem broadcast(log,1), który - ponieważ 1nie jest iterowalny - po prostu ocenia log(1). Wynik jest zatem zerowy, porównanie jest prawdziwe, a wyrażenie ocenia na lcm.

Dennis
źródło
3

Octave / MATLAB, 44 42 41 bajtów

eval(['@' 'lcm'-[5 0 9]*all(version-82)])

Definiuje to anonimową funkcję GCD (@gcd ) w Octave i dla LCM ( @lcm) w MATLAB.

Przykład w Octave (lub Wypróbuj online! ):

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
warning: implicit conversion from numeric to char
ans = @gcd
>> ans(12,16)
ans =  4

Przykład w MATLAB:

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
ans =
    @lcm
>> ans(12,16)
ans =
    48
Luis Mendo
źródło
1

JS (ES6), CGL (CGL Golfing Language) , 31 bajtów (niekonkurencyjny)

Funkcja LCM CGL została dodana po tym wyzwaniu.

 g=(a,b)=>b?g(b,a%b):a
//-LⓍ

To, co wygląda na spację, to tak naprawdę spacja niełamliwa, komentarz CGL. JS oblicza GCD:

g=(a,b)=>b?g(b,a%b):a

A CGL oblicza LCM:

//  does nothing
- decrements the current stack number, resulting in it pointing to input
L computes the LCM of the first and second stack items and pushes it to the stack
Ⓧ prints out the last stack item

Wypróbuj to:

Snippetify( g=(a,b)=>b?g(b,a%b):a
//-LⓍ
);
<script src="https://programmer5000.com/snippetify.min.js"></script>
<input type = "number">
<input type = "number">

programmer5000
źródło