Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą N i odtwarza ten wzór kół skalowanych w celu dopasowania do obrazu pikselowego N × N:
Ten obraz jest poprawnym przykładem wyjścia dla N = 946.
W przypadku, gdy nie jest jasne, wszystkie małe jasnoniebieskie koła mają ten sam promień i są umieszczone w czterech ciemnoniebieskich okręgach w ten sam sposób. Ciemnoniebieskie kółka mają podwójny promień i są podobnie ustawione w dużym jasnoniebieskim kółku.
Zamiast dwóch odcieni niebieskiego można zastosować dowolne dwa odrębne wizualnie kolory.
Kwadrat w tle musi być pokolorowany.
Wygładzanie jest opcjonalne.
Zapisz obraz do pliku, wyświetl go lub potokuj surowe dane obrazu na standardowe wyjście.
Dowolny wspólny format pliku obrazu jest dozwolony.
Najkrótszy kod w bajtach wygrywa.
Punkty Brownie, jeśli rozszerzysz rekurencyjne aspekty tego wzoru okręgu na kolejne poziomy. (Należy to odróżnić od wpisu dotyczącego wyzwania).
źródło
Odpowiedzi:
CJam, 83 bajty
Wypróbuj online
CJam nie ma dedykowanej funkcji wyjściowej obrazu. Mój kod generuje obraz w PBM ASCII. Aby opublikować, przekonwertowałem ten obraz do formatu PNG za pomocą GIMP.
Zauważ, że nie korzystała z funkcji rysowania okręgów ani nic podobnego. Obraz jest obliczany piksel po pikselu.
Wyższe stopnie podziału można łatwo utworzyć, zwiększając stałą
3
wokół środka kodu.Obrazy stopnia 4 i 5 wyglądają tak:
Ogólna sekwencja kodu to:
Wyjaśnienie:
źródło
Python 2 + PIL, 262 bajty
To podejście określa kolor każdej współrzędnej piksela za pomocą funkcji rekurencyjnej
c
.c(x,y,0)
renderuje okrąg;c(x,y,1)
renderuje okrąg z wyciętymi czterema okręgami;c(x,y,2)
renderuje obraz w OP. Wszystko większe niż 2 zarabia mi punkty brownie.Wersja bez gry w golfa:
Dodatkowy obraz rekurencyjny:
źródło
.save("p.png")
prostu użyć.show()
PostScript, 335 bajtów.
PostScript to nie tylko format plików graficznych z funkcjami wektorowymi i bitmapowymi, to w rzeczywistości oparty na obiektach język programowania Turing-complete. Powyższy kod jest dość prostą implementacją funkcji rekurencyjnej. Wszystkie operatory PostScript są funkcjami i ich redefiniowanie w celu zagęszczenia kodu jest powszechne. Zauważ, że PostScript używa odwrotnej notacji polskiej (inaczej notacji postfiksowej).
Tłumacze PostScript zazwyczaj czytają metadane (takie jak rozmiar strony i tytuł) ze specjalnych komentarzy na początku pliku; oczywiście
%!
z mojego wpisu usunąłem wszystkie istotne komentarze podpisu PostScript , ale powinny one być wyświetlane poprawnie w każdym standardowym interpretera PostScript, np. GhostScript lub Okular. Można go również wyświetlić za pomocą narzędzia wyświetlania dostarczanego z ImageMagick / GraphicsMagick.Zauważ, że plik powinien kończyć się nowym wierszem (który zawarłem w mojej liczbie bajtów), w przeciwnym razie tłumacz może się zdenerwować.
Parametr rozmiaru
N
dla tego kodu to 512; jest podzielony przez 2 i dwukrotnie zduplikowany, aby utworzyć parametry dla początkowego wywołania funkcji rekurencyjnejf
. Głębokość rekursji wynosi 2, co jest podane tuż przedf
in512 2 div dup dup 2 f
. Aby zachować mały rozmiar, wydruk jest czarno-biały. Chociaż można ustawić dowolną rozsądną nieujemną głębokość rekurencji liczb całkowitych, ta wersja wygląda dobrze tylko z równymi głębokościami.Ten obraz jest grafiką wektorową, więc może być wyświetlany w dowolnej rozdzielczości bez pikselizacji, w zależności od jakości i ustawień używanego interpretera / drukarki PostScript. (FWIW, PostScript używa krzywych sześciennych Béziera do rysowania łuków kołowych, z wystarczającą liczbą splajnów, aby zapewnić, że błąd jest zawsze mniejszy niż jeden piksel w przestrzeni urządzenia). Aby wyświetlić go za pomocą wyświetlacza ImageMagick w dość wysokiej jakości, możesz:
te same parametry są również dobre, jeśli chcesz użyć ImageMagick's
convert
do konwersji na inny format. Na przykład, oto 640x640 wersja powyższego kodu PostScript przekonwertowanego na PNG:Oto nieco większa wersja, która obsługuje kolory RGB i nieparzyste głębokości rekurencji:
Umożliwia także ustawienie parametru rozmiaru
N
i głębokości rekurencjid
w górnej części skryptu.Wreszcie, oto bardziej czytelna forma kodu. (Niestety, podświetlanie składni użyte tutaj dla PostScript pozostawia wiele do życzenia, ale myślę, że jest lepsze niż nic ...). Inteligentne interpretery PostScript odczytują geometrię strony ze
%%BoundingBox:
specjalnego komentarza.A oto wynik głębokości == 4 w formacie PNG, ponownie utworzony za pomocą konwersji (i zoptymalizowany za pomocą optipng ):
źródło
Python 2 + PIL, 361 bajtów
Zapisuje obraz w czerni i bieli do pliku
c.png
:Zasadniczo generuję jedno z kół o połowie wielkości na obrazie
J
. Następnie używam siebie jako maski do namalowania kształtu na obrazieI
, który ma główny okrąg.Można go skrócić, używając
I.show()
na końcu zamiastI.save("c.png")
, ale nie uruchomiłem go w Pythonie 2. Jeśli ktoś może potwierdzić, że działa w Pythonie 2, zmienię to.Poniższy program generuje obraz jak w pytaniu (419 bajtów):
źródło
save
.SVG (1249 znaków)
Tak, wiele postaci. Ale jest statyczny i renderuje w dowolnym rozmiarze, więc daje to pewną premię.
Widoczny fragment:
źródło
0
w stałych zmiennoprzecinkowych? Na przykład zastąp0.4
przez.4
? W większości języków jest to poprawne. Bardzo szybkie spojrzenie na specyfikację SVG sugeruje, że prawdopodobnie powinna również działać.Mathematica
336359 bajtówGłównymi obiektami graficznymi są regiony zdefiniowane za pomocą logicznych kombinacji równań.
źródło
Java, 550
Głównie po prostu eksperymentuje z JavaFX.
Zrzut ekranu:
W przypadku punktów brownie zmień
2
kod (d(n,2,0,0)
) na inną liczbę.Stara wersja, 810
Pozostawia pewne niepożądane krawędzie, jak widać na tym zrzucie ekranu .
źródło
JavaScript (ES6), 279
Rekurencyjnie twórz płótna i dodaj płótno podrzędne cztery razy do płótna nadrzędnego. W dolnej warstwie płótno jest pojedynczym okręgiem; że płótno zostanie wybite cztery razy na płótnie macierzystej, a następnie , że płótno jest wybity cztery razy na końcowym głównego płótnie.
Uruchomienie demo:
Pokaż fragment kodu
Z białymi znakami, komentarzami i lekko nie golfowym:
Może to łatwo wytworzyć głębsze warstwy rekurencji, zmieniając wartość początkową
o-2
lub dowolną większąo-z
.Zauważ, że to będzie działać tylko w poddaniu Firefox, dzięki wykorzystaniu ES6 funkcje i niespójność w API na płótnie
fill
iclip
argumenty.źródło