Dzisiejszym wyzwaniem jest narysowanie drzewa binarnego tak pięknego ascii-art, jak ten przykład:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/ \ / \ / \ / \
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/ \ / \ / \ / \ / \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Jako dane wejściowe otrzymasz dodatnią liczbę całkowitą. To wejście jest wysokością drzewa . Powyższy przykład ma wysokość sześciu.
Możesz przesłać pełny program lub funkcję i możesz dowolnie korzystać z naszych domyślnych metod We / Wy . Na przykład dozwolone byłoby drukowanie drzewa, zwracanie ciągu z nowymi wierszami, zwracanie tablicy 2d char, zapisywanie drzewa do pliku itp.
Końcowe spacje w każdej linii są dozwolone.
Oto kilka przykładów danych wejściowych i odpowiadających im danych wyjściowych:
1:
/\
2:
/\
/\/\
3:
/\
/ \
/\ /\
/\/\/\/\
4:
/\
/ \
/ \
/ \
/\ /\
/ \ / \
/\ /\ /\ /\
/\/\/\/\/\/\/\/\
5:
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
/\ /\
/ \ / \
/ \ / \
/ \ / \
/\ /\ /\ /\
/ \ / \ / \ / \
/\ /\ /\ /\ /\ /\ /\ /\
/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Niestety, wydajność rośnie wykładniczo, więc trudno jest pokazać większe przykłady. Oto link do wyjścia dla 8.
Jak zwykle jest to wyzwanie związane z golfem , więc obowiązują standardowe luki i spróbuj napisać najkrótszy możliwy program w dowolnym wybranym języku.
Miłej gry w golfa!
Odpowiedzi:
Python 2, 77 bajtów
Drukuje ze spacjami, kończąc się błędem.
Wziąłem ten kod z moim składania na wyzwanie postawione mi na Anarchy Golf , a także poprawa jeden bajt znaleźć xsot. Wartość na sztywno 128 została zmieniona na
2**input()
.Chodzi o to, że każdy wiersz wyniku jest segmentem skopiowanym jeden lub więcej razy. Połowa po podziale wejściowym ma jedną kopię każdego segmentu, ćwiartka po następnym podziale ma dwie kopie i tak dalej, aż do ostatniej linii z wieloma segmentami
/\
.Każdy segment miał
/
i\
, z odstępami pomiędzy nimi, a także na zewnątrz, aby pad do odpowiedniej długości. Zewnętrzne wypełnienie jest zakończonecenter
.Zmienna
s
śledzi prąd każdego segmentu, a liczba segmentów jestS/s
taka, że całkowita szerokość jest szerokością drzewaS
. Numer linii jesti
odliczany o 2, a ilekroć wartośćs
wynosi połowę, następuje podział, a szerokość segmentu jest zmniejszana o połowę. Odbywa się to poprzez wyrażenies/=s/i
. Poi
osiągnięciu0
powoduje błąd, który kończy działanie programu.Ponieważ anagolf zezwala tylko na przesyłanie programów, nie zbadałem możliwości funkcji rekurencyjnej, która moim zdaniem jest prawdopodobnie krótsza.
źródło
V , 32 bajty
Wypróbuj online!
Hexdump:
źródło
Płótno , 11 bajtów
Wypróbuj tutaj!
Wyjaśnienie:
źródło
Haskell ,
140 138135 bajtówWypróbuj online! Wywołaj za pomocą
b 5
, zwraca listę ciągów.Ładne użycie wydruku:
(niektóre) Objaśnienie:
e n
generuje ciągn
spacjin!f
wstawia każdy ciąg na liście ciągówf
zen
spacjami po lewej i prawej stronief n
rysuje „szczyt” wn
za2n
prostokątab n
rysuje drzewo binarne, łącząc dwa mniejsze drzewa i centruje nowy szczyt nad nimiEdycja: -3 bajty dzięki Zgarb!
źródło
1!f(n-1)
im!f m
powinienem zaoszczędzić kilka bajtów.J ,
49 4342 bajtówZwraca to czasownik, który przyjmuje liczbę i zwraca tablicę znaków 2D. Wypróbuj online!
Wyjaśnienie
Najpierw konstruuję macierz wartości -1, 0 i 1, iterując czasownik pomocniczy, a następnie zastępuję liczby znakami. Czasownik pomocniczy konstruuje prawą połowę następnej iteracji, a następnie odzwierciedla ją poziomo, aby wygenerować resztę. W poniższym objaśnieniu
,
łączy tablice 2D w pionie i tablice 1D w poziomie.źródło
JavaScript (ES6), 105 bajtów
Działa poprzez rekurencyjne budowanie wyniku z przypadku podstawowego
/\
. Dolna połowa to tylko poprzedni przypadek z każdą linią powieloną. Górna połowa była trochę trudniejsza; wygląda na to, że chcesz wziąć poprzednią skrzynkę i zachować tylko dwie strony, ale musisz także martwić się o wypełnienie ciągów, aby podwoić szerokość, więc zamiast tego wykonuję magię wyrażeń regularnych. Biorąc wiodące spacje z poprzedniego przypadku i dzieląc w każdym punkcie, mogę rozważyć spacje przed i po tym punkcie. Przy każdym meczu spacje przed wzrostem o 1, a spacje po zmniejszeniu o 1; można to wykorzystać do ustawienia/
i\
w odpowiednich miejscach. Dodano także nowe linie i dopełnienie; zajmuje się to dopełnieniem z wyjątkiem spacji końcowej w każdej linii i spacji wiodącej w pierwszej linii, którą muszę dodać ręcznie. (Spacje wiodące w kolejnych wierszach pochodzą z dopasowanego łańcucha).źródło
Węgiel drzewny , 12 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Długości linii wynoszą 1, 1, 2, 4, 8 ... 2 ^ (N-2), a zatem niezręczne obliczenia.
źródło
Stax ,
2019 bajtówUruchom i debuguj
źródło
Partia, 218 bajtów
Uwaga: Linia 6 kończy się spacją. Działa, przesuwając gałęzie odpowiednio w lewo i prawo za każdym razem, z wyjątkiem rzędów, które znajdują się 2 n od końca, w którym to przypadku gałęzie są rozwidlane.
źródło
Haxe, 181 bajtów
Lub z opcjonalnymi białymi znakami:
Przez chwilę pracowałem nad rozwiązaniem, które najpierw utworzyło tablicę znaków spacji o odpowiednim rozmiarze, a następnie iteracyjnie ustawiało rozwidlone ścieżki coraz niżej (i gęstsze przy każdej iteracji). Pozostało jednak ponad 230 bajtów. Podejście tutaj jest prawie tym, czym jest podejście Haskell @ Laikoni. Nie mogłem oderwać się od braku
:String
, ponieważ Haxe nie jest wystarczająco sprytny, aby stwierdzić, że typem zwrotu zawsze będzie String.Jest to tylko funkcja, oto pełny program do jej przetestowania:
Umieść powyższe
Main.hx
, skompilujhaxe -main Main.hx -neko frac.n
i przetestuj za pomocąneko frac.n 4
(zamień4
w żądanej kolejności).źródło
PHP, 188 bajtów
Wersja online
Rozszerzony
źródło