합동 관계


11

3 개의 양의 정수 a, bn(최대 값이 사용자 언어에서 표현 가능한 최대 정수 값인 경우)는 true 값을 출력하고 a ≡ b (mod n)그렇지 않으면 false를 출력합니다 . 합동 관계에 익숙하지 않은 사람들에게는 a ≡ b (mod n)iff a mod n = b mod n(또는 동등하게 (a - b) mod n = 0)입니다.

제한 사항

  • 내장 된 합동 성 테스트 방법은 금지되어 있습니다
  • 내장 모듈로 연산은 금지되어 있습니다 (이에는 divmod몫과 나머지를 모두 반환하는 파이썬 함수, 분열 함수, 잔차 시스템 함수 등이 포함됩니다).

테스트 사례

(1, 2, 3) -> False
(2, 4, 2) -> True
(3, 9, 10) -> False
(25, 45, 20) -> True
(4, 5, 1) -> True
(83, 73, 59) -> False
(70, 79, 29) -> False
(16, 44, 86) -> False
(28, 78, 5) -> True
(73, 31, 14) -> True
(9, 9, 88) -> True
(20, 7, 82) -> False

이것은 이므로 가장 짧은 코드 (바이트)가 이기고 가장 빠른 제출은 순위 결정 도구입니다.


분할 기능은 어떻습니까?
코너 O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 나머지를 테스트하는 작업도 금지되어 있습니다. 나는 명확히 할 것이다.
Mego

파이썬 2의 정수 층 나누기는 /어떻습니까?
xnor

부동 소수점 나누기?
El'endia Starman

1
기본 전환?
Dennis

답변:



4

파이썬 2, 27 바이트

lambda a,b,n:(a-b)/n*n==a-b

로 자동 나누는으로 나누고 다시 곱하는 것이 동일한 결과 를 제공 하는지 확인 a-b하여 배수가 배수 인지 확인합니다 .nnn


4

줄리아, 24 바이트

f(a,b,n,t=a-b)=t÷n==t/n

세 개의 정수를 받아들이고 부울을 리턴하는 함수입니다.

있는지 우리는 단순히 시험 - B에 의해 divded 정수 n은 동일하다 - B에 의해 분할 플로트 N . 나눗셈에서 남은 부분이없는 경우, 즉 a - b | n - a - b (mod n ) = 0 임을 나타 냅니다 .


4

Pyth, 7 바이트

!@UQ-FE

Pyth의 순환 색인을 사용합니다.

  UQ         range(first line). [0,...,Q-1]
    -FE      Fold subtraction over the second line.
 @           Cyclic index UQ at -FE
!            Logical NOT


3

Minkolang 0.15 , 14 11 바이트

nn-n$d:*=N.

여기 사용해보십시오! 입력은 a b n입니다.

설명:

n              Take number from input -> a
 n             Take number from input -> a, b
  -            Subtract               -> a-b
   n           Take number from input -> a-b, n
    $d         Duplicate stack        -> a-b, n, a-b, n
      :        Integer division       -> a-b, n, (a-b)//n
       *       Multiply               -> a-b, (a-b)//n*n
        =      1 if equal, 0 otherwise
         N.    Output as number and stop.

3

MATL , 9 바이트

Sdt:i*0hm

입력 형식은

[a b]
n

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

S     % implicitly input [a, b]. Sort this array
d     % compute difference. Gives abs(a-b)
t:    % duplicate and generate vector [1,2,...,abs(a-b)]; or [] if a==b
i*    % input n and multiply to obtain [n,2*n,...,abs(a-b)*n]; or []
0h    % concatenate element 0
m     % ismember function. Implicitly display


2

APL, 15 바이트

{(⌊d)=d←⍺÷⍨-/⍵}

이것은 왼쪽의 n 을, 오른쪽 의 배열로 ab 를 받아들이는 2 차원 함수입니다 .

여기의 접근 방식은 기본적으로 Julia의 답변 과 동일 합니다. a - b / n 이 자신의 바닥과 같은지 테스트합니다 . a - b (mod n ) = 0 인 경우에 해당됩니다.


4 개 저장 :d=⌊d←⎕÷⍨-/⎕
Adám

2

