การทดสอบลำดับที่ยอมรับได้


13

บทสรุปผู้บริหาร: ทดสอบว่าลำดับอินพุตของจำนวนเต็มเป็น "ที่ยอมรับได้" หมายความว่ามันไม่ครอบคลุมคลาสที่เหลือทั้งหมดสำหรับโมดูลัสใด ๆ

ลำดับ "ที่ยอมรับได้" คืออะไร

รับจำนวนเต็ม m ≥ 2, คลาสตกค้างมอดูโล mเป็นเพียงความก้าวหน้าทางคณิตศาสตร์ m ที่เป็นไปได้ของความแตกต่างทั่วไป m ตัวอย่างเช่นเมื่อ m = 4 คลาสที่เหลือ 4 แบบโมดูโล 4 คือ

..., -8, -4, 0, 4, 8, 12, ...
..., -7, -3, 1, 5, 9, 13, ...
..., -6, -2, 2, 6, 10, 14, ...
..., -5, -1, 3, 7, 11, 15, ...

คลาส kth residue ประกอบด้วยจำนวนเต็มทั้งหมดที่เหลือเมื่อหารด้วย m เท่ากับ k (ตราบเท่าที่หนึ่งกำหนด "เหลือ" ถูกต้องสำหรับจำนวนเต็มลบ)

ลำดับของจำนวนเต็ม a1, a2, ... , ak เป็นแบบโมดูโล m ที่ยอมรับได้หากไม่สามารถตัดกันอย่างน้อยหนึ่งคลาสที่เหลือ ตัวอย่างเช่น {0, 1, 2, 3} และ {-4, 5, 14, 23} ไม่ใช่ modulo ที่ยอมรับได้ 4 แต่ {0, 1, 2, 4} และ {0, 1, 5, 9} และ {0, 1, 2, -3} เป็น modulo ที่ยอมรับได้นอกจากนี้ {0, 1, 2, 3, 4} ก็ไม่อนุญาต modulo 4 ในขณะที่ {0, 1, 2} เป็น modulo ที่ยอมรับได้

ในที่สุดลำดับของจำนวนเต็มสามารถยอมรับได้ถ้ามันเป็นแบบโมดูโล m ที่ยอมรับได้สำหรับทุกจำนวนเต็ม m ≥ 2

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่รับลำดับของจำนวนเต็มเป็นอินพุตและส่งกลับค่าจริง (สอดคล้องกัน) หากลำดับนั้นยอมรับได้และค่า Falsy (สอดคล้องกัน) หากลำดับไม่ยอมรับ

ลำดับการป้อนของจำนวนเต็มสามารถอยู่ในรูปแบบที่เหมาะสม คุณอาจคิดว่าลำดับการป้อนข้อมูลมีจำนวนเต็มอย่างน้อยสองตัว (คุณอาจจะสมมติว่าจำนวนเต็มอินพุทนั้นแตกต่างกันถ้าคุณต้องการแม้ว่ามันอาจจะไม่ได้ช่วยก็ตาม) คุณต้องสามารถจัดการกับจำนวนเต็มบวกและลบ (และ 0)

ให้คะแนนปกติ: คำตอบที่สั้นที่สุดเป็นไบต์ชนะ

ตัวอย่างอินพุต

ลำดับอินพุตต่อไปนี้แต่ละค่าควรให้ค่าความจริง:

0 2
-1 1
-100 -200
0 2 6
0 2 6 8
0 2 6 8 12
0 4 6 10 12
-60 0 60 120 180
0 2 6 8 12 26
11 13 17 19 23 29 31
-11 -13 -17 -19 -23 -29 -31

ลำดับอินพุตต่อไปนี้แต่ละค่าควรให้ค่าเท็จ:

0 1
-1 4
-100 -201
0 2 4
0 2 6 10
0 2 6 8 14
7 11 13 17 19 23 29
-60 0 60 120 180 240 300

