Rapporti di congruenza


11

Dato 3 interi positivi a, be n(i cui valori massimi sono il valore massimo intero rappresentabile nella tua lingua), in uscita un valore truthy se a ≡ b (mod n), e Falsey altrimenti. Per chi non ha familiarità con le relazioni di congruenza, a ≡ b (mod n)è vero iff a mod n = b mod n(o, equivalentemente, (a - b) mod n = 0).

restrizioni

  • I metodi di test di congruenza integrati sono vietati
  • Sono vietate le operazioni integrate nel modulo (questo include operazioni come la divmodfunzione di Python , che restituiscono sia il quoziente che il resto, nonché le funzioni di divisibilità, funzioni di sistema dei residui e simili)

Casi 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

Questo è , quindi vince il codice più breve (in byte), con la prima presentazione come tiebreaker.


Che ne dici di funzioni di divisibilità?
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Funzionano testando i resti, quindi sono anche vietati. Chiarirò.
Mego,

Che ne dici della divisione del piano intero di Python 2 /?
xnor

Divisione in virgola mobile?
El'endia Starman,

1
Conversione di base?
Dennis,

Risposte:



4

Python 2, 27 byte

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

Verifica se si a-btratta di un multiplo ndividendo per n, che automaticamente si pavimenta, e vedendo se moltiplicare indietro per ndà lo stesso risultato.


4

Julia, 24 byte

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

Questa è una funzione che accetta tre numeri interi e restituisce un valore booleano.

Testiamo semplicemente se il numero intero a - b diviso per n è uguale al float a - b diviso per n . Questo sarà vero quando non ci sono residui dalla divisione, cioè a - b | n , il che implica che a - b (mod n ) = 0.


4

Pyth, 7 byte

!@UQ-FE

Utilizza l'indicizzazione ciclica di Pyth.

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


3

Minkolang 0,15 , 14 11 byte

nn-n$d:*=N.

Provalo qui! L'input è previsto come a b n.

Spiegazione:

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

Il formato di input è

[a b]
n

Provalo 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


2

APL, 15 byte

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

Questa è una funzione che accetta diadica n sulla sinistra e un e b come una matrice a destra.

L'approccio qui è sostanzialmente lo stesso della mia risposta Julia . Testiamo se a - b / n è uguale al piano di se stesso, il che sarà vero quando a - b (mod n ) = 0.


Risparmia quattro:d=⌊d←⎕÷⍨-/⎕
Adám,

2

JavaScript (ES6), 27 byte

@ CᴏɴᴏʀO'Bʀɪᴇɴ ha pubblicato una versione che non funziona; ecco l'algoritmo comune che le persone usano in una forma che "funziona":

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

La parola "funziona" è racchiusa tra virgolette perché il collegamento che stiamo utilizzando per Math.floor()troncare implicitamente un numero compreso nell'intervallo con segno a 32 bit, quindi questo non può gestire l'intero spazio a 52 bit o qualunque numero di numeri interi che JavaScript può descrivere.


Se questa risposta non è in grado di gestire tutti gli interi positivi rappresentabili nella lingua, non è valida.
Mego,

1
@Mego: dato che alcune lingue useranno numeri interi a 32 bit, penso che la restrizione sia onerosamente arbitraria a meno che tu non specifichi ulteriormente la larghezza dei bit degli interi oppure che la lingua debba avere dei bignum.
CR Drost,

1
Non è affatto arbitrario. La sfida afferma chiaramente che gli input possono essere qualsiasi 3 numeri interi positivi, fino al massimo valore intero rappresentabile nella lingua scelta. Se l'invio potrebbe non riuscire per un set di input in quell'intervallo, non è valido. Meta post pertinente .
Mego,

@Mego: Permettetemi di chiedervi in ​​dettaglio: obietterete alla soluzione Haskell sullo stesso criterio? (La soluzione di Haskell è polimorfica perché non ha una firma e non è scritta in un modo che invoca la Restrizione del Monomorfismo temuto. Per i tipi con segno normale funziona perfettamente su tutta la gamma; tuttavia esiste una serie di input che puoi messo in - un set di test è (2, 150, 3) :: (Word8, Word8, Word8); il criterio specificato è esplicitamente "se teoricamente esiste un input che rende la risposta non valida, la risposta deve essere considerata non valida.")
CR Drost,

1
@Mego: Se ti stai chiedendo perché sto facendo un grosso problema con questo, il tipo di numero JavaScript contiene numeri interi non continui attorno ai margini di 2 ^ 52-ish, in modo che diventi molto probabile che (a - b) == aper determinati valori di a. Una risposta che deve essere valida fuori in quelle terre di confine è quasi impossibile anche se prendo la penalità di byte e la sostituisco (0|...)conMath.floor(...).
CR Drost,

2

CJam, 7 byte

l~-\,=!

L'ordine di input è n a b.

Provalo qui.

Spiegazione

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)calcola (x**y)%n, quindi questo è giusto (a-b)**1%n.


1

ES6, 28 byte

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

Funziona cercando un punto decimale in (ab) / n che spero sia permesso.


1

Scherzi a parte, 10 byte

,,,-A│\)/=

Prende l'input come N\nA\nB\n(lettere maiuscole utilizzate per distinguere dalle nuove righe).

Provalo online

Questo utilizza lo stesso metodo della risposta di @ AlexA

Spiegazione (lettere maiuscole utilizzate come nomi di variabili a fini esplicativi):

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.