Relations de congruence

11

Compte tenu de 3 nombres entiers positifs a, bet n(dont les valeurs maximales sont la valeur entière maximum représentable dans votre langue), la sortie d' une valeur si truthy a ≡ b (mod n)et Falsey autrement. Pour ceux qui ne connaissent pas les relations de congruence, a ≡ b (mod n)c'est vrai ssi a mod n = b mod n(ou, de manière équivalente (a - b) mod n = 0).

Restrictions

  • Les méthodes de test de congruence intégrées sont interdites
  • Les opérations modulo intégrées sont interdites (cela inclut les opérations telles que la divmodfonction de Python , qui renvoient à la fois le quotient et le reste, ainsi que les fonctions de divisibilité, les fonctions du système de résidus, etc.)

Cas de test

(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

Il s'agit de , donc le code le plus court (en octets) l'emporte, avec la première soumission en tant que bris d'égalité.

Mego
la source
Et les fonctions de divisibilité?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ceux-ci fonctionnent en testant les restes, ils sont donc également interdits. Je vais clarifier.
Mego
Que diriez-vous de la division du plancher entier de Python 2 /?
xnor
Division en virgule flottante?
El'endia Starman
1
Conversion de base?
Dennis

Réponses:

4

Python 2, 27 octets

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

Vérifie si a-best un multiple de nen divisant par n, ce qui automatiquement les planchers, et voir si multiplier par ndonne le même résultat.

xnor
la source
4

Julia, 24 octets

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

Il s'agit d'une fonction qui accepte trois entiers et renvoie un booléen.

Nous testons simplement si a - b entier divisé par n est égal à a - b float divisé par n . Cela sera vrai lorsqu'il n'y aura pas de reste de division, c'est -à- dire a - b | n , ce qui implique que a - b (mod n ) = 0.

Alex A.
la source
4

Pyth, 7 octets

!@UQ-FE

Utilise l'indexation cyclique de Pyth.

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

Minkolang 0,15 , 14 11 octets

nn-n$d:*=N.

Essayez-le ici! L'entrée est attendue comme a b n.

Explication:

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
la source
3

MATL , 9 octets

Sdt:i*0hm

Le format d'entrée est

[a b]
n

Essayez-le en ligne!

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
la source
3

Rétine , 20

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

L'entrée est donnée en unaire, séparés par des espaces, dans l'ordre n a b . Sortie 1 pour truey et 0 pour falsey.

Essayez-le en ligne.


Si vous préférez la saisie décimale, vous pouvez le faire:

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

Essayez-le en ligne.

Traumatisme numérique
la source
2

APL, 15 octets

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

Il s'agit d'une fonction dyadique qui accepte n à gauche et a et b comme tableau à droite.

L'approche ici est fondamentalement la même que dans ma réponse Julia . Nous testons si a - b / n est égal au plancher de lui-même, ce qui sera vrai lorsque a - b (mod n ) = 0.

Alex A.
la source
Enregistrer un quatre:d=⌊d←⎕÷⍨-/⎕
Adám
2

JavaScript (ES6), 27 octets

@ CᴏɴᴏʀO'Bʀɪᴇɴ a publié une version qui ne fonctionne pas; voici "l'algorithme commun" que les gens utilisent sous une forme qui "fonctionne":

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

Le mot «fonctionne» est entre guillemets, car le raccourci que nous utilisons pour Math.floor()tronque implicitement un nombre pour qu'il soit dans la plage de 32 bits signée. décris.

CR Drost
la source
Si cette réponse ne peut pas gérer tous les entiers positifs représentables dans la langue, elle n'est pas valide.
Mego
1
@Mego: Étant donné que certaines langues utiliseront des entiers 32 bits, je pense que cette restriction est onéreusement arbitraire, sauf si vous spécifiez davantage la largeur en bits des entiers ou bien que la langue doit avoir des bignums.
CR Drost
1
Ce n'est pas du tout arbitraire. Le défi indique clairement que les entrées peuvent être 3 entiers positifs, jusqu'à la valeur entière représentable maximale dans la langue choisie. Si la soumission peut échouer pour un ensemble d'entrées dans cette plage, elle n'est pas valide. Meta post pertinent .
Mego
@Mego: Permettez-moi de vous demander à bout portant: Allez-vous vous opposer à la solution Haskell sur le même critère? (La solution Haskell est polymorphe car elle n'a pas de signature et n'est pas écrite d'une manière qui invoque la restriction du monomorphisme redouté. Pour les types signés normaux, elle fonctionne parfaitement bien sur toute la plage; cependant, il existe un ensemble d'entrées que vous pouvez mettre - un ensemble de test est (2, 150, 3) :: (Word8, Word8, Word8); le critère que vous spécifiez est explicitement "s'il existe théoriquement une entrée qui rend la réponse invalide, la réponse doit être considérée comme invalide.")
CR Drost
1
@Mego: Si vous vous demandez pourquoi j'en fais autant, le type de numéro JavaScript contient des entiers non continus autour des franges 2 ^ 52-ish, de sorte qu'il devient très possible que (a - b) == apour certaines valeurs de a. Une réponse qui doit être valable dans ces régions frontalières est presque impossible même si je prends la pénalité d'octet et remplace (0|...)parMath.floor(...).
CR Drost
2

CJam, 7 octets

l~-\,=!

L'ordre d'entrée est n a b.

Testez-le ici.

Explication

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
la source
1

Python 3, 27 octets

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

pow(x,y,n)calcule (x**y)%n, donc c'est juste (a-b)**1%n.

lirtosiast
la source
1

ES6, 28 octets

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

Fonctionne en recherchant un point décimal dans (ab) / n qui, je l'espère, est autorisé.

Neil
la source
1

Sérieusement, 10 octets

,,,-A│\)/=

Prend l'entrée comme N\nA\nB\n(majuscules utilisées pour distinguer les retours à la ligne).

Essayez-le en ligne

Cela utilise la même méthode que la réponse de @ AlexA

Explication (lettres majuscules utilisées comme noms de variables à des fins explicatives):

,,,-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
la source