เล่นกอล์ฟเครื่องปั่นไฟ Venn Diagram


26

เล่นกอล์ฟเครื่องปั่นไฟ Venn Diagram

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อฉลองวันเกิดครบรอบ 180 ปีของ John Vennอย่างถูกต้องวันนี้งานของคุณจะสร้างโปรแกรมที่แสดงผลVenn Diagram !

การป้อนข้อมูล:

จำนวนเต็มบวกNที่จะกำหนดช่วงของตัวเลขที่ปรากฏในแผนภาพ (จากศูนย์ถึงN) และจำนวนเต็มบวกสามชุด

เอาท์พุท:

3 ชุดแผนภาพเวนน์แสดงจำนวนเต็มทั้งหมดจาก 0 ถึงNและความสัมพันธ์ของชุดโดยการแสดงให้พวกเขาในพื้นที่ที่เหมาะสมของแผนภาพที่คล้ายกับหน้านี้

หมายเหตุ

  1. ใช้stdin(หรือสิ่งที่เทียบเท่าภาษาของคุณ) เพื่อรับค่า
  2. คุณสามารถกำหนดรูปแบบการป้อนข้อมูลสำหรับชุดและสำหรับN(คั่นด้วยเครื่องหมายจุลภาค, สแลชหรืออะไรก็ได้ที่ดีที่สุดสำหรับคุณ)
  3. ตัวเลขที่ไม่ปรากฏในชุดใด ๆ แต่อยู่ในช่วงที่ระบุจะต้องปรากฏบนแผนภาพไม่ใช่ในภูมิภาคใด ๆ
  4. ชุดไม่จำเป็นต้องมีชื่อ
  5. ผลลัพธ์สามารถเป็นรูปวาดหรือ ascii-art
  6. แผนภาพสามารถมีรูปร่างใด ๆ ตราบเท่าที่ขอบเขตมีความแตกต่างอย่างไม่น่าสงสัย (ถ้าคุณเลือกศิลปะ ASCII โดยใช้ + (หรือคล้ายกัน) สำหรับข้ามเขตแดนเป็นสิ่งจำเป็นตัวอย่างเช่น)
  7. ภูมิภาคอาจ แต่ไม่จำเป็นต้องแรเงา
  8. ฟังก์ชันในตัวหรือไลบรารีบุคคลที่สามที่สร้าง Venn Diagrams ไม่อนุญาต
  9. ช่องโหว่ตามมาตรฐาน

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ชนะ


ดูเหมือนว่าคุณควรเพิ่มหมายเหตุว่าโซลูชันต้องปรับมาตราส่วนสำหรับขนาดอินพุตโดยพลการ ปัจจุบันมีเพียงไม่กี่คนเท่านั้นที่ทำเช่นนั้น (เท่าที่ฉันสามารถบอกได้เฉพาะ ASCII เท่านั้น) ฉันไม่ชอบการเปลี่ยนแปลงกฎหลังจากการแข่งขันได้เริ่มขึ้นแล้ว แต่หากไม่มีข้อกำหนดนี้บางคนอาจใช้รูปแบบที่เรียบง่ายซึ่งใช้งานได้กับตัวละครตัวเดียวในแต่ละชุด (ถ้าฉันทำแบบนั้นฉันอาจจะลดขนาดรหัส หนึ่งในสามหรือมากกว่านั้น)
Martin Ender

@ MartinBüttnerใช่บางคนก็ค่อนข้างแย่ แต่การเพิ่มโน้ตตอนนี้มี 7 คำตอบดูเหมือนจะเป็นความคิดที่ไม่ดี ควรเพิ่มบันทึกย่อและแสดงความคิดเห็นในโพสต์ของทุกคนเพื่อให้พวกเขาทราบว่าแผนภาพควรปรับขนาดได้ดีถึง X
William Barbosa

การตั้งค่าขีด จำกัด จะยังคงอนุญาตเฉพาะการเข้ารหัสที่ จำกัด ฉันคิดว่าการปรับขนาดที่เหมาะสมเป็นจริงส่วนที่ยากที่สุดของความท้าทาย ดังนั้นปล่อยให้เป็นไปตามที่ควรจะเป็นหรือเปลี่ยนเป็นการบอกว่ามันจะต้องจัดการกับขนาดชุดที่กำหนดเอง (ซึ่งในทางเทคนิคไม่ได้เป็นการเปลี่ยนแปลงเนื่องจากคุณไม่ได้ จำกัด ขนาดอินพุตที่ฉันคิดว่าควรใส่ขนาดอินพุตโดยไม่ตั้งใจ) .
Martin Ender

