Relacje zgodności

11

Biorąc pod uwagę 3 dodatnie liczby całkowite a, boraz n(którego maksymalne wartości to maksymalna wartość całkowita reprezentowalna w języku polskim), wyjście jeśli wartość truthy a ≡ b (mod n)i falsey inaczej. Dla tych, którzy nie są zaznajomieni ze stosunkami zgodności, a ≡ b (mod n)jest prawdziwe iff a mod n = b mod n(lub równoważnie (a - b) mod n = 0).

Ograniczenia

  • Wbudowane metody testowania zgodności są zabronione
  • Wbudowane operacje modulo są zabronione (obejmuje to operacje takie jak divmodfunkcja Pythona , które zwracają zarówno iloraz, jak i resztę, a także funkcje podzielności, funkcje systemu pozostałości i tym podobne)

Przypadki testowe

(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

To jest , więc wygrywa najkrótszy kod (w bajtach), a najwcześniej zostanie wysłany jako remis.

Mego
źródło
A co z funkcjami podzielności?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ci pracują, testując pozostałości, więc są również zabronione. Wyjaśnię.
Mego,
A co z całkowitym podziałem podłogi w Pythonie 2 /?
xnor
Podział zmiennoprzecinkowy?
El'endia Starman
1
Konwersja bazy?
Dennis

Odpowiedzi:

5

Galaretka, 5 bajtów

_ÆD⁵e

Wykorzystywanie w dużym stopniu wszystkiego, co nie jest zabronione, jest dozwolone.

Wypróbuj online!

Jak to działa

_ÆD⁵e  Main link. Left input: a. Right input: b. Additional input: n

_      Subtract b from a.
 ÆD    Compute all divisors of the difference.
   ⁵e  Test if n is among the divisors.
Dennis
źródło
4

Python 2, 27 bajtów

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

Sprawdza, czy a-bjest to wielokrotność n, dzieląc przez n, co automatycznie npowoduje podłogę, i sprawdzając, czy pomnożenie przez daje ten sam wynik.

xnor
źródło
4

Julia, 24 bajty

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

Jest to funkcja, która akceptuje trzy liczby całkowite i zwraca wartość logiczną.

Po prostu sprawdzamy, czy liczba całkowita a - b podzielona przez n jest równa liczbie zmiennoprzecinkowej a - b podzielonej przez n . Będzie to prawdą, gdy nie pozostanie resztka z podziału, tj. A - b | n , co oznacza, że a - b (mod n ) = 0.

Alex A.
źródło
4

Pyth, 7 bajtów

!@UQ-FE

Korzysta z cyklicznego indeksowania Pytha.

  UQ         range(first line). [0,...,Q-1]
    -FE      Fold subtraction over the second line.
 @           Cyclic index UQ at -FE
!            Logical NOT
lirtosiast
źródło
3

Haskell, 23 bajty

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

Przykład użycia: (28#78)5-> True.

Ta sama metoda, co w odpowiedzi @ xnor .

nimi
źródło
3

Minkolang 0,15 , 14 11 bajtów

nn-n$d:*=N.

Wypróbuj tutaj! Dane wejściowe są oczekiwane jako a b n.

Wyjaśnienie:

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.
El'endia Starman
źródło
3

MATL , 9 bajtów

Sdt:i*0hm

Format wejściowy to

[a b]
n

Wypróbuj 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
Luis Mendo
źródło
3

Retina , 20

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

Dane wejściowe są podawane w jednostajnej, oddzielonej spacją, w kolejności n a b. Wyjście 1 dla prawdy i 0 dla falsey.

Wypróbuj online.


Jeśli wolisz wprowadzanie dziesiętne, możesz to zrobić:

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

Wypróbuj online.

Cyfrowa trauma
źródło
2

APL, 15 bajtów

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

Jest to funkcja, która przyjmuje dwójkowym N po lewej i i b w postaci tablicy w prawo.

Podejście tutaj jest w zasadzie takie samo jak w mojej odpowiedzi Julii . Sprawdzamy, czy a - b / n jest równe samej podłodze, co będzie prawdziwe, gdy a - b (mod n ) = 0.

Alex A.
źródło
Zapisz cztery:d=⌊d←⎕÷⍨-/⎕
Adám,
2

JavaScript (ES6), 27 bajtów

@ CᴏɴᴏʀO'Bʀɪᴇɴ opublikował wersję, która nie działa; oto „wspólny algorytm”, którego ludzie używają w postaci „działającej”:

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

Słowo „działa” jest przerażające, ponieważ skrót, którego używamy, Math.floor()niejawnie obcina liczbę, aby znajdowała się w zakresie 32-bitowym ze znakiem, więc nie jest w stanie obsłużyć pełnej 52-bitowej lub innej przestrzeni liczb całkowitych, którą JavaScript może obsługiwać opisać.

CR Drost
źródło
Jeśli ta odpowiedź nie obsługuje wszystkich reprezentatywnych dodatnich liczb całkowitych w języku, jest niepoprawna.
Mego,
1
@Mego: Biorąc pod uwagę, że niektóre języki będą używać 32-bitowych liczb całkowitych, myślę, że ograniczenie jest uciążliwie arbitralne, chyba że dodatkowo określisz szerokość bitową liczb całkowitych lub że język musi mieć bignum.
CR Drost
1
To wcale nie jest arbitralne. Wyzwanie wyraźnie stwierdza, że ​​dane wejściowe mogą być dowolnymi 3 dodatnimi liczbami całkowitymi, aż do maksymalnej reprezentowanej liczby całkowitej w wybranym języku. Jeśli przesłanie może się nie powieść dla zestawu danych wejściowych w tym zakresie, jest to nieprawidłowe. Odpowiedni meta post .
Mego,
@Mego: Pozwól, że zapytam wprost: czy zamierzasz sprzeciwić się rozwiązaniu Haskell na tym samym kryterium? (Rozwiązanie Haskell jest polimorficzne, ponieważ nie ma podpisu i nie jest napisane w sposób, który wywołuje Dreaded Monomorphism Restriction. W przypadku normalnych typów podpisanych działa doskonale w całym zakresie; istnieje jednak zestaw danych wejściowych, które można wstawiony - zestaw testowy jest (2, 150, 3) :: (Word8, Word8, Word8); kryterium, które określasz, jest jawnie „jeśli teoretycznie istnieje dane wejściowe, które unieważniają odpowiedź, odpowiedź należy uznać za nieważną.”)
CR Drost
1
@Mego: Jeśli zastanawiasz się, dlaczego robię z tego wielką sprawę, typ liczb JavaScript zawiera nieciągłe liczby całkowite wokół 2 ^ 52-ish prążków, więc staje się bardzo możliwe, że (a - b) == adla niektórych wartości a. Odpowiedź, która musi być ważny mecz w tych kresów jest prawie niemożliwe, nawet jeśli wezmę karę bajtowy i wymienić (0|...)zMath.floor(...).
CR Drost
2

CJam, 7 bajtów

l~-\,=!

Kolejność wprowadzania to n a b.

Sprawdź to tutaj.

Wyjaśnienie

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.
Martin Ender
źródło
1

Python 3, 27 bajtów

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

pow(x,y,n)oblicza (x**y)%n, więc to jest po prostu (a-b)**1%n.

lirtosiast
źródło
1

ES6, 28 bajtów

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

Działa, szukając przecinka dziesiętnego w (ab) / n, który, mam nadzieję, jest dozwolony.

Neil
źródło
1

Poważnie, 10 bajtów

,,,-A│\)/=

Pobiera dane wejściowe jako N\nA\nB\n(wielkie litery używane do odróżnienia od znaków nowej linii).

Wypróbuj online

Używa tej samej metody, co odpowiedź @ AlexA

Objaśnienie (wielkie litery używane jako nazwy zmiennych w celach wyjaśniających):

,,,-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)
Mego
źródło