Zbuduj nawias turniejowy

13

Biorąc pod uwagę listę wejściową niepustych ciągów, wypisz grafikę ASCII turnieju, w oparciu o następujące reguły losowania:

  • Ilość łańcuchów jest gwarantowana na ilość 2,4,8,16,etc.
  • Pierwsze dwa struny grają się nawzajem, a następne dwa grają nawzajem i tak dalej. To jest pierwsza runda.
  • Dla każdej gry wybierz zwycięzcę losowo z jednakowym prawdopodobieństwem.
  • W następnej rundzie zwycięzca pierwszej gry gra zwycięzcę drugiej gry, zwycięzca trzeciej gry gra zwycięzcę czwartej gry i tak dalej. Kolejne rundy są zgodne ze wzorem.
  • W końcu jest jeden ogólny zwycięzca.
  • Aby uzyskać ładne wyniki (wymagane), wszystkie ciągi muszą być poprzedzone i dołączone ze znakiem podkreślenia _.
  • Aby nawiasy były odpowiednio ustawione, każde wejście musi być wypełnione, _aby wszystkie były tej samej długości dla tej rundy.
  • Możesz wybrać, czy wypełnienie ma być dołączane, czy dopinane, o ile jest spójne.
  • Zamiast tego możesz wybrać wstępne wypełnienie wszystkich łańcuchów, aby były tej samej długości, a nie na rundę. W zależności od tego, który kod jest bardziej golfowy.

Dalsze zasady

  • Wiodące lub końcowe znaki nowej linii lub białe znaki są opcjonalne, o ile same znaki są poprawnie ustawione w linii.
  • Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
  • Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Przykłady

Przykład z miastami ['Boston', 'New York', 'Charlotte', 'Atlanta', 'St. Paul', 'Chicago', 'Los Angeles', 'Phoenix']:

_Boston______
             \_New York____
_New York____/             \
                            \_New York_
_Charlotte___               /          \
             \_Charlotte___/            \
_Atlanta_____/                           \
                                          \_St. Paul_
_St. Paul____                             /
             \_St. Paul____              /
_Chicago_____/             \            /
                            \_St. Paul_/
_Los Angeles_               /
             \_Los Angeles_/
_Phoenix_____/

Przykład z ['Lions', 'Tigers', 'Bears', 'Oh My']:

_Lions__
        \_Tigers_
_Tigers_/        \
                  \_Tigers_
_Bears__          /
        \_Bears__/
_Oh My__/
AdmBorkBork
źródło
Związane .
Okx,
Czy wybór zwycięzcy musi być losowy Mersenne Twister, czy może być pseudolosowy?
Zach Gates
@ZachGates O ile istnieje szansa 50-50 między dwoma „zespołami”, każda metoda, której chcesz użyć, jest w porządku.
AdmBorkBork,

Odpowiedzi:

6

Węgiel , 92 79 bajtów

A¹θWS⊞υ⪫__ιWυ«A⌈EυLκεA⁺θθδFυ«P×_εPκMδ↓»AE✂υ¹Lυ²⎇‽²κ§υ⁺λλυMε→Fυ«Mδ↑↗θ←↖θ→»Mθ↘Aδθ

Wypróbuj online! Link jest do pełnej wersji kodu. Potrzebuje pustej linii do oznaczenia końca danych wejściowych. Wyjaśnienie:

A¹θ

Zainicjuj zmienną q. To utrzymuje wielkość zygzaków, tj. Połowę odstępu między rzędami.

WS⊞υ⪫__ι

Wczytaj niepuste linie wejściowe do tablicy u. Linie są automatycznie otaczane przez _s podczas ich wczytywania, chociaż nie są jeszcze wypełnione.

Wυ«

Zapętlaj, dopóki pozostaną jeszcze ciągi.

A⌈EυLκε

Oblicz szerokość największego ciągu w e.

A⁺θθδ

Oblicz odstęp między rzędami d.

Fυ«P×_εPκMδ↓»

Dla każdego zespołu wydrukuj wypełnienie, wydrukuj zespół, a następnie przejdź do następnego zespołu.

AE✂υ¹Lυ²⎇‽²κ§υ⁺λλυ

Dla każdej innej drużyny losowo wybieraj między tą lub poprzednią drużyną. (Pamiętaj, że jeśli pozostanie tylko jeden zespół, powstanie pusta lista).

Mε→Fυ«Mδ↑↗θ←↖θ→»Mθ↘

Jeśli pozostały jeszcze drużyny, narysuj zygzaki łączące je parami.

Aδθ

Za każdym razem podwoj długość zygzaków.

Neil
źródło
Czy uważasz, że byłby przypadek, w którym operator wprowadzania listy byłby korzystny?
Tylko ASCII,
@ Tylko ASCII Cóż, mógłbym użyć go do pytania o diagram Venna ASCII ...
Neil,
: | myślisz, że warto wdrożyć?
Tylko ASCII,
@ Tylko ASCII Myślę, że i tak możesz to zrobić ▷vS.
Erik the Outgolfer,
2

Python 2 , 379 364 bajty

exec r"""c=input();from random import*;R,L,d=range,len,0;u,s="_ ";r=[[""]*-~L(c)@R(2*L(c)-1)]
while c:
 W=2+max(map(L,c));j=1<<d;J=j/2;D=d+d;d+=1
 @r:l[D]=s*W;l[D-1]=s*J
 @R(L(c)):
	h=l*2*j+j-1;r[h][D]=(u+c[l]+u*W)[:W]
	@R(h-J,h+J):r[-~l][~-D]=("/\\"[l<h]+s*abs(h-l-(l<h))).rjust(J)
 c=[choice(l)@zip(c[::2],c[1::2])]
@r:print"".join(l)""".replace("@","for l in ")

Wypróbuj online!

TFeld
źródło
Możesz zastąpić dwupoziomowe wcięcia pojedynczą tabulacją i zapisać trzy bajty.
Jonathan Frech,
365 bajtów.
Jonathan Frech,
364 bajty.
Jonathan Frech,