เทียนน้อยเป็นเรื่องน่าเศร้า วาดเขาเป็นก้อนเมฆเพื่อให้กำลังใจเขา


57

เทียนน้อยเป็นเรื่องน่าเศร้า วาดเขาเป็นก้อนเมฆเพื่อให้กำลังใจเขา
หมายเหตุ: การวาดภาพบนคลาวด์จะไม่ทำให้เขามีกำลังใจ

วงกลมสามารถนิยามเป็น 3-tuple (x,y,r)โดยที่xตำแหน่ง x ของวงกลมบนระนาบคาร์ทีเซียนyคือตำแหน่ง y ของวงกลมบนระนาบคาร์ทีเซียนและrเป็นรัศมีของวงกลม xและyอาจเป็นลบ rเป็นบวกเสมอ อินพุตเป็นรายการของวงกลมในรูปแบบของช่องว่างคั่น 3-tuples ตัวอย่างเช่น

3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8

3,1,1หมายถึง "วงกลมที่มีจุดศูนย์ที่3,11 รัศมี. 3,2,1.5หมายความว่า" วงกลมที่มีจุดศูนย์กลางที่ A 3,2พร้อมกับ 1.5 รัศมี

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

กราฟ

สังเกตว่าวงกลมทั้งหมดกลมกลืนกันอย่างไร นั่นคือพวกเขาทั้งหมดซ้อนทับกันเพื่อให้เกิดกลุ่มใหญ่กลุ่มหนึ่งโดยไม่มีกลุ่มวงกลมเล็ก ๆ แยกออกจากส่วนที่เหลือ อินพุตรับประกันว่าจะเหนียวแน่น

สมมติว่าตอนนี้เราวาดเส้นที่เดินทางรอบ "เส้นขอบ" ที่เกิดจากวงกลมเหล่านี้โดยไม่มีเส้นอื่นใด มันจะเหมือนกับการวาดเส้นขอบของเงาที่เกิดจากวงกลมทั้งหมด เมฆที่เกิดขึ้นจะมีลักษณะเช่นนี้:

เมฆ

ดังนั้นคลาวด์นี้จึงถูกสร้างขึ้นโดยการวาดเฉพาะส่วนโค้งของวงกลมในอินพุตที่ก่อตัวเป็นเส้นขอบ กล่าวอีกนัยหนึ่งระบบคลาวด์เกิดจากการวาดส่วนโค้งที่ไม่ได้อยู่ในวงกลมอื่น โปรแกรมของคุณจะป้อนข้อมูลในแบบฟอร์มที่อธิบายข้างต้นและส่งภาพที่แสดงคลาวด์ที่เกิดขึ้น รูปร่างโดยรวมของคลาวด์จะต้องถูกต้อง แต่ขนาดสีความหนาของเส้นและลักษณะของจุดยอดนั้นขึ้นอยู่กับคุณ โปรดทราบว่าคลาวด์ต้องสามารถมองเห็นได้ดังนั้นคุณไม่สามารถดึงบางสิ่งบางอย่างเช่น "โปรแกรมนี้วาดคลาวด์สีขาวบนพื้นหลังสีขาว", "โปรแกรมนี้วาดคลาวด์ในระดับที่เล็กที่สุด", "โปรแกรมนี้ดึงคลาวด์ด้วย 0 ความหนาของเส้น "เป็นต้นโปรดทราบว่าสีของเส้นขอบต้องแตกต่างจากสีของการเติมหรือพื้นหลัง

ตัวอย่างอื่น. การป้อนข้อมูล:

1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7

เอาท์พุท:

cloud2

หากมี "รู" ในคลาวด์คุณควรวาดรูด้วย การป้อนข้อมูล:

0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4 

เอาท์พุท:

cloud3

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

นี่คือรหัสกอล์ฟดังนั้นจำนวนตัวละครที่สั้นที่สุดจึงชนะ


13
+1 สำหรับคำถามกราฟิก - เอาท์พุทที่มีเกณฑ์การชนะอย่างมีวัตถุประสงค์ (และวรรคแรก)
เดนนิส

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