เคล็ดลับ

  • โปรดสังเกตว่าลำดับใด ๆ ของจำนวนเต็ม 3 ตัวหรือน้อยกว่านั้นเป็นโมดูโลที่ยอมรับได้โดยอัตโนมัติ 4 โดยทั่วไปแล้วลำดับของความยาว k จะเป็นแบบโมดูโลที่ยอมรับได้โดยอัตโนมัติเมื่อ m> k มันตามมาว่าการทดสอบความสามารถในการยอมรับต้องใช้การตรวจสอบจำนวน จำกัด ของ m เท่านั้น
  • โปรดสังเกตว่า 2 หาร 4 และลำดับใด ๆ ที่เป็นแบบโมดูโลที่ยอมรับได้ 2 (นั่นคือทั้งหมดหรือคี่ทั้งหมด) จะถูกยอมรับโดยอัตโนมัติแบบโมดูโล 4 โดยทั่วไปถ้า m หาร n และลำดับคือโมดูโลที่ยอมรับได้มันก็คือ ยอมรับ modulo โดยอัตโนมัติ ในการตรวจสอบความสามารถในการยอมรับดังนั้นจึงพอเพียงที่จะพิจารณาเฉพาะนายกเท่านั้นหากคุณต้องการ
  • ถ้า a1, a2, ... , ak เป็นลำดับที่ยอมรับได้ดังนั้น a1 + c, a2 + c, ... , ak + c ก็ยอมรับได้เช่นกันสำหรับจำนวนเต็มใด ๆ c (บวกหรือลบ)

ความเกี่ยวข้องทางคณิตศาสตร์ (การอ่านเพิ่มเติม)

ให้ a1, a2, ... , ak เป็นลำดับของจำนวนเต็ม สมมติว่ามีจำนวนเต็ม n จำนวนนับไม่ถ้วนเช่น n + a1, n + a2, ... , n + ak ล้วนยอดเยี่ยม จากนั้นมันง่ายที่จะแสดงว่า a1, a2, ... , ak ต้องยอมรับได้ ที่จริงสมมติว่า a1, a2, ... , ak ไม่อนุญาตและให้ m เป็นตัวเลขเช่นนั้นว่า a1, a2, ... , ak ไม่ยอมรับ modulo m จากนั้นไม่ว่าเราจะเลือกอะไร n หนึ่งในตัวเลข n + a1, n + a2, ... , n + ak จะต้องมีค่าเป็นทวีคูณของ m ดังนั้นจึงไม่เหมาะ

การคาดคะเน k-tuples ที่สำคัญคือการสนทนาของคำสั่งนี้ซึ่งยังคงเป็นปัญหาที่เปิดกว้างในทฤษฎีจำนวน: มันอ้างว่าถ้า a1, a2, ... , ak เป็นลำดับที่ยอมรับได้ (หรือk-tuple ) จากนั้นมี ควรเป็นจำนวนเต็ม n อย่างไม่มีที่สิ้นสุดที่ n + a1, n + a2, ... , n + ak ล้วนเป็นนายก ตัวอย่างเช่นลำดับที่ยอมรับได้ 0, 2 ให้ผลคำสั่งว่าควรมีจำนวนเต็ม n จำนวนอนันต์เช่นที่ทั้ง n และ n + 2 เป็นจำนวนเฉพาะ, นี่คือการคาดเดาสองช่วง (ยังไม่ได้รับการพิสูจน์)


3
[_60:0:60:120:180]ให้ฉันจริง แท้จริงแล้วมันไม่ได้ตัดกันอย่างน้อยหนึ่งคลาสในทุกระดับmตั้งแต่2ไปถึง5รวม นอกจากนี้มันตัดเพียงชั้นเดียวในทุกmจาก2เพื่อ5รวม
Leun Nun

1
ฉันมีเหมือนกันสำหรับ [-60, 0, 60, 120, 180] เนื่องจาก @LeakyNun สิ่งนี้ควรยอมรับได้
Karl Napf

-60 0 60 120 180 240 300ปริภูมิโมดูโลของคลาสที่เหลือทั้งหมด 7 ดังนั้นจึงไม่อนุญาตให้ใช้
Greg Martin

เราจะมีการทดสอบนานขึ้นได้ไหม
แม่ชีที่รั่ว

@LeakyNun: สำหรับ m ใด ๆ m ช่วงเวลาแรกที่มีขนาดใหญ่กว่า m จะสร้างลำดับที่ยอมรับได้ (กรณีทดสอบจริงสองถึงสองครั้งสุดท้ายเป็นตัวอย่างของสิ่งนี้ด้วย m = 7) กรณีทดสอบเท็จสามารถสร้างได้โดยเริ่มต้นด้วยจำนวนเต็ม 1, ... , m, เลือก k ≤ m และเพิ่มทวีคูณแบบสุ่มของ k กับจำนวนเต็มเริ่มต้น 1, ... , m
Greg Martin

