Krzywa kocha (znany także jako gwiazda Koch i Koch Island) to matematyczna krzywa i jeden z najwcześniejszych fraktalnych krzywych zostały opisane. Opiera się na krzywej Kocha, która ukazała się w artykule z 1904 r. Zatytułowanym „Na ciągłej krzywej bez stycznych, możliwej do zbudowania z geometrii elementarnej” (oryginalny francuski tytuł: „Sur une courbe kontynuacja sans tangente, obtenue par une construction géométrique élémentaire”) przez szwedzki matematyk Helge von Koch.
Oto niektóre ascii reprezentacje różnych iteracji:
n=1
__
\/
n=2
__/\__
\ /
/_ _\
\/
n=3
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/ \__
\ /
/_ __ __ _\
\/ \ / \/
/_ _\
\/
Ponieważ istnieje oczywiście ograniczenie rozdzielczości reprezentacji ascii, musimy powiększyć rozmiar płatka śniegu o współczynnik 3 dla każdej iteracji, aby pokazać dodatkowe szczegóły.
Napisz najkrótszy kod, aby wypisać płatek śniegu w tym samym stylu dla n = 4
Twój program nie powinien pobierać żadnych danych wejściowych.
Twój program powinien zapisać płatek śniegu na konsoli.
źródło
Odpowiedzi:
Python, 338 bajtów
Po prostu kolejny exploit unicode
biegać w ideone
źródło
Python,
650612594574 znakówDziała to poprzez rozszerzenie trójkąta za każdym razem o współczynnik 3. Aby to zrobić, musimy śledzić, czy każdy symbol jest lewą czy prawą granicą (np. Sposób
/
rozwinięcia zależy od tego, która strona/
jest wewnątrz). Używamy różnych symboli dla dwóch możliwych przypadków, jak następuje:d
Zmienna zajmuje się szczególny przypadek, w którym rozprężenioweja
aby przedłużyć do 3x3 w następnym wierszu.źródło
('acEei',r'_/\\ ')
=>('aecEi','_\/\ ')
oszczędza jeszcze 1. Możesz także sprawdzićunicode.translate()
.16-bitowy kod maszynowy MS-DOS: 199 bajtów
Dekoduj przy użyciu tej strony , zapisz jako plik „koch.com” i uruchom z wiersza poleceń WinXP.
Aktualizacja
Oto łatwa do odczytania wersja asemblera:
źródło
"scAA...w==".decode("base64")
do dekodowania w Python2 (nie działa dla Python3)Perl,
176175 bajtówOpublikowanie tego jako osobnej odpowiedzi, ponieważ wykorzystuje on binarny plik źródłowy, co może być nieco podstępne. Ale biorąc pod uwagę, że wciąż jest to kod źródłowy Perla , myślę, że to niezwykłe, że wyprzedza rozwiązanie dla kodu maszynowego MS-DOS !
Źródło w postaci zakodowanej w standardzie base64
Nieco bardziej czytelny
Zastąp wszystkie wystąpienia
/<[0-9a-f]+>/
odpowiednimi danymi binarnymi:W tej wersji płatek śniegu jest kodowany w następujący sposób:
8 bitów w każdym bajcie jest podzielonych w następujący sposób:
R
koduje ciąg spacji. Najdłuższy ciąg ma 27 znaków, więc wszystkie biegi mieszczą się w 5 bitach.C
koduje sekwencję znaków, które są po prostu wyszukiwane w dosłownej tablicy. (Kiedyś miałem tutaj nieco bardziej szalone kodowania, w których tylko tablica zawierała/ \ _
, ale kod Perla niezbędny do odkodowania go był dłuższy ...)Jestem szczęśliwy, że dane binarne nie zawiera żadnych
"
/'
lub\
które potrzebują ucieczki. Nie planowałem tego. Ale nawet gdyby tak było, prawdopodobnie mógłbym właśnie zmienić kolejność elementów w tablicy, aby to naprawić.To niesamowite, jak proste jest to rozwiązanie w porównaniu z dziesiątkami innych rozwiązań, które przeszedłem, zanim to wymyśliłem. Eksperymentowałem z wieloma różnymi kodowaniami bitowymi bardziej złożonymi niż to i nigdy nie przyszło mi do głowy, że prostsze może być tego warte, ponieważ kod Perla do jego dekodowania byłby krótszy. Próbowałem także skompresować powtórzenia w danych przy użyciu zmiennej interpolacji (patrz druga odpowiedź), ale w najnowszej wersji, która nie zyskuje już żadnych znaków.
źródło
Python, 284
Z nieco więcej białych znaków:
Lewa strona jest ściśnięta; prawa strona jest odtwarzana z lewej strony.
źródło
Perl,
224223 znakówNieco bardziej czytelny
Jak to działa
Aby uzyskać wyjaśnienie, jak to działa, zobacz drugą odpowiedź, w której umieszczam to samo w formacie binarnym . Jestem bardzo przykro, że nie jestem faktycznie generowania płatek śniegu Koch, ściskając go po prostu ...
Poprzednie wersje
(359) Zakodowałem cały płatek śniegu zamiast tylko lewej połowy. Spacje zostały włączone do kodowania bitów; nie ma jeszcze długości. Użyto kilku zmiennych interpolowanych oraz
@_
tablicy, do której uzyskano dostęp za pomocąs/\d/$_[$&]/eg
. Newlines zostały zakodowane jako!
.(289) Pierwsza wersja, która zakodowała tylko lewą połowę płatka śniegu.
(267) Pierwsza wersja, w której zastosowano kodowanie długości spacji.
(266) Zmień
' '
na$"
.(224) Zupełnie inna kompresja, zakodowana jako base-64. (Teraz odpowiada wersji binarnej ).
(223) Zdałem sobie sprawę, że mogę umieścić nadruk w ostatnim zastępstwie, a tym samym zapisać średnik.
źródło