최대 공약수


40

당신의 임무는 가능한 적은 수의 코드로 주어진 두 정수의 최대 공약수 (GCD) 를 계산하는 것 입니다.

승인 된 표준 방법 (STDIN / STDOUT, 함수 매개 변수 / 반환 값, 명령 줄 인수 등)을 통해 입력 및 출력 을 받아 프로그램 또는 함수를 작성할 수 있습니다 .

입력은 음이 아닌 두 정수입니다. 언어의 기본 정수 유형이 지원하는 전체 범위 또는 range [0,255]중 더 큰 범위를 처리 할 수 ​​있어야합니다 . 입력 중 하나 이상이 0이 아닌 것으로 보장됩니다.

GCD 또는 LCM (최소 공통 배수)을 계산하는 내장 기능을 사용할 수 없습니다.

표준 규칙이 적용됩니다.

테스트 사례

0 2     => 2
6 0     => 6
30 42   => 6
15 14   => 1
7 7     => 7
69 25   => 1
21 12   => 3
169 123 => 1
20 142  => 2
101 202 => 101

1
우리가 asm이 편리한 레지스터에 입력을 허용하고 reg가 편리한 결과를 얻는다면 함수 또는 코드 조각 (예 : 함수 본문)을 허용해야합니다. 내 대답을 완전한 함수로 만들면 MS의 32 비트 벡터 호출 (하나의 xchg eax, 하나의 mov 및 ret)과 같은 레지스터 호출 규칙 또는 스택 호출 규칙으로 약 4B가 추가됩니다.
Peter Cordes

@PeterCordes 죄송합니다. 좀 더 구체적으로 말씀하셨습니다. 곰 필요한 코드를 완전히 작성할 수는 있지만 해당 코드를 실행하는 방법을 포함시키는 것이 친절하면 좋을 것입니다.
Mike Shlanta

따라서 gcd 코드 만 계산하지만 주변 코드를 제공하여 사람들이 확인 / 실험 / 개선 할 수 있습니까? BTW, 두 입력 중 하나가 0 인 테스트 케이스는 x86 머신 코드 답변을 깨뜨립니다. div를 0으로 설정하면 하드웨어 예외가 발생합니다. Linux에서 프로세스는을 얻습니다 SIGFPE.
Peter Cordes

3
@CodesInChaos 메모리와 시간 제한은 알고리즘 자체가 원칙적으로 모든 입력을 처리 할 수있는 한 무시됩니다. 이 규칙은 알고리즘을 더 작은 범위의 입력으로 인위적으로 제한하는 루프에 대한 임의의 한계를 하드 코딩하는 사람들을 피하기위한 것입니다. 불변성이 어떻게 발생하는지 잘 모르겠습니까?
Martin Ender

1
gcd (0, n)은 n이 아닙니다.
RosLuP

답변:


37

망막 , 16

^(.+)\1* \1+$
$1

이것은 유클리드의 알고리즘을 전혀 사용하지 않습니다. 대신 정규식 일치 그룹을 사용하여 GCD를 찾습니다.

온라인으로 사용해보십시오. -이 예는 GCD (8,12)를 계산합니다.

공백으로 구분 된 2 개의 정수로 입력하십시오. I / O는 단항입니다. 그것이 받아 들여지지 않는다면, 우리는 이것을 할 수 있습니다 :

망막, 30

\d+
$*
^(.+)\1* \1+$
$1
1+
$.&

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

@ MartinBüttner가 지적했듯이, 이것은 일반적으로 단항의 경우와 같이 많은 수의 경우에 떨어집니다. 최소한 INT_MAX를 입력하려면 2GB 문자열을 할당해야합니다.


2
이에 대해 더 투표하고 싶습니다
MickyT

이제 숫자 범위에 문제가 없습니다. 언어의 자연수 범위 (또는 그 이상인 경우 [0,255]) 만 요구하도록 사양 (OP 권한)을 변경했습니다. +s를 *s로 변경해야한다고 생각하지만 0을 지원 해야합니다. 그리고 긴 코드를로 줄임으로써 긴 코드의 마지막 단계를 크게 단축 할 수 있습니다 1.
Martin Ender

2
나중에 참조하기 위해 방금 임의의 수의 입력 (하나 포함)에 작동하는 대체 16 바이트 솔루션을 찾았으므로 다른 상황에서 더 유용 할 수 있습니다. retina.tryitonline.net/…
Martin Ender

