Python (競技プログラミング) を勉強し始めて数か月(主に仕事後)しか経っていないため不適切な質問や非効率なコードが表示されているかもしれませんが、ご容赦ください。
完全に独学なため、常識的なことでも教えていただけると助かります。
こんな書き方がある、でも示していただけると嬉しいです。
以下に前提条件や試したことを書きます。
入力として
stockには、2種類の商品の在庫数
actには、stockに対する作業の種類 (subは在庫から商品を減らし、addは商品を増やす)
changeには、それぞれの作業におけるstockの変化量を示しており、それぞれリストに入っています。
出力として
在庫が減らす分、存在する場合は在庫数をカンマ区切りで出力し
どちらかの商品の在庫が足りない場合は"Not enough"を出力するとします。
("sub"の数だけ出力がある)
パターン1と2の場合は問題なく動きますが、np.allを用いたパターン3の場合は在庫数が負でも出力されます。
どうしてそうなるのかわからず、解決法を教えていただければ幸いです。
該当のソースコード
パターン1
html
1import numpy as np 2stock = [3,2] 3act = ["sub", "sub", "add", "sub", "sub"] 4change = [[1,2], [3,0], [3, 2], [2,1], [2,2]] 5ans = [] 6for a, b in zip(act, change): 7 tes = [] 8 for h, b2 in zip(stock, b): 9 tes.append(h-b2) 10 if a == "sub": 11 if all((x>=0 for x in tes)): 12 for e, (p, b2) in enumerate(zip(stock, b)): 13 stock[e] -= b2 #stockの個数を変更 14 ans.append(",".join([str(a) for a in stock])) 15 else: 16 ans.append("Not enough") 17 elif a =="add": 18 for e, (p,b2) in enumerate(zip(stock, b)): 19 stock[e] += b2 20for a in ans: 21 print(a)
出力
2,0
Not enough
3,1
Not enough
パターン2
html
1import numpy as np 2stock = [3,2] 3act = ["sub", "sub", "add", "sub", "sub"] 4change = [[1,2], [3,0], [3, 2], [2,1], [2,2]] 5ans = [] 6for a, b in zip(act, change): 7 tes = (np.array(stock)-np.array(b)).tolist() 8 if a == "sub": 9 if all((x>=0 for x in tes)): 10 for e, (p, b2) in enumerate(zip(stock, b)): 11 stock[e] -= b2 #stockの個数を変更 12 ans.append(",".join([str(a) for a in stock])) 13 else: 14 ans.append("Not enough") 15 elif a =="add": 16 for e, (p,b2) in enumerate(zip(stock, b)): 17 stock[e] += b2 18for a in ans: 19 print(a)'
出力
2,0
Not enough
3,1
Not enough
パターン3
html
1import numpy as np 2stock = [3,2] 3act = ["sub", "sub", "add", "sub", "sub"] 4change = [[1,2], [3,0], [3, 2], [2,1], [2,2]] 5ans = [] 6for a, b in zip(act, change): 7 tes = np.array(stock)-np.array(b) 8 if a == "sub": 9 if np.all(x>=0 for x in tes): #これが上手く動作していない? 10 for e, (p, b2) in enumerate(zip(stock, b)): 11 stock[e] -= b2 #stockの個数を変更 12 ans.append(",".join([str(a) for a in stock])) 13 else: 14 ans.append("Not enough") 15 elif a =="add": 16 for e, (p,b2) in enumerate(zip(stock, b)): 17 stock[e] += b2 18for a in ans: 19 print(a)'
出力
2,0
-1,0
0,1
-2,-1
回答2件
あなたの回答
tips
プレビュー