Venn Diagram Cells


12

ป.ร. ให้ไว้หลายชุดเช่นs1={2,3,7}, s2={1,2,4,7,8}และs3={4,7}เป็นแผนภาพเวนน์น visualizes แต่ละชุดโดยปิดโค้งและชุดองค์ประกอบซึ่งมีทั้งภายในหรือภายนอกปริมณฑลโค้งที่ขึ้นอยู่กับว่าพวกเขาเป็นส่วนหนึ่งของชุดหรือไม่ เนื่องจากชุดองค์ประกอบทั้งหมดปรากฏเพียงครั้งเดียวใน Vram digram เส้นโค้งที่แสดงถึงชุดแต่ละชุดจึงจำเป็นต้องทับซ้อนกันหากมีองค์ประกอบอยู่ในชุดมากกว่าหนึ่งชุด เราเรียกแต่ละเซลล์ที่ซ้อนทับกันของแผนภาพ Venn

คำอธิบายนี้อาจทำให้สับสนเล็กน้อยดังนั้นเรามาดูตัวอย่าง

ตัวอย่าง

แผนภาพเวนน์ชุดs1, s2และs3อาจมีลักษณะเช่นนี้

เซลล์นี้แผนภาพเวนน์จะ (อ่านจากบนลงล่างซ้ายไปขวา) {1,8}, {2}, {7}, {4}, {3}, และ{}{}

ในทางปฏิบัติหนึ่งทั่วไปพบเฉพาะไดอะแกรมเวนน์ของสองหรือสามชุดเนื่องจากการแทนไดอะแกรมเวนน์ของสี่หรือมากกว่าชุดไม่ชัดเจนมาก อย่างไรก็ตามมีอยู่เช่นสำหรับหกชุด:

CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309

งาน

กำหนดชุดของจำนวนเต็มบวกที่ไม่ว่างเปล่าในการนำเสนอที่สมเหตุสมผลใด ๆ ให้ส่งคืนชุดเซลล์ของแผนภาพ Venn ของชุดอินพุต โดยเฉพาะอย่างยิ่งไม่จำเป็นต้องมีการแสดงกราฟิก

  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ
  • คุณอาจส่งคืนชุดว่างได้มากเท่าที่มีเซลล์ว่างเปล่า (เช่นรายการของเซลล์ทั้งหมด) แทนชุดเปล่าเพียงชุดเดียว (เช่นชุดของเซลล์)
  • บางวิธีที่เหมาะสมของการป้อนข้อมูลสำหรับตัวอย่างข้างต้นรวมถึง แต่ไม่ จำกัด{{2,3,7},{1,2,4,7,8},{4,7}}, [[2,3,7],[1,2,4,7,8],[4,7]], หรือ"2,3,7;1,2,4,7,8;4,7" "2 3 7\n1 2 4 7 8\n4 7"หากสงสัยว่ารูปแบบอินพุตที่คุณเลือกนั้นเป็นที่ยอมรับหรือไม่โปรดถามในความคิดเห็น
  • รูปแบบผลลัพธ์ของคุณควรตรงกับรูปแบบการป้อนข้อมูลของคุณหากเป็นไปได้ โปรดทราบว่ากฎนี้ต้องการรูปแบบของคุณเพื่อให้สามารถแสดงชุดว่างได้อย่างไม่น่าสงสัย
  • นี่คือดังนั้นพยายามใช้จำนวนน้อยที่สุดในภาษาที่คุณเลือก เพื่อส่งเสริมการแข่งขันต่อภาษาแทนที่จะเป็นระหว่างภาษาฉันจะไม่ยอมรับคำตอบ

กรณีทดสอบ

นี่คืออินพุตบางส่วนพร้อมกับเอาต์พุตที่เป็นไปได้:

input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}

ฉันสมมติว่าสิ่งนี้เป็นจริงเพราะคำจำกัดความของชุด แต่เราอาจคิดว่าจะไม่มีการทำซ้ำภายในหนึ่งชุดย่อยหรือไม่
HyperNeutrino

@Hyper Neutrino ใช่คุณสามารถสมมติว่าเซตทั้งหมดนั้นซ้ำกันได้ฟรี
Laikoni

