モジュラス検証


12

すべてが真であり 、2つの数値と結果を伴う剰余剰余計算で構成される数式のリストが与えられた場合、タスクは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. 任意の便利な形式で入力し、任意の便利な形式で出力します。たとえば、input:3 [3 0, 4 1, 5 3]およびoutput: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 EDIT:他の質問は多くのことを禁止しているようで、1つの用語のみを出力します。これがもう重複しているかどうかわからない
....-Yytsi

1
@flawrそのチャレンジには時間制限があります。中国の剰余定理に依存しない、この問題に取り組むためのゴルファーの方法があります。
デニス

はい、私はそれを知っています。それが私がそれをリンクした理由です。
-flawr

ある0有効な結果?
ニール

回答:


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次のように、最初と2番目の配列をカリー化して使用します。

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

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返す整数の数の3つの入力を取得します。たとえば、2番目のテストケースは、

#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}完全に機能していても、非負整数を1つずつテストしたものよりも短い上手。


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)。3つのペアには、8つの引数があります。ファイル名$argv[0]n= $argv[1]、およびmodulo/のresultペアです。$v=23回インクリメントすると5> が得られます$argc/2

クリーン出るために1つのバイトを追加します交換してください&&$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

ONSB で使用したのはこれが初めてです。ここで代わりに使用したのIF F GOTO@L?T、1行を節約して同じ行に配置できるようにするためです。



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