Der kleine Chandler ist traurig. Zeichne ihm eine Wolke, um ihn aufzuheitern.
Hinweis: Das Zeichnen einer Wolke wird ihn nicht wirklich aufheitern.
Ein Kreis kann als 3-Tupel definiert werden, (x,y,r)
wobei x
die x-Position des Kreises auf einer kartesischen Ebene, y
die y-Position des Kreises auf einer kartesischen Ebene und r
der Radius des Kreises ist. x
und y
kann negativ sein. r
ist immer positiv. Die Eingabe ist eine Liste von Kreisen in Form von durch Leerzeichen getrennten 3-Tupeln. Zum Beispiel:
3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8
Das 3,1,1
bedeutet "Ein Kreis mit Mittelpunkt bei 3,1
mit 1 Radius. 3,2,1.5
" Ein Kreis mit Mittelpunkt bei 3,2
mit 1,5 Radius.
Wenn wir alle diese Kreise der Eingabe in einem Diagramm zeichnen, sieht es so aus (ich habe nur zur Verdeutlichung Gitterlinien und Beschriftungen eingefügt; diese sind nicht erforderlich):
Beachten Sie, wie alle Kreise zusammenhängend sind . Das heißt, sie sind alle so überlappt, dass sie eine große Gruppe bilden, ohne dass kleine Gruppen von Kreisen vom Rest getrennt sind. Die Eingabe ist garantiert kohäsiv.
Nehmen wir nun an, wir zeichnen eine Linie, die um die von diesen Kreisen gebildete "Grenze" verläuft, ohne eine der anderen Linien. Es wäre, als würde man den Rand der Silhouette zeichnen, die von allen Kreisen gebildet wird. Die resultierende Wolke würde ungefähr so aussehen:
Diese Wolke wurde also gebildet, indem nur die Bögen der Kreise in der Eingabe gezeichnet wurden, die eine Grenze bilden, was zu einer einzigen Form führte. Mit anderen Worten, die Wolke wird gebildet, indem nur die Bögen gezeichnet werden, die sich nicht innerhalb eines anderen Kreises befinden. Ihr Programm nimmt Eingaben in der oben erläuterten Form auf und gibt ein Bild aus, das die resultierende Wolke anzeigt. Die Gesamtform der Wolke muss korrekt sein, aber der Maßstab, die Farbe, die Linienstärke und das Aussehen der Scheitelpunkte liegen bei Ihnen. Beachten Sie, dass die Wolke sichtbar sein muss, damit Sie nichts wie "Dieses Programm zeichnet eine weiße Wolke auf einem weißen Hintergrund", "Dieses Programm zeichnet eine Wolke in einem infinitesimal kleinen Maßstab", "Dieses Programm zeichnet eine Wolke mit 0" ziehen können Strichstärke "usw. Beachten Sie außerdem, dass sich die Farbe des Rahmens von der Farbe der Füllung oder des Hintergrunds unterscheiden muss.
Ein anderes Beispiel. Eingang:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7
Ausgabe:
Wenn es ein "Loch" in der Wolke gibt, sollten Sie das Loch auch zeichnen. Eingang:
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
Ausgabe:
Hier ist eine wichtige Regel: Ihr Programm darf nur die Linien zeichnen , die den Rand bilden. Das bedeutet, dass Sie die Kreise NICHT einfach vollständig und dann mit einer weißen Füllung etwas kleiner zeichnen können - da bei dieser Methode immer noch Linien gezeichnet werden, die keinen Rand bilden, werden sie anschließend nur überdeckt. Der Zweck der Regel bestand darin, zu verhindern, dass Implementierungen wie "Kreise zeichnen, dann Kreise mit weißer Füllung erneut zeichnen" oder ähnliches implementiert werden. Es wird erwartet, dass die Antwort tatsächlich berechnet, wo die Dinge gezeichnet werden sollen, bevor sie gezeichnet werden.
Dies ist Codegolf, also gewinnt die kürzeste Anzahl an Zeichen.
quelle
Antworten:
Mathematica
177 126 121119Lösen nach Datenträgerregionen: der Ansatz des Mathematikers
Die Logik ist zu
Dies ist genau der Ansatz, der im Folgenden verfolgt wird. Es wurden die 3 obigen Zahlen erstellt.
Implizite Region # 1 ist die Vereinigung der Kreise. Der implizite Bereich # 2 ist die Vereinigung der in den Kreisen liegenden Scheiben. Ihr Unterschied ist die Grenze.
Lösen nach Festplattenregionen: der Ansatz des Ingenieurs (119 Zeichen)
Im Folgenden wird die Vereinigung der Festplattenregionen herangezogen, diese Region diskretisiert und ihre Grenze ermittelt. Die Punkte im Diagramm markieren die Intervalle des Delaunay-Netzes. Wir zeigen den diskretisierten Bereich unten an, um das Objekt hervorzuheben, das die interessierende Grenze bildet (den Umriss der Wolke).
3,1,1 3,2,1,5 1,2,0,7 0,9,1,2,1,2 1,0,0,8
Die Bereichsgrenze wird diskretisiert.
Lösen durch Erkennen von Kanten: Der Ansatz des Fotografen - 121 Zeichen
Es zeichnet die Datenträger in Schwarz, rastert das Bild, erkennt die Ränder und kehrt Schwarzweiß um.
quelle
RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
s=StringSplit
Innere der Aufforderung? Versuchen Sie, das wieder nach vorne zu schieben. Es sollte immer noch kürzer sein als Ihre aktuelle Version.T-SQL
23523422921217173 BytesDies nutzt räumliche Funktionen in SQL Server 2012+. Wenn es in SSMS (SQL Server Management Studio) ausgeführt wird, wird ein räumlicher Ergebnisbereich erstellt.
Die Eingabe erfolgt von der Variablen @i. Ich könnte es weiter reduzieren, wenn die Eingabe aus einer Tabelle entnommen werden könnte.Da Tabelleneingabe jetzt erlaubt ist.
Ich habe die vorherige Lösung unten gelassen.
Bearbeiten : Entfernen Sie den Streuraum , den Überschuss in und die Unterabfrage
171: Tabellenerstellung durch CTE und @s durch @ ersetzt.
Aufschlüsselung des Dynamic SQL
quelle
'A' has fewer columns than were specified in the column list
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'
. Leider kann ich im Moment nicht testen und SQLfiddle spielt 2012 nicht gut.Mathematica,
175158149 BytesIch erinnere mich an die Diskussion in der Sandbox, dass dieser Ansatz gültig sein sollte, aber ich bin mir nicht ganz sicher, wie er mit dem neuen Wortlaut der Regeln übereinstimmt. Also, @Lilac, lassen Sie mich wissen, wenn Sie glauben, dass dies gegen die Regeln verstößt.
Grundsätzlich erstelle ich eine logische Bedingung, die für alle Punkte innerhalb der Wolke wahr und für alle Punkte außerhalb der Wolke falsch ist. Ich füttere das,
RegionPlot
woraufhin der Bereich aller Punkte, an denen der Ausdruck istTrue
, sowie ein Umriss um ihn herum gerendert wird.Ungolfed:
quelle
ImplicitRegion
Findet automatisch die richtigen x- und y-Werte für das Plotten. 122 Zeichen:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
RegionPlot
habe.),AspectRatio-> 1
der Code auf 149 Byte zurückgesetzt wird, genau dort, wo er jetzt steht.Python 3.3 (
183177164160 Byte)Es erfordert eine 80 Zeichen breite Konsole, von der ich weiß, dass sie die Standardeinstellung in Windows ist. Es funktioniert am besten, wenn Ihre Konsole eine quadratische Schrift hat. Hier einige Auszüge aus einigen Testeingaben.
Original:
Ein weiterer:
Loch:
quelle
Python -
253249215199Dies ist eine Werbung für die großartige, formschöne Bibliothek, deren Geometrieoperationen das Schreiben der Lösung durch Zeichnen der Umrisse der Vereinigung von überlappenden Kreisen (= gepufferten Punkten) vereinfacht haben:
Ausgabe:
Bearbeiten:
sys.argv[1:]
durchraw_input().split()
Speichern von aimport sys
k={'color':'k'}
Luxus entfernt, ersetztsavefig
durchshow
map(float,s.split(','))
durcheval(s)
quelle
Python - 535
quelle
from math import*
indem nicht benötigte Leerzeichen entfernt werden, indem nur einbuchstabige Variablennamen verwendet werden, indem das Listenverständnis verwendet wird (zcc=[z for z in a if z!=a2 and (z[0]…)]
. B. ). Beachten Sie auch die Tipps zum Golfen in Python .a2
.Python -
296249231223212Die ursprüngliche Lösung wurde an @ richard-green (Erlaubnis wurde erteilt) gutgeschrieben. Ich habe sie nur ein wenig heruntergeschraubt.
quelle
pylab
stattmatplotlib.pyplot
.from pylab import *
würde, könnte ich immer noch anrufenshow()
undscatter()
ohne Referenzen?[eval(i)for i in raw_input().split()]
aus Pythonseval
Turns1,2,3
ein Tupel machen. Sie werden auch müssen natürlich die Änderung[x,y,r]
ein zu(x,y,r)
.JavaScript (E6) + HTML 322
JSFiddle
Jeder Kreis ist in ungefähr 100 kleine Bögen unterteilt, und jeder Bogen wird gezeichnet, wenn sein Mittelpunkt nicht in einem der anderen Kreise liegt.
quelle
Python 274 Bytes
Dies nimmt die Eingabe von stdin entgegen und überprüft jeden Punkt auf der Anzeige, wobei die Pixel nacheinander gezeichnet werden. Nicht gerade effizient, aber es folgt allen Regeln.
Beachten Sie, dass die Pygame-Anzeige beendet wird, sobald die Zeichnung fertig ist. Ich war mir nicht sicher, ob ich sie als Teil meiner Antwort einschließen sollte, aber um sie anzuzeigen, können Sie entweder
raw_input
am Ende einwerfen oder eine kleine Schleife hinzufügen, wenn Sie möchten möchte das Betriebssystem daran hindern, sich darüber zu beschweren, dass es nicht reagiert, und so weiter:Beispielbilder:
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
quelle
Perl - 430
Schreibt eine pbm-Datei nach stdout.
Testbild (in PNG konvertiert):
quelle