ตรวจสอบชุดผลต่างแบบวน


14

ชุดวงจรผลต่างคือชุดของจำนวนเต็มบวกที่มีคุณสมบัติเฉพาะ:

  1. อนุญาตnเป็นจำนวนเต็มที่มากที่สุดในชุด
  2. อนุญาตrเป็นจำนวนเต็มใด ๆ (ไม่จำเป็นต้องอยู่ในชุด) มากกว่า 0 n/2แต่น้อยกว่าหรือเท่ากับ
  3. อนุญาตkเป็นจำนวนของการแก้ปัญหาเพื่อ(b - a) % n = rที่aและbเป็นสมาชิกของชุดใด ๆ (a,b)วิธีการแก้ปัญหาแต่ละคนเป็นคู่ที่ได้รับคำสั่ง (โปรดทราบว่า modulo รุ่นนี้ทำให้ตัวเลขติดลบเป็นบวกโดยเพิ่มnลงไปซึ่งแตกต่างจากการใช้งานในหลายภาษา)
  4. ท้ายที่สุดถ้าหากว่านี่เป็นชุดความแตกต่างแบบวนรอบค่าของkไม่ขึ้นอยู่กับการเลือกของrคุณ นั่นคือค่าทั้งหมดของการrให้จำนวนเดียวกันของการแก้ปัญหาเพื่อความสอดคล้องข้างต้น

สิ่งนี้สามารถแสดงได้ด้วยตัวอย่างต่อไปนี้:

Cyclic difference set: {4,5,6,8,9,11}
0 < r <= 11/2, so r = 1,2,3,4,5
r=1: (4,5) (5,6) (8,9)
r=2: (4,6) (6,8) (9,11)
r=3: (5,8) (6,9) (8,11)
r=4: (4,8) (5,9) (11,4)  since (4-11)%11=(-7)%11=4
r=5: (4,9) (6,11) (11,5)

แต่ละค่าของrมีจำนวนโซลูชั่นเท่ากัน 3 ในกรณีนี้ดังนั้นนี่คือชุดผลต่างแบบวน

อินพุต

อินพุตจะเป็นรายการของจำนวนเต็มบวก เนื่องจากนี่เป็นคุณสมบัติที่กำหนดให้ถือว่าอินพุตไม่ได้เรียงลำดับ คุณสามารถคิดว่าnอย่างน้อย2แม้ว่าkอาจจะเป็นศูนย์

เอาท์พุต

โปรแกรม / ฟังก์ชั่นของคุณควรส่งออกค่าความจริงหากชุดนั้นเป็นชุดผลต่างแบบวนหรือเป็นค่าที่ไม่แน่นอน

กรณีทดสอบ

ชุดความแตกต่างของวงจรที่ถูกต้อง:

10,12,17,18,21
7,5,4
57,1,5,7,17,35,38,49
1,24,35,38,40,53,86,108,114,118,135,144,185,210,254,266,273
16,3,19,4,8,10,15,5,6
8,23,11,12,15,2,3,5,7,17,1

( แหล่งข้อมูลแม้ว่าการประชุมของพวกเขาจะแตกต่างกัน)

ชุดความแตกต่างของรอบไม่ถูกต้อง:

1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8

1
สามารถaและbเป็นสมาชิกคนเดียวกัน (ไม่จำเป็นa ≠ b) หรือไม่?
Erik the Outgolfer

2
@EriktheOutgolfer ถ้าbและaเป็นตัวเลขเดียวกัน(b-a)%n = 0แต่ 0 ไม่ใช่ค่าที่คุณกำลังมองหาวิธีแก้ไข ดังนั้นจึงไม่มีข้อห้ามที่ชัดเจนเกี่ยวกับพวกเขาเป็นหมายเลขเดียวกัน แต่พวกเขาจะไม่เป็น
PhiNotPi

1
ฉันชอบมันมากถ้า7 7 7เป็นข้อมูลที่ไม่ถูกต้อง ชุดไม่ได้ทำซ้ำค่า
Ton Hospel

