Конгрегенційні відносини


11

З огляду на 3 додатні цілі числа a, bта n(чиї максимальні значення є максимальним представним цілим числом у вашій мові), виведіть значення truthy, якщо a ≡ b (mod n), і фальсируйте інакше. Для тих, хто не знає стосунків конгруентності, a ≡ b (mod n)є істинним iff a mod n = b mod n(або, що рівнозначно (a - b) mod n = 0).

Обмеження

  • Вбудовані методи тестування на відповідність заборонені
  • Вбудовані модульні операції заборонені (це включає такі операції, як divmodфункція Python , які повертають як коефіцієнт, так і залишок, а також функції поділу, функції залишкової системи тощо)

Випробування

(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

Це , тому найкоротший код (у байтах) виграє, з найдавнішим поданням як проривника.


Як щодо функцій розділення?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ці роботи тестують залишки, тому вони також заборонені. Я уточню.
Мего

Як щодо цілого поділу підлоги Python 2 /?
xnor

Ділення з плаваючою комою?
El'endia Starman

1
Базова конверсія?
Денніс

Відповіді:



4

Python 2, 27 байт

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

Перевіряє, чи a-bє кратним n, діленням на n, яке автоматично перетворюється на підлогу, і бачить, чи множення назад на результат nдає той самий результат.


4

Юлія, 24 байти

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

Це функція, яка приймає три цілі числа і повертає булеве значення.

Ми просто перевіряємо, чи a - b ціле число, поділене на n , дорівнює a - b float, поділене на 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

Haskell, 23 байти

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

Приклад використання: (28#78)5-> True.

Той самий метод, що і у відповіді @ xnor .


3

Мінколанг 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

3

Сітківка , 20

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

Введення подається в одинаковому, розділеному пробілом порядку n a b. Вихід 1 для трити і 0 для фальси.

Спробуйте в Інтернеті.


Якщо ви віддаєте перевагу десяткового введення, ви можете зробити це:

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

Спробуйте в Інтернеті.


2

APL, 15 байт

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

Це діадійна функція, яка приймає n зліва, a і b як масив праворуч.

Підхід тут в основному такий же, як у моїй відповіді Юлії . Ми перевіряємо, чи a - b / n дорівнює самій підлозі, що буде істинним, коли a - b (mod n ) = 0.


Збережіть четвірку:d=⌊d←⎕÷⍨-/⎕
Адам

2

JavaScript (ES6), 27 байт

@ CᴏɴᴏʀO'Bʀɪᴇɴ опублікував версію, яка не працює; ось "загальний алгоритм", який люди використовують у формі, яка "працює":

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

Слово "працює" міститься у відлякуючих лапках, оскільки ярлик, який ми використовуємо для Math.floor()неявного скорочення числа, має бути в підписаному 32-бітовому діапазоні, тому це не може обробляти повний 52-бітовий чи будь-який простір цілих чисел, який може JavaScript. описати.


Якщо ця відповідь не може обробляти всі представлені додатні цілі числа в мові, вона не є дійсною.
Мего

1
@Mego: З огляду на те, що деякі мови будуть використовувати 32-бітні цілі числа, я вважаю, що обмеження є довільним довільним, якщо ви додатково не вкажете або бітову ширину цілих чисел, або інше, що мова має мати bignums.
CR Drost

1
Це зовсім не довільно. У виклику чітко зазначено, що вхідними даними можуть бути будь-які 3 додатні цілі числа, аж до максимального представного цілого числа у вибраній мові. Якщо подання може не вдатися до набору входів у цьому діапазоні, воно недійсне. Відповідна мета-посада .
Мего

@Mego: Дозвольте запитати вас: чи збираєтесь ви заперечувати проти рішення Haskell за тим же критерієм? (Рішення Haskell є поліморфним, оскільки не має підпису і не написане таким чином, що викликає обмеження Dreaded Monoorphism. Для нормальних типів, що підписуються, воно працює чудово у всьому діапазоні; проте існує набір входів, які ви можете ставити - тестовий набір є (2, 150, 3) :: (Word8, Word8, Word8); критерій, який ви вказуєте, явно "якщо теоретично існує вхід, який робить відповідь недійсною, відповідь слід вважати недійсною")
CR Drost

1
@Mego: Якщо вам цікаво, чому я роблю з цього велику справу, тип номера JavaScript містить неперервні цілі числа навколо бахроми 2 ^ 52-ish, так що стає дуже можливим, що (a - b) == aдля певних значень a. Відповідь , який повинен бути коректними в цих прикордоння практично неможливо , навіть якщо я байтовий штраф і замінити (0|...)зMath.floor(...).
CR Дрост

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

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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.