実現したいこと
カードの数字の積の最大値を求めたい
前提
Nはカードの枚数(2 <= N <= 10)
CにN個の数字がスペースで区切られて入力されます。(-5 <= c <= 5)
そのカードの中から2枚取り出し(card_a, card_b)、
片方の数から1を引いて、もう片方の数に1を加えます。
(card_a-1, card_b+1)
そしてcard_a,とcard_bと残りのカードの数の積を求めます。
この積の最大値を求めたいです。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "Main.py", line 12, in <module> l.append(card_a* card_b* copylist[0]* copylist[1]* copylist[2]) IndexError: list index out of range
l.append(数式)の部分がエラーになっているようです
C = [-3,-1,-5,1,2]
の場合に正しい結果(0)を導き出せない問題があります。
該当のソースコード
Python
1# coding: utf-8 2import math 3N = int(input()) 4C = [c for c in map(int,input().split(" ")) if 2 <= N <= 10 and -5 <= c <= 5] 5l = [] 6for card_a in C: 7 copylist = C.copy() 8 copylist.remove(card_a) 9 card_a -= 1 10 for card_b in copylist: 11 copylist.remove(card_b) 12 card_b += 1 13 l.append(card_a* card_b* math.plod(copylist)) #変更 14print(max(l))
試したこと
元のリストCをコピーして、card_a, card_bをremoveメソッドで削除しました。
コピーしたリストには3つの数字が残っているはずなのですが、
なぜかcopyist[2]と書くとout of rangeになってしまいます。
12行目にprint(copylist)を追加すると
[5, 1, -4]
[5, -4]
このように二つリストが表示されます。
朝から色々試行錯誤していますがこの原因が全く分からないので困っています。
> l.append(card_a* card_b* copylist[0]* copylist[1]* copylist[2])
ここで、なぜ、「残りのカード」を3枚(0~2)固定としているのでしょうか?
N は 5 と決まっているのですか?
確かにそうですね!入力値を固定したまま試行錯誤していました!
import math
l.append(card_a* card_b* math.prod(copyist))
↑このように変更したらC = [1,2,3,4,5]の場合に正しい答え(⭕️192)を出せたのですが、
C = [-3,-1,-5,1,2] のような場合に間違えてしまいます。(❌80→⭕️0)
他にもおかしいところがあるみたいです...
こちらでは、C = [-3,-1,-5,1,2] の場合を変更後のコードで実行すると正しく 80 という結果が返ります。
失礼しました。正答が「0」になるようなのですが、
80が出てしまうという事ですね。
マイナスが3つあるので単純に積はマイナスになるのですが、
-1に対して1を加えて0にすることで
最大値が「0」になるという事だと思うのですが、
このプログラムだとその結果が出せないようです...
お手数ですみません、読み間違いをしていました。
デバッグしてどのような時に80となるのか調べてみたらいいと思うのですが。
また、can110さんの回答は確認されましたか?