คำตอบ:



7

Brachylog , 25 24 19 ไบต์

5 ไบต์ขอบคุณ Karl Napf

lybb '(eM-yA,?: [M] z:% aodA) 
l: 2' (eM-yA,?: [M] z:% aodA)
L: 2' (EMG: RZ:% adlM)

ลองออนไลน์!

ยืนยันผลการทดสอบทั้งหมด!

l:2'(eMg:?rz:%adlM)
l:2                  Temp = [2:length(input)]
   '(             )  true if the following cannot be proven:
     eM                  M is an element of the interval
                         indicated by Temp, i.e. from 2
                         to the length of input inclusive,
       g:?rz:%adlM       every element of input modulo M
                         de-duplicated has length M.

4

งูหลาม 61 60 ไบต์

q=lambda l,d=2:d>len(l)or q(l,d+1)&(len({v%d for v in l})<d)

กรณีทดสอบทั้งหมดในideone

แก้ไข: แทนที่ตรรกะและด้วย bitwise & เพื่อบันทึกหนึ่งไบต์


2

JavaScript (ES6), 59 ไบต์

a=>a.every((_,i)=>!i++|new Set(a.map(e=>(e%i+i)%i)).size<i)

ใช้ชุดเคล็ดลับเศษซาก @ KarlNapf


1
มันไม่ใช่กลอุบายเพียงแค่คณิตศาสตร์ ;-)
Karl Napf

2

Python ขนาด67 64 ไบต์

ในฐานะแลมบ์ดาที่ไม่มีชื่อ:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • แก้ไข 1: แทนที่set()ด้วย{}
  • แก้ไข 2: ไม่ต้องการวงเล็บเหลี่ยมรอบตัวสร้าง all(...)
  • แก้ไข 3: ตามที่โจนาธานอัลลันชี้ให้เห็นrangeต้องขึ้นไปlen(N)+1

รหัสเก่าเป็นฟังก์ชัน (96 ไบต์):

def f(N):
 for m in range(2,len(N)+1):
    if len(set(i%m for i in N))==m:return False
 return True

1
ด้วยเหตุนี้ฉันให้เครดิตคุณสำหรับวิธีการของคุณที่ช่วยฉัน 5 ไบต์
แม่ชีที่รั่ว

@LeakyNun ไม่เป็นไร!
Karl Napf


2

MATL 11 ไบต์

"X@QGy\un>v

Truthy เป็นอาร์เรย์ (เวกเตอร์คอลัมน์) ที่มีค่าทั้งหมด Falsy เป็นอาร์เรย์ที่มีศูนย์อย่างน้อยหนึ่งรายการ คุณสามารถตรวจสอบคำจำกัดความเหล่านี้ได้โดยใช้ลิงค์นี้

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด: truthy , falsy (รหัสแก้ไขเล็กน้อยแต่ละกรณีผลิตเวกเตอร์แนวนอนเพื่อความชัดเจน)

คำอธิบาย

"       % Take input array. For each; i.e. repeat n times, where n is arrray size
  X@Q   %   Push iteration index plus 1, say k. So k is 2 in the first iteration,
        %   3 in the second, ... n+1 in the last. Actually we only need 2, ..., n;
        %   but the final n+1 doesn't hurt
  G     %   Push input again
  y     %   Duplicate k onto the top of the stack
  \     %   Modulo. Gives vector of remainders of input when divided by k
  un    %   Number of distinct elements
  >     %   True if that number is smaller than k
  v     %   Vertically concatenate with previous results
        % End for each. Implicitly display 

ฉันยังคงได้รับการมุ่งเน้นไปที่เว็บไซต์นี้ดังนั้นขอโทษถ้าเป็นคำถามที่ถามกันดี แต่: ฉันจะคิดว่าความจริง / ค่าเท็จควรเป็นค่าคงที่ที่แท้จริงของบางประเภทไม่ใช่รูปแบบเช่น "อาร์เรย์ที่มีที่ อย่างน้อยหนึ่งศูนย์ " ไม่ควรดำเนินการอาร์เรย์ (โดยใช้ bitwise และในกรณีนี้) เพื่อมาถึงค่าคงที่ในที่สุด?
Greg Martin

@ GregMartin นั่นเป็นคำถามที่ดีมาก เรามีฉันทามติที่มั่นคงเกี่ยวกับคำตอบของมัน; ดูที่นี่
Luis Mendo

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