Twoje zadanie: wygeneruj płatek śniegu Kocha na n-tej głębokości. Nie musisz tworzyć pełnego płatka śniegu Kocha, tylko jedną stronę trójkąta początkowego. Wikipedia na temat płatków Kocha: https://en.wikipedia.org/wiki/Koch_snowflake .
Zasady:
- Program musi wygenerować jedną stronę płatka śniegu Kocha na n-tej głębokości.
- Wyjściem musi być ASCII.
- Państwo może generować cały płatek śniegu; nie jest to wymagane.
- Obowiązują standardowe zasady dotyczące wejścia / wyjścia oraz luki i inne rzeczy.
- Biała spacja nie ma znaczenia, o ile wszystkie znaki znajdują się we właściwym miejscu względem siebie.
- Najkrótszy kod wygrywa!
Przypadki testowe:
n = 0:
__
n = 1:
__/\__
n = 2:
__/\__
\ /
__/\__/ \__/\__
n = 3:
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/\__ __/ \__ __/\__
\ / \ / \ /
__/\__/ \__/\__/ \__/\__/ \__/\__
Mam nadzieję, że to ma sens. Zauważ, że w każdym przypadku testowym fraktal można podzielić na trzy części o równej długości. Zauważ również, że szerokość każdego płatka śniegu jest trzy razy większa niż szerokość poprzedniej generacji płatka śniegu.
__/\__
dwa podkreślenia, dzięki którym każda iteracja była 3 razy większa niż poprzednia. Używanie tylko jednego podkreślenia wydaje się dawać sprzeczności, które zaczynają być naprawdę niezręczne w n = 3. Np. Zewnętrzne części mają szerokość 12, podczas gdy środkowa część ma tylko szerokość 10, w wyniku czego/_
i_\
które są zbyt ciasne. A nawet wcześniej_
rozszerzasz do dwukrotnej szerokości/
i\
./_
i_\
to jedyny naprawdę krytyczny część - podkreślenia trzeba iść, ponieważ muszą być w tej samej pozycji jak/
i\
. Gdy to się stanie, rzeczy mogą wzrosnąć 3 razy od n = 1 (ale n = 0 nie pasuje.)Odpowiedzi:
Haskell ,
308300299 bajtówEdycje:
zipWith(+)
sięzipWith(-)
i regulacja kodowania i korekcje pozbył każdego znaku negacji.#
przy użyciur=reverse
zamiast bezpośredniego dopasowania wzorca.zipWith(-)
.o=[0,0]
celu skrócenia stałych listy.?
.Wypróbuj online! (Niestety, wszystko większe niż n = 3 zostaje okropnie opakowane i nieczytelne, ale możesz skopiować to do innego programu, aby to zobaczyć.)
Wariacje
[6]
się[6,4,4]
, masz cały płatek śniegu. Wypróbuj online!,3..gcd 3x
, otrzymasz krzywą w stylu, w którym pierwotnie podano to pytanie. Wypróbuj online!Jak to działa
k
jest główną funkcją, pobieraInt
n
i zwraca aString
.iterate(>>=(:[1,4,1]))[6]
generuje nieskończoną listę zawierającą, dla każdego n, zwoje między kolejnymi liniami w tej iteracji krzywej, styl grafiki żółwia, jako liczby nominalnie między0
a5
. Każda iteracja jest tylko poprzednia z1,4,1
przeplotem zwojów . Jedynym powodem, dla którego podlisty zaczynają,6
zamiast0
robićgcd
sztuczkę,f
jest unikanief 0
.scanl1(+)
zamienia zwoje w kierunki „absolutne”, aż do modułu 6. A0
oznacza w prawo, a następnie każda wyższa liczba wynosi 60 stopni w kierunku przeciwnym do ruchu wskazówek zegara w stosunku do poprzedniego. (Cóż, byłoby to 60 stopni, gdyby był to właściwy rysunek, a nie ASCII.)f
konwertuje kierunek bezwzględny na listę par (znak, kodowanie offsetowe), która koduje znaki, które należy dodać do krzywej (dla kierunków poziomych generuje dwie pary, w przeciwnym razie jedną), oraz sposób zmiany położenia względnego.#
iteracje przez operatora poprzedniej listy (znak offsetowy, kodowanie), generowanie par rzeczywistych (współrzędnych par znaków)._/\
nominalnie reprezentuje linię od narożnika początkowego przez prostokątną komórkę do innego narożnika końcowego.[y,x]
, od góry do dołu, od lewej do prawej, dzięki czemu sortują się w kolejności, w jakiej chcemy je wydrukować. Kolumny są oparte na 1. Listy są używane zamiast krotek dla krótszej arytmetyki wektorowej z(&)=zipWith(-)
.[y,x]
co komórka w lewym górnym rogu. Zapewnia to, że wszystkie przesunięcia od rogu do sąsiednich komórek są nieujemne, unikając stałych ujemnych.[y1,x1,x2,y2]
którym[y1,x1]
znajduje się przesunięcie współrzędnych od narożnika początkowego do komórki znakowej i[y2,x2]
jest przesunięciem od narożnika końcowego do komórki znakowej. To znaczy:3
..5
są tylko odwrotnością list dla0
…2
, pozwalając na ich generowanie[id,r]<*>
.(&)=zipWith(-)
listy kodowania lub jej odwrotności.?
, co generujeString
z nich finał .x?l@(([_,w],c):r)
x
jest współrzędną x poprzedniego znaku pokazanego w tym wierszu lub0
jeśli jest na początku wiersza;l
jest całą bieżącą listą,w
jest współrzędną x następnego znaku do dodania,c
jest znakiem ir
jest pozostałą listą.\
i/
, więc jest sortowane jako ostatnie, jeśli nakłada się z innym znakiem na tej samej pozycji. W ten sposób wykrywany jest nadmiarowy znak podkreślenia, sprawdzając, czy współrzędna X została powtórzona.źródło