자바 스크립트 (ES6), 27 바이트

@ CᴏɴᴏʀO'Bʀɪᴇɴ 작동하지 않는 버전을 게시했습니다. 사람들이 "작동하는"형태로 사용하는 "공통 알고리즘"은 다음과 같습니다.

(a,b,n)=>n*(0|(a-b)/n)==a-b

"직장"이라는 단어는 따옴표로 표시됩니다. 왜냐하면 우리가 사용하는 바로 가기가 Math.floor()숫자를 부호있는 32 비트 범위 로 암시 적으로 자르기 때문에 JavaScript가 할 수있는 52 비트 이상의 정수 공간을 처리 할 수 ​​없기 때문입니다. 설명하십시오.


이 답변이 언어로 표현 가능한 모든 양의 정수를 모두 처리 할 수 ​​없으면 유효하지 않습니다.
Mego

1
@ Mego : 일부 언어는 32 비트 정수를 사용한다고 가정하면 정수의 비트 너비를 더 지정하지 않거나 언어에 큰 숫자가 있어야한다는 제한이 없으면 제한이 엄청나게 임의적이라고 생각합니다.
CR Drost 2019

1
전혀 임의적이지 않습니다. 도전 과제는 입력이 선택한 언어의 최대 표현 가능한 정수 값까지 3 개의 양의 정수 일 수 있음을 분명히 나타냅니다. 해당 범위의 입력 세트에 대한 제출이 실패 할 경우 유효하지 않습니다. 관련 메타 포스트 .
Mego

@Mego : 빈칸으로 물어 보자 : 같은 기준으로 Haskell 솔루션에 반대 할 것인가? Haskell 솔루션은 서명이없고 Dreaded Monomorphism Restriction을 호출하는 방식으로 작성되지 않았기 때문에 다형성입니다. 일반적인 부호있는 유형의 경우 전체 범위에서 완벽하게 작동하지만 입력 할 수있는 입력 세트가 있습니다 입력-테스트 세트 (2, 150, 3) :: (Word8, Word8, Word8), 명시 적으로 지정한 기준은 "이론적으로 응답이 유효하지 않은 입력이 존재하면 응답이 유효하지 않은 것으로 간주됩니다.")
CR Drost

1
@ Mego : 왜 이것으로 많은 것을 만들고 있는지 궁금하다면 JavaScript 숫자 유형에는 2 ^ 52-ish 프린지 주변에 비 연속 정수가 포함되어있어 (a - b) == a특정 값의 경우 매우 가능합니다 a. 내가 바이트 페널티 킥을 가지고 대체하는 경우에도 그 국경 지대에서 유효 오프 수있는 대답은 거의 불가능 (0|...)Math.floor(...).
CR Drost

2

CJam, 7 바이트

l~-\,=!

입력 순서는 n a b입니다.

여기에서 테스트하십시오.

설명

l~  e# Read input and evaluate to push n, a and b onto the stack.
-   e# Subtract b from a.
\,  e# Swap with n and turn into range [0 1 ... n-1].
=   e# Get (a-b)th element from that range, which uses cyclic indexing. This is
    e# equivalent to modulo, and as opposed to the built-in % it also works correctly
    e# for negative (a-b).
!   e# Negate, because a 0 result from the previous computation means they are congruent.

1

파이썬 3, 27 바이트

lambda a,b,n:pow(a-b,1,n)<1

pow(x,y,n)계산 (x**y)%n, 그래서 이것은 단지 (a-b)**1%n입니다.


1

ES6, 28 바이트

(a,b,n)=>!/\./.test((a-b)/n)

내가 기대하고있는 (ab) / n의 소수점을 찾아서 작동합니다.


1

진지하게, 10 바이트

,,,-A│\)/=

입력 N\nA\nB\n을 개행과 구분하는 데 사용되는 대문자로 사용합니다.

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

이것은 @AlexA의 답변 과 동일한 방법을 사용합니다.

설명 (설명 목적으로 변수 이름으로 사용되는 대문자) :

,,,-A│\)/=
,,,         push N, A, B
   -A       push C = abs(A-B)
     │      duplicate entire stack (result is [N, C, N, C])
      \)/=  1 if C//N == C/N (floored division equals float division)

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