Modül doğrulaması


12

Hepsi doğru olan ve iki sayı ve bir sonuç içeren modulo kalan hesaplamaları içeren matematik ifadelerinin bir listesi verildiğinde , göreviniz nlistedeki tüm ifadeler için doğru olan ilk sayıları vermektir.

Örneğin:

[m % 3 = 0, m % 4 = 1, m % 5 = 3], burada% modulo operatörüdür.

İçin n= 3, diziyi sığacak ilk 3 numaraları (0 ile sayma) vardır 33, 93, 153, böylece sonuç (size kalmış biçimlendirmek) olurdu.

Kurallar / ES

  1. Pozitif bir sayı nve gerçeklerin bir listesini alırsınız . Tabii ki, almanız gereken şeyler sadece modulo işleminin RHS'si ve sonucudur.
  2. nve hakikatler listesindeki sayılar daima 1 -> 2 ^ 31-1 aralığında olacaktır ve sonuçlar da öyle olacaktır.
  3. Herhangi bir uygun formda girdi alırsınız ve herhangi bir uygun formda çıktı alırsınız. Örneğin, giriş: 3 [3 0, 4 1, 5 3]ve çıkışı: 33 93 153.
  4. Çözümün matematiksel olarak mümkün olduğu garanti edilir.
  5. Giriş kaynağı bir dosya, fonksiyon parametreleri, stdin, vb. Olabilir. Çıktı için de aynı şey geçerlidir.
  6. Boşluk yok.
  7. Bu kod golf, bu yüzden en düşük bayt sayısı kazanır.

testcases

# 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

Sahte kodda başvuru uygulaması

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: Diğer soru birçok şeyi yasaklıyor gibi görünüyor ve sadece bir terimi yazdırıyor. Bunun artık bir kopya olup olmadığından emin değilim ....
Yytsi

1
@flawr Bu mücadelenin zaman kısıtlaması var. Çin Kalan Teoremine dayanmayan bu sorunun üstesinden gelmek için daha golfçü yollar var.
Dennis

Evet, bunun farkındayım, bu yüzden yeni bağladım.
Kusur

0geçerli bir sonuç?
Neil

Yanıtlar:


6

Jöle , 7 bayt

%⁼⁴
0ç#

Bu tam bir program. Bağımsız değişkenler bu sırayla bölücüler, hedef modüller ve çözümlerin sayısıdır.

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Dene

Girdi ( number-of-values, list-of-divisors, list-of-remainders )

Expanded:

{   # 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 bayt

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

Basit bir özyinelemeli işlev. Dizide birinci ve nikinci olarak körükleyerek kullanın , şöyle:

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 bayt

Girdiyi bir tamsayı nve sözdizimi ile diziler dizisi aolarak alır .[modulo, remainder](n)(a)

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

Test senaryoları


3

Haskell, 47 bayt

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

Kullanım örneği: 3 # [(8,0),(13,3),(14,8)]-> [120,848,1576].


3

Python, 67 bayt

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

Sadece ihtiyacın var range(2**31). Ayrıca, çok güzel. Bu yanıtı bağımsız olarak buldum.
mbomb007

3

JavaScript (ES6), 72 70 bayt

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

Önce koşullar dizisi ve ikinci olarak sonuç sayısı üzerinde curried. Düzenleme: Sıfır durumunu işlemeyerek 2 bayt kaydetti.


2

Mathematica, 42 bayt

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

Adsız işlev, pozitif tamsayıların bir listesini döndürme ve üç girdi alma: modüllerin listesi, kalanların listesi ve ndöndürülecek tamsayıların sayısı . Örneğin, ikinci test senaryosu

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

ve geri döner {120, 848, 1576}.

Yerleşik #2~ChineseRemainder~#, en küçük negatif olmayan çözümü verir; İstenen tüm çözümleri elde etmek için, bu sayıyı tüm modüllerin en az ortak katının Range[0,#3-1]LCM@@#ilk nnegatif olmayan katları olan ekliyoruz .

Mathematica, bildiğim kadarıyla tembel olarak değerlendirilmiş sonsuz listelere sahip değil, bu nedenle bu uygulama, negatif olmayan tam sayıları tek tek test ettiğimden, işlev adının uzunluğunda ChineseRemainderve hatta bir testin Mod[k,{8,13,14}]=={0,3,8}mükemmel çalışmasına rağmen bulduğum her şeyden daha kısaydı. iyi.


2

PHP, 97 bayt

en uzun cevap. Ama 100'ün altına alabildiğim için memnunum.

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++];

ayrı komut satırı bağımsız değişkenlerinden girdi alır,
alt çizgilerle ayrılmış ve izlenen eşleşmeleri yazdırır.
Döngü asla kırılmaz; Çevrimiçi test kullanıcıları için zar zor uygun.

Gibi koş php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ....

Yıkmak

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

notlar

$argc==count($argv). Üç çift için 8 argüman vardır: dosya adı $argv[0], n= $argv[1]ve bunun üzerindeki modulo/ resultçiftleri. $v=23 kez artırılır 5>$argc/2 .

Temiz bir çıkış için bir bayt ekleyin: Değiştir &&$a[1]-->0?print$k._ile ?$a[1]--?print$k._:die.



1

SmileBASIC, 102 bayt

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

SB'de ilk defa kullandım ON. Ben yerine burada kullanılan sebebi IF F GOTO@Lben koyabilirsiniz öyle oldu ?T1 byte tasarrufu aynı satırda ondan sonra.


1

Python, 59 bayt

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

m gibi dize biçimindeki ifadelerin bir listesidir ["i % 4 == 1", ...]

Çevrimiçi deneyin (daha kısa bir aralıkta, böylece gerçekten bitecek)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.