質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3244閲覧

Python3  トーナメント表作成

python3_beginer

総合スコア46

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/04/14 05:23

編集2018/04/14 06:34

目標)
あるゲームのトーナメント表をつくたい

参加者全員の総当たりゲーム

引き分けは無し、必ず勝ちか負けかの判定がでる

参加人数は未定でN人とする

N=3のとき
参加者数: 3 (参加者 1 ~ 3)
結果報告:
参加者 1 と 3 が試合を行い、参加者 1 の勝利
参加者 1 と 2 が試合を行い、参加者 2 の勝利
参加者 2 と 3 が試合を行い、参加者 2 の勝利

コード トーナメント表結果の参考例 1 2 3 1 - L W 2 W - W 3 L L - 上記のように、勝者なら〇,敗者なら×を記入する形式 ''' 入力例1 3 1 3 2 1 2 3 出力例1 - × 〇 〇 - 〇 × × - '''

解き方)

コード まず、以下のようなトーナメント表をリストを利用して作成する - - - - - - - - - - - - - - - - - - - - - - - - - 次に入力例から取得した値を、上記のリストのindexに代入し、以下のような結果を表示したい - 〇 〇 〇 〇 × - 〇 〇 × × × - 〇 〇 × × × - × × 〇 〇 〇 -

問題)

上記の方法でコードを作成するも期待値と出力値がずれてしまった。

正しく出力するためには何が必要なのか教えて頂きたいです。

コード #プレイヤーの数 N = int(input()) #ゲームの結果表示のボード作成 data_1 = [ list('-'*N) for _ in range(N) ] print('\n'.join(map(' '.join, data_1))) # ゲームの結果 data = [ list(map(int,input().split())) for _ in range(N) ] x,y = zip(*data) print(x,y) #ゲームボードに、結果を代入する for a,b in zip(x,y): data_1[a-1][b-1] = 'W' data_1[b-1][a-1] = 'L' print('\n'.join(map(' '.join, data_1))) 出力値 - - - 〇 〇 - - 〇 - × - × - 〇 - × - × - - × 〇 - - - 期待値 - 〇 〇 〇 〇 × - 〇 〇 × × × - 〇 〇 × × × - × × 〇 〇 〇 -

#追記質問

ゲーム結果の組み合わせの処理が抜けているとご指摘を受けました。
組み合わせ処理を追記後、トーナメント表の結果の空欄部分に勝敗の結果を記載できた。
しかし、トーナメント表の同じ人間同士の結果にまで勝敗の結果が入ってしまった。
本来は、同じ人間同士のため結果表は'-'の表示のままにしたい。

重ね重ね申し訳ありません。原因がお分かりの方がいらっさいましたら教えて頂きたいです。

また、質問内容の記述が分かりづらい点がいくつかありまして申し訳ございませんでした。

コード import itertools #プレイヤーの数 N = int(input()) #ゲームの結果表示のボード作成 data_1 = [ list('-'*N) for _ in range(N) ] print('\n'.join(map(' '.join, data_1))) # ゲームの結果 data = [ list(map(int,input().split())) for _ in range(N) ] x,y = zip(*data) print(x,y) #ゲーム結果の組み合わせ data_trans = list(itertools.product(x,y)) x,y = zip(*data_trans) print(x,y) #ゲームボードに、結果を代入する for a,b in zip(x,y): data_1[a-1][b-1] = 'W' data_1[b-1][a-1] = 'L' print('\n'.join(map(' '.join, data_1))) 出力値 - 〇 〇 〇 〇 × × × 〇 〇 × 〇 × 〇 〇 × × × - 〇 × × × 〇 × 期待値 - 〇 〇 〇 〇 × - 〇 〇 × × × - 〇 〇 × × × - × × 〇 〇 〇 -

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/04/14 05:39

??? 1を引かないといけない理由がわからないということでしょうか?
Untitled_Sample

2018/04/14 05:53 編集

入力例1で対戦表が完成しても、勝敗まで渡され無いのですか?
Untitled_Sample

2018/04/14 05:43

解き方)の入力例1では、どうして、その様な対戦表ができるのですか?
LouiS0616

2018/04/14 05:53

『期待値』の出力を得るためには、N=5の対戦データが入力として必要な気がするのですが...
guest

回答1

0

ベストアンサー

組み合わせだからここでNC2の入力を取らないといけません(N=人数)。

python

1data = [ 2 list(map(int,input().split())) for _ in range(N) 3]

それ以外は恐らくできてるようです。

追記に関して

5人の総当たり対戦を例に考えるとして。下の図で*で示したセルの数のぶんだけ入力データが必要です。

python

1- - - - - 2* - - - - 3* * - - - 4* * * - - 5* * * * -

対角成分は無視するし、反対側は反転させるだけですからこれで良いのです。
*の数を数えると10ですね。だから5人対戦なら10回入力を取る必要があります。

python

1data = [ 2 list(map(int,input().split())) for _ in range(10) 3]

一般的なNに対しては、N人から2人取る組み合わせの数ですからNC2の入力を取らないといけません。ご理解いただけたでしょうか。

productを使った処理は不要です。というか訳のわからない結果になると思う。

投稿2018/04/14 06:02

編集2018/04/14 06:59
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

python3_beginer

2018/04/14 07:21

お返事ありがとうございます。 「対角成分は無視するし、反対側は反転させるだけですからこれで良いのです。 *の数を数えると10ですね。だから5人対戦なら10回入力を取る必要があります。」 こちらの説明のおかげで、対戦データを人数の二倍にする理由を理解できました。 レベルの低い質問で申し訳ないのですが、NC2というのはNの二倍を意味する表記ですか?
python3_beginer

2018/04/14 07:28

失礼致しました。優れたエンジニアになるために、勉強しなおしたいと思います。 ご指摘ありがとうございます。
hayataka2049

2018/04/14 07:44

あまり深刻に考える必要はありません。勉強頑張ってください。 参考に、nC2であればn*(n-1)/2としても計算できることを書いておきます。三角形の面積を出すという発想で考えるとわかりやすいと思います。とりあえずこっちで実装するというのも一つの手です(rangeの引数にfloatは渡せないので、intに型変換するか/の代わりに//を使うと良いと思います)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問