同等关系


11

给定3个正整数a,,bn(其最大值是您的语言中可表示的最大整数值),如果输出a ≡ b (mod n),则为true,否则为false。对于那些不熟悉一致性关系的人,a ≡ b (mod n)如果iff a mod n = b mod n(或等价于(a - b) mod n = 0),则为真。

限制条件

  • 禁止内置一致性测试方法
  • 内置的模运算是禁止的(这包括诸如Python divmod函数之类的操作,该函数既返回商又返回余数,以及除数函数,残差系统函数等)

测试用例

(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ʀɪᴇɴ这些通过测试余数来工作,因此也被禁止。我会澄清。
Mego

Python 2的整数底数除法/怎么样?
xnor

浮点除法?
El'endia Starman'2

1
基本转换?
丹尼斯

Answers:



4

Python 2,27字节

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

通过除a-b以来检查是否为的倍数,该值会自动下限,并查看乘以是否得出相同的结果。nnn


4

朱莉娅,24个字节

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

这是一个接受三个整数并返回布尔值的函数。

我们简单地测试是否 - b通过divded整数Ñ等于一个 - b浮子除以Ñ。当除法中没有余数时,即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

Minkolang 0.1514 11个字节

nn-n$d:*=N.

在这里尝试!输入预期为a b n

说明:

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字节

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,在右边接受ab作为数组。

此处的方法基本上与我的Julia 答案相同。我们测试a - b / n是否等于其自身的底数,当a - b(mod n)= 0 时将为真。


保存四:d=⌊d←⎕÷⍨-/⎕
亚当

2

JavaScript(ES6),27个字节

@CᴏɴᴏʀO'Bʀɪᴇɴ发布了一个无效的版本;这是人们以“有效”的形式使用的“通用算法”:

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

“ works”一词用引号引起来,因为我们使用的快捷方式Math.floor()隐式地将数字截断为有符号32位范围,因此这无法处理JavaScript可以处理的完整52位或任何整数空间描述。


如果此答案不能处理该语言中所有可表示的正整数,则无效。
Mego

1
@Mego:鉴于某些语言将使用32位整数,除非您进一步指定整数的位宽或该语言必须具有大数,否则我认为限制是任意的。
CR Drost

1
这一点也不随意。挑战清楚地表明,输入可以是任意3个正整数,最大为所选语言中可表示的最大整数值。如果提交对于该范围内的一组输入可能失败,则无效。相关元帖子
Mego 2016年

@Mego:让我直截了当地问:您是否会基于相同的标准反对Haskell解决方案?(Haskell解决方案是多态的,因为它没有签名,并且没有以调用“恐惧单态限制”的方式编写。对于普通的带符号类型,它在整个范围内都运行良好;但是,您可以使用一组输入放入-测试集为(2, 150, 3) :: (Word8, Word8, Word8);您指定的条件明确为“如果理论上存在使答案无效的输入,则该答案应视为无效。”)
CR Drost

1
@Mego:如果您想知道为什么要为此大刀阔斧,JavaScript数字类型在2 ^ 52-ish条纹周围包含不连续的整数,因此(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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.