1
@JanDvorak จุดประสงค์ของกฎนี้ก็เพื่อป้องกัน "วาดวงกลมแล้ววาดวงกลมอีกครั้งด้วยการเติมสีขาว" หรืออะไรก็ตามที่คล้ายกัน คำตอบคาดว่าจะคำนวณตำแหน่งที่จะวาดสิ่งต่าง ๆ ก่อนที่จะทำการวาด ฉันจะแก้ไขเพื่อให้ชัดเจนยิ่งขึ้น
absinthe

15
คำถามนี้เฮฮาอย่างยิ่งเมื่อติดตั้งCloud to Butt ( chrome.google.com/webstore/detail/cloud-to-butt-plus/?hl=th )
Erty Seidohl

9
@SomeKittens ฉันทำหายที่ "ถ้ามี" ช่อง "ในคลาวด์คุณควรวาดรูด้วย
Erty Seidohl

คำตอบ:


25

Mathematica 177 126 121 119

การแก้ปัญหาตามภูมิภาคของดิสก์: แนวทางของนักคณิตศาสตร์

ตรรกะคือการ

  • สร้างภาค 1 (R1), วงกลม (ไม่มีการตกแต่งภายใน)
  • สร้างภูมิภาค 2 (R2), ดิสก์ (ไม่มีเส้นขอบวงกลม)
  • สร้างภูมิภาค 3 (R3 = R1-R2)
  • -

การอนุมานภูมิภาค

นี่คือวิธีการที่ถูกต้องด้านล่าง มันสร้างตัวเลข 3 ตัวด้านบน

