Построить турнирную сетку


13

Учитывая входной список непустых строк, выведите художественное представление турнира в формате ASCII на основе следующих правил рисования:

  • Количество строк гарантированно должно быть количеством 2,4,8,16,etc.
  • Первые две строки играют друг друга, а следующие две играют друг друга, и так далее. Это первый раунд.
  • Для каждой игры выбирайте победителя случайным образом с равной вероятностью.
  • В следующем раунде победитель первой игры играет победителя второй игры, победитель третьей игры играет победителя четвертой игры и так далее. Последующие раунды следуют шаблону.
  • В конечном итоге есть один победитель.
  • Для красивого вывода (обязательно) все строки должны быть предварительно добавлены и дополнены подчеркиванием _.
  • Для того чтобы скобки выстроились соответствующим образом, каждая запись должна быть дополнена, _чтобы все были одинаковой длины для этого раунда.
  • Вы можете выбрать, будет ли дополнение или дополнение добавлено, при условии, что оно соответствует.
  • Вместо этого вы можете выбрать предварительную вставку всех строк одинаковой длины, а не для каждого раунда. Какой бы ни был игрок в гольф для вашего кода.

Дальнейшие правила

  • Начальные или завершающие символы новой строки или пробелы являются необязательными, при условии, что сами символы выстроены правильно.
  • Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Если возможно, укажите ссылку на среду онлайн-тестирования, чтобы другие люди могли опробовать ваш код!
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).

Примеры

Пример с городами ['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_____/

Пример с ['Lions', 'Tigers', 'Bears', 'Oh My']:

_Lions__
        \_Tigers_
_Tigers_/        \
                  \_Tigers_
_Bears__          /
        \_Bears__/
_Oh My__/


Должен ли выбор победителя быть случайным по Mersenne Twister или псевдослучайным?
Зак Гейтс

@ZachGates Если между двумя «командами» есть шанс 50 на 50, то любой метод, который вы хотите использовать, подойдет.
AdmBorkBork

Ответы:


6

Древесный уголь , 92 79 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Нужна пустая строка, чтобы отметить конец ввода. Объяснение:

A¹θ

Инициализируйте переменную q. Это держит размер зигзагов, то есть половину промежутка между рядами.

WS⊞υ⪫__ι

Читайте непустые строки ввода в массив u. Строки автоматически окружаются символом _s, когда они читаются, хотя они еще не заполнены.

Wυ«

Цикл, пока есть еще строки.

A⌈EυLκε

Рассчитайте ширину наибольшей строки в e.

A⁺θθδ

Рассчитайте разрыв между рядами в d.

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

Для каждой команды напечатайте отступы, напечатайте команду, а затем перейдите к следующей команде.

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

Для любой другой команды случайным образом выбирайте между этой командой или предыдущей командой. (Обратите внимание, что если осталась только одна команда, то это создает пустой список.)

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

Если еще остались команды, нарисуйте зигзаги, соединяющие их попарно.

Aδθ

Удвойте длину зигзагов каждый раз.


Как вы думаете, был бы случай, когда оператор ввода списка был бы выгоден?
Только для ASCII

@ ASCII-only Ну, я мог бы использовать его для вопроса ASCII Venn Diagram ...
Нейл

: | ты думаешь это стоит реализовать?
Только для ASCII

@ ASCII-только я думаю, вы можете сделать ▷vSили что-то для этого в любом случае.
Эрик Outgolfer

2

Python 2 , 379 364 байта

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 ")

Попробуйте онлайн!


Вы можете заменить свои двухуровневые отступы отдельной вкладкой и сохранить три байта.
Джонатан Фрех


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.