いろいろと仕事や作業の忙しかったところ、一段落したところで、「きゃらばと!オンライン」関連にて、仙台の知り合い宅へ遊びに行っていました。
仙台へ旅行ということで、一日は松島観光、一日はまったりと身内遊びして、騒ぎながら楽しんだ一泊二日の旅行でした。
詳細は関係者向け専用に後日公開する予定です。
問題)
カードの集合Uのうち、属性Aを持つものをX枚、属性Bを持つものをY枚、属性Cを持つものを(30−X−Y)枚取り出し、30枚のカードの束を作る。
(1)この問題の欠点を指摘し、妥当な解決案を示せ。
(2)上記を実現するアルゴリズムのうち、後戻りがないものを示せ。
この問題についても、関係者向け専用の詳細レポートの中で解答を示します。他に知りたい人がいたら直接ご連絡いただくか、blogにコメントください(ただし、レポート記述完了後の対応になります)。
レポート書き終わったんで、答えを示しておきます。
1:属性の重複が考慮されていないこと。属性A/B/Cの排他性については、何も言ってない。
解決方法は、属性が重複したカードについては、重複した属性のいずれかから選択し直す。
例えば、「属性Aかつ属性B」のカードを属性A、属性Bからそれぞれ選択して重複した場合、重複排除したカードは属性Aまたは属性Bのカードから選択する。
2:次のアルゴリズムによる。ただし、示された問題については、n=1,2,3とし、an=bnの条件で考える。
(1) 全てのグループについて、以下の処理を行う。
– グループnの枚数の範囲を[an, bn]とする。
– グループnのフラグが立っているカードの中からランダムに an 枚選ぶ。
– ここで、他のグループで選択されたカードと重複したカードの枚数を cn とする。
(2) (1)の結果を重複排除し、結合する。
(3) カードリストから(2)を取り除く
(4) 全てのグループについて、以下の処理を行う。
– グループnのフラグが立っているカードの中からランダムに bn – an + cn 枚選ぶ。
(5) (4)の結果を重複排除し、結合する。
(6) (5)の中から 30 – ((2)の枚数)枚ランダムに選び、(2)と合わせてデッキとする。