GCD / LCM 폴리 글 로트!


26

과제는 한 언어로 입력 의 GCD 를 출력하고 다른 언어로 입력의 LCM 을 출력하는 프로그램 또는 기능을 만드는 것입니다. GCD 또는 LCM을위한 내장 (Mathematica를보고 있습니다)은 허용되지만 권장되지는 않습니다. 2 개의 입력이 있으며 항상 양의 정수이며 1000보다 크지 않습니다.

테스트 사례

각 줄은 다음과 같은 형식으로 하나의 테스트 사례입니다 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

가능한 모든 입력에 대해서는이 pastebin참조하십시오0 < x, y < 31 . 동일한 언어의 다른 버전은 다른 언어로 계산됩니다.


그래서 ... if변수에 저장된 경우 언어 버전을 기반으로하는 것이 허용됩니까?
IllidanS4는 Monica를

@ illidanS4 괜찮습니다.
programmer5000

답변:


24

젤리 / 실제로 2 바이트

00000000: 1e 67                                            .g

제출 된 프로그램의 16 진 덤프 (xxd)입니다. TIO는 CP437 인코딩을 지원하지 않기 때문에 온라인으로 테스트 할 수 없습니다. @Mego는 이것이 실제로 의도 된대로 CP437을 구현하는 Cygwin에서 작동하는지 확인하기에 충분히 친절했습니다.

젤리 : GCD

Jelly는 Jelly 코드 페이지 를 사용하므로 다음 문자가 표시됩니다.

œg

온라인으로 사용해보십시오!

작동 원리

œ불완전한 토큰이므로 무시됩니다. g내장 된 GCD입니다.

실제로 : LCM

실제로 CP 437을 사용 하므로 다음 문자가 표시됩니다.

▲g

온라인으로 사용해보십시오!

작동 원리

LCM 입력입니다. 이후 g(GCD)가 필요 정수 입력을 그것이 실행되지 않는다.


27

C / C ++, 79 78 73 바이트

바이트 절약을위한 @ETHproductions에 감사합니다!

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는 GCD를 계산합니다 : 온라인으로 사용해보십시오!

C ++은 LCM을 계산합니다 : 온라인으로 사용해보십시오!

C에서는 auto e=.5자동 스토리지 클래스 (기본값)를 사용하여 정수 변수를 선언 한 다음 0으로 초기화하고 C ++ 11에서는 double을 선언하여 0.5로 초기화합니다. 따라서 변수의 값은 C ++에서는 진실하고 C에서는 거짓입니다.

이 함수는 a와 b의 곱을 GCD로 나누어 유클리드 알고리즘으로 LCD와 LCM을 계산합니다.

리턴 문을 생략하면 최소한 GCC에서 작동합니다. 아래의 78 바이트 솔루션은 모든 컴파일러에서 작동해야합니다.

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;}

1
당신이 할 수 있다면 설명은 멋지다
고양이

@cat 설명이 추가되었습니다.
Steadybox

1
내가 실수하지 않으면 다음과 같이 바이트를 저장할 수 있습니다.for(;a;b=c)c=a,a=b%a;
ETHproductions

@ETHproductions 감사합니다! ;) for대신 사용해야 할 이유가 있다는 것을 알았습니다 while.
Steadybox

18

실제로 / 젤리 , 3 바이트

00000000: 11 1c 67                                         ..g

제출 된 프로그램의 16 진 덤프 (xxd)입니다.

온라인으로 사용해보십시오! 1

실제로 : GCD

실제로 CP 437을 사용 하므로 다음 문자가 표시됩니다.

◄∟g

온라인으로 사용해보십시오!

작동 원리

     (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.

젤리 : LCM

Jelly는 Jelly 코드 페이지 를 사용하므로 다음 문자가 표시됩니다.

×÷g    

온라인으로 사용해보십시오!

작동 원리

×÷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).

참고 : 수식 gcd (a, b) lcm (a, b) = abab 가 양수 이므로 유지 합니다.


1 TIO는 실제로 UTF-8을 실제로 사용합니다. ASCII 문자와 CP437 문자 0x110x1c 는 모두 할당되지 않기 때문에 프로그램은 작동합니다.


9

앨리스젤리 , 9 바이트

Alice는 LCM을 계산합니다.

//L
oi@g

온라인으로 사용해보십시오!

공간과 같은 어떤 모습이 정말 0x7FDEL제어 문자.

