Kongruenzbeziehungen

11

In Anbetracht 3 positive ganze Zahlen sind a, bund n(deren Maximalwerte sind der maximal darstellbare Integer - Wert in Ihrer Sprache), Ausgang eines truthy Wert , wenn a ≡ b (mod n)und Falsey anders. Für diejenigen, die mit Kongruenzbeziehungen nicht vertraut sind, a ≡ b (mod n)gilt iff a mod n = b mod n(oder gleichwertig (a - b) mod n = 0).

Beschränkungen

  • Eingebaute Kongruenztestmethoden sind verboten
  • Eingebaute Modulo-Operationen sind verboten (dies schließt Operationen wie die Python- divmodFunktion ein, die sowohl den Quotienten als auch den Rest zurückgeben, sowie Teilbarkeitsfunktionen, Restsystemfunktionen und dergleichen).

Testfälle

(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

Dies ist , also gewinnt der kürzeste Code (in Bytes) mit der frühesten Einreichung als Tiebreaker.

Mego
quelle
Wie wäre es mit Teilbarkeitsfunktionen?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Diese arbeiten durch Testen von Resten, daher sind sie auch verboten. Ich werde klären.
Mego
Wie wäre es mit der ganzzahligen Unterteilung von Python 2 /?
xnor
Gleitkommadivision?
El'endia Starman
1
Basisumwandlung?
Dennis

Antworten:

4

Python 2, 27 Bytes

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

Überprüft, ob a-bes sich um ein Vielfaches nvon handelt, indem durch dividiert wird n, wodurch automatisch Stockwerke gebildet werden, und ob das Multiplizieren mit ndas gleiche Ergebnis ergibt.

xnor
quelle
4

Julia, 24 Bytes

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

Dies ist eine Funktion, die drei Ganzzahlen akzeptiert und einen Booleschen Wert zurückgibt.

Wir testen einfach, ob eine durch n geteilte a - b- Ganzzahl gleich a - b float geteilt durch n ist . Dies gilt, wenn kein Rest der Teilung vorhanden ist, dh a - b | n , was impliziert, dass a - b (mod n ) = 0 ist.

Alex A.
quelle
4

Pyth, 7 Bytes

!@UQ-FE

Verwendet die zyklische Indizierung von Pyth.

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

Haskell, 23 Bytes

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

Anwendungsbeispiel: (28#78)5-> True.

Gleiche Methode wie in der Antwort von @ xnor .

Nimi
quelle
3

Minkolang 0,15 , 14 11 Bytes

nn-n$d:*=N.

Probieren Sie es hier aus! Eingabe wird erwartet als a b n.

Erläuterung:

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
quelle
3

MATL , 9 Bytes

Sdt:i*0hm

Eingabeformat ist

[a b]
n

Probieren Sie es online aus!

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
quelle
3

Netzhaut , 20

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

Die Eingabe erfolgt in unärer, durch Leerzeichen getrennter Reihenfolge n a b. Ausgabe 1 für wahr und 0 für falsch.

Probieren Sie es online aus.


Wenn Sie eine Dezimaleingabe bevorzugen, können Sie dies tun:

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

Probieren Sie es online aus.

Digitales Trauma
quelle
2

APL, 15 Bytes

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

Dies ist eine dyadische Funktion, die links n und rechts a und b als Array akzeptiert .

Der Ansatz hier ist im Grunde der gleiche wie in meiner Antwort von Julia . Wir testen, ob a - b / n gleich dem Boden von sich selbst ist, was wahr ist, wenn a - b (mod n ) = 0 ist.

Alex A.
quelle
Speichern Sie eine vier:d=⌊d←⎕÷⍨-/⎕
Adám
2

JavaScript (ES6), 27 Byte

@ CᴏɴᴏʀO'Bʀɪᴇɴ hat eine Version gepostet, die nicht funktioniert; Hier ist der "allgemeine Algorithmus", den Menschen in einer Form verwenden, die "funktioniert":

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

Das Wort "funktioniert" steht in erschreckenden Anführungszeichen, da die Verknüpfung, die wir verwenden, Math.floor()implizit eine Zahl abschneidet, die im vorzeichenbehafteten 32-Bit-Bereich liegt. Daher kann dies nicht den gesamten 52-Bit- oder beliebigen Bereich von Ganzzahlen verarbeiten, den JavaScript verwenden kann beschreiben.

CR Drost
quelle
Wenn diese Antwort nicht alle darstellbaren positiven Ganzzahlen in der Sprache verarbeiten kann, ist sie nicht gültig.
Mego
1
@Mego: Angesichts der Tatsache, dass einige Sprachen 32-Bit-Ganzzahlen verwenden, denke ich, dass die Einschränkung streng willkürlich ist, es sei denn, Sie geben entweder die Bitbreite der Ganzzahlen weiter an oder die Sprache muss Bignums haben.
CR Drost
1
Es ist überhaupt nicht willkürlich. Die Herausforderung besagt eindeutig, dass die Eingaben 3 beliebige positive Ganzzahlen bis zum maximal darstellbaren Ganzzahlwert in der ausgewählten Sprache sein können. Wenn die Übermittlung für eine Reihe von Eingaben in diesem Bereich fehlschlägt, ist sie nicht gültig. Relevanter Meta-Beitrag .
Mego
@ Mego: Lassen Sie mich Sie direkt fragen: Werden Sie nach demselben Kriterium Einwände gegen die Haskell-Lösung erheben? (Die Haskell-Lösung ist polymorph, da sie keine Signatur hat und nicht so geschrieben ist, dass sie die Einschränkung des gefürchteten Monomorphismus aufruft. Für normal signierte Typen funktioniert sie über den gesamten Bereich einwandfrei. Es gibt jedoch eine Reihe von Eingaben, die Sie verwenden können put in - ein Testsatz ist (2, 150, 3) :: (Word8, Word8, Word8); das von Ihnen angegebene Kriterium ist explizit "Wenn theoretisch eine Eingabe existiert, die die Antwort ungültig macht, sollte die Antwort als ungültig angesehen werden.")
CR Drost
1
@Mego: Wenn Sie sich fragen, warum ich eine große Sache daraus mache, enthält der JavaScript-Nummerntyp nicht kontinuierliche Ganzzahlen um die 2 ^ 52-ish-Ränder, so dass es (a - b) == afür bestimmte Werte von sehr wahrscheinlich wird a. Eine Antwort , die gültig ab in den Grenzländern sein muss , ist fast unmöglich , selbst wenn ich die Byte Strafe nehmen und ersetzen (0|...)mitMath.floor(...).
CR Drost
2

CJam, 7 Bytes

l~-\,=!

Eingabereihenfolge ist n a b.

Testen Sie es hier.

Erläuterung

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
quelle
1

Python 3, 27 Bytes

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

pow(x,y,n)rechnet (x**y)%n, also ist das gerecht (a-b)**1%n.

lirtosiast
quelle
1

ES6, 28 Bytes

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

Funktioniert, indem nach einem Dezimalpunkt in (ab) / n gesucht wird, von dem ich hoffe, dass er zulässig ist.

Neil
quelle
1

Im Ernst, 10 Bytes

,,,-A│\)/=

Nimmt die Eingabe als N\nA\nB\n(Großbuchstaben zur Unterscheidung von Zeilenumbrüchen).

Probieren Sie es online aus

Dies verwendet dieselbe Methode wie die Antwort von @ AlexA

Erläuterung (Großbuchstaben, die zu Erklärungszwecken als Variablennamen verwendet werden):

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