บางทีคุณอาจเพิ่มกรณีทดสอบที่ไม่มีเซลล์ว่างเปล่า เช่น {{1,2,3,4}, {1,2,5,6}, {1,3,5,7}}
Ørjan Johansen

คนที่สองไม่ให้ได้{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}อย่างไร
Leun Nun

1
@carusocomputing เมื่อตรวจสอบอย่างใกล้ชิดคุณจะพบว่านี่ไม่ใช่แผนภาพ Venn จริงเนื่องจากการซ้อนทับที่เป็นไปได้บางอย่างหายไป
Laikoni

คำตอบ:


8

Haskell , 71 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อรับรายการของจำนวนเต็มและส่งคืนรายการที่คล้ายกัน

(foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]]ใช้เป็น

import Data.List
foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[]

ลองออนไลน์!

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

  • ใช้ชุดเหมือนการดำเนินงาน\\(ความแตกต่าง) และจากintersectData.List
  • พับรายการ "ชุด" (แสดงเป็นรายการ) []ในรายการของเซลล์ที่เริ่มต้นด้วยรายการที่ว่างเปล่า
  • xเป็นชุดปัจจุบันที่จะเพิ่มลงในไดอะแกรมและrเป็นรายการของเซลล์ที่สร้างขึ้นแล้ว
    • x\\(id=<<r)เป็นส่วนย่อยขององค์ประกอบxที่ไม่ได้อยู่ในเซลล์ที่สร้างไว้แล้ว
    • [intersect x,(\\x)]<*>rแยกแต่ละเซลล์ขึ้นอยู่rกับว่าองค์ประกอบอยู่ในxหรือไม่
  • แน่นอนที่สุดไม่ได้พยายามรวมเซลล์ว่างดังนั้นจึงมีบางส่วนในผลลัพธ์

แนวคิดเดียวกันกับการนำไปใช้ของฉัน แต่สั้นลงสองไบต์ ทำได้ดี!
Laikoni

4

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

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€

ลองออนไลน์!

การส่งฟังก์ชั่น (เนื่องจากรูปแบบที่เยลลี่พิมพ์รายการตามค่าเริ่มต้นไม่ใช่แบบไปกลับ - ไม่สามารถอ่านรูปแบบเอาต์พุตของตัวเองได้ - แต่ฟังก์ชั่นอินพุตและเอาต์พุตในรูปแบบเดียวกัน) ลิงก์ TIO ประกอบด้วยส่วนท้ายที่เรียกใช้ฟังก์ชันและพิมพ์ผลลัพธ์ในรูปแบบเดียวกับที่แยกวิเคราะห์อินพุต

คำอธิบาย

FṀ‘³iþ¬Ḅµ;ṀḶ$ĠṖṖ€
FṀ‘               Find the largest number that appears in any of the input sets, + 1
   ³ þ            For each number from 1 to that number, and each of the input sets
    i ¬             find whether the number is missing from the set
       Ḅ          Convert the list of missing sets into a single number using binary
         ;        Append
        µ ṀḶ$     all numbers from 0 to the maximum value minus 1
             Ġ    Group indexes by values
              ṖṖ€ Delete the last group and last element of other groups

ข้อกำหนดที่เราส่งออกชุดว่างอย่างน้อยหนึ่งชุดหากไม่ใช่ส่วนไดอะแกรม Venn ทั้งหมดจะใช้เพื่อจัดการโปรแกรมมากกว่าครึ่งหนึ่งที่นี่ (รับผิดชอบต่อสิ่งที่ทำให้แน่ใจว่าเรามีอย่างน้อยหนึ่งกลุ่มสำหรับองค์ประกอบที่ไม่ตรงกันซึ่งช่วยให้เรา เพื่อติดตามจำนวนชุดเริ่มต้นรวมทั้งเก้าไบต์สุดท้ายของซอร์สโค้ดยกเว้นสำหรับĠ) วิธีการพื้นฐานที่เราใช้มันเพื่อให้แน่ใจว่าเซตย่อยไดอะแกรม2 ^ n Venn ทั้งหมดมีอย่างน้อยหนึ่งรายการโดยเพิ่มรายการดัมมี่ที่จะเติมส่วน "ในชุดที่ไม่มี" และ (ต่อมา) รายการดัมมี่ให้แต่ละรายการ ส่วนอื่น ๆ แล้วส่งออกจะกลุ่มสำหรับแต่ละส่วนย่อยซึ่งเราสามารถเอาใช้ĠṖṖ€


