Validasi modulus

12

Diberikan daftar ekspresi matematika yang semuanya benar dan terdiri dari perhitungan sisa modulo dengan dua angka dan hasilnya, tugas Anda adalah menghasilkan nangka pertama yang benar untuk semua pernyataan dalam daftar.

Sebagai contoh:

[m % 3 = 0, m % 4 = 1, m % 5 = 3], di mana% adalah operator modulo.

Untuk n= 3, 3 angka pertama (dihitung dari 0) yang sesuai dengan urutannya 33, 93, 153, sehingga hasilnya adalah (format terserah Anda).

Aturan / IO

  1. Anda mengambil angka positif ndan daftar kebenaran. Tentu saja, hal-hal yang perlu Anda ambil hanyalah RHS dari operasi modulo dan hasilnya.
  2. ndan angka-angka dalam daftar kebenaran akan selalu berada dalam kisaran 1 -> 2 ^ 31-1 , dan begitu pula hasilnya.
  3. Anda mengambil input dalam bentuk apa pun yang mudah dan keluaran dalam bentuk apa pun yang mudah. Sebagai contoh, masukan: 3 [3 0, 4 1, 5 3]dan output: 33 93 153.
  4. Dijamin bahwa solusinya secara matematis dimungkinkan.
  5. Sumber input dapat berasal dari file, parameter fungsi, stdin, dll ... Hal yang sama berlaku untuk output.
  6. Tidak ada celah.
  7. Ini adalah kode-golf, sehingga jumlah byte terendah menang.

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

Implementasi referensi dalam pseudo-code

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
}
Yytsi
sumber
@ flawr EDIT: Pertanyaan lain sepertinya melarang banyak hal dan hanya mencetak satu istilah. Tidak yakin apakah ini duplikat lagi ....
Yytsi
1
@ flawr Tantangan itu memiliki batasan waktu. Ada cara golf untuk mengatasi masalah ini yang tidak bergantung pada Teorema Sisa Cina.
Dennis
Ya saya sadar akan hal itu, itulah sebabnya saya hanya menautkannya.
flawr
Apakah 0hasil yang valid?
Neil

Jawaban:

6

Jelly , 7 byte

%⁼⁴
0ç#

Ini adalah program lengkap. Argumennya adalah pembagi, moduli target, dan sejumlah solusi, dalam urutan itu.

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
4

Perl 6 , 33 byte

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

Cobalah

Inputnya adalah ( number-of-values, list-of-divisors, list-of-remainders )

Diperluas:

{   # 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」 )
}
Brad Gilbert b2gills
sumber
4

JavaScript (ES6), 71 68 byte

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

Fungsi rekursif sederhana. Gunakan dengan menjelajah array pertama dan nkedua, seperti:

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)
Produksi ETH
sumber
4

JavaScript (ES6), 74 70 69 byte

Mengambil input sebagai integer ndan sebuah array adari [modulo, remainder]array dengan currying sintaks (n)(a).

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

Uji kasus

Arnauld
sumber
3

Haskell, 47 byte

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

Contoh penggunaan: 3 # [(8,0),(13,3),(14,8)]-> [120,848,1576].

nimi
sumber
3

Python, 67 byte

lambda n,r:[k for k in range(2**32)if all(k%d==m for d,m in r)][:n]
orlp
sumber
Anda hanya butuh range(2**31). Juga sangat bagus. Saya datang dengan jawaban ini secara mandiri.
mbomb007
3

JavaScript (ES6), 72 70 byte

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

Telusuri array kondisi terlebih dahulu dan jumlah hasil kedua. Sunting: Disimpan 2 byte dengan tidak menangani case nol.

Neil
sumber
2

Mathematica, 42 byte

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

Fungsi yang tidak disebutkan namanya, mengembalikan daftar bilangan bulat positif, dan mengambil tiga input: daftar moduli, daftar sisa, dan jumlah nbilangan bulat untuk kembali. Sebagai contoh, test case kedua dipanggil oleh

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

dan kembali {120, 848, 1576}.

Builtin #2~ChineseRemainder~#memberikan solusi non-negatif terkecil; untuk mendapatkan semua solusi yang diinginkan, kami menambahkan nomor ini Range[0,#3-1]LCM@@#, yang merupakan nkelipatan non-negatif pertama dari kelipatan paling umum dari semua moduli.

Mathematica tidak memiliki daftar tak terbatas yang malas dievaluasi sejauh yang saya tahu, jadi implementasi ini lebih pendek daripada apa pun yang saya temukan yang menguji bilangan bulat negatif satu per satu — bahkan dengan panjang nama fungsi ChineseRemainder, dan meskipun tes seperti Mod[k,{8,13,14}]=={0,3,8}berfungsi dengan sempurna baik.

Greg Martin
sumber
2

PHP, 97 byte

jawaban terpanjang sejauh ini. Tapi saya senang saya bisa mendapatkannya di bawah 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++];

mengambil input dari argumen baris perintah yang terpisah,
mencetak pertandingan yang dipisahkan dan dibuntuti oleh garis bawah.
Loop tidak pernah putus; hampir tidak cocok untuk penguji online.

Jalankan seperti php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ....

kerusakan

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

catatan

$argc==count($argv). Untuk tiga pasangan ada 8 argumen: nama file $argv[0], n= $argv[1]dan modulo/ resultpasangan di atas itu. $v=2bertambah 3 kali memberi 5> $argc/2.

Tambahkan satu byte untuk jalan keluar yang bersih: Ganti &&$a[1]-->0?print$k._dengan ?$a[1]--?print$k._:die.

Titus
sumber
1

SmileBASIC, 102 byte

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

Ini adalah pertama kalinya saya menggunakan ONSB. Alasan saya menggunakannya di sini bukan IF F GOTO@Lkarena saya bisa meletakkannya ?Tdi baris yang sama, menghemat 1 byte.

12Me21
sumber
1

Python, 59 byte

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

m adalah daftar ekspresi dalam bentuk string seperti ["i % 4 == 1", ...]

Cobalah online (dengan rentang yang lebih pendek, sehingga benar-benar akan selesai)

mbomb007
sumber
0

PHP, 91 Bytes

Ambil daftar sebagai array asosiatif

<?for($t=1;$r<$_GET[1];$i+=$t=!$t?:print+$i._.!++$r)foreach($_GET[0]as$k=>$v)$t*=$i%$k==$v;

Cobalah online!

Jörg Hülsermann
sumber