Przegląd
Napisz program, który drukuje proste wzorce fraktalne, biorąc pod uwagę wzorzec bitowy kodujący fraktal, plus współczynnik skali fraktala i liczba pokoleń.
Wyjaśnienie
Oto reprezentacja ASCII pliku dywanu Sierpińskiego :
Generacja 0:
#
Generacja 1:
# # #
# #
# # #
Generacja 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
Generacja n + 1 dywanu Sierpińskiego ASCII składa się z siatki 3x3 zawierającej 8 kopii generacji n, bez centralnego elementu siatki.
Ponieważ jest on definiowany za pomocą siatki 3x3 i ma 3 razy większą szerokość i wysokość z każdym pokoleniem, możemy powiedzieć, że ma współczynnik skali 3.
Możemy zdefiniować wzór bitowy dla dywanu Sierpińskiego, numerując elementy w siatce 3x3 od 0 do 8, od góry do dołu, od lewej do prawej i ustawiając odpowiedni bit liczby całkowitej, jeśli generacja n + 1 zawiera kopia generacji n na tej pozycji siatki:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Dla współczynnika skali 2 wzór bitów byłby ustawiony następująco:
0 1
2 3
i tak dalej.
Twoim zadaniem jest napisanie programu, który akceptuje wzór bitowy w tej formie, współczynnik skali (np. 3 dla Dywanu Sierpińskiego) oraz numer generacji i generuje fraktal ASCII.
Wkład
Twój program powinien akceptować 3 liczby całkowite w następującej kolejności: wzór bitowy, współczynnik skali (od 2 do 5 włącznie) i liczbę generacji (od 0 do 5 włącznie).
Nie trzeba przeprowadzać żadnej weryfikacji danych wejściowych dla tych wartości i jest całkowicie w porządku, jeśli program działa dla wartości większych niż określone zakresy.
Dane wejściowe można przekazywać w dowolnej formie (krotki, lista rozdzielana przecinkami / spacjami itp.)
Wydajność
Program powinien wypisać fraktal złożony ze #
znaku, po którym następuje spacja w pozycjach, w których fraktal jest zdefiniowany, podwójne spacje tam, gdzie go nie ma, oraz znak nowej linii na końcu każdej linii, drukując je lub zwracając ciąg z funkcji.
Przykłady
Wkład:
495,3,3
Wyjście (Dywan Sierpińskiego 3. generacji):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Wkład:
7,2,5
Wyjście ( trójkąt Sierpińskiego ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Wkład:
325,3,3
Wyjście ( kurz Cantor ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Wkład
186,3,3
Wyjście ( fraktal Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Wkład:
279,3,3
Dane wyjściowe (przykład asymetrycznego fraktala):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
itp.
Uwagi:
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach
- Twój program może być albo samodzielny, albo funkcją wywoływaną z 3 parametrami wejściowymi i zwracającą (lub drukującą) ciąg znaków
- Generacja 0 jest zdefiniowana jako
#
(#
po której następuje spacja) nawet dla wzorca bitowego 0. - Końcowy znak nowej linii w ostatnim wierszu jest opcjonalny, ale dozwolony, podobnie jak dowolna ilość białych znaków końcowych w każdej linii.
"##"
na"# "
. Widzę, że jedna końcowa spacja na końcu wiersza jest uwzględniona w twoich przykładach, czy jest wymagana? . Zgodnie z ostatnią regułą zakładam, że jest opcjonalna, ale fakt, że potrzebujesz miejsca końcowego dla generacji 0, zastanawia mnie. Myślę też, że powinieneś wskazać maksymalną dozwoloną spację i znaki nowej linii (masz liczbę mnogą). Jako skrajny przykład zawsze mogłem zacząć od tablicy 5 ^ 6 = 15625 linii 2 * 5 ^ 6 spacji, a następnie zastąpić#
s. W większości przypadków jest to ogromna ilość nieużywanych białych znaków279,3,3
?Odpowiedzi:
APL (Dyalog Unicode) , 37 bajtów SBCS
Wypróbuj online!
źródło
Common Lisp,
248242 bajtyBez golfa
Wyjaśnienie
dotimes
) i obliczamy, czy należy narysować każdą komórkę (podejście przypominające raycasting). Odbywa się to poprzez rekurencyjne zaglądanie do fraktala zf
funkcją pomocniczą."# "
lub wydrukuj" "
. Oczywiście drukujemy także nowe wiersze na końcu każdego wiersza.Na przykład trójkąt Sierpińskiego jest reprezentowany przez
S=7
iR=2
. W 3. generacji rozmiar kwadratu wynosi 2 3 = 8. Dla każdej komórki (x, y) następują:f
nazywa się x , y , g związane z 3 i s jest związany z 4 (8/2)truncate
zwraca zarówno iloraz, jak i resztę, które są powiązane odpowiednio z px i x (ponownie używamy tego samego symbolu x , ale to nie jest problem).f
rekurencyjnie nowe wiązania dla x i y . To jest teraz względne położenie wewnątrz wewnętrznego fraktala. Mijamy G-1 dla generacji is / s aby reprezentować połowę długości fraktala.Przykład
Obliczenie 8. dywanu Sierpińskiego przy użyciu
(fractal 495 3 8)
zajmuje 24,7 sekundy i generuje wyjściowy plik tekstowy o wielkości 83 MB. Napisałem nieco zmodyfikowaną wersję, która wyświetla obraz. Dla tych samych parametrów plik GIF waży 1,5 MB (ten sam czas obliczeń):Vicsek (kliknij, aby zobaczyć oryginalny rozmiar):
źródło
)
z rzędu!Pyth, 38 bajtów
Wypróbuj online: Regular Input / Test Suite
Wyjaśnienie nastąpi później.
źródło
186 3 5
(tłumacza online), ale poza tym jestem pod wielkim wrażeniem tego, jak krótki jest to czas.Ruby, 154
Wynik dotyczy tylko funkcji. Prezentowane jako nieogolone poniżej w programie testowym. Jedyne golfa, o które obecnie twierdzę, to usuwanie komentarzy i wcięć. Później zagram w golfa. W tej chwili dobrze się bawię grając z programem.
Funkcja przyjmuje sześć argumentów, ale przy pierwszym wywołaniu tylko pierwsze 3 są podane dla specyfikacji. Powoduje to ustawienie trzech pozostałych argumentów na wartości domyślne, a w szczególności ciąg, w
a
którym zapisywane są dane wyjściowe, jest tworzony i inicjowany do wierszy spacji zakończonych znakami nowej linii. Jako efekt uboczny$w
tworzona jest również zmienna globalna , wskazująca liczbę symboli w linii.Gdy funkcja wywołuje się rekurencyjnie, udostępnia wszystkie sześć argumentów, w tym ciąg znaków
a
i współrzędne xiy lewego górnego rogu następnej rekurencjiReszta programu jest dość prosta, jak wskazano w komentarzach.
Wydajność
Oto zestaw fraktali luźno oparty na formie liter słowa GOLF. Bardziej realistyczne litery można uzyskać dzięki większym mapom bitowym. Jak pokazuje ostatni przykład, najciekawsze fraktale odkryto przypadkowo.
źródło
CJam, 45 lat
Realizacja mojego pierwszego pomysłu. Wypróbuj online
Zasadniczo zaczyna się od macierzy 1 * 1 zawierającej 3 (różnica między „#” i „”), a następnie wielokrotnie zwielokrotnia każdą liczbę w macierzy ze wzorem bitowym (macierz 0/1) i łączy uzyskane macierze w jedną większa matryca. Na końcu dodaje spację do każdej liczby i łączy się ze spacjami i znakami nowej linii.
Drugi pomysł, 49
Wypróbuj online
To generuje wszystkie współrzędne macierzy wyjściowej jako tablice <liczb generacji> par liczb mniejszych niż współczynnik skali (wszystkie takie kombinacje), a następnie dla każdej pary liczb otrzymuje odpowiedni bit ze wzoru i dla każdej tablicy współrzędnych mnoży bity i mnoży przez 3. Ostateczne przetwarzanie jest takie samo.
Prawdopodobnie jest miejsce na więcej golfa.
źródło
C, 316 bajtów
Bez golfa:
źródło
Scala
293299bez golfa:
przykłady:
pierwsze cięcie, prawdopodobnie można grać w golfa nieco dalej ...
źródło
#
. Oprócz tego, że wymaga tego specyfikacja, naprawdę poprawia wygląd twoich wyników.Matlab, 115 bajtów
kron
Produkt Kronecker znacznie ułatwia wszystko:źródło
de2bi
działa tylko, jeśli masz Przybornik systemów komunikacji. Bez tego nie działa. Potrzebowałobydec2bin
.de2bi
to nie to samo codec2bin
.)C, 158 bajtów
źródło
K5, 70 bajtów
To poczatek:
W akcji:
źródło