合同関係


11

3つの正の整数を考えるとabと、n(その最大値の言語で表現可能な最大の整数値です)、出力truthy値であればa ≡ b (mod n)falseyそれ以外の場合は、と。一致関係になじみのない人にとってa ≡ b (mod n)は、true 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

これはなので、最短のコード(バイト単位)が優先され、タイブレーカーとして最も早く送信されます。


可分関数はどうですか?
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴこれらは余りをテストすることで機能するため、禁止されています。明確にします。
メゴ

Python 2の整数階除算は/どうですか?
xnor

浮動小数点除算?
エレンディアスターマン

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

これは、3つの整数を受け入れてブール値を返す関数です。

かどうかを単純にテスト- bは整数によってdivded Nに等しい- のBで割ったフロート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

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


2

APL、15バイト

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

これは、左側にnを、右側にaおよびbを配列として受け入れる2項関数です。

ここでのアプローチは、ジュリアの答えと基本的に同じです。a - b / nがそれ自体の下限に等しいかどうかをテストします。これは、a - b(mod n)= 0の場合に真になります。


4を保存しますd=⌊d←⎕÷⍨-/⎕
。–アダム

2

JavaScript(ES6)、27バイト

@CᴏɴᴏʀO'Bʀɪᴇɴが機能しないバージョンを投稿しました。これが、人々が「機能する」形で使用している「共通のアルゴリズム」です。

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

「ワークス」という言葉は、引用符で囲まれています。これは、使用するショートカットがMath.floor()暗黙的に符号付き32ビット範囲の数値を切り捨てるためです。説明する。


この答えが言語で表現可能な正の整数をすべて処理できない場合、それは無効です。
メゴ

1
@Mego:一部の言語は32ビット整数を使用することを考えると、整数のビット幅をさらに指定するか、言語にbignumが必要な場合を除き、制限は非常にarbitrary意的だと思います。
CRドロス

1
それはまったくarbitrary意的ではありません。課題では、入力は、選択した言語で表現可能な最大整数値までの任意の3つの正の整数であることが明確に示されています。その範囲内の一連の入力に対して送信が失敗する可能性がある場合、それは無効です。関連するメタ投稿
メゴ

@Mego:率直に言ってみましょう:同じ基準でHaskellソリューションに反対しますか?(Haskellソリューションは、シグネチャを持たず、恐ろしい単相性の制限を呼び出す方法で記述されていないため、ポリモーフィックです。通常の符号付きタイプの場合、範囲全体で完全に機能しますが、入力可能なセットが存在します入れます-テストセットです(2, 150, 3) :: (Word8, Word8, Word8);指定する基準は、明示的に「理論的に答えが無効になる入力が存在する場合、答えは無効と見なされる必要があります。」)
CR Drost

1
@Mego:なぜ私がこれを大事にしているのか疑問に思っているなら、JavaScript数値型には2 ^ 52のフリンジの周りに不連続な整数が含まれている(a - b) == aため、の特定の値に対して非常に可能になりますa。それらの国境地帯で有効でなければならない答えは、バイトペナルティを取り、次のように置き換え(0|...)てもほとんど不可能です。Math.floor(...).
CR Drost

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

Python 3、27バイト

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

pow(x,y,n)計算する(x**y)%nので、これはちょうど(a-b)**1%nです。


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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.