1
방금 ^시작 위치에서 경기가 실패하는 것이 불가능하기 때문에 귀하의 솔루션이나 위의 의견에있는 솔루션이 모두 필요 하지 않습니다.
Martin Ender

28

i386 (x86-32) 기계 코드, 8 바이트 (부호없는 경우 9B)

b = 0입력 을 처리해야 할 경우 + 1B

amd64 (x86-64) 머신 코드, 9 바이트 (부호없는 경우 10B, 부호있는 또는 부호없는 64b 정수의 경우 14B 13B)

amd64에서 부호없는 10 9B (입력 = 0)


입력은 32 비트 비 제로인 서명 의 정수 eaxecx. 에서 출력 eax.

## 32bit code, signed integers:  eax, ecx
08048420 <gcd0>:
 8048420:       99                      cdq               ; shorter than xor edx,edx
 8048421:       f7 f9                   idiv   ecx
 8048423:       92                      xchg   edx,eax    ; there's a one-byte encoding for xchg eax,r32.  So this is shorter but slower than a mov
 8048424:       91                      xchg   ecx,eax    ; eax = divisor(from ecx), ecx = remainder(from edx), edx = quotient(from eax) which we discard
    ; loop entry point if we need to handle ecx = 0
 8048425:       41                      inc    ecx        ; saves 1B vs. test/jnz in 32bit mode
 8048426:       e2 f8                   loop   8048420 <gcd0>
08048428 <gcd0_end>:
 ; 8B total
 ; result in eax: gcd(a,0) = a

