Construa um suporte de torneio


13

Dada uma lista de entrada de strings não vazias, produza uma representação artística ASCII de um torneio, com base nas seguintes regras de desenho:

  • O número de strings é garantido como sendo de quantidade 2,4,8,16,etc.
  • As duas primeiras cordas se tocam, e as próximas duas tocam e assim por diante. Esta é a primeira rodada.
  • Para cada jogo, escolha o vencedor aleatoriamente com igual probabilidade.
  • Para a próxima rodada, o vencedor do primeiro jogo joga o vencedor do segundo jogo, o vencedor do terceiro jogo joga o vencedor do quarto jogo e assim por diante. As rodadas subsequentes seguem o padrão.
  • Eventualmente, há um vencedor geral.
  • Para uma saída bonita (necessária), todas as seqüências devem ser anexadas e anexadas com um sublinhado _.
  • Para que os colchetes se alinhem adequadamente, cada entrada deve ser preenchida com _o mesmo comprimento para essa rodada.
  • Você pode escolher se o preenchimento é anexado ou anexado, desde que consistente.
  • Em vez disso, você pode optar por preencher previamente todas as seqüências de caracteres com o mesmo comprimento, e não por rodada. Qualquer que seja o golfista para o seu código.

Regras adicionais

  • Novas linhas à esquerda ou à direita ou espaços em branco são opcionais, desde que os caracteres sejam alinhados corretamente.
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • Se possível, inclua um link para um ambiente de teste on-line para que outras pessoas possam experimentar seu código!
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.

Exemplos

Exemplo com cidades ['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_____/

Exemplo com ['Lions', 'Tigers', 'Bears', 'Oh My']:

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


A seleção do vencedor deve ser aleatória de Mersenne Twister, ou pode ser pseudo-aleatória?
Zach Gates,

@ZachGates Desde que haja uma chance de 50 a 50 entre as duas "equipes", qualquer que seja o método que você queira usar.
AdmBorkBork

Respostas:


6

Carvão , 92 79 bytes

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

Experimente online! Link é a versão detalhada do código. Precisa de uma linha em branco para marcar o final da entrada. Explicação:

A¹θ

Inicialize a variável q. Isso mantém o tamanho dos zig-zags, ou seja, metade do espaço entre as linhas.

WS⊞υ⪫__ι

Leia linhas de entrada não vazias na matriz u. As linhas são automaticamente cercadas por _s à medida que são lidas, embora ainda não estejam preenchidas.

Wυ«

Faça um loop enquanto ainda houver seqüências de caracteres.

A⌈EυLκε

Calcule a largura da maior string em e.

A⁺θθδ

Calcule a diferença entre as linhas em d.

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

Para cada equipe, imprima o preenchimento, imprima a equipe e passe para a próxima equipe.

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

Para todos os outros times, escolha aleatoriamente entre o time ou o time anterior. (Observe que, se houver apenas uma equipe, isso produzirá uma lista vazia.)

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

Se ainda houver equipes, desenhe os ziguezagues juntando-os em pares.

Aδθ

Dobre o comprimento dos ziguezagues de cada vez.


Você acha que haveria algum caso em que um operador de entrada da lista seria adcantageous?
somente ASCII

@ ASCII-only Bem, eu poderia tê-lo usado para o ASCII questão diagrama de Venn ...
Neil

: | você acha que vale a pena implementar?
somente ASCII

@ Somente ASCII, acho que você pode fazer ▷vSou algo assim de qualquer maneira.
Erik the Outgolfer

2

Python 2 , 379 364 bytes

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

Experimente online!


Você pode substituir seus recuos de dois níveis por uma guia singular e salvar três bytes.
Jonathan Frech


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.