1
@TonHospel เสร็จแล้วและทำ 7 7 7เป็นคำขอของผู้ใช้รายอื่น แต่ฉันลบออกแล้วเนื่องจากไม่ใช่ชุด
PhiNotPi

1
มีสนามเล่นกอล์ฟคิดว่าเราไม่จำเป็นต้องผูกไว้rโดย0 < r <= max(input)/2แต่0 < r < max(input)เพราะเราสามารถขอรับr > max(input)/2กรณีโดยเพียงแค่พลิกลบในr <= max(input)/2กรณี
จองฮวานมิน

คำตอบ:


9

เยลลี่ , 14 7 ไบต์

_þ%ṀṬSE

ลองออนไลน์!

มันทำงานอย่างไร

_þ%ṀṬSE  Main link. Argument: A (array of unique elements / ordered set)

_þ       Subtract table; yield a 2D array of all possible differences of two
         (not necessarily distinct) elements of A.
  %Ṁ     Take the differences modulo max(A).
    Ṭ    Untruth; map each array of differences modulo max(A) to a Boolean array
         with 1's at the specified indices. Note that all 0's in the index array
         are ignored, since indexing is 1-based in Jelly.
     S   Take the sum of these arrays, counting occurrences.
      E  Test if all resulting counts are equal.

5

Husk , 13 ไบต์

Ë#m%▲¹×-¹¹ḣ½▲

ลองออนไลน์!

ทั้งสามยก 1s ดูเหมือนสิ้นเปลือง ...

คำอธิบาย

Ë#m%▲¹×-¹¹ḣ½▲  Input is a list, say x=[7,5,4]
            ▲  Maximum: 7
           ½   Halve: 3.5
          ḣ    Inclusive range from 1: [1,2,3]
Ë              All elements are equal under this function:
                Argument is a number, say n=2.
      ×-¹¹      Differences of all pairs from x: [0,-2,2,-3,0,3,-1,1,0]
  m%▲¹          Map modulo max(x): [0,5,2,4,0,3,6,1,0]
 #              Count occurrences of n: 1

4

ภาษา Wolfram (Mathematica) , 53 52 ไบต์

SameQ@@Counts@Mod[#-#2&@@@#~Permutations~{2},Max@#]&

ลองออนไลน์!

หมายเหตุเราไม่จำเป็นต้องหารองค์ประกอบสูงสุดด้วยสองเนื่องจากสมมาตร (เราอาจตรวจสอบจำนวนโมดูโลทั้งหมด1เป็นmax(input) - 1)

คำอธิบาย

#~Permutations~{2}

ใช้การเปลี่ยนลำดับความยาว -2 ทั้งหมดของอินพุต

#-#2&@@@

ค้นหาความแตกต่างของแต่ละ

Mod[ ... ,Max@#]

แก้ไขผลลัพธ์ด้วยองค์ประกอบสูงสุดของอินพุต

Counts@

ค้นหาความถี่ของแต่ละองค์ประกอบ

SameQ@@

ส่งคืนว่าตัวเลขทั้งหมดเหมือนกันหรือไม่



3

JavaScript (ES6), 87 ไบต์

ผลตอบแทน0หรือ1

a=>a.map(b=>a.map(c=>x[c=(c-b+(n=Math.max(...a)))%n-1]=-~x[c]),x=[])|!x.some(v=>v^x[0])

กรณีทดสอบ




2

Ruby , 81 ไบต์

->s{n=s.max
(1..n/2).map{|r|s.permutation(2).count{|a,b|(b-a)%n==r}}.uniq.size<2}

ลองออนไลน์!

Ungolfed:

->s{
  n=s.max
  (1..n/2).map{|r|               # For each choice of r
    s.permutation(2).count{|a,b| # Count the element pairs
      (b-a)%n==r                 #   for which this equality holds
    }
  }.uniq.size<2                  # All counts should be identical.
}

2

Haskell, 84 ไบต์

l s=all((g 1==).g)[1..t-1]where t=maximum s;g j=[1|x<-s>>=(`map`s).(-),x==j||x+t==j]

l เป็นฟังก์ชั่นที่ทำการตรวจสอบ มันแค่คำนวณความแตกต่างและการนับทั้งหมด


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