การตรวจสอบโมดูลัส


12

รับรายการนิพจน์ทางคณิตศาสตร์ที่ทุกคนเก็บไว้เป็นจริงและประกอบด้วยการ คำนวณส่วนที่เหลือของโมดูโลที่มีตัวเลขสองตัวและผลลัพธ์งานของคุณคือให้ผลลัพธ์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. นี่คือโค้ดกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ

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

การใช้งานอ้างอิงในรหัสหลอก

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
}

สำเนาซ้ำที่เป็นไปได้ของcodegolf.stackexchange.com/questions/48057/…
ข้อบกพร่อง

@flawr แก้ไข: คำถามอื่น ๆ ดูเหมือนจะห้ามสิ่งต่าง ๆ มากมายและพิมพ์ออกมาเพียงหนึ่งคำ ไม่แน่ใจว่านี่จะซ้ำกันอีกหรือไม่ ....
Yytsi

1
@flawr ความท้าทายนั้นมีการ จำกัด เวลา มีวิธีการเล่นกอล์ฟที่จะแก้ไขปัญหานี้ได้โดยไม่ต้องพึ่งพาทฤษฎีทมิฬของจีน
Dennis

ใช่ฉันรู้ว่านั่นคือเหตุผลที่ฉันเพิ่งเชื่อมโยงมัน
ข้อบกพร่อง

เป็น0ผลมาถูกต้อง?
Neil

คำตอบ:


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)]:[]

ฟังก์ชั่นวนซ้ำง่าย ๆ ใช้โดย currying ในอาร์เรย์ที่หนึ่งและ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

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

Curried เหนืออาร์เรย์เงื่อนไขก่อนและจำนวนผลลัพธ์ที่สอง แก้ไข: บันทึก 2 ไบต์โดยไม่จัดการกับตัวพิมพ์เล็กและใหญ่


2

Mathematica ขนาด 42 ไบต์

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

ฟังก์ชัน Unnamed ส่งคืนรายการจำนวนเต็มบวกและรับสามอินพุต: รายการ moduli รายการส่วนที่เหลือและจำนวนnเต็มที่จะส่งคืน ตัวอย่างเช่นกรณีทดสอบที่สองถูกเรียกโดย

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

{120, 848, 1576}และผลตอบแทน

builtin #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

นี่เป็นครั้งแรกที่ฉันใช้ONSB เหตุผลที่ฉันใช้ที่นี่แทนที่จะ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", ...]

ลองใช้งานออนไลน์ (ด้วยช่วงที่สั้นลงดังนั้นมันจะเสร็จสิ้นจริง ๆ )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.