Chaos Gra jest prosta metoda do generowania fraktali. Biorąc pod uwagę punkt początkowy, stosunek długości r oraz zestaw punktów 2D, wielokrotnie wykonaj następujące czynności:
- Z zestawu punktów wybierz jeden losowo (jednolicie).
- Średnie tego punktu, a ostatni punkt sporządzone (lub punktem wyjścia) za pomocą R i 1 - R jako obciążników (czyli R = 0 oznacza, że otrzymasz punkt wyjścia, r = 1 oznacza, że otrzymasz punkt losowy i R = 0,5 oznacza, że dostać punkt w połowie drogi.)
- Narysuj wynikowy punkt.
Na przykład, jeśli wybrałeś wierzchołki równobocznego trójkąta ir = 0,5 , wykreślone punkty odwzorowałyby trójkąt Sierpińskiego:
Musisz napisać program lub funkcję, która „gra” w grę chaosu i tworzy fraktal.
Wkład
Możesz napisać program lub funkcję i przyjmować następujące dane wejściowe za pomocą ARGV, STDIN lub argumentu funkcji:
- Liczba punktów do wykreślenia.
- Współrzędna początkowa (która również musi zostać narysowana!).
- Średnia waga rw przedziale [0,1] .
- Lista punktów do wyboru.
Wydajność
Możesz renderować na ekranie lub zapisać plik obrazu. Jeśli wynik jest zrasteryzowany, musi on wynosić co najmniej 600 pikseli z każdej strony, wszystkie punkty muszą znajdować się na obszarze roboczym, a co najmniej 75% zakresu obrazu w poziomie i pionie musi być użyte dla punktów (aby tego uniknąć odpowiada pojedynczymi czarnymi pikselami, mówiąc „jest naprawdę bardzo pomniejszony”). X i y Oś musi być w tej samej skali (to jest od linii (0,0) do (1,1), muszą być pod kątem 45 stopni), a każdy punkt na wykresie w grze chaosu przedstawia się jako jeden piksel (jeśli twoja metoda kreślenia antyaliasuje punkt, może on zostać rozłożony na 2x2 piksele).
Kolory są twoim wyborem, ale potrzebujesz co najmniej dwóch rozróżnialnych kolorów: jednego dla tła i jednego dla kropek wykreślonych podczas gry chaosu. Możesz, ale nie musisz kreślić punktów wejściowych.
Proszę obejmują trzy interesującym przykładem wyjścia w swojej odpowiedzi.
Punktacja
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Edycja: Nie musisz już rysować punktów wejściowych, ponieważ i tak nie są one widoczne jako pojedyncze piksele.
źródło
Odpowiedzi:
Mathematica, 89
Jak to działa
W Mathematica
Graphics[]
funkcja tworzy skalowalną grafikę, renderujesz ją do dowolnego rozmiaru, po prostu przeciągając rogi obrazu. W rzeczywistości początkowy rozmiar całej wyświetlanej grafiki to ustawienie „.ini”, które można ustawić na 600 lub dowolną inną wartość. Dlatego nie ma potrzeby robienia niczego specjalnego dla wymagań 600 x 600.AbsolutePointSize[]
Rzeczą określa, że rozmiar punkt nie zostanie zmodyfikowany poprzez zwiększenie rozmiaru obrazu.Podstawowym konstruktem jest
lub w pseudo-kodzie bez golfa:
Rekurencyjnie buduje listę zaczynając od
(start point)
i stosując funkcję (wektorową) w pierwszym argumencie do każdego kolejnego punktu, w końcu zwracając listę wszystkich obliczonych punktów do wykreślenia przezPoint[]
Niektóre przykłady samoreplikacji:
źródło
Instructions for testing this answer without Mathematica installed:
1) Pobierz to z pastebin i zapisz jako * .CDF 2) Pobierz i zainstaluj darmowe środowisko CDF z Wolfram Research pod (nie mały plik). Cieszyć się. Powiedz mi, czy to działa!#r
, abyr#
uciec bez spacji lub*
pomiędzy nimi.#
ir
.#key
. Jestem pewien, że się przyda. :)Java: 246
253447W funkcji
m()
:Podziały linii (w programie pokazujące użycie):
Rysowanie punktów wejściowych zostało usunięte z wymagań (tak 80 bajtów!). Nadal są wyświetlane na poniższych zrzutach ekranu, ale nie zostaną wyświetlone, jeśli je uruchomisz. Zobacz historię zmian, jeśli jesteś zainteresowany.
Dane wejściowe są podane jako tablica liczb zmiennoprzecinkowych. Pierwsza to iteracje, kolejne dwie zaczynają się
x y
. Po czwarter
, a na końcu jest lista współrzędnych, wx1 y1 x2 y2 ...
modzie.Gwiazda Ninja
Krzyż
Oktochainy
źródło
show
jest przestarzałeshow()
jest przestarzały, ale nadal działa. Kiedy mówisz „nie działa”, co to znaczy? Jeśli nie masz Javy 8, trzeba dodaćfinal
doString[]a
main przynajmniej.JavaScript (E6) + HTML 173
176 193Edycja: duży krój, dzięki Williamowi Barbosie
Edycja: 3 bajty mniej, dzięki DocMax
173 bajty zliczające funkcję i element canvas potrzebne do wyświetlenia wyniku.
Testuj jako plik HTML i otwórz w FireFox.
JSFiddle
źródło
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
ma 176 bajtów długości, nie rozumiem twojego obliczeniafor
połączenia:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Pobiera dane wejściowe jako argumenty funkcji do a, zapisuje wynik na standardowe wyjście jako plik pgm.
n
to iteracje,s
to punkt początkowy,r
to r, iz
to lista punktów wejściowych.Edycja: Nie rysuje już punktów wejściowych na szaro.
Ciekawe produkty:
źródło
p=[255]*360000
mogą zostać przekazane do funkcji jako parametry opcjonalne; ciało pętli for może przejść do tej samej linii, jeśli nie ma przepływu sterującego; można golić parens z[1]*(n+1)
jak[1]*-~n
; ponieważ nie używaszi
zewnętrznej pętli for, krócej jest uruchomić kodn
razy asexec"code;"*n
); Myślę, że parenyfor i in(0,1)
można usunąć.SuperCollider - 106
SuperCollider to język do generowania muzyki, ale potrafi tworzyć grafiki w mgnieniu oka.
Użyłem niejasnych skrótów składniowych, aby zaoszczędzić kilka bajtów - bardziej czytelna i bardziej wydajna pamięć jest wersja
na 109 znakach.
Podobnie jak w przykładzie Mathematica, musisz ręcznie zmienić rozmiar okna, aby uzyskać 600 x 600 pikseli. Musisz wtedy poczekać na ponowne losowanie.
Generuje to podstawowy trójkąt Sierpińskiego (nie pokazano, ponieważ widziałeś go wcześniej)
To coś w rodzaju pięciokąta Sierpińskiego:
Ta sama rzecz z 6 punktami pozostawia odwrócony płatek śniegu Koch na środku:
Na koniec, oto riff na piramidach 3D z odpowiedzi asa. (Pamiętaj, że dwukrotnie użyłem jednego z punktów, aby uzyskać efekt cieniowania).
źródło
Python,
189183175Edycja: naprawiono odwrócony współczynnik r i przełączono na obraz czarno-biały, aby zaoszczędzić kilka bajtów.
Przyjmuje liczbę punktów jako
n
, pierwszy punkt jakop
, stosunek jakor
i listę punktów jakol
. Potrzebuje modułu Poduszka.Przykłady:
Generuję punkty w kółko wokół centrum obrazu
Powtórzenia XOXO, tylko zmieniam stosunek z 0,4 na 0,6
Jakiś płatek śniegu
źródło
n,p,r,l=input()
. Możesz także usunąć nawiasy klamrowe z*=
operacji i użyćimport random as R
.*=
. :( Theinput
byłoby dobrze być bardzo nieprzyjemne do pracy, a import jest obecnie najbardziej zwięzła forma możliwe (lub mieć coś przeoczyłem?).import random as R,PIL.Image as I
a potemrandom.choice
może byćR.choice
. Tak, używanie danych wejściowych jest kiepskie, ale możesz użyć wersji funkcji do testowania i opublikować tę,input()
aby uzyskać lepszy wynik !! 1! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Z przyjemnością otrzymam opinię na temat mojego skryptu i gry w golfa, ponieważ nie czuję się komfortowo z JS =) (Zapraszam do korzystania z tego / zmieniania go do własnego zgłoszenia!)
Odczytywanie danych wejściowych (Aby być porównywalnym z wpisem edc65 , nie liczę danych wejściowych.):
Ustawienia i obliczenia na płótnie
Nieco bardziej niepohamowany (w tym przykładowe dane wejściowe, w których prawdziwe promesy wejściowe są po prostu komentowane, więc gotowe do użycia):
Przykłady
źródło
Przetwarzanie, 153
Przeniesiono odpowiedź Java @Geobits na Przetwarzanie i zrobiłem trochę golfa, co spowodowało redukcję 100 znaków. Początkowo zamierzałem animować proces, ale ograniczenia wejściowe są w tym przypadku zbyt surowe (Przetwarzanie nie ma stdin ani argv, co oznacza, że muszę napisać własną funkcję zamiast korzystać z natywnej
draw()
pętli przetwarzania ).Kompletny program z podziałem linii:
Powyższy program daje Krzyże:
To daje piramidy:
To daje trójkąt Sierpińskiego:
źródło
Niegolfowane „referencyjne wdrożenie”, Python
Aktualizacja : znacznie, znacznie szybciej (o rzędy wielkości)
Sprawdź interaktywną powłokę!
Edytuj plik i ustaw
interactive
naTrue
, a następnie wykonaj jedną z następujących czynności:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
generuje, zapisuje i wyświetla wielokąt.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
robi to, o co prosi specyfikacja.źródło
Python (202 znaków)
Przyjmuje liczbę punktów jako
n
średnią wagę jakor
punkt początkowy jakotuple
s
a listę punktów jako listętuple
nazwanych XYl
.źródło