現在、CodinGameでみんなで問題といてみませんかコンテストをやっていて、そのお題がこちら
た、たいしたことはない。(嘘です。google翻訳にかけたあとも問題文の読解をあきらめかけました。)
問題の内容
n枚のコインをt回投げた結果から、コインの表裏に書かれた数字を答えてください。
コインの表裏に書かれる数字の条件は偶数と奇数のペアでランダム。
書かれる数字は、1から2xnまでの整数でそれぞれ1回しか使わない。
答え方は奇数の数値のコインを昇順に並べた時、その裏のコインの数値をスペース区切りで表示。
どうです。サッパリわからないでしょう?
集合の説明
4 set()で集合にします。ここでは2 x nまでの偶数の値を集合
7 スペース区切りの数値の偶数をdieという変数に集合型で代入
9 a[dio](辞書型の値が集合型)その集合から、7行目で作成した集合を引いています。(存在した場合なくなります)
10 空の集合を作成
15 集合の和
17 集合の差(9行目と同じ)
20 集合をList化してその先頭を文字列化 ( str(List(a[i])[0]) )
解き方
コインが投げられた時
見えている奇数の裏に、見えている偶数はない。(ペアでないから)
奇数と偶数のペアが確定したら、その数値を確定として除外する。
最終的にペアが確定する。(問題は確定するように作成されています)
ロジックの説明
1 n,tの取得
2-4 aを辞書型にして、奇数の数値をキーに 値を存在する偶数を集合に設定
5-9 コインの数字を取得して、その中の奇数のキーの辞書から、その中の偶数を引く
10 okはペアの確定した偶数の集合
11-19 ペアが確定したら( a[key]の集合の数が1)okに加え、未確定ならば
現在のokを引いて絞り込み。未確定がなくなればループを抜ける
20 辞書のキーを昇順でまわして存在する偶数値をスペース区切りで表示
die dioはdice_even dice_oddのつもり。diceとcoinを勘違いして命名して気づかずcommit