이 루프 구조는 테스트 케이스 where에 실패합니다 ecx = 0. ( 0으로 나누면 하드웨어 실행이 div발생합니다 #DE. (Linux에서는 커널이 SIGFPE(부동 소수점 예외)를 전달합니다 .) 루프 진입 점이 바로 앞에 있으면 inc문제를 피할 수 있습니다. x86-64 버전은이를 처리 할 수 ​​있습니다. 무료로 아래를 참조하십시오.

Mike Shlanta의 대답은 이것의 출발점이었습니다 . 내 루프는 그의 것과 같은 일을하지만 부호있는 정수의 cdq경우 1보다 짧습니다 xor edx,edx. 그리고 네, 하나 또는 두 개의 입력 모두 음수로 올바르게 작동합니다. Mike의 버전은 uop 캐시에서 더 빠르게 실행되고 더 적은 공간을 차지합니다 ( xchgIntel CPU에서는 3 개의 uops이며 loop대부분의 CPU에서는 실제로 느립니다 ). 그러나이 버전은 머신 코드 크기에서 승리합니다.

처음에는 질문에 부호없는 32 비트가 필요하다는 것을 알지 못했습니다 . xor edx,edx대신에 돌아 가면 cdq1 바이트가 필요합니다. div와 크기가 같고 idiv다른 모든 xchg데이터 는 동일하게 유지 될 수 있습니다 ( 데이터 이동 및 inc/loop여전히 작동).

흥미롭게도 64 비트 피연산자 크기 ( raxrcx)의 경우 부호있는 버전과 부호없는 버전의 크기가 같습니다. 서명 된 버전에는 cqo(2B)에 대한 REX 접두사가 필요 하지만 서명되지 않은 버전은 여전히 ​​2B를 사용할 수 있습니다 xor edx,edx.

64 비트 코드에서 inc ecx2B는 1 바이트 inc r32이며 dec r32opcode는 REX 접두어로 용도 변경되었습니다. inc/loop64 비트 모드에서 코드 크기를 저장하지 않으므로 test/jnz. 64 비트 정수에 작동하는 것은 제외하고, REX 접두사의 지시에 따라 다른 바이트를 추가 loop하거나 jnz. 나머지가 낮은 32b에서 모두 0을 가질 수 gcd((2^32), (2^32 + 1))있으므로 (예를 들어 ) 전체 rcx를 테스트해야하고로 바이트를 저장할 수 없습니다 test ecx,ecx. 그러나 느린 jrcxzinsn은 2B에 불과 하며 입력 을 처리하기 위해 루프 상단에 배치 할 수 있습니다ecx=0 .

## 64bit code, unsigned 64 integers:  rax, rcx
0000000000400630 <gcd_u64>:
  400630:       e3 0b                   jrcxz  40063d <gcd_u64_end>   ; handles rcx=0 on input, and smaller than test rcx,rcx/jnz
  400632:       31 d2                   xor    edx,edx                ; same length as cqo
  400634:       48 f7 f1                div    rcx                      ; REX prefixes needed on three insns
  400637:       48 92                   xchg   rdx,rax
  400639:       48 91                   xchg   rcx,rax
  40063b:       eb f3                   jmp    400630 <gcd_u64>
000000000040063d <gcd_u64_end>:
## 0xD = 13 bytes of code
## result in rax: gcd(a,0) = a

32 및 64b 버전의 경우 Godbolt Compiler Explorer에서 소스 및 asm 출력main 을 실행 하는 전체 실행 가능 테스트 프로그램 . 테스트 및 32 비트에 대한 (일 ), 64 비트를 ( ) 및 X32 ABI ( ) .printf("...", gcd(atoi(argv[1]), atoi(argv[2])) ); -m32-m64-mx32

x86-64 모드에서도 부호없는 9B이며 임의의 레지스터에서 입력 중 하나를 취할 수있는 반복 뺄셈 만 사용하는 버전도 포함 됩니다 . 그러나 입력시 입력이 0 인 것을 처리 할 수 ​​없습니다 ( subx-0이 절대로하지 않는 0을 생성 할 때 감지 ).

32 비트 버전 용 GNU C 인라인 asm 소스 (로 컴파일 gcc -m32 -masm=intel)

int gcd(int a, int b) {
    asm (// ".intel_syntax noprefix\n"
        // "jmp  .Lentry%=\n" // Uncomment to handle div-by-zero, by entering the loop in the middle.  Better: `jecxz / jmp` loop structure like the 64b version
        ".p2align 4\n"                  // align to make size-counting easier
         "gcd0:   cdq\n\t"              // sign extend eax into edx:eax.  One byte shorter than xor edx,edx
         "        idiv    ecx\n"
         "        xchg    eax, edx\n"   // there's a one-byte encoding for xchg eax,r32.  So this is shorter but slower than a mov
         "        xchg    eax, ecx\n"   // eax = divisor(ecx), ecx = remainder(edx), edx = garbage that we will clear later
         ".Lentry%=:\n"
         "        inc     ecx\n"        // saves 1B vs. test/jnz in 32bit mode, none in 64b mode
         "        loop    gcd0\n"
        "gcd0_end:\n"
         : /* outputs */  "+a" (a), "+c"(b)
         : /* inputs */   // given as read-write outputs
         : /* clobbers */ "edx"
        );
    return a;
}

일반적으로 asm으로 전체 함수를 작성하지만 GNU C 인라인 asm은 선택한 regs에 입 / 출력을 가질 수있는 스 니펫을 포함하는 가장 좋은 방법 인 것 같습니다. 보다시피, GNU C 인라인 asm 구문은 어색하고 시끄 럽습니다. 또한 asm 배우는 것은 정말 어려운 방법 입니다.

.att_syntax noprefix사용 된 모든 insns가 single / no operand 또는이므로 실제로 컴파일하고 모드에서 작동 합니다 xchg. 실제로 유용한 관찰은 아닙니다.


2
@ MikeShlanta : 감사합니다. asm 최적화를 좋아한다면 stackoverflow에 대한 내 대답 중 일부를 살펴보십시오. :)
Peter Cordes

2
@ MikeShlanta : jrcxzuint64_t 버전에서 결국 사용을 찾았습니다 :). 또한 unsigned를 지정했음을 알지 못했기 때문에 바이트 수도 포함했습니다.
Peter Cordes

jecxz32 비트 버전에서 동일한 효과 를 사용할 수없는 이유는 무엇 입니까?
코디 그레이

1
@CodyGray : inc/loop는 32 비트 버전에서는 3 바이트이지만 64 비트 버전에서는 4B입니다. 즉, 64 비트 버전에서만 jrcxzjmp대신에 추가 바이트 비용이 들지 않습니다 inc / loop.
Peter Cordes

당신은 항목으로 중간을 가리킬 수 없습니까?
l4m2

14

Hexagony , 17 바이트

?'?>}!@<\=%)>{\.(

펼쳐진 :

  ? ' ?
 > } ! @
