Biorąc pod uwagę dodatnią liczbę całkowitą N („virality”), twój program powinien utworzyć rysunek drzewa ASCII z dwoma gałęziami o długości N rozciągającymi się w dół i / lub w prawo od lewego górnego rogu.
Kierunek obrany przez każdą gałąź po pierwszej gwiazdce może być w prawo lub w dół, a tego wyboru należy dokonywać losowo 1 na każdym kolejnym kroku.
Na przykład przy danych wejściowych 5 wynik może wyglądać następująco:
***
* ***
**
**
Dwie gałęzie mogą się dotykać (znajdować się na sąsiednich komórkach), ale nie mogą się nakładać (znajdować się na tej samej komórce), więc następujące elementy nie będą dozwolone:
***
* *
*****
*
*
Przykłady
W przypadku danych wejściowych 1
jedynym możliwym wyjściem jest:
**
*
(Będzie to obecne na wszystkich prawidłowych danych wyjściowych, ponieważ dwie gałęzie idące tą samą ścieżką spowodowałyby ich nakładanie się.)
Możliwe dane wyjściowe 3
obejmują:
***
* *
**
**
***
*
*
Do wprowadzenia 7
:
****
* **
* **
*
***
*
Do wprowadzenia 10
:
****
* *
*********
*
*****
To jest golf-golf, więc wygrywa najkrótsza poprawna odpowiedź (w bajtach).
1. Powinno to być równomiernie losowe (tj. Szansa 50/50 dla każdego kierunku), lub tak zbliżone do równomiernie losowego, jak to możliwe na normalnym sprzęcie.
0
s i1
zamiast spacji i gwiazdek?Odpowiedzi:
CJam ,
5851 bajtówWypróbuj online!
Podstawową ideą jest to, że zaczynamy od,
[0 0]
a następnie wielokrotnie dodajemy 0 lub 1 do każdego elementu (upewniając się, że nigdy nie są równe, chyba że na początku, aby uniknąć nakładania się), zbierając wszystkie wyniki pośrednie.Następnie tworzymy dużą tablicę tablic, w której każda podtablica zawiera
*
indeksy podane przez odpowiednią parę w oryginalnej tablicy i spacje wszędzie indziej.Daje to przekątne wycinki macierzy wyjściowej (gdzie przesunięcie od lewej do prawej odpowiada przesunięciu od góry z prawej do dołu z lewej strony w rzeczywistej macierzy).
Następnie możemy użyć
::a:.+
do „odkątkowania” i uzyskania wynikowych linii:źródło
Węgiel drzewny ,
3124 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Początkowo myślałem, że łatwiej będzie zrobić pierwszy krok losowo, ale okazało się, że golfistą jest, aby pierwsza gałąź była przewidywalna. Wyjaśnienie:
Zapętl dwa razy, używając zmiennej indeksu
i
. (W rzeczywistości iteruje się po niejawnej liście, więc można bezpiecznie mutowaći
wewnątrz pętli).Przejdź do początku płótna.
N+1
Czasy pętliWydrukuj a
*
, ale pozostaw kursor w prawo lub poniżej kursora, w zależności od wartościi
.Losuj wartość
i
dla następnej iteracji pętli wewnętrznej.Jeśli obecna postać to a
*
, oznacza to, że jesteśmy drugą gałęzią i zeszliśmy w dół zamiast w prawo, więc przesuń się w górę, aby to poprawić. (Pierwsza gałąź zawsze zaczyna się w dół, więc druga gałąź zawsze będzie nad nią, co oznacza, że musimy tylko sprawdzić kolizję pionową).źródło
N
duże gałęzie, ale maN-1
rozmiar :)Java 10,
273272268239 bajtówWypróbuj online tutaj .
Podziękowania dla Kevina Cruijssena za grę w golfa 29 bajtów.
Wersja bez golfa:
źródło
do{}
trochę rzeczy w środku (i umieściłem ints w pierwszej części pętli for). PS: W twojej początkowej odpowiedzi0.5
mogłem.5
równieżPerl 5 ,
208124122118 bajtów118 bajtów bez znaków nowej linii, wcięć i komentarzy. Bierze N ze standardowego:
Wypróbuj online!
źródło
2..$N
się1..shift
teraz i ogoliłem kilka bajtów.<>
i danych wejściowych zamiastshift
i argumentów, a także zmienić kolejność wywołań,rand
aby uniknąć parens. Nie powinieneś kończyć swojego zadania na@o
żadnym z nich. Próbowałem użyć,@b=([],[]);
który wydaje się działać, ale nie eksperymentowałem zbyt wiele, więc mogłem przegapić przypadek na krawędzi. Mam nadzieję, że trochę pomogą!Python 2 , 204 bajty
Wypróbuj online!
źródło
Perl 5
-a
,97969392 bajtyNie ma odchylenia w prawo, w dół ani w dół.
Wypróbuj online!
źródło
PHP, 118 bajtów
wymaga PHP 5.4 lub nowszego dla operatora Elvisa. Wymień
?:
się?1:
dla starszego PHP.Uruchom jako potok z
-nR
lub spróbuj online .źródło
$argBak=$argn=
$argn
. W prawdziwym środowisku$argn
pochodzi ze STDIN, jeśli uruchamiasz go jako potok z-R
. Następnie wykona kod dla każdego wiersza danych wejściowych (ale jestem pewien, że PHP nie rozłącza zmiennych między nimi; więc wyraźne kolejne uruchomienia są bardziej prawdopodobne, aby uniknąć złych niespodzianek.)Czerwony ,
195190 bajtówWypróbuj online!
Czytelny:
źródło
Galaretka ,
504341 bajtówWypróbuj online!
To było naprawdę fajne do napisania. Może być bardziej optymalna metoda. Prawdopodobnie jest również trochę golfa w tej metodzie.
Zaraz po opublikowaniu tego zdałem sobie sprawę, że mogę użyć
,þ`
zamiastaþ,""oþ`Ɗ
.źródło
R ,
148142 bajtówWypróbuj online!
Dodatkowo, chociaż nie spełnia specyfikacji wyjściowej, możesz rozróżnić dwie gałęzie: Wypróbuj online!
Wyjaśnienie:
Zaczynając od indeksu
1
, losowo wybieramy ruch w prawo lub w lewo dla gałęzir
, dodając odpowiednion
lub1
. Następnie wybieramy kolejny ruch w prawo lub w lewo dla gałęzik
, a jeśli przecinałby się tam, gdzier
idzie, wybieramy inny kierunek. Następnie używamyr
ik
jako wskaźniki dom
, ustawiając te wartości jako"*"
. Iterowanien-1
razy, a następnie wydrukujemy wynik.źródło
Galaretka ,
3938 bajtówWypróbuj online!
Chociaż pozornie niezwiązane,
d
jest przydatne tutaj, aby zapisać bajt (w porównaniu z moim poprzednim podejściem).źródło
Python 2 ,
191187176 bajtówWypróbuj online!
Python ma natywne wsparcie dla liczb zespolonych formularza
a+bj
; to sprawia, że niektóre problemy 2D są nieco łatwiejsze do rozwiązania ...źródło