อืมมีข้อ จำกัด ไม่เกิน 7 ชุดและหนึ่งในกรณีทดสอบมีมากกว่า
Ørjan Johansen

ฉันคิดว่าเซ็ตดั้งเดิมมีความยาว 3 เพราะนั่นเป็นวิธีที่ Venn diagrams ทำงาน แต่ดูเหมือนจะไม่ ในกรณีนั้นฉันอาจต้องการวิธีที่แตกต่างในการเพิ่มชุดเปล่าเฉพาะในกรณีที่ไม่ได้เติมส่วนของแผนภาพ Venn ทั้งหมด นั่นเป็นสิ่งที่น่ารังเกียจในสิ่งที่เป็นคำถามที่ค่อนข้างหรูหรา

ทีนี้คุณสามารถแทนที่ 7 ด้วย 2 ^ n-1 ได้ฉันถือว่า
Ørjan Johansen

ฉันพบวิธีที่จะได้ค่า 2 ^ n-1 ที่ตรงกับข้อมูลจำเพาะ แต่มันยาวมาก หวังว่าจะมีวิธีที่สั้นกว่านี้ แต่ถึงอย่างนั้นคำถามนี้ก็น่าหงุดหงิด

4

Perl 5, 79 ไบต์

sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h}

ใช้อินพุตเป็นรายการของอาร์เรย์ที่ไม่ระบุชื่อเช่น ([2,3,7], [1,2,4,7,8], [4,7]) เอาต์พุตแฮชที่คีย์คือเลเบลและค่าเป็นอาร์เรย์นิรนามที่สอดคล้องกับชุดเอาต์พุต

เป็นส่วนหนึ่งของโปรแกรมเต็มรูปแบบ:

*x=
sub{for$.(0..@_){$x{$_}+=2**$.for@{$_[$.]}};push@{$h{$x{$_}}},$_ for keys%x;%h};
%x=x([2,3,7],[1,2,4,7,8],[4,7]);
print"Set $_:@{$x{$_}}\n"for keys%x;

คำอธิบาย:

$.ให้แต่ละชุดจำนวนเต็มเป็นป้ายกำกับ สร้างแฮชที่เก็บจำนวนเต็มสำหรับองค์ประกอบเฉพาะแต่ละ$_รายการ เพิ่ม2**$.สำหรับแต่ละชุดที่$_ปรากฏขึ้นทำให้การทำแผนที่ไบนารีอย่างมีประสิทธิภาพแสดงสิ่งที่ชุดแต่ละองค์ประกอบปรากฏขึ้นในที่สุดทำให้อาร์เรย์ที่ไม่ระบุชื่อสำหรับแต่ละเซลล์ของแผนภาพ Venn และผลักองค์ประกอบที่ปรากฏในชุดที่สอดคล้องกันไปยังอาร์เรย์ ดังนั้นองค์ประกอบของแต่ละอาร์เรย์มีอยู่ในชุดเดียวกันและทำให้เซลล์เดียวกันของไดอะแกรมเวนน์


3

Pyth , 11 ไบต์

m-@Fds-Qdty

ชุดทดสอบ

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

แต่ละพื้นที่ของไดอะแกรมเวนน์แสดงองค์ประกอบที่อยู่ใน [ชุดที่แน่นอนของชุด] แต่ไม่ได้อยู่ใน [ชุดอื่น ๆ ]

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

สำหรับชุดค่าผสมแต่ละชุดที่สร้างขึ้นเราจะพบจุดตัดของชุดในชุดค่าผสมและกรององค์ประกอบที่อยู่ในชุดอื่น

m-@Fds-Qdty  input as Q
          y  power set
         t   remove the first one (empty combination)
m            for each combination d:
  @Fd            find the intersection of all the sets in d
 -               filter out those who are in
     s               the union of
      -Qd            the sets not in the combination
                     (input minus combination)

2

JavaScript (ES6), 123 ไบต์

a=>a.map((b,i)=>b.map(e=>m[e]|=1<<i),m=[])&&[...Array(1<<a.length)].map((_,i)=>m.map((e,j)=>e==i&&j).filter(j=>j)).slice(1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.