Quan hệ đồng dư


11

Với 3 số nguyên dương a, bn(có giá trị tối đa là giá trị số nguyên biểu diễn tối đa trong ngôn ngữ của bạn), sản lượng một giá trị truthy nếu a ≡ b (mod n), và falsey khác. Đối với những người không quen thuộc với các mối quan hệ đồng đẳng, a ≡ b (mod n)là iff đúng a mod n = b mod n(hoặc, tương đương, (a - b) mod n = 0).

Những hạn chế

  • Các phương pháp kiểm tra đồng dư tích hợp bị cấm
  • Các hoạt động modulo tích hợp bị cấm (điều này bao gồm các hoạt động như divmodchức năng của Python , trả về cả thương số và phần còn lại, cũng như các hàm phân chia, các hàm hệ thống dư và tương tự)

Các trường hợp thử nghiệm

(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

Đây là , vì vậy mã ngắn nhất (tính bằng byte) sẽ thắng, với lần gửi sớm nhất là bộ bẻ khóa.


Làm thế nào về chức năng phân chia?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Những người làm việc bằng cách kiểm tra phần còn lại, vì vậy họ cũng bị cấm. Tôi sẽ làm rõ.
Mego

Làm thế nào về phân chia số nguyên của Python 2 /?
xnor

Phân chia điểm nổi?
El'endia Starman

1
Chuyển đổi cơ sở?
Dennis

Câu trả lời:



4

Python 2, 27 byte

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

Kiểm tra xem a-bcó phải là bội số của nbằng cách chia cho n, nó sẽ tự động tạo tầng và xem liệu nhân lại bằng cách ncho kết quả tương tự.


4

Julia, 24 byte

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

Đây là một hàm chấp nhận ba số nguyên và trả về một boolean.

Chúng ta chỉ cần kiểm tra xem a - b số nguyên được chia cho n có bằng a - b float chia cho n không . Điều này sẽ đúng khi không có phần còn lại từ phép chia, tức là a - b | n , ngụ ý rằng a - b (mod n ) = 0.


4

Bình thường, 7 byte

!@UQ-FE

Sử dụng lập chỉ mục tuần hoàn của Pyth.

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


3

Chồn 0,15 , 14 11 byte

nn-n$d:*=N.

Hãy thử nó ở đây! Đầu vào dự kiến ​​là a b n.

Giải trình:

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 byte

Sdt:i*0hm

Định dạng đầu vào là

[a b]
n

Hãy thử trực tuyế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 byte

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

Đây là một hàm dyadic chấp nhận n ở bên trái và ab là một mảng ở bên phải.

Cách tiếp cận ở đây về cơ bản giống như trong câu trả lời Julia của tôi . Chúng tôi kiểm tra xem a - b / n có bằng sàn của chính nó hay không, điều này sẽ đúng khi a - b (mod n ) = 0.


Lưu bốn:d=⌊d←⎕÷⍨-/⎕
Adám

2

JavaScript (ES6), 27 byte

@ CᴏɴᴏʀO'Bʀɪᴇɴ đã đăng một phiên bản không hoạt động; đây là "thuật toán chung" mà mọi người đang sử dụng ở dạng "hoạt động":

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

Từ "hoạt động" nằm trong dấu ngoặc kép sợ hãi vì phím tắt chúng tôi đang sử dụng để Math.floor()cắt ngắn một số nằm trong phạm vi 32 bit đã ký, do đó, điều này không thể xử lý toàn bộ không gian 52 bit hoặc bất kỳ số nguyên nào mà JavaScript có thể diễn tả.


Nếu câu trả lời này không thể xử lý tất cả các số nguyên dương có thể biểu thị trong ngôn ngữ, thì nó không hợp lệ.
Mego

1
@Mego: Cho rằng một số ngôn ngữ sẽ sử dụng số nguyên 32 bit, tôi nghĩ rằng hạn chế đó là tùy ý, trừ khi bạn chỉ định thêm độ rộng bit của số nguyên hoặc ngôn ngữ khác phải có ngôn ngữ.
CR Drost

1
Nó hoàn toàn không tùy tiện. Thách thức nêu rõ rằng các đầu vào có thể là bất kỳ 3 số nguyên dương nào, tối đa bằng giá trị nguyên có thể biểu diễn tối đa trong ngôn ngữ đã chọn. Nếu việc gửi có thể thất bại đối với một tập hợp các đầu vào trong phạm vi đó, thì nó không hợp lệ. Bài viết meta có liên quan .
Mego

@Mego: Cho tôi hỏi bạn điểm trắng: Bạn có phản đối giải pháp Haskell trên cùng một tiêu chí không? (Giải pháp Haskell là đa hình vì nó không có chữ ký và không được viết theo cách gọi ra Hạn chế đơn hình đáng sợ. Đối với các loại ký thông thường, nó hoạt động hoàn hảo trên toàn phạm vi; tuy nhiên vẫn tồn tại một bộ đầu vào mà bạn có thể đưa vào - một bộ kiểm tra là (2, 150, 3) :: (Word8, Word8, Word8); tiêu chí bạn chỉ định rõ ràng là "nếu về mặt lý thuyết là một đầu vào tồn tại làm cho câu trả lời không hợp lệ, câu trả lời sẽ được coi là không hợp lệ.")
CR Drost

1
@Mego: Nếu bạn đang tự hỏi tại sao tôi lại kiếm được nhiều tiền từ việc này, loại số JavaScript chứa các số nguyên không liên tục xung quanh rìa 2 ^ 52-ish, do đó nó trở nên rất khả thi (a - b) == ađối với các giá trị nhất định a. Một câu trả lời phải có giá trị ở những vùng biên giới đó là gần như không thể ngay cả khi tôi chấp nhận hình phạt byte và thay thế (0|...)bằngMath.floor(...).
CR Drost

2

CJam, 7 byte

l~-\,=!

Thứ tự đầu vào là n a b.

Kiểm tra nó ở đây.

Giải trình

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

Python 3, 27 byte

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

pow(x,y,n)tính toán (x**y)%n, vì vậy đây chỉ là (a-b)**1%n.


1

ES6, 28 byte

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

Hoạt động bằng cách tìm kiếm một dấu thập phân trong (ab) / n mà tôi hy vọng được cho phép.


1

Nghiêm túc, 10 byte

,,,-A│\)/=

Lấy đầu vào là N\nA\nB\n(chữ in hoa được sử dụng để phân biệt với dòng mới).

Dùng thử trực tuyến

Điều này sử dụng cùng một phương pháp như câu trả lời của @ AlexA

Giải thích (chữ in hoa được sử dụng làm tên biến cho mục đích giải thích):

,,,-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)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.