< \ = % )
 > { \ .
  ( . .

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

사이드 길이 3에 맞추는 것은 바람이었습니다. 마지막 에이 2 바이트를 제거하는 것은 아니 었습니다 ... 나는 그것이 최적이라고 확신하지는 않지만 그것이 가깝다고 생각합니다.

설명

또 다른 유클리드 알고리즘 구현.

이 프로그램은 다음 과 같이 메모리 포인터 (MP)가 시작되는 A , BC 라는 3 개의 메모리 에지를 사용합니다 .

여기에 이미지 설명을 입력하십시오

제어 흐름도는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

입력에 대한 짧은 선형 비트로 회색 경로에서 제어 흐름이 시작됩니다.

?    Read first integer into memory edge A.
'    Move MP backwards onto edge B.
?    Read second integer into B.

이제 코드가 가장자리를 <왼쪽 모서리 로 감 쌉니다 . 이것은 <브랜치 역할을합니다. 현재 에지가 0이면 (즉, 유클리드 알고리즘이 종료 됨) IP가 왼쪽으로 편향되어 빨간색 경로를 사용합니다. 그렇지 않으면 유클리드 알고리즘의 반복이 녹색 경로에서 계산됩니다.

우리는 먼저 녹색의 길을 고려할 것입니다. 참고 >\모든 단순히 명령 포인터를 편향 거울 역할을합니다. 또한 제어 흐름은 아래쪽에서 위쪽으로 한 번, 오른쪽 모서리에서 아래쪽 행으로 한 번, 마지막으로 오른쪽 아래에서 왼쪽 모서리로 한 번 가장자리를 3 회 감싸서 조건을 다시 확인합니다. 또한 그것은 .놈이 아닙니다.

단일 반복을 위해 다음과 같은 선형 코드가 남습니다.

{    Move MP forward onto edge C.
'}   Move to A and back to C. Taken together this is a no-op.
=    Reverse the direction of the MP so that it now points at A and B. 
%    Compute A % B and store it in C.
)(   Increment, decrement. Taken together this is a no-op, but it's
     necessary to ensure that IP wraps to the bottom row instead of
     the top row.

이제 세 개의 모서리가 (원래 주기적으로 자신의 역할을 변경 한 것을 우리가 제외 시작있는 거 다시 C는 지금의 역할 소요 B 원래 B 의 역할 ...). 실제로, 우리는 입력을 relpaced했습니다 ABBA % B각각.

일단 A % B(에지에 C가 ) 제로의 GCD는 에지에서 찾을 수 B . 다시 한 번 >IP를 빗나가므로 빨간색 경로에서 다음을 실행합니다.

}    Move MP to edge B.
!    Print its value as an integer.
@    Terminate the program.

9

32 비트 리틀 엔디안 x86 머신 코드, 14 바이트

를 사용하여 생성 nasm -f bin

d231 f3f7 d889 d389 db85 f475

    gcd0:   xor     edx,edx
            div     ebx
            mov     eax,ebx
            mov     ebx,edx
            test    ebx,ebx
            jnz     gcd0

4
나는 이것을 사용 cdq하고 signed 대신 idiv1 바이트를 사용하여 8 바이트로 줄 xchg eax, r32였습니다 mov. 32 비트 코드의 경우 : inc/loop대신 test/jnz(을 사용하는 방법을 볼 수 jecxz없으며 jecxnz) 가 없습니다 . 변경 사항이 정당화하기에 충분히 크다고 생각하기 때문에 최종 버전을 새로운 답변으로 게시했습니다.
Peter Cordes

9

T-SQL, 153169 바이트

누군가 골프에 최악의 언어를 언급 했습니까?

CREATE FUNCTION G(@ INT,@B INT)RETURNS TABLE RETURN WITH R AS(SELECT 1D,0R UNION ALL SELECT D+1,@%(D+1)+@B%(D+1)FROM R WHERE D<@ and D<@b)SELECT MAX(D)D FROM R WHERE 0=R

재귀 쿼리를 사용하여 공약수를 계산 하는 테이블 반환 함수 만듭니다 . 그런 다음 최대 값을 반환합니다 . 이제 유클리드 알고리즘을 사용하여 여기 에서 내 대답 에서 파생 된 GCD를 결정합니다 .

사용법 예

SELECT * 
FROM (VALUES
        (15,45),
        (45,15),
        (99,7),
        (4,38)
    ) TestSet(A, B)
    CROSS APPLY (SELECT * FROM G(A,B))GCD

A           B           D
----------- ----------- -----------
15          45          15
45          15          15
99          7           1
4           38          2

(4 row(s) affected)

1
장황한 예수.
Cyoce

9

젤리, 7 바이트

ṛß%ðḷṛ?

유클리드 알고리즘의 재귀 적 구현. 온라인으로 사용해보십시오!

내장이 금지되지 않으면 g(1 바이트, 내장 GCD) 더 나은 점수를 얻을 수 있습니다.

작동 원리

ṛß%ðḷṛ?  Main link. Arguments: a, b

   ð     Convert the chain to the left into a link; start a new, dyadic chain.
 ß       Recursively call the main link...
ṛ %        with b and a % b as arguments.
     ṛ?  If the right argument (b) is non-zero, execute the link.
    ḷ    Else, yield the left argument (a).

거의 하하를 속이는 것 같은 느낌이 들지만 답변이 버 틀린을 사용할 수 없도록 지정해야 할 수도 있습니다.
Mike Shlanta

13
그렇게하기로 결정했다면 빨리해야합니다. 현재 세 가지 답변이 무효화됩니다.
Dennis

지정된 길이는 바이트 단위입니다. 이러한 문자는 UTF8에서 대부분> 1 바이트입니다.
cortices

8
@cortices 예, 모든 코드 골프 대회는 기본적으로 바이트로 점수가 매겨집니다. 그러나 Jelly는 UTF-8을 사용하지 않지만 256 자 각각을 인코딩 하는 사용자 정의 코드 페이지 는 단일 바이트로 이해합니다.
Dennis

@ 데니스 아, 영리한.
cortices

7

하스켈, 19 바이트

a#0=a
a#b=b#rem a b

사용 예 : 45 # 35-> 5.

다시 유클리드.

추신 : 물론 내장 기능 gcd도 있습니다.


당신은 조건부 검사를 피하기 위해 입력 순서를 반전 트릭 설명해야
자랑 haskeller

@ proudhaskeller : 어떤 트릭? 모두이 알고리즘을 사용합니다. 즉 0모듈러스를 멈추 거나 계속합니다.
nimi

Nevrmind, 모두가 트릭을 사용하고 있습니다
자랑스러운 Haskeller

골프가 덜한이 게임은 거의 정확히 같은 내용입니다Prelude
Michael Klein

6

파이썬 3, 31

Sp3000 덕분에 3 바이트를 절약했습니다.

g=lambda a,b:b and g(b,a%b)or a

3
Python 3.5 이상에서 :from math import*;gcd
Sp3000

@ Sp3000 Nice, 나는 그들이 그것을 수학으로 옮겼다는 것을 몰랐습니다.
Morgan Thrapp

1
당신이 그것에있는 동안 :g=lambda a,b:b and g(b,a%b)or a
Sp3000

@ Sp3000 감사합니다! 방금 재귀 솔루션을 완료했지만 그게 나보다 낫습니다.
Morgan Thrapp

GCD 및 LCM에 대한 기본 제공은 허용되지 않으므로 두 번째 솔루션은 유효하지 않습니다.
mbomb007

6

MATL , 11 9 바이트

지금까지 아무도 무차별 힘을 사용한 것 같지 않습니다.

ts:\a~f0)

입력은 두 숫자가있는 열 배열입니다 ( ;구분자로 사용).

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

t     % Take input [a;b] implicitly. Duplicate
s     % Sum. Gives a+b
:     % Array [1,2,...,a+b]
\     % Modulo operation with broadcast. Gives a 2×(a+b) array
a~    % 1×(a+b) array that contains true if the two modulo operations gave 0
f0)   % Index of last true value. Implicitly display

