Wyzwanie
Wszyscy wiemy o normalnych choinkach - ale co powiesz na odwróconą choinkę ! To dość łatwe, świąteczne wyzwanie. Celem tego wyzwania jest uczynienie mnie do góry nogami choinką ASCII. Oto zasady tego wyzwania:
- Zaakceptuj nieparzystą liczbę całkowitą dodatnią. Możesz założyć, że zawsze będzie pomiędzy
7
i51
. Podstawa drzewa będzie złożona z postaci:
___ \ / |
Wierzchołek drzewa (gwiazda) będzie składał się z jednego
*
.Każda linia drzewa zostanie zbudowana w formacie, w
<?>
którym?
jest dowolna liczba-
s. Na przykład, jeśli tworzysz linię długości5
, linia powinna być<--->
. Lub jeśli tworzysz linię długości8
, linia powinna być<------>
.Oto, jak należy zbudować ciało drzewa:
Weź liczbę nieparzystą
n
podaną jako dane wejściowe i utwórz linię drzewa o tej długości.Odjąć
4
odn
i utworzyć linię drzewa tej długości.Odjąć
2
odn
i utworzyć linię drzewa tej długości.Zmniejszenie
n
przez2
. Następnie, chyba żen
jest równy5
, wróć do kroku 2.
Baza (patrz krok 2.) gwiazda (patrz krok 3.) i każda linia drzewa (patrz kroki 4. i 5.) powinny być wyśrodkowane przy użyciu oryginału liczby nieparzystej (patrz krok 1.) jako maksimum szerokość.
Przykłady / przypadki testowe
odd number inputed: 7
___
\ /
|
<-----> line length -> 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 13
___
\ /
|
<-----------> line length -> 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 9
___
\ /
|
<-------> line length -> 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
odd number inputed: 17
___
\ /
|
<---------------> line length -> 17
<-----------> line length -> 17 - 4 = 13
<-------------> line length -> 17 - 2 = 15
<---------> line length -> 15 - 4 = 11
<-----------> line length -> 15 - 2 = 13
<-------> line length -> 13 - 4 = 9
<---------> line length -> 13 - 2 = 11
<-----> line length -> 11 - 4 = 7
<-------> line length -> 11 - 2 = 9
<---> line length -> 9 - 4 = 5
<-----> line length -> 9 - 2 = 7
<-> line length -> 7 - 4 = 3
<---> line length -> 7 - 2 = 5
*
Zasady
- Obowiązują standardowe luki .
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
repeat the above steps until the odd number minus 2 equals 5
- na pierwszym wejściu liczba nieparzysta to 7, a 7-2 = 5, dlatego drzewo powinno się natychmiast zakończyć (wiem, co masz na myśli, ale wymaga przeformułowania)7
minimalną wartością wejściową, najpierw należy utworzyć trzy linie drzewa (pod-kroki .1.1, .1.2, .1.3), a następnie odjąć2
od liczby nieparzystej i sprawdzić, czy jest ona równa5
. Instrukcja sprawdzenia, czy „liczba nieparzysta minus 2 równa się 5” znajduje się na końcu, pozostałe trzy kroki należy wykonać w pierwszej kolejności. Ale odpowiedź na twój pierwszy komentarz byłaby w porządku.7
dane wejściowe, czy możesz je zaakceptować4
, jak w czwartej liczbie nieparzystej (lub3
czy jest to indeks 0).Odpowiedzi:
Python 3 ,
12712110510310098 bajtówTo jest nienazwana funkcja lambda, która zwraca listę linii:
Wypróbuj online!
Główną częścią tej odpowiedzi jest
(o-i+2-i%2*3)
określenie liczby myślników na linii. Resztą odpowiedzi jest po prostu przekształcenie tego w pożądaną sztukę ASCII.Ogromne podziękowania dla pana Xcodera za golenie 6 bajtów i omawianie ze mną golfa na czacie.
Dziękujemy także Lynn za zauważenie, że
3*(i%2)
może byći%2*3
, 2 bajty krótsze!źródło
f
ciągówo-i+2-i%2*3
oszczędza dwa bajty.C, 163 bajty
Wypróbuj online!
Rozwinięty:
źródło
Proton , 83 bajty
Dzięki FlipTack za zaoszczędzenie 4 bajtów i za współpracę na czacie (tak naprawdę tworzymy świetny zespół). Pośrednio zapisane 2 bajty dzięki Lynn .
Wypróbuj online!
źródło
Węgiel drzewny , 28 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wydrukuj bazę.
Pętla od połowy liczby wejściowej do 1.
Wydrukuj dwa wiersze, pierwszy z jednym większym
-
niż indeks pętli, drugi z jednym mniejszym.Lustro, aby ukończyć drzewo.
Umieść gwiazdę.
źródło
SOGL V0.12 ,
3530 bajtówWypróbuj tutaj!
Wykorzystuje algorytm węgla drzewnego Neila , pobiera dane wejściowe jako indeks w liczbach nieparzystych - więc 13 odpowiada wejściu 7
źródło
Siatkówka , 89 bajtów
Wypróbuj online! Objaśnienie: Pierwszy etap konwertuje dane wejściowe na jednoargumentowe i dołącza znak
>
. Drugi etap zastępuje dwa-
s przez,<
aby skorygować długość linii. Trzeci etap replikuje gałąź, ale za każdym razem nieco krótszy, dopóki gałąź nie może być dalej skracana. Ostatni etap dodaje podstawę i gwiazdę.źródło
JavaScript 506 bajtów
Wersja golfowa:
Wersja bez golfa:
Stosowanie:
console.log(tree(13)), console.log(tree(17)),
ES6 165 bajtów (od mojego przyjaciela)
Wersja golfowa:
Wersja bez golfa:
Stosowanie:
p(31); p(17);
źródło
const
słowa kluczowe itp.PowerShell , 131 bajtów
Wypróbuj online!
Cóż, jest to dobry bałagan dla każdego, kto nie zna się w PowerShell ... więc zobaczmy, jak dobrze mogę wyjaśnić, jak to działa.
Dla wyjaśnienia użyję
input = 17
.Zaczynamy dość prosto, z ustawieniem zmiennej pomocniczej
$i=2
i ustawieniem$x
na<something>
, z<something>
początkiem jako zakres od wejścia$args
do5
, więc17,16,15,...,6,5
. Ten zakres jest pompowany do pętli for.Każda iteracja, zaczynamy z ustawieniem zmiennej pomocnika
$j
być wynikiemif
oświadczeniuif($_%2){$i-2}else{($i++)}
. Jeśli to dziwne,$j=$i-2
w przeciwnym razie$j=($i++)
. To, w połączeniu z$i=2
początkiem, daje nam sekwencję,0, 2, 1, 3, 2, 4, 3, 5...
która akurat dokładnie odpowiada liczbie spacji, które musimy przyłożyć do naszej linii drzewa. ;-) Bierzemy' '
i mnożymy to przez ten numer.Następnie potrzebujemy naszych oddziałów. Odbywa się to poprzez pomnożenie
'<'
środkowej części'-'
plus koniec'>'
. Mnożenie odbywa się przez rozpoznanie, że-
zmienna we2, 5, 2, 5, 2...
wzorcu na podstawie liczby wejściowej$_
, więc wybieramy z pseudo-trójki na podstawie tego wzorca.Aby uzyskać dodatkowe wyjaśnienia, oto kilka pierwszych terminów w każdej sekcji:
Więc teraz ustawiliśmy
$x
się na tablicę rozgałęzień (tj. Łańcuchów). Poza pętlą budujemy teraz nasze „górne” drzewo z zachowaną odpowiednią liczbą spacji$y
, a następnie wyświetlamy nasze gałęzie$x
, a następnie „dolne” drzewo za pomocą*
. Każdy z nich pozostaje w potoku, a wynik jest domyślnie z nową linią między elementami.źródło
JavaScript (ES6),
150147 bajtówPokaż fragment kodu
źródło
Płótno , 28 bajtów
Wypróbuj tutaj!
Port mojej odpowiedzi SOGL, która jest odpowiedzią na węgiel drzewny Neila.
źródło
Moja próba na JS ESGoogoltriplex.
Pokaż fragment kodu
źródło