Construir un grupo de torneos

13

Dada una lista de entrada de cadenas no vacías, genera una representación artística ASCII de un torneo, basada en las siguientes reglas de dibujo:

  • Se garantiza que la cantidad de cadenas sea de cantidad 2,4,8,16,etc.
  • Las dos primeras cuerdas se tocan, y las dos siguientes se tocan, y así sucesivamente. Esta es la primera ronda.
  • Para cada juego, elige al ganador al azar con la misma probabilidad.
  • Para la siguiente ronda, el ganador del primer juego juega con el ganador del segundo juego, el ganador del tercer juego juega con el ganador del cuarto juego, y así sucesivamente. Las rondas posteriores siguen el patrón.
  • Eventualmente hay un ganador general.
  • Para obtener un resultado bonito (obligatorio), todas las cadenas deben estar antepuestas y anexadas con un guión bajo _.
  • Para que los corchetes se alineen apropiadamente, cada entrada debe rellenarse _para que todos tengan la misma longitud para esa ronda.
  • Puede elegir si el relleno está prepuesto o anexado, siempre que sea consistente.
  • En su lugar, puede optar por rellenar previamente todas las cadenas para que tengan la misma longitud, en lugar de por ronda. Lo que sea más golfier para su código.

Reglas adicionales

  • Las nuevas líneas iniciales o finales o espacios en blanco son opcionales, siempre que los caracteres se alineen correctamente.
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Si es posible, incluya un enlace a un entorno de prueba en línea para que otras personas puedan probar su código.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).

Ejemplos

Ejemplo con ciudades ['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_____/

Ejemplo con ['Lions', 'Tigers', 'Bears', 'Oh My']:

_Lions__
        \_Tigers_
_Tigers_/        \
                  \_Tigers_
_Bears__          /
        \_Bears__/
_Oh My__/
AdmBorkBork
fuente
Relacionados .
Okx
¿La selección del ganador tiene que ser aleatoria de Mersenne Twister, o puede ser seudoaleatoria?
Zach Gates
@ZachGates Mientras haya una probabilidad de 50-50 entre los dos "equipos", cualquier método que desee utilizar está bien.
AdmBorkBork

Respuestas:

6

Carbón , 92 79 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Necesita una línea en blanco para marcar el final de la entrada. Explicación:

A¹θ

Inicializa la variable q. Esto mantiene el tamaño de los zig-zags, es decir, la mitad del espacio entre filas.

WS⊞υ⪫__ι

Lea las líneas de entrada no en blanco en la matriz u. Las líneas se rodean automáticamente por _s a medida que se leen, aunque todavía no se rellenan.

Wυ«

Haz un bucle mientras aún queden cuerdas.

A⌈EυLκε

Calcular el ancho de la cadena más grande en e.

A⁺θθδ

Calcule la brecha entre filas en d.

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

Para cada equipo, imprima el relleno, imprima el equipo y luego baje al siguiente equipo.

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

Para cualquier otro equipo, elige al azar entre ese equipo o el equipo anterior. (Tenga en cuenta que si solo queda un equipo, esto genera una lista vacía).

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

Si aún quedan equipos, dibuja los zigzags uniéndolos en pares.

Aδθ

Duplique la longitud de los zigzags cada vez.

Neil
fuente
¿Crees que habría algún caso en el que un operador de entrada de lista sería ventajoso?
Solo ASCII
@ Solo ASCII Bueno, podría haberlo usado para la pregunta del Diagrama de Venn ASCII ...
Neil
: | ¿Crees que vale la pena implementar?
Solo ASCII
@ Solo ASCII Creo que puedes hacer ▷vSo algo por eso de todos modos.
Erik the Outgolfer
2

Python 2 , 379364 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 ")

Pruébalo en línea!

TFeld
fuente
Puede reemplazar sus sangrías de dos niveles con una pestaña singular y guardar tres bytes.
Jonathan Frech
365 bytes.
Jonathan Frech
364 bytes.
Jonathan Frech