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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1041閲覧

様々な条件に対応し、点数を弾き出したい

ruuuu

総合スコア176

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/09/09 10:56

編集2020/09/10 11:46

既にご回答頂いている方もおり、大変申し訳ないのですが、仕様が明確でなくこのままでは回答して下さる方にも迷惑がかかってしまうと思い、一度質問を整理し書き直すことに致しました。
具体的な内容は以下の通りです。
・1~8番のチェック項目に対し、以下の表を元に、プログラム側で引っかかったチェック項目の数、組み合わせと照らし合わせ、最終的な点数を算出する。

表1
|番号|チェック項目|点数(単体)|重み
|:--|:--:|--:|
|1|チェック項目1|75|2
|2|チェック項目2|45|6
|3|チェック項目3|70|2
|4|チェック項目4|40|8
|5|チェック項目5|45|6
|6|チェック項目6|48|5
|7|チェック項目7|60|4
|8|チェック項目 8|90|2

表2

条件点数(複合)重み
2 + 71210
5 + 6408
1 + 3673
7 + 3555

表3

重みの基準算出ポイント
1~3010
31~408
41~456
46~555
56~604
61~693
70~2

点数の算出基準なのですが、ベースとしては「最も低い点数」をベースの点数として設定したいと考えております。
単純に、「番号5」のチェック項目に該当した場合は、単体の点数「45点」ですが、「番号7」「番号1」の2つのチェック項目に引っかかったら、最も低い点数が設定されている「番号7」をベースの点数として考えるといった形です。
ベースの点数とは何かと申しますと、その点数を基準に、他のチェックに該当した番号の「重み」の値を引く為の点数です。
こちらにつきましては、後述させて頂く部分で例も交えより詳しく説明させて頂きます。
そして、表2に関してなのですが、こちらは特定の番号の組み合わせで、チェックに引っかかっていた場合に、単体のベースとなる点数より値が小さくなるよう、設定をした表になります。
例えば、「番号2」と「番号7」の2つが該当した場合、表1では2つの内最も低い点数が設定されている「番号2」の「45点」 - 「番号7に設定した重み」が点数となりますが、表2に組み合わせとして設定されていた場合、表2の点数が採用され、「12」となるといった形です。
ここで「重み」に関してなのですが、これはベースとなる点数が確定した後、他にチェック項目に該当した番号についている重みとなる値をベースの点数から「引く」為です。
以下は、様々なケースによって考えられる算出例になります。

  • ケース1

番号「7、2、5、6、1」が該当した場合、表2では「 7 + 2」「5 + 6」の組み合わせがありますが、この組み合わせの中で最も点数が低く設定されているのは、「 7 + 2」の組み合わせである「12点」です。表1の方でも、「番号1」を確認すると点数は「75」となっている為、ベースとなる点数は「12点」に確定します。
そこから、「 5 + 6」の重みである「8」そして、「番号1」の重みである、「2」を引き、最終的な点数は「12 - 10 = 2」となります。
ここで、重みは表3に設定した点数によって決めたいと考えている為、番号「5」と番号「6」の重みを別々と考え、それぞれの重みである「6」と「5」を足した値を引かずに、「5 + 6」の組み合わせとして設定されている「40点」の重みである「8」を重みと数えることとしています。

  • ケース2

番号「1,5,8」が該当する場合、表2ではどの組み合わせも設定されていない為、表1の中で一番低い点数として設定されている、番号「5」の「45点」をベースとし、そこから番号「1」の重みの「2」、番号「8」の重みの「2」を引き「45 - 4 = 41」となり、最終的な点数は「41」となります。      

  • ケース3

番号「5,6,4」の場合、表2で「 5 + 6」の組み合わせである「40」点と表1の4番の「40」点が被りますが、どちらをベースの点数に設定しても、重みが同じな為、最終的には「40 - 8 = 32」となる為、どちらをベースに設定しても良いと考えております。

仕様につきましては、以上となります。
不明確な部分などありましたら、適宜ご指摘頂けましたら幸いです。
ご助言の程、よろしくお願いします。

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

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

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

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

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

tiitoi

2020/09/09 11:06 編集

「該当番号 1,3,6 -> 11点」のような例をもう何例かいただけますか? 点数の一覧は単体と複合のみですか?それとも 1+3+5とかのパターンもありますか?
sfdust

2020/09/09 11:11 編集

「2番目の表はある条件が重なった時だけ、点数が変わる」について、たとえば1と4が該当した場合、最終的な点は、100点ですか?それとも、28点ですか?
swordone

2020/09/09 11:10

> 仮に、番号「6」が該当し、番号「1」と番号「3」が該当した場合、最終的には「11」点となります。これはより低く設定されている点数(番号6)と「番号1」と「番号3」が存在しそれぞれ「2点」分引かれている為です。 「6のみ」の15点よりも、「6と3」の10点のほうが低いのでは?
1T2R3M4

