Hubungan kongruensi


11

Mengingat 3 bilangan bulat positif a, bdan n(yang maksimum nilai adalah nilai integer representable maksimum dalam bahasa Anda), output nilai truthy jika a ≡ b (mod n), dan falsey sebaliknya. Bagi mereka yang tidak terbiasa dengan hubungan kongruensi, a ≡ b (mod n)adalah benar iff a mod n = b mod n(atau, setara, (a - b) mod n = 0).

Batasan

  • Metode pengujian kongruensi bawaan dilarang
  • Operasi modulo bawaan dilarang (ini termasuk operasi seperti divmodfungsi Python , yang mengembalikan baik hasil bagi dan sisanya, serta fungsi pembagian, fungsi sistem residu, dan sejenisnya)

Uji Kasus

(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

Ini adalah , jadi kode terpendek (dalam byte) menang, dengan pengiriman paling awal sebagai tiebreak.


Bagaimana dengan fungsi pembagian?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Mereka bekerja dengan menguji sisa, sehingga mereka juga dilarang. Saya akan mengklarifikasi.
Mego

Bagaimana dengan pembagian lantai integer Python 2 /?
xnor

Divisi titik mengambang?
El'endia Starman

1
Konversi basis?
Dennis

Jawaban:



4

Python 2, 27 byte

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

Memeriksa apakah a-bkelipatan ndengan membaginya dengan n, yang secara otomatis lantai, dan melihat apakah mengalikan kembali dengan nmemberikan hasil yang sama.


4

Julia, 24 byte

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

Ini adalah fungsi yang menerima tiga bilangan bulat dan mengembalikan boolean.

Kami hanya menguji apakah suatu - b bilangan bulat divded oleh n adalah sama dengan sebuah - b mengambang dibagi dengan n . Ini akan menjadi benar ketika tidak ada sisa dari divisi, yaitu a - b | n , yang menyiratkan bahwa a - b (mod n ) = 0.


4

Pyth, 7 byte

!@UQ-FE

Menggunakan pengindeksan siklus Pyth.

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

3

Haskell, 23 byte

(a#b)n=div(a-b)n*n==a-b

Contoh penggunaan: (28#78)5-> True.

Metode yang sama dengan jawaban @ xnor .


3

Minkolang 0,15 , 14 11 byte

nn-n$d:*=N.

Coba di sini! Input diharapkan sebagai a b n.

Penjelasan:

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

Format input adalah

[a b]
n

Cobalah online!

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

3

Retina , 20

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

Masukan diberikan secara unary, dipisahkan oleh ruang, secara berurutan n a b. Output 1 untuk truey dan 0 untuk falsey.

Cobalah online.


Jika Anda lebih suka input desimal maka Anda dapat melakukan ini:

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

Cobalah online.


2

APL, 15 byte

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

Ini adalah fungsi diadik yang menerima n di sebelah kiri dan a dan b sebagai larik di sebelah kanan.

Pendekatan di sini pada dasarnya sama dengan jawaban Julia saya . Kami menguji apakah a - b / n sama dengan lantai itu sendiri, yang akan benar ketika a - b (mod n ) = 0.


Simpan empat:d=⌊d←⎕÷⍨-/⎕
Adám

2

JavaScript (ES6), 27 byte

@ CᴏɴᴏʀO'Bʀɪᴇɴ memposting versi yang tidak berfungsi; di sini adalah "algoritma umum" yang digunakan orang dalam bentuk yang "berfungsi":

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

Kata "berfungsi" dalam tanda kutip karena pintasan yang kami gunakan untuk Math.floor()secara terpotong memotong angka yang berada dalam kisaran 32-bit yang ditandatangani, jadi ini tidak dapat menangani ruang penuh bilangan bulat 52-bit-atau-apa pun yang JavaScript dapat menggambarkan.


Jika jawaban ini tidak dapat menangani semua bilangan bulat positif yang dapat diwakili dalam bahasa, itu tidak valid.
Mego

1
@Mego: Mengingat bahwa beberapa bahasa akan menggunakan bilangan bulat 32-bit, saya pikir bahwa pembatasan bersifat arbitrer kecuali jika Anda lebih jauh menentukan lebar bit bilangan bulat atau jika bahasa tersebut harus memiliki bignum.
CR Drost

1
Sama sekali tidak sewenang-wenang. Tantangannya dengan jelas menyatakan bahwa input dapat berupa 3 bilangan bulat positif, hingga nilai integer maksimum yang dapat direpresentasikan dalam bahasa yang dipilih. Jika pengiriman mungkin gagal untuk satu set input dalam rentang itu, itu tidak valid. Meta postingan yang relevan .
Mego

@Mego: Izinkan saya bertanya langsung: Apakah Anda akan keberatan dengan solusi Haskell pada kriteria yang sama? (Solusi Haskell bersifat polimorfik karena tidak memiliki tanda tangan dan tidak ditulis dengan cara yang menyerukan Pembatasan Monomorfisme Dreaded. Untuk tipe bertanda tangan normal ia bekerja dengan sangat baik di seluruh jajaran; namun ada sejumlah input yang dapat Anda gunakan masukkan - set tes adalah (2, 150, 3) :: (Word8, Word8, Word8); kriteria yang Anda tentukan secara eksplisit "jika secara teoritis input yang ada membuat jawaban tidak valid, jawabannya harus dianggap tidak valid.")
CR Drost

1
@Mego: Jika Anda bertanya-tanya mengapa saya mempermasalahkan hal ini, tipe nomor JavaScript berisi bilangan bulat tidak kontinu di sekitar pinggiran 2 ^ 52-ish, sehingga sangat mungkin (a - b) == auntuk nilai tertentu a. Sebuah jawaban yang harus valid di perbatasan itu hampir tidak mungkin bahkan jika saya mengambil penalti byte dan menggantinya (0|...)denganMath.floor(...).
CR Drost

2

CJam, 7 byte

l~-\,=!

Urutan input adalah n a b.

Uji di sini.

Penjelasan

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)menghitung (x**y)%n, jadi ini adil (a-b)**1%n.


1

ES6, 28 byte

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

Bekerja dengan mencari titik desimal di (ab) / n yang saya harap diizinkan.


1

Serius, 10 byte

,,,-A│\)/=

Mengambil input sebagai N\nA\nB\n(huruf besar yang digunakan untuk membedakan dari baris baru).

Cobalah online

Ini menggunakan metode yang sama dengan jawaban @ AlexA

Penjelasan (huruf kapital digunakan sebagai nama variabel untuk tujuan penjelasan):

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.