@Ryan โปรดทราบว่าฉันระบุ "ด้วยการแสดงในขอบเขตที่เหมาะสมของไดอะแกรม" ในส่วนผลลัพธ์ บางคำตอบ (รวมอยู่ในรายการของคุณ) ไม่แสดงส่วนในสุดอย่างถูกต้องหากส่วนดังกล่าวมีองค์ประกอบมากกว่า 5 รายการดังนั้นฉันจึงคิดว่ามันไม่ถูกต้อง
William Barbosa

xkcd ที่เกี่ยวข้อง: xkcd.com/1810
sergiol

คำตอบ:


8

Mathematica 343 264

UnGolfed

m=Input[]; data=Input[];


(* The circles to represent set boundaries *)
{R1,R2,R3}=Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}};

(*converts  {1,0,1} to base 10, ie, the number 5.
bool[x_]:=FromDigits[Boole[x],2]

(* determines the region in which each number from 0 to `m` resides *)
encode[num_]:=bool[Table[MemberQ[data[[k]],num],{k,3}]]

(*Centroid of each region; the first is a location for numbers in none of the three sets *)
points={{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}

(* Plots the venn diagram with numbers in regions *)
Graphics[{
Text@@@({#[[1]],points[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,encode[#]}&/@Range[0,m],Last])),
Opacity[.1],R1,R2,R3
}]

สมมติว่า 10เป็นอินพุตสำหรับmและ{{1,2,3,4,5,9},{1,2,3,6,8},{7,2,9}}เป็นอินพุตสำหรับd,

แผนภาพเวนน์ใหม่


ตีกอล์ฟ 264

ฉันรู้สึกประหลาดใจที่การคำนวณทั้งหมดสามารถทำได้ภายในGraphicsฟังก์ชันนั้น ด้วยข้อยกเว้นของอินพุตมันเป็นหนึ่งซับ

m=Input[];d=Input[]
Graphics@{Text@@@({#[[1]],{{7,4},{0,2},{4,10},{3,6},{-4,10},{-3,6},{0,11},{0,7}}[[#[[2]]+1]]}&/@({#[[All,1]],#[[1,2]]}&/@GatherBy[{#,FromDigits[Boole[Table[d[[k]]~MemberQ~#,{k,3}]],2]}&/@Range[0,m],Last])),Circle[#,5]&/@{{-2,8.5},{2,8.5},{0,5}}}

+1 สำหรับการปรากฏตัวของแวดวง ฉันประหลาดใจที่พวกเขาดูดีในสีเทา การกระจัดกระจายของตัวเลขนั้นแปลก คุณกำลังใช้RandomSampleเพื่อเลือกสถานที่?
เลเวลริเวอร์เซนต์

สีเทาใช้งานได้เนื่องจากความทึบแสงคือ 10% RandomSample ถูกใช้เพื่อเลือกสถานที่ เมื่อเลือกตำแหน่งแล้วจะถูกลบออกจากชุดผู้สมัครสำหรับการเลือกเพิ่มเติม ฉันเล่นกับวิธีอื่น ๆ (เช่นใช้เซนทรอยด์ของอนุภูมิภาค แต่ไม่ชอบผลลัพธ์) BTW ฉันชอบแนวทางของคุณในการติดตั้งฉลาก
DavidC

ในการบันทึกตัวละครฉันเปลี่ยนไปCirclesดังนั้นดิสก์สีเทาจึงหายไป การประหยัดส่วนใหญ่มาจากความจริงที่ว่าสมาชิกทั้งหมดของภูมิภาคนั้นวางแผนที่ศูนย์กลางของภูมิภาคนั้น
DavidC

45

Ruby, 654 590 566 542 505 ไบต์

มันสนุกมาก ฉันใช้ ASCII ฉันยังไม่สามารถทดสอบชุดค่าผสมที่เป็นไปได้ทั้งหมดดังนั้นหากคุณพบกรณีทดสอบที่ผิดพลาดโปรดแจ้งให้เราทราบ

require'set'
u=(0..gets.to_i).to_set
a,b,c=eval(gets).map &:to_set
i=' '
m,M,n,N,o,O,p,P,q,Q,r,R,s,S=[a-b-c,b-a-c,c-a-b,a&b-c,b&c-a,a&c-b,a&b&c].map{|u|[t=u.to_a*i,t.size]}.flatten
H,V,X=?─,?│,?┼
puts'┌'+H*(A=[1+M+[P,S].max,1+R].max)+?┐+(u-a-b-c).to_a*i,V+i*M+?┌+(b=H*(T=-M+U=A-1)+X+H*(B=[N,Q].max))+?┐,V+m+V+p+i*(T-P)+V+n+i*(B-N)+V,'│┌'+H*(K=M-1)+X+b+X+H*(C=[O-B-1,0].max)+?┐,(v=V*2+i*K)+V+s+i*(T-S)+V+q+i*(B-Q)+V+i*C+V,v+?└+b+?┘+i*C+V,V*2+r+i*(U-R)+V+o+i*(-O+D=B+C+1)+V,'└┼'+H*U+?┘+i*D+V,' └'+H*(A+D)+?┘

คาดว่าอินพุตใน STDIN ในรูปแบบต่อไปนี้

10
[[1,2,3,4,5,9],[1,2,3,6,8],[7,2,9]]

และจากนั้นจะตอบแทนคุณด้วยความงามนี้

┌───────┐0 10
│   ┌───┼───┐
│4 5│1 3│6 8│
│┌──┼───┼───┼┐
││  │2  │   ││
││  └───┼───┘│
││9     │7   │
└┼──────┘    │
 └───────────┘

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

สิ่งนี้สามารถตีกอล์ฟต่อไปได้ด้วยการทำให้ขอบเขตที่ จำกัด น้อยลงหรือทำให้มันคงที่เหมือนกราฟิกบางอันทำ แต่ฉันชอบที่มันดูดีและทำได้ "ถูกต้อง" แม้จะถูกตีกอล์ฟ


หากคุณยังไม่ถึงขีดสูงสุดของวันนี้คุณจะไปถึงสโมสร 10K วันนี้พร้อมคำตอบนี้ช่างน่าเสียดาย
William Barbosa

@ WilliamBarbosa บางทีมันอาจจะทำให้ฉันมี upvotes ที่จำเป็นในวันพรุ่งนี้ ;)
Martin Ender

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

@ สตีฟเวอร์ริลใช่แน่นอน ชุดย่อย 8 ชุดแต่ละชุดจะถูกพิมพ์เป็นรายการที่คั่นด้วยช่องว่างในตำแหน่งที่ถูกต้อง ขอบเขตนั้นมีรูปร่างที่เหมือนกันเสมอและความกว้างของแต่ละส่วนนั้นถูกกำหนดให้เป็นขั้นต่ำที่สุดเพื่อให้พอดีกับทุกอย่างภายใน แน่นอนว่ามันอาจดูดีกว่าถ้าฉันคำนวณ line break เพื่อให้แต่ละเซตย่อย ๆ เป็นสี่เหลี่ยมจัตุรัส นอกจากนี้ยังดูดีขึ้นโดยไม่มีระยะห่างเพิ่มเติมระหว่างบรรทัด
Martin Ender

1
เห็นตัวละครมุมน้อยและทำสองครั้งคิดว่ามันเป็น APL หรืออะไรบางอย่าง :)
hoosierEE

15

BBC BASIC, 243 อักขระ ASCII (ขนาดไฟล์โทเค็น 211 ไบต์)

ดาวน์โหลดโปรแกรมจำลองที่http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

แข็งแรงเล่นกอล์ฟ

  INPUT"N",n
  DIMs(n+1)
  FORi=0TO2PRINT"S";i
  REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n
  NEXTMODE4r=360CIRCLE460,r,r
  CIRCLE640,664,r
  CIRCLE820,r,r
  FORi=0TO7FORx=0TOn:IFs(x)=i PRINT;x
  NEXTREADa
  VDU28,a+1792;a+5;
  NEXT
  DATA19,4873,2572,4893,2586,5907,3091,34

บีบีซีเบสิคคือกฎเกณฑ์ที่กำหนดขึ้นบรรทัดใหม่ / ช่องว่างที่คุณสามารถกำจัดได้ นอกเหนือจากการแยกบรรทัดใหม่ที่ไม่จำเป็นออกไปแล้วยังมีเคล็ดลับอีกอย่างที่นี่ซึ่งไม่ได้อยู่ในเวอร์ชันที่ไม่ได้รับการอัปเดต: ฉันกำหนดวิวพอร์ต (ดูคำอธิบายด้านล่างในความคิดเห็นที่ไม่ได้รับ ซึ่งหมายความว่าองค์ประกอบนอกชุดถูกพล็อตด้านบนซ้ายและเคอร์เซอร์ถูกขังอยู่ในวิวพอร์ตที่ด้านบนขวาในตอนท้ายของโปรแกรม VDU26เหตุผลของเรื่องนี้คือการกำจัด

Ungolfed

แต่ละชุดของตัวเลขจะถูกยกเลิกโดยผู้ใช้ที่ป้อนหมายเลข N + 1 (ตัวเลือกที่ผิดปกติเล็กน้อยเพื่อหลีกเลี่ยงข้อผิดพลาดที่เกิดจากการพยายามเขียนนอกช่วงของอาเรย์) จากนั้นจะเปลี่ยนจากโหมดข้อความเป็นโหมดกราฟิก และพล็อตแผนภาพ Venn

ข้อมูลอินพุตถูกเก็บไว้ในอาร์เรย์หนึ่งเซลล์สำหรับแต่ละค่าที่จะแสดง ข้อมูลจะถูกเก็บไว้เป็นค่า 3 บิต: 1 สำหรับ Set0 + 2 + 4 Set1 สำหรับ SET2 ให้ตัวเลขในช่วง 0 ถึง 7 บีบีซีพื้นฐานได้ดำเนินการเปลี่ยนแปลงไม่ดังนั้นผู้ประกอบการพลังงานถูกนำมาใช้แทน: 2^iแทน1<<iใน C ตัวอย่างเช่น

หลังจากพล็อตวงกลมวงกลมด้านนอกจะผ่านแต่ละแปดภูมิภาคเคลื่อนย้ายไปยังพิกัดที่ต้องการ (ตามตารางข้อมูล) ลูปด้านในจะพิมพ์ตัวเลขทั้งหมดในภูมิภาคนั้น (ที่มีค่า 3 บิตที่สอดคล้องกันใน อาร์เรย์.)

  INPUT"N",n                                 :REM create an array called s() with range 0..n+1
  DIMs(n+1)
  FORi=0TO2
    PRINT"S";i                               :REM prompt the user for data for set 0, set 1 and set 2.
    REPEATINPUTx:s(x)=s(x)+2^i:UNTILx>n      :REM input numbers and store as a bit table. Repeat until user enters n+1.
  NEXT
  MODE4                                      :REM change to graphics mode.
  r=360
  CIRCLE460,r,r                              :REM plot a circle at x,y,r.
  CIRCLE640,664,r                            :REM for the bottom two circles y=r.
  CIRCLE820,r,r
  FORi=0TO7                                  :REM for each region of the venn diagram
    READa                                    :REM read a 2 byte value for the  coordinates of the top left corner of a text viewport from the DATA statement: x+256y
    VDU28,a+1792;a+5;                        :REM create a 5x7 viewport (limits each region to 7 numbers.) 1792=7*256
    FORx=0TOn:IFs(x)=i PRINT;x               :REM print all numbers in the array belonging to that region
    NEXT
  NEXT
  VDU26                                      :REM Restore the viewport to the whole screen, to ensure the command prompt does not mess up the display at the end of the program.
  DATA34,19,4873,2572,4893,2586,5907,3091

การตัดต่ออินพุทและเอาท์พุททั่วไป (เวอร์ชั่นที่ไม่ดี)

>ในรุ่นแข็งแรงเล่นกอล์ฟตำแหน่งของตัวเลขนอกชุดที่มีการแลกเปลี่ยนกับพร้อมรับคำสั่ง

ป้อนคำอธิบายรูปภาพที่นี่


ใช้งานได้กับอินพุตที่มีขนาดใหญ่หรือไม่?
Martin Ender

@ หลักการในMartinBüttnerใช่อัลกอริทึมสามารถทำได้ แต่จอแสดงผลช่วยให้มันลง (เป็นไปได้ที่จะมีปัญหากับการแก้ปัญหาอื่น ๆ ) ฉันพูดเป็นนัยในความเห็นของโปรแกรมที่แต่ละภูมิภาคจะถูก จำกัด จำนวน 7 ตัวเลขก่อนที่จะเริ่มเลื่อน ตัวเลขอยู่ในคอลัมน์แนวตั้งเนื่องจากฉันคิดว่าการห่อจะดูน่ากลัว) ผู้เลียนแบบที่ฉันใช้สามารถจัดการกับความละเอียดหน้าจอที่สูงขึ้นได้มาก แต่ฉันได้ไปหนึ่งในโหมดหน้าจอ BBC micro "ของแท้" ซึ่งค่อนข้าง จำกัด หากใครบางคนพอร์ตนี้เพื่อ Java ขีด จำกัด ในทางปฏิบัติเท่านั้นจะเป็นความสามารถของมนุษย์ในการอ่านแผนภาพ
เลเวลริเวอร์เซนต์

ใช่แล้วฉันแค่สงสัยว่าวงกลมจะปรับให้เข้ากับขนาดอินพุตหรือไม่ ... แน่นอนว่าโซลูชันของฉันจะไม่สามารถอ่านได้สำหรับอินพุตขนาดใหญ่หากเทอร์มินัลของคุณล้อมเส้นหรือไม่ แต่ตราบใดที่มันแสดงด้วยแถบเลื่อน ขนาด.
Martin Ender

2
แม้ว่านี่จะถูกส่งไปยัง java คุณจะต้องเพิ่มรหัสเพื่อทำให้แวดวงมีขนาดใหญ่ขึ้นสำหรับข้อความเพิ่มเติม
Sparr

14

Javascript 1235

http://jsfiddle.net/44a4L/7/

ผ่านการทดสอบใน google chrome v36

อินพุตถูกใช้ในตัวแปรส่วนบน, set1, set2 และ set3

อัปเดต:ตอนนี้ปรับขนาดอัตโนมัติตามขนาดของอินพุต

function t(e,t){z.getElementById(e).innerHTML+=" "+t}z=document;s=200+upper*20;z.body.innerHTML+="<style>#m{width:"+s+"px;height:"+s+"px;}div{position:absolute;text-align:center;border-radius:50%;}#s1{left:calc(15% + 15px);top:30px;bottom:30%;right:calc(15% + 15px);background-color:rgba(255,0,0,0.4);padding:10%;}#s2{left:30px;bottom:30px;top:30%;right:30%;background-color:rgba(0,255,0,0.4);padding-right:40%;padding-top:30%;}#s3{right:30px;bottom:30px;top:30%;left:30%;background-color:rgba(0,0,255,0.4);padding-left:40%;padding-top:30%;}#s123{left:40%;top:40%;right:40%;bottom:40%;}#s12{left:20%;top:35%;right:65%;bottom:50%;}#s13{right:20%;top:35%;left:65%;bottom:50%;}#s23{left:40%;right:40%;bottom:15%;top:70%;}</style><div id=m><div id=s1 class=s></div><div id=s2 class=s></div><div id=s3 class=s></div><div id=s123 class=v></div><div id=s12 class=v></div><div id=s13 class=v></div><div id=s23 class=v></div></div>";for(i=0;i<=upper;i++){i1=i2=i3=false;if(set1.indexOf(i)!=-1)i1=true;if(set2.indexOf(i)!=-1)i2=true;if(set3.indexOf(i)!=-1)i3=true;if(i1&&i2&&i3)t("s123",i);else if(i1&&i2)t("s12",i);else if(i1&&i3)t("s13",i);else if(i2&&i3)t("s23",i);else if(i1)t("s1",i);else if(i2)t("s2",i);else if(i3)t("s3",i);else t("m",i)}

ตัวอย่างผลลัพธ์:

เวนน์


ค่อนข้างดี! ฉันสามารถบีบให้แน่นยิ่งขึ้นดูjsfiddle.net/44a4L/2 - ดูที่ฟังก์ชัน "t", CSS และ body.innerHTML ตรรกะเดียวกันแม้ว่า ฉันแน่ใจว่ามันยังคงถูกบีบ
Nenotlep

นี่คือสิ่งที่สวยงามที่สุดเท่าที่เคยมีมา องค์ประกอบสามอย่างในพื้นที่ด้านในสุดทำให้เกิดการแตกหัก คุณวางแผนที่จะทำให้มันขยายขนาดอย่างใด?
William Barbosa

ปรับ @WilliamBarbosa จะดำเนินการในขณะนี้
rdans

2
งดงาม! น่าทึ่ง! งดงาม! (ต้องใช้มากกว่าหนึ่งชั้นเยี่ยมเพราะ SE เกลียดความกะทัดรัด)
Scott Leadley

4

Python - 603

import re
n,a,b,c=eval(input())
h=set(range(n+1))-a-b-c
g=a&b&c
d,e,f=a&b-g,b&c-g,a&c-g
l,m=set(a),set(b)
a-=b|c
b-=l|c
c-=l|m
for t in'abcdefgh':exec("%s=' '.join(map(str,%s))"%(2*(t,)))
l=len
x,y,z=max(l(a),l(f)+2,3),l(max(d,g)),max(l(b),l(e)+2,l(c)-l(f+g)-2,3)
j=[0]*4
for t in'abcdefg':exec("%s=%s.ljust([x,z,x+y+z-2,y,z-2,x-2,y][ord('%s')-97])+'|'"%(3*(t,)))
s='\d| '
w=re.sub
for r in (1,3):q=r//2;j[r]=['','| '][q]+'|'+[a+d+b,f+g+e][q]+['',' |'][q];j[r-1]=w('\|','+',w(s,'-',j[r]))
j[0]+=h
o=j[2]
j[2]='| +'+j[2][3:-3]+'+ |'
p='  |'+c
q='  '+w('\|','+',w(s,'-',p))[2:]
for l in j+[o,p,q]:print(l)

อินพุตคือ N ตามด้วยสามชุดคั่นด้วยเครื่องหมายจุลภาค (เช่น8, {1,2,4}, {2,3,4,5}, {4,6,8}) มันส่งสัญญาณชุดในศิลปะ ACSII ดังต่อไปนี้:

+---+-+---+0 7
|1  | |3 5|
| +-+-+-+ |
| |2|4| | |
+-+-+-+-+-+
  |6 8  |
  +-----+

ฮ่าฮ่าสองโซลูชั่นที่เหมือนกันเกือบภายใน 5 นาที (3 ชั่วโมงหลังจากการท้าทายถูกโพสต์ ... )
Martin Ender

1
โปรดดูหมายเลขหมายเหตุ 6 ขอบและข้ามเขตแดนของคุณจะต้องเป็นตัวละครอื่นเช่น "+"
William Barbosa

4

HTML + JavaScript (E6) 752 761

รูปแบบการป้อนข้อมูล: สูงสุด set1 set2 set3 (แต่ละชุดเป็นรายการตัวเลขคั่นด้วยเครื่องหมายจุลภาค)

ตัวอย่าง: 10 1,2,3,4,5,9 1,2,3,6,8 7,2,9

ภาพหน้าจอ

ตัวอย่างที่ 2: 30 2,4,6,8,10,12,14,16,18,30 3,6,9,12,15,18,21,30 5,10,15,20,25,30

ภาพหน้าจอของ Chrome

ขนาดทั้งหมดของส่วนอัตโนมัติต้องขอบคุณการแสดงผล html

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,x=>'09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x])
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,x=>r[x]))
</script></body></html>

Javascript E5 version ใช้งานได้ใน Chrome และ MSIE 10 (อาจเป็น 9)

<html><body><script>
i=prompt().split(' ');
r=",,,,,,,, class=',></i>".split(c=',')
for (j=-1;j++<i[0];r[h]+=j+' ')for(h=k=0;++k<4;)if((c+i[k]+c).search(c+j+c)+1)h+=k+(k>2);
document.write(
"<style>div{1row}p{position:relative;text-align:center;padding:7;1cell}i{position:absolute;top:0;3:0;4:0;left:0}.a{2top-left5b{2top-45c{23-left5d{23-45x{6880,9.y{680,89.z{60,889</style>"
.replace(/\d/g,function(x){return '09display:table-9border-9bottom9right9-radius:60px}.9background:rgba(930px9255,9.3)}'.split(9)[x]})
+"<div><p8x a'/><p8x'>1</p><p><i8y a'9<i8x b'93</p><p8y'>2</p><p8y b'/></div><div><p8x c'/><p8z a'><i8x'95</p><p8z'><i8x d'9<i8y c'97</p><p8z b'><i8y'96</p><p8y d'/></div><div><p/><p8z c'/><p8z'>4</p><p8z d'/></div>0"
.replace(/\d/g,function(x){return r[x]}))
</script></body></html>

ไม่เล่นกอล์ฟ

<html>
<style>
div {   display:table-row; }
p {
    position: relative;
    text-align: center;
    padding: 30px;
    display: table-cell;
}
i {
    position: absolute;
    top:0;bottom:0;right:0;left:0;
}
.a { border-top-left-radius: 60px; }
.b { border-top-right-radius: 60px; }
.c { border-bottom-left-radius: 60px; }
.d { border-bottom-right-radius: 60px; }
.x { background: rgba(255,255,0,.3) }
.y { background: rgba(255,0,255,.3) }
.z { background: rgba(0,255,255,.3) }
</style>
<body>
<div>
<p class='x a'/><p class='x'><b id='b1'></b></p><p><i class='y a'></i><i class='x b'></i><b id='b3'></b></p><p class='y'><b id='b2'></b></p><p class='y b'/>
</div>    
<div>
<p class='x c'/><p class='z a'><i class='x'></i><b id='b5'></b></p><p class='z'><i class='x d'></i><i class='y c'></i><b id='b7'></b></p><p class='z b'><i class='y'></i><b id='b6'></b></p><p class='y d'/>
</div>        
<div>
<p/><p class='z c'/><p class='z'><b id='b4'></b></p><p class='z d'/>
</div>    
<b id='b0'></b>    
<script>
i=prompt().split(' ')
r=',,,,,,,'.split(c=',')
for (j=-1; j++<i[0];)
{
    for(h = k = 0; ++k < 4;)
    {
    if( (c+i[k]+c).search(c+j+c) >= 0)
      h += k + (k>2); // bit mask 1 or 2 or 4
  }
  r[h] += j + ' ';
}        
for (j = 0; j < 8; j++)
    document.getElementById('b'+j).innerHTML=r[j]
</script>
</html>

3

Python 3 - 353

# 353 bytes, input format like: 6 1,2,3 2,3,4 1,3,4
import sys
from turtle import*
_,n,*q=sys.argv
n=set(range(int(n)))
a,b,c=map(set,map(eval,q))
for x,y in(0,0),(-115,-185),(115,-185):goto(x,y),pd(),circle(200),up()
for x,y,s in(200,331,n-a-b-c),(-101,278,a-b-c),(-254,-49,b-a-c),(95,-49,c-a-b),(-172,164,a&b-c),(58,164,a&c-b),(-49,-39,b&c-a),(-49,52,a&b&c):goto(x,y),write(s or'',font=None)
ht()
done()

มีใครเล่นกับโลโก้เมื่อตอนเป็นเด็กบ้างไหม?

ตัวอย่าง: python3 turtletest.py 15 1,2,3,4,5,9,10,12 1,3,4,6,7,9 1,2,7,8,9

ป้อนคำอธิบายรูปภาพที่นี่


แบบอักษร / วงกลมจะปรับขนาดสำหรับอินพุตที่มีขนาดใหญ่โดยพลการหรือไม่
SPARR

ไม่ยังคิดเกี่ยวกับสิ่งนั้นอยู่
Jason S

@JasonS ยังคิดอยู่ใช่ไหม
Jonathan Frech

3

perl 388b 346b 488b

สิ่งนี้มีเอาต์พุตคล้ายกับรายการอื่น:

@a=split($",<>);
$n=pop @a;
@a=map[split(',')],@a;
for$i(0..2){$b{$_}+=1<<$i foreach@{$a[$i]}}
push@{$c[$b{$_}]},$_ for(0..$n);
$l|=length($d[$_]=join($",@{$c[$_]}))for(0..$n);
print$h=(("+-"."-"x$l)x3)."+
";
sub j{sprintf"% ".(sprintf"%ds",$l+($_[0]<4)+($_[0]==7)),$d[$_[0]]}
sub r{join('|',map{j($_)}@_)}
$h=~s/\+-/|+/;
$h=~s/-\+$/+|/;
print "|".r(1,3,2)."|
".$h;
$h=~s/[|+]{2}/++/g;
print "||".r(5,7,6)."||
".$h;
$h=~s/\+\+/ +/;
$h=~s/\+\+/+ /;
$h=~s/-\+-/---/g;
$l=$l*3+3;print " |".j(4)."|
",$h,$d[0]

ทดสอบการทำงานและการส่งออก:

# echo "1,2,3,7,13 2,3,8,11,13,6,9 3,4,5,11,12,13,14 15" | perl venn.pl ;echo
+----------------+----------------+----------------+
|             1 7|               2|           6 8 9|
|+---------------+----------------+---------------+|
||               |            3 13|             11||
++---------------+----------------+---------------++
 |                                       4 5 12 14|
 +------------------------------------------------+ 

หืมมฉันไม่แน่ใจว่าเลย์เอาต์นั้นไม่คลุมเครือจริงๆถ้าคุณไม่เห็นอินพุท
Martin Ender

คุณพูดถูกสิ่งนี้ไม่ดีพอ
William Barbosa

@WilliamBarbosa โอเคฉันทำให้มันดูเหมือนรายการของ faubiguy
Sparr

2

T-SQL 2095

Assumes @N เป็น int ที่มี N. Assumes @A, @B และ @C เป็นตารางที่มีตัวเลขสามชุด อย่าพยายามตีกอล์ฟมากเกินไป

DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)INSERT INTO @(Z)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P INSERT INTO @(Y)SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL INSERT INTO @(X)SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL INSERT INTO @(W)SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL INSERT INTO @(V)SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL INSERT INTO @(U)SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL INSERT INTO @(T)SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL WHILE @N>=0BEGIN INSERT INTO @(S)SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)SET @N-=1 END DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))INSERT INTO @Z SELECT @F,@H,@F,@H,@G,@H,@G,''WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')SET @E+=1 END INSERT INTO @Z SELECT @F,@H,@J,@H,@G,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@J,@H,@F,'',@I,''SET @E=0WHILE @E<=@D BEGIN INSERT INTO @Z SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''SET @E+=1 END INSERT INTO @Z SELECT @G,@H,@G,@H,@F,@H,@F,''SELECT*FROM @Z

รุ่น golfed น้อยกว่า:

--finding the sets
DECLARE @D INT=@N,@E INT=0,@F CHAR='/',@G CHAR='\',@H CHAR='-',@I CHAR='|',@J CHAR='+'
DECLARE @ TABLE(Z INT,Y INT,X INT,W INT,V INT,U INT,T INT,S INT)
INSERT INTO @(Z)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P JOIN @C C ON A.P=C.P 
INSERT INTO @(Y)
SELECT A.P FROM @A A JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL 
INSERT INTO @(X)
SELECT C.P FROM @C C JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL 
INSERT INTO @(W)
SELECT B.P FROM @B B JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL 
INSERT INTO @(V)
SELECT A.P FROM @A A LEFT JOIN @B B ON A.P=B.P LEFT JOIN @C C ON A.P=C.P WHERE C.P IS NULL AND B.P IS NULL 
INSERT INTO @(U)
SELECT C.P FROM @C C LEFT JOIN @A A ON C.P=A.P LEFT JOIN @B B ON C.P=B.P WHERE B.P IS NULL AND A.P IS NULL 
INSERT INTO @(T)
SELECT B.P FROM @B B LEFT JOIN @C C ON B.P=C.P LEFT JOIN @A A ON B.P=A.P WHERE A.P IS NULL AND C.P IS NULL 
WHILE @N>=0
BEGIN 
    INSERT INTO @(S)
    SELECT @N WHERE @N NOT IN(SELECT*FROM @A UNION SELECT*FROM @B UNION SELECT*FROM @C)
    SET @N-=1 
END

--displaying the venn diagram
DECLARE @Z TABLE(A CHAR(5),B CHAR(5),C CHAR(5),D CHAR(5),E CHAR(5),F CHAR(5),G CHAR(5),H CHAR(5))
INSERT INTO @Z 
SELECT @F,@H,@F,@H,@G,@H,@G,''
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT V FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT X FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT U FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT S FROM @)),'')
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @F,@H,@J,@H,@G,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Y FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT Z FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@J,@H,@F,'',@I,''
SET @E=0
WHILE @E<=@D 
BEGIN 
    INSERT INTO @Z 
    SELECT @I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT T FROM @)),''),@I,ISNULL((SELECT CONVERT(CHAR,@E,5) WHERE @E IN(SELECT W FROM @)),''),@I,'',@I,''
    SET @E+=1 
END 
INSERT INTO @Z 
SELECT @G,@H,@G,@H,@F,@H,@F,''
SELECT*FROM @Z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.