2020/09/09 11:17 編集

1,4,7の場合4の30か7+1の30のどちらを取るのでしょうか。 また、 2,8の場合はどうなりますか。
ruuuu

2020/09/09 11:14

情報が不足していて、すみません。 > 1+3+5とかのパターンもありますか? はい。この場合、「1 + 3」の組み合わせが、「20」その他一つ該当しているので、そこから2点引き、最終的には、「18」点と計算したいと考えております。
tiitoi

2020/09/09 11:18

「1+3+5とかのパターンもありますか?」 というのは1,3,5の3つ揃って30点みたいなパターンがありますかという意味で聞きました。それとも点数表は質問欄に書いてあるもののみという認識でよろしいですか?
ruuuu

2020/09/09 11:18 編集

> 「2番目の表はある条件が重なった時だけ、点数が変わる」について、たとえば1と4が該当した場合、最終的な点は、100点ですか?それとも、28点ですか? 「1」と「4」が該当した場合、2番目の表の組み合わせでは設定していない為、1番目の表のより低い点数の4番の「30」点そして、他一つの該当で、「-2点」、最終的には、「28点」したいと考えております。
ruuuu

2020/09/09 11:23 編集

> というのは1,3,5の3つ揃って30点みたいなパターンがありますかという意味で聞きました。それとも点数表は質問欄に書いてあるもののみという認識でよろしいですか? すみません。こちら不確定な情報で申し訳ないのですが、いずれかは拡張させ、3つ以上のパターンにも対応させたいと考えております。
ruuuu

2020/09/09 11:28 編集

>「6のみ」の15点よりも、「6と3」の10点のほうが低いのでは? こちらですが、より多くのチェック項目に引っかかった場合、点数はより低く設定するように作成したいと考えております
tiitoi

2020/09/09 11:31 編集

1,3,6なら該当するのは以下になると思いますが、どういう計算をしたら11点になるのでしょうか? [1] 70点 [3] 50点 [6] 15点 [1, 3] 20点 [3, 6] 10点
ruuuu

2020/09/09 11:33

> 1,4,7の場合4の30か7+1の30のどちらを取るのでしょうか。 2番目の表の条件には合致していないため、1番目の表の一番低い4番の「30」点から、他に該当した2つの項目を「-2点」とし、最終的には「26」点になります。 > 2,8の場合はどうなりますか。 2番目の表の条件に当てはまるので、「40」点となります
ruuuu

2020/09/09 11:34 編集

> 1,3,6なら該当するのは以下になると思いますが、どういう計算をしたら11点になるのでしょうか? すみません。 3.6の部分の組み合わせの点数に誤りがありましたので、先ほど修正致しました。
ruuuu

2020/09/09 11:38

きちんとお伝えせず、申し訳ありません。 「1,3,6」こちらの組み合わせですと、より低い組み合わせが優先される為、「3 + 6」の12点、そして、他に該当している「1番」は「-2点」と考えますため、「12 - 2 = 10」点となります。
tiitoi

2020/09/09 11:53

なんどもすみませんが、 > 1,4,7の場合 [1] 70点 [4] 30点 [7] 35点 [1, 7] 30点 となりますが、なぜ[1,7] の30点より[4]の30点が選ばれるのでしょうか? > 1,3,6の場合 [1] 70点 [3] 50点 [6] 15点 [1, 3] 20点 [3, 6] 10点 となりますが、一番低い[3, 6]が選ばれたとして、-2されるのは単純に選んだ点数で使わなかった数字の数 * -2 ということですか? > 2.8 の場合 [2] 40点 [8] 65点 [8, 2] 40点 となりますが、なぜ[2] の40点が選ばれて、使わなかった数字(8)の個数 * -2 で38点となるのではなく、[8, 2] 40点が選ばれるのでしょうか?
tiitoi

2020/09/09 11:56 編集

仕様が不明確なので他の回答者さんも回答できない状況と思います。 こちらで仕様を類推してコードを回答しても質問者さんの意図と違うということになりかねないので、もう少し仕様を箇条書きでも、フローチャートでもいいので整理されてはどうでしょうか? ロジックをどうコード化すればいいかわからないという質問をする場合、競プロの問題のように 問題文に矛盾なく条件が定義されていて、入力例と出力例がいくつか記載されていることが必要です。 望ましい問題例の書き方: https://atcoder.jp/contests/abc085/tasks/abc085_c
ruuuu

2020/09/09 12:01 編集

いえ...自分の質問が分かりにくい為に、何度もご確認頂いてすみません。 > となりますが、なぜ[1,7] の30点より[4]の30点が選ばれるのでしょうか? すみません。こちらの部分自分も未だ考えていなかった部分でした。 今、考えてみたのですが、チェック項目に多く引っかかっている為に、「1 ,7」の方を優先せずに、1番目の表の「4」の点数を優先し、30 - 4 = 26の方が良いと考えております。
ruuuu

2020/09/09 12:02

