Wygeneruj płatek śniegu Koch
Płatek śniegu Koch to trójkąt, który dla każdego n
dodaje kolejny punkt równoboczny na środku każdej strony: http://en.wikipedia.org/wiki/Koch_snowflake#Properties
Mieliśmy już wyzwanie złożoności Koch Snowflake dla złożoności kolmogrovn=4
. Nowym wyzwaniem jest narysowanie płatka śniegu Koch z dowolnym n
między 1
i 10
.
Zasady
Płatki śniegu nie mogą być zakodowane na stałe w programie ani w plikach - muszą zostać wygenerowane przez Twój program.
Twój program musi obsługiwać wszystkie rozmiary
n
od 1 do 10.Liczba stron musi zostać wprowadzona przez użytkownika za pomocą standardowego wejścia.
Musisz wydrukować graficzną reprezentację płatka śniegu na ekranie.
Próbkuj płatki śniegu Koch o wartościach n
równych 1, 2, 3 i 4 (zielone linie tylko dla przejrzystości, nie odtwarzaj ich):
W przypadku remisu wygrywa program z największą liczbą głosów pozytywnych (konkurs pop).
źródło
n=7
tym na ekranie komputera nie widać nowo dodanych trójkątów w płatku śniegu. Czy jest jakikolwiek „najlepszy wysiłek”? Czy istnieje minimalna rozdzielczość dla rozwiązań opartych na pikselach?Odpowiedzi:
Mathematica 72
n = 3
Dzięki za alephalpha.
źródło
AnglePath
w Mathematica 10.1.Graphics@Line@AnglePath[Nest[Join@@({-1,2,-1,#}&/@#)&,{2,2,2},Input[]-1]Pi/3]
ListLinePlot@AnglePath[Nest[Join@@({#,1,4,1}&/@#)&,{4,4,4},Input[]-1]π/3]
MATLAB,
119115W nietypowym cyklu wydarzeń odkryłem, że ten program faktycznie działał lepiej, gdy grałem w golfa. Po pierwsze, stało się znacznie szybsze z powodu wektoryzacji. Teraz wyświetla pomocne podpowiedź
~n:~
przypominające użytkownikowi, którą ilość wprowadzić!Newlines nie są częścią programu.
n = 9:
o
jest dowolnym ciągiem równym modułowi[0 2 4 0]
6. e iπ / 3 podniesione do tych mocy daje wierzchołki równobocznego trójkąta w płaszczyźnie zespolonej. Pierwszykron
służy do wykonania kopii listy punktów, z których każdy jest powielany 4 razy.~~o
to wygodny sposób na uzyskanie wektora 4. Po drugiediff(P)
znajduje wektor między każdą parą kolejnych punktów. Wielokrotności tego wektora (0, 1/3, (1 + e -iπ / 3 ) / 3 i 2/3) są dodawane do każdego ze starych punktów.źródło
T-SQL: 686 (bez formatowania)
Dla SQL Server 2012+.
Mimo że nigdy nie będzie to rywal, musiałem sprawdzić, czy uda mi się to zrobić w języku T-SQL. Zniknęło podejście polegające na rozpoczęciu od trzech początkowych krawędzi, a następnie ponownym przejściu przez każdą krawędź i zastąpieniu ich 4 krawędziami na każdym poziomie. Wreszcie połączenie wszystkiego w jedną geometrię dla poziomu określonego dla @i
źródło
LOGO: 95
Definiuje funkcję
k
z parametrem jednopoziomowym.Edytować
W tym internetowym edytorze http://www.calormen.com/jslogo/ możesz dodać,
k readword
aby użyć monitu o wprowadzenie danych, ale z jakiegoś powodu to polecenie nie obsługuje standardowego skróturw
.Poniższe rozwiązanie 102 znaków działa w USBLogo ze standardowym wejściem, jak określono w pytaniu. Jednak kod wymagał drobnych zmian, ponieważ UCBLogo ma dziwny parser. Wymaga
to
iend
musi znajdować się w osobnych wierszach, a przestrzeń:
jest wymagana, ale z drugiej strony:
są opcjonalne.źródło
BBC BASIC, 179
REV 1
Jak poprzednio, ale w czerni i bieli, w wersji bez golfa (ale usprawnione) i golfa. Nie jest zwycięzcą, mimo że robi to w ten sposób, unikając potrzeby specjalnego leczenia dla n = 1.
REV 0
Zgodnie z odpowiedzią PO na @xnor, wypełnione płatki śniegu są OK. Ta odpowiedź została zainspirowana komentarzem xnora. Kolory są po prostu dla zabawy i pokazują, jak jest zbudowany. Weź trójkąt (w tym przypadku magenta) i nałóż na siebie 6 trójkątów 1/3 podstawy.
źródło
Mathematica - 177
Klip bonusowy zmieniający kąt środkowego elementu
źródło
Python 3 - 139
Korzysta z biblioteki grafiki żółwia.
źródło
"G">j
,"Q"<j
i użyćfd(9/b)
, aby zapisać 3 bajty? Ponadto można uniknąćif
mnożenia instrukcji, np("G">j)
. Argumentu9/b
i umieścić je wszystkie w jednym wierszufor
. O! Następnie możesz nawet łączyćrt
ilt
używać120*(...)-60*(...)
Python 3, 117 bajtów
Metoda:
n
jestinput - 1
0000
, łączymy każdą jego postać101
n
iteracyjnie z eval trick (dzięki za to @xnor).1
lub0
), a następnie przesuwamy do przodu o długość (99/3^n
), która gwarantuje podobny rozmiar dla wszystkichn
.0
ciąg będzie bezużyteczny, ale przerysowuje tę samą linię, co pierwsze0
losowanie.Przykładowe dane wyjściowe dla
input = 3
:źródło
R:
240175Ponieważ próbuję ominąć R, oto inna wersja. Prawdopodobnie istnieją o wiele lepsze sposoby na to i cieszę się, że otrzymuję wskazówki. To, co zrobiłem, wydaje się bardzo skomplikowane.
źródło
Wise fwom youw gwave ...
Wiedziałem, że chcę spróbować zaimplementować to w Befunge-98 za pomocą TURT, ale nie mogłem wymyślić, jak to zrobić i siedziałem na nim przez kilka miesięcy. Teraz dopiero niedawno wymyśliłem sposób na zrobienie tego bez konieczności samodzielnej modyfikacji! A więc...
Befunge-98 z odciskiem palca TURT, 103
Najpierw zdobądźmy trochę szczegółów implementacji:
I
„wydruk” obrazu do pliku SVG. Jeśli uruchomisz to w CCBI bez argumentu polecenia--turt-line=PATH
, domyślnie wyjdzie jako plik o nazwie CCBI_TURT.svg. To jest najbliższe, jakie mogłem przyjść, aby „wydrukować graficzną reprezentację płatka śniegu na ekranie” z dostępnymi tłumaczami Funge, jakie mogłem znaleźć. Może kiedyś będzie lepszy tłumacz, który ma wyświetlacz graficzny dla żółwia, ale na razie ...Zasadniczo działa to przy użyciu stosu jako rodzaju prowizorycznego systemu L i rozszerzaniu go w locie. Przy każdym podaniu, jeśli najwyższy numer na stosie to:
f
w ostatniej linii);n-1, -1, n-1, 0, n-1, -1, n-1
.Ponieważ
n = 10
proces ten trwa bardzo długo (kilka minut w moim systemie), a wynikowy plik SVG ma rozmiar ~ 10 MB i jest niewidoczny podczas przeglądania w przeglądarce, ponieważ nie można dopasować rozmiaru pędzla za pomocą TURT. IrfanView wydaje się działać przyzwoicie, jeśli masz odpowiednie wtyczki. Nie jestem zbyt obeznany z SVG, więc nie wiem, jaka jest preferowana metoda przeglądania tych plików (szczególnie, gdy są naprawdę duże).Hej, przynajmniej działa - co, biorąc pod uwagę, że jest Befunge, jest czymś, za co można być wdzięcznym.
źródło
Python 2, 127 bajtów
źródło