Xác nhận mô-đun


12

Đưa ra một danh sách các biểu thức toán học đều đúng và bao gồm các phép tính dư modulo với hai số và kết quả, nhiệm vụ của bạn là đưa ra các nsố đầu tiên đúng với tất cả các câu lệnh trong danh sách.

Ví dụ:

[m % 3 = 0, m % 4 = 1, m % 5 = 3], trong đó% là toán tử modulo.

Với n= 3, 3 số đầu tiên (tính từ 0) phù hợp với chuỗi là 33, 93, 153, do đó kết quả của bạn sẽ là (định dạng tùy thuộc vào bạn).

Quy tắc / IO

  1. Bạn có một số tích cực nvà một danh sách các sự thật. Tất nhiên, những thứ bạn cần chỉ là RHS của hoạt động modulo và kết quả.
  2. nvà các con số trong danh sách sự thật sẽ luôn nằm trong phạm vi 1 -> 2 ^ 31-1 , và kết quả cũng vậy.
  3. Bạn nhận đầu vào ở bất kỳ hình thức thuận tiện và đầu ra dưới bất kỳ hình thức thuận tiện. Ví dụ: đầu vào: 3 [3 0, 4 1, 5 3]và đầu ra : 33 93 153.
  4. Nó đảm bảo rằng giải pháp là có thể về mặt toán học.
  5. Nguồn đầu vào có thể từ một tệp, tham số chức năng, stdin, v.v ... Tương tự với đầu ra.
  6. Không sơ hở.
  7. Đây là môn đánh gôn, vì vậy số byte thấp nhất sẽ thắng.

Tủ thử

# 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

Tham chiếu thực hiện trong mã giả

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: Câu hỏi khác dường như cấm rất nhiều thứ và chỉ in ra một thuật ngữ. Không chắc đây có phải là bản sao nữa không ....
Yytsi

1
@flawr Thử thách đó có giới hạn thời gian. Có nhiều cách chơi golf để giải quyết vấn đề này mà không dựa vào Định lý còn lại của Trung Quốc.
Dennis

Vâng, tôi biết điều đó, đó là lý do tại sao tôi chỉ liên kết nó.
flawr

0một kết quả hợp lệ?
Neil

Câu trả lời:


6

Thạch , 7 byte

%⁼⁴
0ç#

Đây là một chương trình đầy đủ. Đối số là ước số, mô đun đích và số lượng giải pháp, theo thứ tự đó.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

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

Thử nó

Đầu vào là ( number-of-values, list-of-divisors, list-of-remainders )

Mở rộng:

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

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

Một hàm đệ quy đơn giản. Sử dụng bằng cách curry trong mảng đầu tiên và nthứ hai, như vậy:

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 byte

Lấy đầu vào là một số nguyên nvà một mảng acác [modulo, remainder]mảng với cú pháp currying (n)(a).

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

Các trường hợp thử nghiệm


3

Haskell, 47 byte

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

Ví dụ sử dụng: 3 # [(8,0),(13,3),(14,8)]-> [120,848,1576].


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]

Bạn chỉ cần range(2**31). Ngoài ra, rất tốt đẹp. Tôi đã đưa ra câu trả lời này một cách độc lập.
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

Curried trên mảng điều kiện đầu tiên và số lượng kết quả thứ hai. Chỉnh sửa: Đã lưu 2 byte bằng cách không xử lý trường hợp zero.


2

Toán học, 42 byte

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

Hàm chưa được đặt tên, trả về danh sách các số nguyên dương và lấy ba đầu vào: danh sách các mô đun, danh sách các phần còn lại và số lượng ncác số nguyên sẽ trả về. Ví dụ, trường hợp thử nghiệm thứ hai được gọi bởi

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

và trả lại {120, 848, 1576}.

Nội dung #2~ChineseRemainder~#cho giải pháp không âm nhỏ nhất; để có được tất cả các giải pháp mong muốn, chúng tôi thêm số này vào Range[0,#3-1]LCM@@#, đây là nbội số không âm đầu tiên của bội số chung nhỏ nhất của tất cả các mô đun.

Mathicala không có các danh sách vô hạn được đánh giá một cách lười biếng theo như tôi biết, vì vậy việc triển khai này ngắn hơn bất cứ điều gì tôi thấy rằng đã kiểm tra các số nguyên không âm một lần một ngay cả với độ dài của tên hàm ChineseRemaindervà mặc dù một phép thử như thế Mod[k,{8,13,14}]=={0,3,8}hoạt động hoàn hảo tốt.


2

PHP, 97 byte

Câu trả lời dài nhất cho đến nay. Nhưng tôi rất vui vì tôi có thể đạt được dưới 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++];

lấy đầu vào từ các đối số dòng lệnh riêng biệt,
các bản in khớp được phân tách và theo dõi bởi dấu gạch dưới.
Vòng lặp không bao giờ phá vỡ; hầu như không thích hợp cho người thử nghiệm trực tuyến.

Chạy như thế php -r 'code' <n> <modulo1> <result1> <modulo2> <result2> ....

phá vỡ

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

ghi chú

$argc==count($argv). Đối với ba cặp có 8 đối số: tên tệp $argv[0], n= $argv[1]và cặp modulo/ resulttrên đó. $v=2tăng 3 lần cho 5> $argc/2.

Thêm một byte cho lối thoát sạch: Thay thế &&$a[1]-->0?print$k._bằng ?$a[1]--?print$k._:die.



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

Đây là lần đầu tiên tôi từng sử dụng ONtrong SB. Lý do tôi sử dụng nó ở đây thay vì IF F GOTO@Llà vì vậy tôi có thể đặt ?Tnó trên cùng một dòng, tiết kiệm 1 byte.


1

Python, 59 byte

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

m là một danh sách các biểu thức ở dạng chuỗi như ["i % 4 == 1", ...]

Hãy thử trực tuyến (với phạm vi ngắn hơn, vì vậy nó sẽ thực sự kết thúc)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.