> となりますが、一番低い[3, 6]が選ばれたとして、-2されるのは単純に選んだ点数で使わなかった数字の数 * -2 ということですか? はい。そのようにしたいと考えております
ruuuu

2020/09/09 12:03

> となりますが、なぜ[2] の40点が選ばれて、使わなかった数字(8)の個数 * -2 で38点となるのではなく、[8, 2] 40点が選ばれるのでしょうか? すみません。ここの部分も考えついていない部分でした。
ruuuu

2020/09/09 12:05 編集

一度、こちらの質問は閉じ、再度整理をし、質問した方が良ろしいでしょうか...?
mjk

2020/09/09 12:05

>>いずれかは拡張させ、3つ以上のパターンにも対応させたい それを想定することも今回の要件ということですか? 実際にはもっと多いチェックや条件、例えば9番以降のチェックや条件が沢山あるのでしょうか? 質問文から混乱して質問しているようですがまさかと思いますが実務の開発案件では無いですよね? inputとoutputの全パターンを列挙したものや現状考えられる要件全てを先に提示した方が回答がつきやすいと思いました。
ruuuu

2020/09/09 12:06

> inputとoutputの全パターンを列挙したものや現状考えられる要件全てを先に提示した方が回答がつきやすいと思いました。 おっしゃる通りです。要件に穴がありすぎました...
ruuuu

2020/09/09 12:07

正直現状、自分でも収集がつかなくなってしまっております... どうしたら良いでしょうか...?
ruuuu

2020/09/09 12:10

色々とご確認頂いており、申し訳ないのですが、一度きちんと聞きたいことを整理し、再度質問させて頂きたく思います。
mjk

2020/09/09 12:10

ここのコメントを見ると余計に混乱すると思うので落ち着いて深呼吸してぐっすり睡眠を取りましょう。 時間を置いて要件整理するなり実務なのだとしたら誰かに相談しましょう。 整理がついて質問を編集すれば回答がつくと思いますよ。
ruuuu

2020/09/09 12:14

> 整理がついて質問を編集すれば回答がつくと思いますよ。 ありがとうございます。再度きちんと質問を整理し、編集したいと思います。
tiitoi

2020/09/09 12:15

たぶん仕様が明確になっていないのが点数算出部分だと思うので、スコア表からマッチした行をとってくるコードだけ回答しました。 点数算出方法はもう一度ゆっくり考えてみてください
ruuuu

2020/09/10 01:39 編集

ありがとうございます。 きちんと仕様が明確になるように整理したいと思います。
ruuuu

2020/09/10 09:28

質問の方、大幅に改善致しました。 tiitoiさんに頂いていたご指摘の、組み合わせの表の点数と、単体の点数が同じだった場合はどちらを優先するかといった部分は、重みを設定することで、解決することにしました。 点数なども見直した為、ほとんど前回の質問とは変わった形になってしまい大変申し訳ないのですが、一度お目を通して頂けましたら幸いです。
guest

回答1

0

ベストアンサー

点数表を作成して、1, 5, 7 のように該当する番号を入力したら、点数表からマッチした行を抽出する部分までコードを書きました。

ここからどう最終的な点数を算出するかは質問者さんが考えてください

import itertools import numpy as np import pandas as pd # 番号は順不同なので、set で作成する scores = pd.DataFrame( { "番号": [{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {1, 3}, {1, 7}, {3, 6}, {2, 8}], "点数": [70, 40, 50, 30, 90, 15, 35, 65, 20, 30, 12, 40], } ) def get_match_scores(*args): max_len = scores["番号"].apply(len).max() # 点数表のパターンの最大の長さ # パターンを列挙する patterns = [] for r in range(1, max_len + 1): for p in itertools.combinations(args, r): patterns.append(set(p)) # 該当するパターンの点数を抽出する matches = scores[np.isin(scores["番号"], patterns)] return matches matches = get_match_scores(2, 8) print(matches) matches = get_match_scores(1, 5, 7) print(matches)

点数表

番号点数
0{1}70
1{2}40
2{3}50
3{4}30
4{5}90
5{6}15
6{7}35
7{8}65
8{1, 3}20
9{1, 7}30
10{3, 6}12
11{8, 2}40

入力: 2.8

出力:

番号点数
{2}40
{8}65
{8, 2}40

入力: 1, 5, 7
出力:

番号点数
{1}70
{5}90
{7}35
{1, 7}30

投稿2020/09/09 12:10

編集2020/09/09 12:14
tiitoi

総合スコア21956

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

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

ruuuu

2020/09/18 02:39 編集

ご回答ありがとうございます。 頂いたご回答を元に、get_match_scoresメソッドに色々と付け足すなどのカスタマイズを行い、実装を行う事が出来ました。 業務で使用しているという都合もあり、回答に記載することは出来ないのですが、ご回答頂き助かりました。 今回は、こちらのご回答をBAとして、質問を閉めせて頂きたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問