젤리는 GCD를 계산합니다. Jelly는 인쇄 가능한 ASCII 와만 호환되는 자체 코드 페이지를 사용하므로 줄 바꿈 및 DEL 문자 ½는 각각 다음 으로 바뀝니다 .

//L½oi@
g

온라인으로 사용해보십시오!

설명

젤리는 사소합니다. 첫 번째 줄은 무의미한 도우미 링크를 정의하고 두 번째 줄은 실제 프로그램이며 단순히 GCD 내장을 포함합니다.

Alice는 조금 까다 롭지 만 내장 기능도 사용합니다.

/   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.

What looks like a space실제로 공간처럼 보이지 않습니다.
Outgolfer Erik

@EriktheOutgolfer는 글꼴에 따라 다릅니다.
Martin Ender

나를 위해 0x7F (duh mini-markdown)는 적어도 내 경험상 어떤 글꼴의 공백처럼 보지 못했습니다. 그러나 항상 줄 아래에 여분의 줄 간격을 삽입합니다.
Erik the Outgolfer

7

옥타브 / MATLAB, 66 61 바이트

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

Foon 덕분에 5 바이트를 절약했습니다. (x*y)^any()물론보다 짧았습니다 1+(x*y-1)*any().


글쎄, 적어도에 내장을 사용하지 않습니다 lcm.

설명:

내장 함수 gcd를 사용하여 최대 공약수를 계산합니다.

옥타브에서 이것은의 거듭 제곱으로 올라갑니다 1-2*any(version==82). any(version==82)이다 0이 간단하므로, 옥타브에 gcd(x,y)^1. (x*y)^any(version==82)또는을 곱합니다 (x*y)^0 = 1.

MATLAB의 gcd경우로 거듭 제곱 1-2*any(version==82)됩니다. any(version==82)1이 그래서, MATLAB에서 gcd(x,y)^-1. (x*y)^any(version==82)또는을 곱한 값 (x*y)^1 = x*y입니다. 이것은 lcm(x,y) == x*y/gcd(x,y)양수 가 많으므로 최소 공배수를 제공합니다 .


5

젤리MATL , 6 5 바이트

ZmD
g

이것은 두 언어 중 하나의 전체 프로그램입니다. 젤리에서 GCD를 계산하고 ( 온라인 시도! ) MATL에서 LCM을 계산하십시오 ( 온라인으로 시도하십시오! ). MATL 프로그램은 올바른 출력을 생성 한 후 오류 (기본적으로 허용됨)와 함께 종료됩니다.

ASCII 문자 만 사용되므로 두 언어에서 동일한 인코딩 된 바이트에 해당합니다.

젤리의 GCD 설명

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

MATL에서의 LCM 설명

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

5

Julia 0.4 / Julia 0.5 , 18 바이트

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

로 평가 gcd줄리아 0.4 (에서 온라인으로보십시오! )과에 lcm줄리아 0.5에서 ( 온라인으로보십시오! ).

작동 원리

Julia 0.4에서는 log.(1)축약 형으로 getfield(log,1), log내장 의 메모리 위치 ( 예 : 포인터)를 반환 Ptr{Void} @0x00007f2846cb6660합니다. 따라서 결과는 0이 아니며 비교는 거짓이며 표현식은로 평가됩니다 gcd.

Julia 0.5에서는 새로운 함수 벡터화 구문이 도입되었습니다. 반복 할 수 없기 때문에 간단히 평가 log.(1)하는 약자입니다 . 따라서 결과는 0이고 비교는 true이며 표현식은로 평가됩니다 .broadcast(log,1)1log(1)lcm


3

옥타브 / MATLAB, 44 42 41 바이트

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

이것은 @gcdOctave의 GCD ( ) 및 @lcmMATLAB의 LCM ( )에 대한 익명 함수를 정의합니다 .

옥타브의 예 (또는 온라인으로 사용해보십시오! ) :

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

MATLAB의 예 :

>> eval(['@' 'lcm'-[5 0 9]*all(version-82)])
ans =
    @lcm
>> ans(12,16)
ans =
    48

1

JS (ES6), CGL (CGL 골프 언어) , 31 바이트 (비경쟁)

이 도전 후에 CGL의 LCM 기능이 추가되었습니다.

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

공간처럼 보이는 것은 실제로 비파괴 공간이며 CGL에 대한 주석입니다. JS는 GCD를 계산합니다.

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

그리고 CGL은 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

사용해보십시오 :

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">

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.