トーナメントブラケットを構築する


13

空でない文字列の入力リストが与えられた場合、次の描画ルールに基づいて、トーナメントのASCIIアート表現を出力します。

  • 文字列の数は、量が保証されています 2,4,8,16,etc.
  • 最初の2つのストリングは互いに演奏し、次の2つのストリングは互いに演奏します。これは最初のラウンドです。
  • ゲームごとに、同じ確率で勝者をランダムに選択します。
  • 次のラウンドでは、最初のゲームの勝者が2番目のゲームの勝者、3番目のゲームの勝者が4番目のゲームの勝者、というように続きます。後続のラウンドはパターンに従います。
  • 最終的には全体で1つの勝者がいます。
  • きれいに出力するには(必須)、すべての文字列の前にアンダースコアを付加する必要があります_
  • ブラケットを適切に整列させるために、各エントリは_そのラウンドですべて同じ長さになるようにパディングする必要があります。
  • 一貫性がある限り、パディングを追加するか追加するかを選択できます。
  • 代わりに、ラウンドごとではなく、すべての文字列を同じ長さになるように事前に追加することを選択できます。どちらがあなたのコードにとってゴルファーです。

さらなるルール

  • 文字自体が正しく並んでいる限り、先頭または末尾の改行または空白はすべてオプションです。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

都市の例['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__/


勝者の選択は、メルセンヌツイスターランダムにする必要がありますか、それとも疑似ランダムにすることができますか?
ザックゲイツ

@ZachGates 2つの「チーム」の間のチャンスが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υ²⎇‽²κ§υ⁺λλυ

他のすべてのチームについて、そのチームまたは前のチームの間でランダムに選択します。(チームが1つしか残っていない場合、空のリストが生成されることに注意してください。)

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

まだチームが残っている場合は、それらを結合してジグザグを描きます。

Aδθ

毎回ジグザグの長さを2倍にします。


リスト入力演算子が面白くなるようなケースがあると思いますか?
ASCIIのみ

@ ASCIIのみまあ、私は... ASCIIベン図の質問のためにそれを使用することもできました
ニール

:| 実装する価値があると思いますか?
ASCIIのみ

@ ASCII-onlyあなたができると思うか▷vS、とにかく何かのために。
エリックアウトゴルファー

2

Pythonの2379の 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 ")

オンラインでお試しください!


2レベルのインデントを1つのタブに置き換えて、3バイト節約できます。
ジョナサンフレッチ


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.