input = "3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8";
circles = ((x - #)^2 + (y - #2)^2 == #3^2) & @@@ 
     ToExpression[#~StringSplit~","] &@(StringSplit@input);
R1 = ImplicitRegion[Or @@ circles, {x, y}];
r1 = RegionPlot[R1, PlotLabel -> "R1: circles containing borders", 
   AspectRatio -> 1, PlotRange -> {{-1, 5}, {-1, 5}}];

innerDisks = ((x - #)^2 + (y - #2)^2 < #3^2) & @@@ 
     ToExpression[#~StringSplit~","] &@(StringSplit@input);
R2 = ImplicitRegion[Or @@ innerDisks, {x, y}];
r2 = RegionPlot[R2, PlotLabel -> "R2: disks within circle borders", 
   AspectRatio -> 1, PlotRange -> {{-1, 5}, {-1, 5}}];
R3 = RegionDifference[R1, R2]
r3 = RegionPlot[R3, PlotLabel -> "R3 = R1-R2", AspectRatio -> 1, 
   PlotRange -> {{-1, 5}, {-1, 5}}];
GraphicsGrid[{{r1, r2, r3}}, ImageSize -> 600]

ภูมิภาค # 1 โดยนัยคือการรวมกันของแวดวง โดยปริยายภูมิภาคที่ 2 คือการรวมกันของดิสก์ที่อยู่ในวงกลม ความแตกต่างคือชายแดน

RegionDifference [
ImplicitRegion [(- 3 + x) ^ 2 + (-1 + y) ^ 2 == 1 || (-3 + x) ^ 2 + (-2 + y) ^ 2 == 2.25 || (-1 + x) ^ 2 + (-2 + y) ^ 2 == 0.49 || (-0.9 + x) ^ 2 + (-1.2 + y) ^ 2 == 1.44 || (-1 + x) ^ 2 + y ^ 2 == 0.64, {x, y}],
ImplicitRegion [(- 3 + x) ^ 2 + (-1 + y) ^ 2 <1 | | (-3 + x) ^ 2 + (-2 + y) ^ 2 <2.25 || (-1 + x) ^ 2 + (-2 + y) ^ 2 <0.49 || (-0.9 + x) ^ 2 + (-1.2 + y) ^ 2 <1.44 || (-1 + x) ^ 2 + y ^ 2 <0.64, {x, y}]]


การแก้ปัญหาโดย Disk ภูมิภาค: วิธีการของวิศวกร (119 chars)

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

s = StringSplit;RegionBoundary@DiscretizeRegion[RegionUnion[Disk[{#, #2}, #3] &@@@
ToExpression[#~s~","] &@(s@InputString[])]]

"3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8"

ขอบเขตของพื้นที่จะถูกแยกออก

reg1


การแก้ปัญหาโดยการตรวจจับขอบ: แนวทางของช่างภาพ - 121 ตัวอักษร

การตรวจจับขอบ

มันดึงดิสก์เป็นสีดำทำให้ภาพ rasterizes ตรวจจับขอบและแปลงกลับเป็นสีดำและสีขาว

s=StringSplit;ColorNegate@EdgeDetect@Rasterize@Graphics[Disk[{#,#2},#3]&@@@
((ToExpression/@s[#,","])&/@s[InputString[]])]

โกนออกได้ 5 ไบต์:RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
Martin Ender

อาจเกิดขึ้นs=StringSplitภายในพรอมต์? ลองย้ายที่อยู่ข้างหน้าอีกครั้งควรจะสั้นกว่าเวอร์ชันปัจจุบันของคุณ
Martin Ender

27

T-SQL 235 234 229 212 171 73 ไบต์

สิ่งนี้ใช้ประโยชน์จากฟังก์ชันเชิงพื้นที่ใน SQL Server 2012+ เมื่อมันถูกเรียกใช้ใน SSMS (SQL Server Management Studio) จะสร้างบานหน้าต่างผลลัพธ์เชิงพื้นที่ อินพุตมาจากตัวแปร @i ฉันสามารถลดความมันลงไปได้อีกหากการป้อนข้อมูลสามารถนำมาจากตารางได้

เนื่องจากอนุญาตให้ใช้ตารางในขณะนี้

SELECT Geometry::UnionAggregate(Geometry::Point(X,Y,0).STBuffer(R))FROM A

ฉันได้ออกจากโซลูชันก่อนหน้านี้ด้านล่าง

DECLARE @ VARCHAR(999)='WITH a AS(SELECT *FROM(VALUES('+REPLACE(@i,' ','),(')+'))A(X,Y,R))SELECT Geometry::UnionAggregate(Geometry::Point(X,Y,0).STBuffer(R))FROM a'EXEC(@)

แก้ไข : เอาพื้นที่จรจัดส่วนเกินเข้าและแบบสอบถามย่อย

171: แทนที่การสร้างตารางด้วย CTE และ @s ด้วย @

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

แยกย่อยของ Dynamic SQL

DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7' -- Input
DECLARE @ VARCHAR(999) = '
WITH a AS(                                       --CTE to produce rows of x,y,r 
    SELECT *FROM(VALUES('+
        REPLACE(@i,' ','),(')                    --Format @i to a value set
        +'))A(X,Y,R)
)
SELECT Geometry::UnionAggregate(                 --Aggregate Buffered Points
    Geometry::Point(X,Y,0).STBuffer(R)           --Create point and buffer
    )               
FROM a                                           --from the table variable
'
EXEC(@)                                          --Execute Dynamic sql

ฉันได้รับข้อผิดพลาดที่บอกว่า'A' has fewer columns than were specified in the column list
Jesan Fafon

@JesanFafon ตรวจสอบให้แน่ใจว่าตัวแปรอินพุต @i ของคุณถูกตั้งค่าอย่างถูกต้อง DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'. น่าเสียดายที่ฉันไม่สามารถทดสอบได้ในขณะนี้และ SQLfiddle ไม่ได้เล่นอย่างสวยงามในปี 2012
MickyT

ใช้งานได้ดีกับฟังก์ชันเรขาคณิต SQL ข่าวดี! การป้อนข้อมูลจากตารางที่มีอยู่ก่อนในขณะนี้จะได้รับอนุญาตอย่างชัดเจน ไม่จำเป็นต้องสร้างตารางและจำนวนประชากรในจำนวนไบต์
BradC

ฉันเล่นกอล์ฟสักสองสามตัว ลิงก์ไม่สร้างผลลัพธ์ แต่มันใช้งานได้ในสตูดิโอจัดการเซิร์ฟเวอร์ ms-sql สคริปต์อยู่ที่นี่สนุก อย่าลังเลที่จะใช้มัน
t-clausen.dk

@ t-clausen.dk ขอบคุณสำหรับสิ่งนั้น แต่เนื่องจากฉันจะอัปเดตฉันจะเปลี่ยนเป็นอินพุตตารางที่ได้รับอนุญาต ฉันจะไม่ขุดมันขึ้นมา แต่ ...
มิกกี้

23

Mathematica, 175 158 149 bytes

s=StringSplit;l=ToExpression[#~s~","]&@s@InputString[];RegionPlot[Or@@(Norm@{x-#,y-#2}<#3&@@@l),{x,m=Min@(k={{##}-#3,{##}+#3}&@@@l),M=Max@k},{y,m,M}]

ฉันจำได้จากการสนทนาใน sandbox ว่าวิธีการนี้ควรจะใช้ได้ แต่ฉันไม่แน่ใจทั้งหมดว่ามันอยู่กับถ้อยคำใหม่ของกฎดังนั้น @Lilac แจ้งให้เราทราบหากคุณคิดว่านี่เป็นการละเมิดกฎ

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

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

Ungolfed:

s = StringSplit;
l = ToExpression[#~s~","] &@s@InputString[];
RegionPlot[
 Or @@ (Norm@{x - #, y - #2} < #3 & @@@ l), 
 {x, m = Min@(k = {{##} - #3, {##} + #3} & @@@ l), M = Max@k},
 {y, m, M}
]

1
ImplicitRegionค้นหาค่า x และ y ที่เหมาะสมสำหรับการพล็อตโดยอัตโนมัติ 122 chars:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
DavidC

@DavidCarraher แต่น่าเสียดายที่มันบิดเบือนอัตราส่วนภาพของภาพ (ดีใจที่ได้รู้จักฟังก์ชันของภูมิภาคเหล่านั้น - รวมถึงฟังก์ชั่นที่คุณใช้ - ฉันเห็นมาRegionPlotแล้ว)
Martin Ender

คุณอาจสังเกตเห็นแล้วว่า,AspectRatio-> 1จะนำรหัสกลับไปที่ 149 ไบต์ตรงที่ตอนนี้
DavidC

2
เป็นฉันหรือรูปภาพนี้ดูเหมือนว่า Marvin the Paranoid Android หรือไม่
paqogomez

16

Python 3.3 ( 183 177 164 160 ไบต์)

B=list(map(eval,input().split()))
print("".join(" ## "[sum(any(r*r>(x-d%80/4+10)**2+(y+d//80/4-10)**2for
x,y,r in B)for d in[i,i+1,i+80])]for i in range(6400)))

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

เดิม:

           ########
          ##       #
         ##         #
     #####          #
    ##   #          #
   ##               #
  ##                #
 ##                 #
 #                  #
 #                 ##
  #               ##
  #       ##      #
   #      # #    ##
   #      #  #####
   #      #
    #    ##
     #  ##
      ###

อื่น ๆ :

    ########
  ###       ##
 ##           #
 #            #
##             #
#              #
#              #
#              #
#              #
#               ##
#                 #
 #                 ##
 #                   ######
  #                        #
   ##      ###             #
     #    ## #             #
     #    #  #             #
      #  ## ##             #
       ###  #             ##
            #       #######
            #      ##
            #      #
             #    ##
              #####

หลุม:

                              ############
                            ###           ##
                          ###               ##
                         ##                   #
                  ########                     #######
                ###                                   ##
              ###                                       ##
             ##                                           #
            ##                                             #
           ##                                               #
          ##                                                 #
         ##                                                   #
        ##                                                     #
       ##                                                       #
      ##                                                         #
      #                                                          #
     ##                                                           #
     #                                                            #
    ##                                                             #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
   ##                                                               #
  ##                                                                 #
  #                                                                  #
 ##                                                                   #
 #                                                                    #
##                                                                     #
#                                 ####                                 #
#                                ##   #                                #
#                               ##     #                               #
#                              ##       #                              #
#                              #        #                              #
#                              #        #                              #
#                               #      ##                              #
#                                #    ##                               #
#                                 #  ##                                #
#                                  ###                                 #
 #                                                                    ##
 #                                                                    #
  #                                                                  ##
  #                                                                  #
   #                                                                ##
    #                                                              ##
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
    #                                                              #
     #                                                            ##
     #                                                            #
      #                                                          ##
      #                                                          #
       #                                                        ##
        #                                                      ##
         #                                                    ##
          #                                                  ##
           #                                                ##
            #                                              ##
             #                                            ##
              #                                          ##
               ##                                      ###
                 ##                                  ###
                   #######                    ########
                          #                  ##
                           ##              ###
                             ##          ###
                               ###########

1
ฉันรักที่นี่เป็นวิธีแก้ปัญหาศิลปะ ASCII เดียว
vmrob

ไม่มีการนำเข้า ... ประทับใจ!
Richard Green

15

Python - 253 249 215 199

นี่คือโฆษณาสำหรับห้องสมุดรูปร่างดีที่มีการดำเนินการทางเรขาคณิตทำให้การแก้ปัญหาตรงไปตรงมาโดยการวาดโครงร่างของการรวมกันของวงกลมที่ทับซ้อนกัน (= คะแนนบัฟเฟอร์):

from pylab import*
from shapely.geometry import*
c=Point()
for s in raw_input().split():
 x,y,r=eval(s)
 c=c.union(Point(x,y).buffer(r))
plot(*c.exterior.xy)
for i in c.interiors:
 plot(*i.xy)
show()

เอาท์พุท:

สามเมฆ

แก้ไข (s):

  • 249: ถูกแทนที่sys.argv[1:]โดยraw_input().split()บันทึกimport sys
  • 215: นำความk={'color':'k'}หรูหราออกไปแทนที่savefigด้วยshow
  • 199: ถูกแทนที่map(float,s.split(','))ด้วยeval(s)

11

Python - 535

import math as m
import matplotlib.pyplot as l
c = "3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8"
a = [[float(y) for y in x.split(",")] for x in c.split(" ")]
for a2 in a:
    for x in xrange(0,200):
        q=x*m.pi/100.0
        p=(a2[0]+m.sin(q)*a2[2], a2[1]+m.cos(q)*a2[2])
        cc = []
        for z in a:            
            if z != a2:               
                if ((z[0] - p[0]) ** 2 + (z[1] - p[1]) ** 2 ) < (z[2] ** 2) :
                    cc.append(z)
        if not cc: 
            l.scatter(p[0],p[1])
l.show()

2
สิ่งนี้มีความเป็นไปได้สูงมากที่จะถูกตีลงไปอีกเช่นโดยfrom math import*การลบช่องว่างออกโดยใช้ชื่อตัวแปรหนึ่งตัวอักษรเท่านั้นโดยใช้ความเข้าใจในรายการ (เช่นcc=[z for z in a if z!=a2 and (z[0]…)]) ดูเคล็ดลับสำหรับการเล่นกอล์ฟใน Pythonด้วย
Wrzlprmft

a2คุณสามารถบันทึกตัวอักษรบางตัวโดยใช้หนึ่งตัวอักษรชื่อตัวแปรแทน
ProgramFOX

ขอบคุณ wrzl ... ฉันอาจจะเริ่มเล่นกอล์ฟในคืนนี้ (สิ่งอื่น ๆ ที่จะทำในขณะนี้ แต่ต้องการที่จะนำสัดส่วนการถือหุ้นในพื้นดิน)
ริชาร์ดกรีน

1
ใช่ @ProgramFOX ... นี้เป็นรุ่นที่ทำงานและที่ฉันสามารถแก้ปัญหา .. จะได้รับมันคืนนี้สั้น ...
ริชาร์ดกรีน

3
@ เจมส์วิลเลียมส์ถ้าคุณต้องการที่จะกระบอง ... โปรดทำ .. ฉันไม่ได้ป้องกันรหัส !! รู้สึกอิสระที่จะเพิ่มมันเป็นรายการของคุณเอง (ตราบใดที่คุณให้เครดิตต้นฉบับ!)
ริชาร์ดกรีน

9

Python - 296 249 231 223 212

from pylab import*
a=map(eval,raw_input().split())
for x,y,r in a:
 for i in range(200):
  q=i*pi/100;p=x+r*sin(q);t=y+r*cos(q);[z for z in a if z!=(x,y,r)and(z[0]-p)**2+(z[1]-t)**2<z[2]**2]or scatter(p,t)
show()

เครดิตไปที่@ richard-green (ได้รับสิทธิ์) สำหรับวิธีการแก้ปัญหาดั้งเดิมฉันเพิ่งจะกระเพื่อมลงเล็กน้อย


7
ดีที่ได้รับการโหวตของฉัน ...
ริชาร์ดกรีน

1
คุณอาจจะสามารถที่จะบันทึกบางมากขึ้นโดยการนำเข้าแทนpylab matplotlib.pyplot
ojdo

@odjo บนมือถือปัจจุบันถ้าฉันใช้ฉันfrom pylab import *จะยังสามารถโทรshow()และscatter()ไม่มีการอ้างอิงได้หรือไม่?
James Williams

1
@JamesWilliams ยืนยันแล้ว! Pylab เป็นผู้สร้างเนมสเปซรวมถึงฟังก์ชั่นที่คล้ายกับ MATLAB :-)
ojdo

คุณสามารถย่อให้สั้นลงได้โดยใช้[eval(i)for i in raw_input().split()]การevalเปลี่ยนของ python 1,2,3ให้เป็น tuple คุณยังจะแน่นอนต้องเปลี่ยนไป[x,y,r] (x,y,r)
KSab

7

JavaScript (E6) + HTML 322

JSFiddle

แต่ละวงกลมจะถูกแบ่งย่อยในส่วนโค้งเล็ก ๆ ประมาณ 100 และส่วนโค้งแต่ละอันจะถูกวาดถ้าจุดกึ่งกลางไม่อยู่ในวงกลมอื่น ๆ

<canvas id='c'/>
<script>
t=c.getContext("2d"),z=99,c.width=c.height=400,
l=prompt().split(' ').map(c=>c.split(',').map(v=>40*v)),
l.map(c=>{
  for(i=z;--i+z;)
    s=4/z,r=c[2],x=c[0]+r*Math.cos(a=i*s),y=c[1]+r*Math.sin(a),
    t.beginPath(),
    l.some(q=>c!=q&(d=x-q[0],e=y-q[1],d*d+e*e<q[2]*q[2]))||t.arc(z+c[0],z+c[1],r,a-s,a+s),
    t.stroke()
})
</script>

7

Python 274 ไบต์

การดำเนินการนี้จะรับอินพุตจาก stdin และตรวจสอบทุกจุดบนหน้าจอโดยการวาดพิกเซลทีละภาพ ไม่ค่อยมีประสิทธิภาพเท่าไหร่ แต่ก็เป็นไปตามกฎทั้งหมด

c=[eval(s)for s in raw_input().split()]
import pygame
S=pygame.display.set_mode((500,500))
S.fill([255]*3)
for p in((x,y)for x in range(500)for y in range(500)if 0<min((((x-250)/25.-a)**2+((y-250)/25.-b)**2)**.5-r for(a,b,r)in c)<.1):S.set_at(p,[0]*3)
pygame.display.update()

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

alive = True
while alive:
    pygame.display.update()
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            alive = False

ภาพตัวอย่าง:

1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7 ป้อนคำอธิบายรูปภาพที่นี่

0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4 ป้อนคำอธิบายรูปภาพที่นี่


3
@ edc65 ฉันไม่แน่ใจว่าคุณหมายถึงอะไร สิ่งที่แม่นยำคือเติมพิกเซลใด ๆ ที่อยู่ระหว่าง 0 ถึง 0.1 หน่วย (ระหว่าง 0 ถึง 2.5 พิกเซล) นอกวงกลม คุณกำลังบอกว่าควรหารูปโค้งที่ถูกต้องในเชิงคณิตศาสตร์หรือไม่? จากการอ่านคำถามดูเหมือนว่ามันไม่ได้เป็นข้อ จำกัด สำหรับฉัน
KSab

4

Perl - 430

@e=map{[map{int($_*32)}split',']}(split' ',<>);for$g(@e){for(0..3){($a[$_]>($q=$$g[$_&1]+(($_>>1)*2-1)*$$g[2]))^($_>>1)&&($a[$_]=$q)}}for(2,3){$a[$_]-=$a[$_-2]-1}for(@e){($x,$y,$r)=@$_;$x-=$a[0];$y-=$a[1];for$k($x-$r..$x+$r){for$l($y-$r..$y+$r){$i=(int(sqrt(($x-$k)**2+($y-$l)**2)+0.5)<=>$r)-1;$f[$l][$k]=($j=$f[$l][$k])<-1||$i<-1?-2:$i||$j;}}}print"P1
$a[2] $a[3]
".join("
",map{join' ',map{$_+1?0:1}@$_,('0')x($a[2]-@$_)}@f)."
"

เขียนไฟล์ pbm ไปที่ stdout

ภาพทดสอบ (แปลงเป็น png):

ภาพทดสอบที่สอง (แปลงเป็น png)

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