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


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.