5

C, 38 바이트

g(x,y){while(x^=y^=x^=y%=x);return y;}

1
바이트 카운트에 함수 정의를 포함시켜야합니다.
Rɪᴋᴇʀ

1
@Riker 죄송합니다, 나는 정의를 추가하고 카운트를 업데이트
어떻게 Chen

g대신 함수의 이름을 지정하여 2 바이트를 절약 할 수 있습니다 gcd.
Steadybox

@Steadybox 좋아, 네, 처음으로이 커뮤니티에 참여하십시오 :)
Chen Chen

1
PPCG에 오신 것을 환영합니다!
Rɪᴋᴇʀ

4

C, 28 바이트

유클리드 알고리즘을 구현하는 다소 간단한 함수입니다. 대체 알고리즘을 사용하면 더 짧아 질 수 있습니다.

g(a,b){return b?g(b,a%b):a;}

작은 메인 래퍼를 작성하는 경우

int main(int argc, char **argv)
{
  printf("gcd(%d, %d) = %d\n", atoi(argv[1]), atoi(argv[2]), g(atoi(argv[1]), atoi(argv[2])));
}

그런 다음 몇 가지 값을 테스트 할 수 있습니다.

$ ./gcd 6 21
gcd (6, 21) = 3
$ ./gcd 21 6
gcd (21, 6) = 3
$ ./gcd 6 8
gcd (6, 8) = 2
$ ./gcd 1 1
gcd (1, 1) = 1
$ ./gcd 6 16
gcd (6, 16) = 2
$ ./gcd 27244
gcd (27, 244) = 1

