Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl N aufnimmt und dieses Muster von Kreisen wiederherstellt, die so skaliert sind, dass sie zu einem N × N-Pixelbild passen:
Dieses Bild ist ein gültiges Ausgabebeispiel für N = 946.
Falls es nicht klar ist, haben alle kleinen hellblauen Kreise den gleichen Radius und werden auf die gleiche Weise in den vier dunkelblauen Kreisen positioniert. Die dunkelblauen Kreise haben den doppelten Radius und sind in ähnlicher Weise in dem großen hellblauen Kreis positioniert.
Anstelle der beiden Blautöne können zwei beliebige visuell unterschiedliche Farben verwendet werden.
Das Hintergrundquadrat muss farbig sein.
Anti-Aliasing ist optional.
Speichern Sie das Bild in einer Datei, zeigen Sie es an oder leiten Sie die Rohdaten an stdout.
Jedes gängige Bilddateiformat ist zulässig.
Der kürzeste Code in Bytes gewinnt.
Brownie-Punkte, wenn Sie die rekursiven Aspekte dieses Kreismuster auf weitere Ebenen erweitern. (Unterscheiden Sie dies von Ihrem Herausforderungseintrag.)
quelle
Antworten:
CJam, 83 Bytes
Probieren Sie es online aus
CJam bietet keine dedizierten Bildausgabefunktionen. Mein Code generiert ein Bild in PBM ASCII. Zum Posten habe ich dieses Bild mit GIMP in ein PNG konvertiert.
Beachten Sie, dass keine Kreiszeichnungsfunktion oder ähnliches verwendet wurde. Das Bild wird pixelweise berechnet.
Höhere Grade der Unterteilung können leicht erzeugt werden, indem die Konstante
3
um die Mitte des Codes erhöht wird .Die Bilder der Grade 4 und 5 sehen folgendermaßen aus:
Die Gesamtsequenz des Codes ist:
Erläuterung:
quelle
Python 2 + PIL, 262 Bytes
Dieser Ansatz bestimmt die Farbe jeder einzelnen Pixelkoordinate unter Verwendung einer rekursiven Funktion
c
.c(x,y,0)
rendert einen Kreis;c(x,y,1)
erzeugt einen Kreis mit vier ausgeschnittenen Kreisen;c(x,y,2)
Rendert das Bild im OP. Alles was größer als 2 ist, bringt mir Brownie-Punkte.Nicht Golf Version:
Bonus extra-rekursives Bild:
quelle
.save("p.png")
nur zu verwenden.show()
PostScript, 335 Bytes.
PostScript ist nicht nur ein Grafikdateiformat mit Vektor- und Bitmap-Funktionen, sondern eine objektbasierte Programmiersprache für Turing-complete. Der obige Code ist eine recht einfache Implementierung rekursiver Funktionen. Alle PostScript-Operatoren sind Funktionen, und es ist üblich, sie neu zu definieren, um den Code zu komprimieren. Beachten Sie, dass PostScript die umgekehrte polnische Notation verwendet (auch bekannt als Postfix-Notation) verwendet.
PostScript-Interpreter lesen im Allgemeinen Metadaten (wie Seitengröße und Titel) aus speziellen Kommentaren am Anfang der Datei. Natürlich habe ich alle wichtigen PostScript-Signaturkommentare
%!
aus meinem Eintrag entfernt, aber sie sollten in jedem Standard-PostScript-Interpreter, z. B. GhostScript oder Okular, weiterhin in Ordnung sein. Es kann auch das betrachtet wird unter Verwendung von Display - Dienstprogramm , das mit ImageMagick / GraphicsMagick kommt.Beachten Sie, dass die Datei in einer neuen Zeile enden sollte (die ich in meine Byteanzahl aufgenommen habe), damit der Interpreter nicht verärgert wird.
Der Größenparameter
N
für diesen Code ist 512; Es wird durch 2 geteilt und zweimal dupliziert, um die Parameter für den ersten Aufruf der rekursiven Funktion zu erstellenf
. Die Rekursion Tiefe beträgt 2, die unmittelbar vor dem gegeben wirdf
in512 2 div dup dup 2 f
. Um die Größe klein zu halten, erfolgt die Ausgabe in Schwarzweiß. Obwohl Sie eine angemessene nicht negative ganzzahlige Rekursionstiefe festlegen können, sieht diese Version nur mit gleichmäßigen Tiefen gut aus.Dieses Bild ist eine Vektorgrafik und kann daher in jeder Auflösung ohne Pixelung angezeigt werden, abhängig von der Qualität und den Einstellungen des verwendeten PostScript-Interpreters / Druckers. (FWIW, PostScript verwendet kubische Bézier-Kurven zum Zeichnen von Kreisbögen, wobei genügend Splines verwendet werden, um sicherzustellen, dass der Fehler immer weniger als ein Pixel im Gerätebereich beträgt.) Um es mit dem ImageMagick- Display in angemessen hoher Qualität anzuzeigen , können Sie Folgendes tun:
Die gleichen Parameter eignen sich auch, wenn Sie ImageMagicks
convert
zum Konvertieren in ein anderes Format verwenden möchten . Hier ist zum Beispiel eine 640x640-Version des obigen PostScript-Codes, der in PNG konvertiert wurde:Hier ist eine etwas größere Version, die RGB-Farben und ungerade Rekursionstiefen verarbeitet:
Außerdem können Sie den Größenparameter
N
und die Rekursionstiefed
im oberen Bereich des Skripts festlegen .Schließlich ist hier die besser lesbare Form des Codes. (Leider Hervorhebung der Syntax hier verwendet für Postscript eine lässt viel zu wünschen übrig, aber ich denke , es ist besser als nichts ...). Smart PostScript-Interpreter lesen die Seitengeometrie aus dem
%%BoundingBox:
speziellen Kommentar.Und hier ist die Ausgabe von depth == 4 im PNG-Format, die wiederum mit convert erstellt (und mit optipng optimiert ) wurde:
quelle
Python 2 + PIL, 361 Bytes
Speichert das Bild in Schwarzweiß in der Datei
c.png
:Ich generiere im Grunde genommen einen der halbgroßen Kreise im Bild
J
. Ich benutze mich dann als Maske, um die Form auf das Bild zu malenI
, das den Hauptkreis hat.Es könnte mit
I.show()
am Ende anstatt gekürzt werdenI.save("c.png")
, aber ich habe es in Python 2 nicht zum Laufen gebracht. Wenn jemand bestätigen kann, dass es in Python 2 funktioniert, werde ich das ändern.Das folgende Programm erzeugt das Bild wie in der Frage (419 Bytes):
quelle
save
.SVG (1249 Zeichen)
Ja, viele Charaktere. Aber es ist statisch und rendert in jeder Größe, so dass es einen Bonus gibt.
Sichtbares Snippet:
quelle
0
Gleitkommakonstanten weglassen ? Zum Beispiel ersetzen0.4
durch.4
? In den meisten Sprachen ist das gültig. Und ein sehr kurzer Blick auf die SVG-Spezifikation legt nahe, dass sie wahrscheinlich auch funktionieren sollte.Mathematica
336359 BytesDie Hauptgrafikobjekte sind Bereiche, die durch logische Kombinationen von Gleichungen definiert werden.
quelle
Java, 550
Meist nur mit JavaFX experimentieren.
Bildschirmfoto:
Für Brownie-Punkte ändern Sie die
2
im Code (d(n,2,0,0)
) eine andere Zahl.Alte Version, 810
Es hinterlässt einige unerwünschte Kanten, wie Sie in diesem Screenshot sehen können .
quelle
JavaScript (ES6), 279
Erstellen Sie rekursiv Leinwände und fügen Sie die untergeordnete Zeichenfläche viermal zur übergeordneten Zeichenfläche hinzu. In der unteren Ebene ist die Leinwand ein einzelner Kreis. Diese Zeichenfläche wird viermal auf eine übergeordnete Zeichenfläche gestempelt, und diese Zeichenfläche wird dann viermal auf die endgültige Master-Zeichenfläche gestempelt.
Lauffähige Demo:
Code-Snippet anzeigen
Mit Leerzeichen, Kommentaren und leicht ungolfed:
Dies kann leicht zu tieferen Rekursionsebenen führen, indem der Anfangswert
o-2
oder ein beliebiger größerero-z
Wert geändert wird.Beachten Sie, dass diese Übermittlung aufgrund der Verwendung von ES6-Funktionen und der Inkonsistenz in der Canvas-API für
fill
undclip
Argumente nur in Firefox ausgeführt wird .quelle