模量验证


12

给定一个全部为true的数学表达式列表,该数学表达式包含 具有两个数字和结果的模余数计算,您的任务是得出n列表中所有语句均成立的第一个数字。

例如:

[m % 3 = 0, m % 4 = 1, m % 5 = 3],其中%是取模运算符。

对于n= 3,适合该序列的前3个数字(从0开始计数)是33, 93, 153,因此您的结果将是(依您的格式)。

规则/ IO

  1. 您需要一个正数n和一个事实列表。当然,您需要做的只是模运算的RHS和结果。
  2. n事实列表中的数字将始终在1-> 2 ^ 31-1的范围内,结果也是如此。
  3. 您可以采用任何方便的形式输入并以任何方便的形式输出。例如,输入:3 [3 0, 4 1, 5 3]和输出:33 93 153
  4. 可以保证该解决方案在数学上是可行的。
  5. 输入源可以来自文件,函数参数,stdin等。输出也是如此。
  6. 没有漏洞。
  7. 这是代码高尔夫球,因此最低的字节数为准。

测试用例

# Input in the form <n>, <(d r), (d2 r2), ...>
# where <d> = RHS of the modulo expression and <r> the result of the expression. Output in the next line.

5, (3 2), (4 1), (5 3)
53 113 173 233 293

3, (8, 0), (13, 3), (14, 8)
120 848 1576

伪代码中的参考实现

n = (an integer from stdin)
truths = (value pairs from stdin)
counter = 0

while n != 0 {
    if matches_criterias(counter, truths) {
        print counter
        n -= 1
    }

    counter += 1
}


@flawr编辑:另一个问题似乎禁止了很多事情,只打印一个术语。不知道这是否是重复的
。...– Yytsi

1
@flawr该挑战有时间限制。解决这一问题的高尔夫球手有很多方法不依赖于中国剩余定理。
丹尼斯,

是的,我知道这一点,所以才将其链接。
瑕疵

0一个有效的结果呢?
尼尔

Answers:


6

果冻,7个字节

%⁼⁴
0ç#

这是一个完整程序。参数依次是除数,目标模数和解数。

在线尝试!

怎么运行的

0ç#  Main link.
     Left argument: D (array of divisors)
     Right argument: M (array of target moduli)
     Third argument: n (number of solutions)

0ç#  Execute the helper link with k = 0, 1, 2, ... as left argument and D as the
     right one until n of them return 1. Yield the array of matches.


%⁼⁴  Helper link. Left argument: k. Right argument: D

%    Compute k % d for each d in D.
 ⁼⁴  Compare the result with M.

4

Perl 6、33字节

{grep((*X%@^b)eqv@^c,0..*)[^$^a]}

尝试一下

输入是 ( number-of-values, list-of-divisors, list-of-remainders )

展开:

{   # bare block lambda with placeholder parameters 「$a」 「@b」 「@c」

  grep(

    # WhateverCode lambda:
    (

      *        # the value being tested

      X%       # cross modulus

      @^b      # with the divisors ( second parameter )

    )

    eqv        # is that list equivalent with

    @^c        # the expected remainders ( third parameter )

    # end of WhateverCode lambda

    ,

    0 .. *     # Range of all Integers starting with 0

  )[ ^$^a ]    # grab up-to 「$a」 values ( first parameter )
               # ( 「^$a」 is the same as 「0 ..^ $a」 )
}

4

JavaScript(ES6),71 68字节

a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]

一个简单的递归函数。首先通过在数组中进行n第二次使用,如下所示:

g=a=>f=(n,m=0)=>n?a.some(x=>m%x[0]-x[1],++m)?f(n,m):[m,...f(n-1,m)]:[]
g([[3, 2], [4, 1], [5, 3]])(5)

4

JavaScript(ES6),74 70 69字节

取输入为一个整数n和阵列a[modulo, remainder]阵列,讨好语法(n)(a)

n=>a=>eval('for(i=r=[];a.some(([b,c])=>i%b-c)||--n*r.push(i);i++);r')

测试用例


3

Haskell,47个字节

n#l=take n[i|i<-[0..],all(\(d,r)->mod i d==r)l]

用法示例:3 # [(8,0),(13,3),(14,8)]-> [120,848,1576]


3

Python,67个字节

lambda n,r:[k for k in range(2**32)if all(k%d==m for d,m in r)][:n]

您只需要range(2**31)。另外,非常好。我独立提出了这个答案。
mbomb007 '01

3

JavaScript(ES6),72 70字节

a=>g=(n,i,r=[],m=a.some(e=>i%e[0]^e[1]))=>n?g(n-!m,-~i,m?r:[...r,i]):r

首先处理条件数组,然后处理结果数。编辑:通过不处理零大小写保存2个字节。


2

Mathematica,42个字节

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&

未命名函数,返回正整数列表,并接受三个输入:模数列表,余数列表和n要返回的整数数。例如,第二个测试用例由

#2~ChineseRemainder~#+Range[0,#3-1]LCM@@#&[{8,13,14},{0,3,8},3]

然后返回{120, 848, 1576}

内置函数#2~ChineseRemainder~#提供最小的非负解;为了获得所有所需的解,我们将这个数字加到Range[0,#3-1]LCM@@#,这是n所有模数的最小公倍数的第一个非负倍数。

据我所知,Mathematica没有惰性计算的无限列表,因此,这种实现比我发现一个非负整数一个一个地测试非负整数(即使使用函数名的长度)更短ChineseRemainder,即使像这样的测试也能Mod[k,{8,13,14}]=={0,3,8}完美地工作好。


2

PHP,97字节

迄今为止最长的答案。但我很高兴我能把它降到100以下。

for($a=$argv;++$k;)for($i=$v=2;$m=$a[$i++];$v>$argc/2&&$a[1]-->0?print$k._:0)$v+=$k%$m==$a[$i++];

从单独的命令行参数获取输入,
打印下划线分隔并尾随的匹配项。
循环永不中断;勉强适合在线测试人员。

运行像php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ...

分解

for($a=$argv;++$k;)         // loop $k up from 1
    for($i=$v=2;                // $i = argument index, $v=2+ number of satisfied equations
        $m=$a[$i++];            // loop through modulo/result pairs
        $v>$argc/2                  // 2. if $v>argument-count/2
        &&$a[1]-->0                 // and match count not exhausted
            ?print$k._                  // print match
            :0                          // else do nothing
        )
            $v+=$k%$m==$a[$i++];    // 1. if $k%modulo==result, increment $v

笔记

$argc==count($argv)。对于三对,有8个参数:文件名$argv[0]n= $argv[1]和上面的modulo/ result对。$v=2递增3倍给出5> $argc/2

为干净退出添加一个字节:替换&&$a[1]-->0?print$k._?$a[1]--?print$k._:die



1

SmileBASIC,102字节

DEF V N,M
FOR K=1TO N@L
T=T+1F=0FOR J=1TO LEN(M)F=F||T MOD M[J-1]-M[J]J=J+1NEXT
ON!F GOTO @L?T
NEXT
END

这是我第一次ON在SB中使用。我在这里使用它而不是在这里的原因IF F GOTO@L是,我可以将?T它放在同一行上,节省1个字节。


1

Python,59个字节

lambda n,m:[i for i in range(2**31)if all(map(eval,m))][:n]

m 是字符串形式的表达式列表,例如 ["i % 4 == 1", ...]

在线尝试(范围较短,因此实际上可以完成)


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.