4

미로 , 18 바이트

?}
:
)"%{!
( =
}:{

오류와 함께 종료되지만 오류 메시지는 STDERR로 이동합니다.

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

이것은 아직 최적의 느낌은 아니지만이 시점에서 루프를 3x3 미만으로 압축하는 방법은 보이지 않습니다.

설명

유클리드 알고리즘을 사용합니다.

먼저 입력을 읽고 메인 루프에 들어가는 선형 비트가 있습니다. 명령 포인터 (IP)는 왼쪽 상단에서 시작하여 동쪽으로 이동합니다.

?    Read first integer from STDIN and push onto main stack.
}    Move the integer over to the auxiliary stack.
     The IP now hits a dead end so it turns around.
?    Read the second integer.
     The IP hits a corner and follows the bend, so it goes south.
:    Duplicate the second integer.
)    Increment.
     The IP is now at a junction. The top of the stack is guaranteed to be
     positive, so the IP turns left, to go east.
"    No-op.
%    Modulo. Since `n % (n+1) == n`, we end up with the second input on the stack.

이제 유클리드 알고리즘을 계산하는 일종의 while-do 루프를 시작합니다. 스택의 상단 포함 a하고 b(제로의 암시 무한한 양의 위에, 그러나 우리는 그 필요하지 않습니다). 스택을 나란히 나타내며 서로를 향해 성장합니다.

    Main     Auxiliary
[ ... 0 a  |  b 0 ... ]

루프가 일단 종료되면 a0입니다. 루프 반복은 다음과 같이 작동합니다.

=    Swap a and b.           [ ... 0 b  |  a 0 ... ]
{    Pull a from aux.        [ ... 0 b a  |  0 ... ]
:    Duplicate.              [ ... 0 b a a  |  0 ... ]
}    Move a to aux.          [ ... 0 b a  |  a 0 ... ]
()   Increment, decrement, together a no-op.
%    Modulo.                 [ ... 0 (b%a)  |  a 0 ... ]

당신은 우리가 교체 한 볼 수 ab함께 b%aa각각.

마지막으로, 일단 b%a0이되면 IP는 계속 동쪽으로 이동하여 다음을 실행합니다.

{    Pull the non-zero value, i.e. the GCD, over from aux.
!    Print it.
     The IP hits a dead end and turns around.
{    Pull a zero from aux.
%    Attempt modulo. This fails due to division by 0 and the program terminates.

4

줄리아, 21 15 바이트

a\b=a>0?b%a\a:b

유클리드 알고리즘의 재귀 적 구현. 온라인으로 사용해보십시오!

내장이 금지되지 않으면 gcd(3 바이트, 내장 GCD) 더 나은 점수를 얻을 수 있습니다.

작동 원리

a\b=             Redefine the binary operator \ as follows:
    a>0?     :       If a > 0:
        b%a\a        Resursively apply \ to b%a and a. Return the result.
              b      Else, return b.

4

Cubix , 10 12 바이트

?v%uII/;O@

여기 사용해보십시오

이것은 다음과 같이 큐브에 랩됩니다.

    ? v
    % u
I I / ; O @ . .
. . . . . . . .
    . .
    . .

유클리드 방법을 사용합니다.

IISTDIN에서 2 개의 숫자를 가져
/와서 스택 위에 놓습니다
%. 나머지는 스택의 상단에 왼쪽
?바로 TOS 0 다음, 그렇지 않으면 계속할 설정하면
v다음 아래로 리디렉션 및 0이 아닌 경우 u유행의 우회전 두 번 다시 설정
/하면 리플렉터에 큐브 주위 0 이동
;드롭 TOS, O출력 TOS 및 @종료


난 그냥 그때 모두 처리 할 필요가 있는지에 대한 답변을 스크롤 시작, 12 바이트 Cubix 답변을 작성 0,x하고 x,0나서이 건너 왔어요 .... 좋은 것!
ETHproductions


3

윈도우 배치, 76 바이트

재귀 기능. GCD a b파일 이름 처럼 호출하십시오 gcd.

:g
if %2 equ 0 (set f=%1
goto d)
set/a r=%1 %% %2
call :g %2 %r%
:d
echo %f%

3

MATL, 7 바이트

pG1$Zm/

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

설명

우리가 명시 적으로 (내장의 GCD 기능을 사용할 수 없기 때문에 ZdMATL에서), I는 최소 공통의 여러 사실 악용 ab시간의 가장 큰 공통 분모 a와가 b의 제품과 동일 ab.

p       % Grab the input implicitly and multiply the two elements
G       % Grab the input again, explicitly this time
1$Zm    % Compute the least-common multiple
/       % Divide the two to get the greatest common denominator

두 개의 개별 입력으로 1 바이트를 저장할 수 있습니다.*1MZm/
Luis Mendo

3

라켓 (스키마), 44 바이트

라켓의 유클리드 구현 (도표)

(define(g a b)(if(= 0 b)a(g b(modulo a b))))

편집 : @ Numeri의 솔루션 lol을 보지 못했습니다. 어쨌든 우리는 동일한 코드를 독립적으로 얻었습니다.


이 둘 다 작동합니까?
NoOneIsHere6

@NoOneIsHere 네, 둘 다 작동합니다
kronicmage

3

> <> , 32 바이트

::{::}@(?\=?v{:}-
.!09}}${{/;n/>

스택에서 두 값을 받아들이고 유클리드 알고리즘을 적용하여 GCD를 생성합니다.

여기서 시도해보십시오 !

> <>에서 훨씬 더 나은 답변을 얻으 려면 Sok 's를 확인하십시오 !


1
오늘 새로운 언어를 찾았습니다 :)
nsane


2

GML, 57 바이트

a=argument0
b=argument1
while b{t=b;b=a mod b;a=t}return a

2

델파이 7, 148

글쎄, 나는 골프를위한 새로운 최악의 언어를 발견했다고 생각한다.

unit a;interface function g(a,b:integer):integer;implementation function g(a,b:integer):integer;begin if b=0then g:=a else g:=g(b,a mod b);end;end.

오, 모르겠다, 괄호 는 골프를
하기에는

2

훈, 20 바이트

|=
{@ @}
d:(egcd +<)

-

훈 # 2, 39 바이트

|=
{a/@ b/@}
?~
b
a
$(a b, b (mod a b))

이상하게도, Hoon의 stdlib에서 GCD에 대한 유일한 구현은 RSA 암호화에 사용되는 것 뿐이며 다른 값도 반환합니다. d출력 에서만 가져 오는 함수로 감싸 야합니다 .

다른 구현은 기본 재귀 GCD 정의입니다.


2

Python 3.5, 70 82 73 바이트 :

lambda*a:max([i for i in range(1,max(*a)+1)if not sum(g%i for g in[*a])])

not이 경우는 확인 합 모든 숫자를 만들 것입니다 *args모듈은 i제로이다.

또한 이제이 람다 함수는 수학 모듈 >=2gcd함수 와 달리 값의 양이 인 한 원하는만큼 많은 값을 취할 수 있습니다 . 예를 들어, 값을 받아서 2,4,6,8,10올바른 GCD 2를 리턴 할 수 있습니다 .


1
multichar 변수 이름이 체포되었습니다. (또는 함수 인수, 그러나 무엇이든)
CalculatorFeline

2

루비, 23 바이트

g=->a,b{b>0?a:g[b,a%b]}

루비 블록은 g (...) 대신 g [...] 또는 g.call (...)로 호출됩니다.

voidpigeon에 대한 부분 크레딧


2
대신을 g.call(a,b)사용할 수 있습니다 g[a,b]. 대신을 proc{|a,b|사용할 수 있습니다 ->a,b{.
afuous

1
다른 피연산자의 순서를 바꾸는 b>0대신 대신 사용하여 한 바이트를 저장할 수도 있습니다 b<=0.
afuous

2

ARM 기계 코드, 12 바이트 :

어셈블리:

gcd: cmp r0, r1
     sublt r0, r0, r1
     bne gcd

현재 이것을 컴파일 할 수 없지만 ARM의 각 명령어는 4 바이트를 사용합니다. 아마도 THUMB-2 모드를 사용하여 골프 다운 될 수 있습니다.


좋은 직업 남자 기계 코드 에서이 작업을 수행하는 사람은 내게 심각한 소품을 가져옵니다.
Mike Shlanta

이것은 뺄셈 만 사용하여 Euclid의 알고리즘 에서 시도한 것처럼 보이지만 작동하지는 않습니다. 경우 r0 > r1다음이 sublt아무것도하지 않는 것 ( lt술어는 거짓) 및 bne무한 루프 될 것입니다. 그렇지 않은 경우 스왑이 필요하다고 생각 lt하므로 동일한 루프가 수행 b-=a하거나 a-=b필요에 따라 수행 할 수 있습니다 . 서브가 생산 한 경우 부정 (일명 차용).
Peter Cordes

ARM 명령어 세트 안내서 에서는 실제로 예측을위한 예로 빼기 GCD 알고리즘을 사용합니다. (25 페이지). 그들은 cmp r0, r1/ subgt r0, r0, r1/ sublt r1, r1, r0/를 사용 bne gcd합니다. ARM 명령어의 16B, thumb2 명령어의 12B입니까?
Peter Cordes

1
x86에서는 sub ecx, eax/ jae .no_swap/ add ecx,eax/ xchg ecx,eax/로 9 바이트를 관리했습니다 jne. 따라서 cmp 대신 하위로 전환 한 다음 하위가 다른 방식으로 진행된 경우 실행 취소 및 교체합니다. 나는 이것을 테스트했고 작동한다. ( add하지 않습니다 jne입력 중 하나가 시작하는 영 (0)하지 않는 한이 0을 생성 할 수 없기 때문에, 잘못된 시간에 종료하고, 우리는 그것을 지원하지 않는 업데이트 :. 우리가 제로가되는 하나의 입력을 지원하는 데 필요한 작업을 수행합니다 /)
Peter Cordes

Thumb2의 ite경우 if-then-else 명령이 있습니다. cmp / sub one way / sub에 대해 완벽해야합니다.
Peter Cordes

2

TI 기본, 10 바이트

Prompt A,B:gcd(A,B

gcd 내장을 금지하는 새로운 규칙으로 인해 비경쟁


gcd(내장 되지 않은 17 바이트 솔루션

Prompt A,B:abs(AB)/lcm(A,B

lcm 내장을 금지하는 새로운 규칙으로 인해 비경쟁


27 바이트 솔루션이 gcd(있거나 lcm(내장 되지 않은 경우 :

Prompt A,B:While B:B→T:BfPart(A/B→B:T→A:End:A

35 바이트 재귀 솔루션 (내장 gcd(또는 lcm(내장 되지 않음) (2.53 MP 운영 체제 이상 필요, 이름을 지정해야 함 prgmG ) :

If Ans(2:Then:{Ans(2),remainder(Ans(1),Ans(2:prgmG:Else:Disp Ans(1:End

{A,B}예를 들어 {1071, 462}:prgmGyield 와 같이 재귀 변형에 인수를 전달 21합니다.


나에게 깊은 인상을주었습니다.
Mike Shlanta

마지막 파일은으로 저장해야한다고 언급해야합니다 prgmG.
스파게티


2

오라클 SQL 11.2 104 118 바이트

SELECT MAX(:1+:2-LEVEL+1)FROM DUAL WHERE(MOD(:1,:1+:2-LEVEL+1)+MOD(:2,:1+:2-LEVEL+1))*:1*:2=0 CONNECT BY LEVEL<=:1+:2;

0 입력으로 고정


입력 중 하나가 0이면 올바르게 작동하지 않습니다.
Egor Skriptunoff

이것은 당신을 절약해야합니다SELECT MAX(LEVEL)FROM DUAL WHERE MOD(:1,LEVEL)+MOD(:2,LEVEL)=0 CONNECT BY LEVEL<=:1+:2;
MickyT

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