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

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

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

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

Q&A

解決済

3回答

471閲覧

paizaのゲームのレジのプログラミングの質問

alcot

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2018/02/02 01:06

編集2018/02/02 02:17

paizaのゲーム もし次の常駐先が女子エンジニアばっかりだったらで遊んでいます。一番上の数字が店にある商品の数で、次の3つの数字がその商品の単価、何個買ったら割引になるか、割引する値段です。
次の数字が客が幾つ商品を買ったかで、2つの数字が商品番号、個数です
合計幾らかを出力すればいいのですが
プログラムは書いたのですが実行できないし見ずらいしで良くわかりません。
なぜ実行できないのか、もっと綺麗に書けないのか添削お願いします

入力例1

2 20 5 10 45 6 40 2 1 6 2 12

出力例1

110 460

入力例2

4 30 2 10 55 5 40 100 1 2 25 10 25 6 1 1 2 1 3 3 1 3 2 9 4 52

出力例2

30 55 294 80 455 1175

試したコード

python

1A = int(input()) 2C_arr = [list(map(int,input().split())) for _ in range(A)] 3 4B = int(input()) 5D_arr = [list(map(int,input().split())) for _ in range(B)] 6 7for i in range(B): 8 if D_arr[i][1]>C_arr[int(D_arr[i][0])][1]: 9 print(C_arr[int(D_arr[i][0])][0]*D_arr[i][1]-((C_arr[i][1]/ C_arr[int(D_arr[i][0])][1])* C_arr[int(D_arr[i][0])][2])) 10 else: 11 print(C_arr[int(D_arr[i][0])][0]*D_arr[i][1])

エラーメッセージ

python

1Traceback (most recent call last): 2 File "Main.py", line 12, in <module> 3 if D_arr[i][1]>C_arr[int(D_arr[i][0])][1]: 4IndexError: list index out of range

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

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

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

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

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

guest

回答3

0

どのゲームで遊んでいるのかは知りませんが、paizaの利用規約には「外部のサイト等で問題の情報を公開するな」「カンニングするな」と言った旨の禁止事項が書かれているはずですよ。

実行できないときはエラーメッセージをよく読んで下さい。list index out of rangeと原因が書かれています。そしてその問題が発生した行までしっかり書かれています。初心者のミスは大抵エラーメッセージを見れば原因と発生箇所まで丁寧に書かれています。

投稿2018/02/02 01:19

masaya_ohashi

総合スコア9206

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

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

alcot

2018/02/02 12:19

ちゃんと利用規約5章17条見てどうぞ17条4項のチートデータ配布の所を拡大解釈すればそうなる可能性もあるけど要するにチートするなって事悔い改めて
退会済みユーザー

退会済みユーザー

2018/02/02 12:51

禁止行為:当社が許容する以外の行為 まずはこれだな(笑)
guest

0

綺麗に書けない(綺麗に見えない)のは、

  • マジックナンバーや意味をなさない変数名を多用している
  • 商品データを保持するデータの構造が使いにくい

の2点が大きいと思います。

綺麗に書いてなおかつ後々参照しやすいように商品データを保持しようとすると、例えばですが以下のようになります。

python

1_input = iter('''\ 22 320 5 10 445 6 40 5'''.splitlines()) 6def input(): 7 return next(_input) 8 9 10from collections import namedtuple 11 12 13n_products = int(input()) 14Product = namedtuple('Product', 'price volume discount') 15products = {} 16 17for ident in range(1, n_products + 1): 18 products[ident] = Product(*map(int, input().split())) 19 20 21print('データ全体:', products) 22print('商品1:', products[1]) 23print('商品1の価格', products[1].price)
データ全体: {1: Product(price=20, volume=5, discount=10), 2: Product(price=45, volume=6, discount=40)} 商品1: Product(price=20, volume=5, discount=10) 商品1の価格 20

ポイントは、

  • 商品は後々参照しやすいようにdictで保持する
  • 商品の情報はコードが意味をなすようにnamedtupleで保持する

です。

投稿2018/02/02 04:00

編集2018/02/02 04:01
YouheiSakurai

総合スコア6142

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

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

YouheiSakurai

2018/02/02 04:05

もしかするとvolume -> discount_unit、discount -> discount_priceの方が意味が通るかもしれません。
alcot

2018/02/02 12:33

ありがとうございます。 プログラム初心者なので半分位わかんない所がありますがそれは自分で調べて自身の能力向上につなげたいと思います。本当にどうしても分からない部分があればまたこのサイトで質問させてもらおうと思います。 ゲームは攻略本や攻略法を教えて貰ってクリアしても面白くはないので
YouheiSakurai

2018/02/02 13:44

良い心がけですね。頑張ってください。
guest

0

ベストアンサー

エラー内容通り

Python

1D_arr[i][1]>C_arr[int(D_arr[i][0])][1]

ここが問題でしょうね。int(D_arr[i][0])って、例えば

plain

12 220 5 10 345 6 40 42 51 6 62 12

i = 1の時って2ですよね?…前の質問と同じミスしていませんか…?

その後のロジックは読んでいません。申し訳ありませんが読む気がしません。

ご自身でわかってはおられるようですが、改行するなど、可読性を考慮したコーディングを改めてしていただきたいです。

追記

paizaの利用規約違反ではないかという話については、

Python 3.x - paizaのハッカソンで遊んでて分からない所あったので正解と解説下さいオナシャス(111294)|teratail

の方でやり取りがあったので、それを踏まえ「質問者様曰く規約違反にはならないサービス」だと仮定して回答しています。(つまり厳密に規約違反かは見ていません。)

> paizaのゲーム

だけでは具体的にどのサービスかわかりません。もし規約違反ではないサービスなのでしたら、誤解を防ぐためにどのサービスか明記すべきだと思います。

(追記されたので取り消し線をつけました。)

回答コード例

okrt様が掲示してくださったリンク先にコードの共有を歓迎する旨を確認しました。
作ってみたので参考までにどうぞ。大した量書く必要はないですよ。

python

1N = int(input()) 2items = [[int(i) for i in input().split()] for _ in range(N)] 3 4M = int(input()) 5purchases = [[int(i) for i in input().split()] for _ in range(M)] 6 7for p in purchases: 8 item,n = items[p[0]-1],p[1] 9 print(item[0]*n-item[2]*(n//item[1]))

投稿2018/02/02 01:17

編集2018/02/02 23:06
namnium1125

総合スコア2043

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

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

namnium1125

2018/02/02 03:15

「もし次の常駐先が女子エンジニアばっかりだったら」やってみました。面白そうですね。 ってそんなことはどうでもよくて、 通常のpaizaのスキルチェック問題だと解く前に「ネットで答え聞くな」といった旨の警告がバッチリ出るのですが、このゲームの場合出ないですね…ただ全体の利用規約を見る限り許される行為ではやはりなさそうです。 おそらくpaizaのスキルチェック問題を解いたことがある回答者がこの問題を見ると、「こいつカンニングしている!!」と思うこと請け合いです。 paizaの問題だというのは言わない方がいいと思いますよ。そしてバレない範囲で質問してください。(う〜ん、、この言い方だとカンニングを助長していることに…なってしまうんですかね?そんなつもりはないですが。) これくらいの問題の場合はpaizaと書かれていなくてもその手のサイトだとわかってしまうので、やっぱり頑張って自力で解く他ないと思います。 もう少し複雑な内容で、ピンポイントな内容なら(例えば「この関数がわからない」とか)、皆さん快く回答してくださると思います。
alcot

2018/02/02 12:29

スキルチェックの問題は答えを聞いたり助言を受けて回答するとその人のプログラミングスキルの評価がずれ 適切な転職及び仕事紹介ができないつまり会社の不利益になるため禁止しています。 オンラインゲームは会社の不利益にならずかつ利用規約5章17条禁止事項に (ヒントを求めるかつ答え又は解説を求める事を禁ずる)とは書いてません 4項を拡大解釈すればそうなる可能性もありますが要するにチートするなって事です。 利用規約も見ずにpaizaだから利用規約違反だと言う輩には言わせておけばいいのです。
退会済みユーザー

退会済みユーザー

2018/02/02 12:48

禁止行為:当社が許容する以外の行為 上記があるのでまずグレーなので運営の質問サイトで質問し解答してもいいのかの回答を提出してください。
LouiS0616

2018/02/02 12:56 編集

『利用規約も見ずにpaizaだから利用規約違反だと言う輩には言わせておけばいいのです。』 teratail利用規約第7条(禁止事項)に、次のようにあります。 > 登録ユーザーは、本サービスの利用にあたり、以下の各号のいずれかに該当する行為または該当すると当社が判断する行為をしてはなりません。 > [中略] > (5) 本サービスを通じ、以下に該当し、または該当すると当社が判断する情報を当社または本サービスの他の登録ユーザーに送信する行為 > [中略] > ・他人に不快感を与える表現を含む情報 輩って表現は随分攻撃的ですね。規約違反では?
okrt

2018/02/02 17:01

公式サイドから http://paiza.hatenablog.com/entry/2016/12/06/%E7%BE%8E%E5%B0%91%E5%A5%B3%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E8%82%B2%E6%88%90%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0%E3%80%8E%E3%82%82 >これまでのpaizaオンラインハッカソン同様、問題内容や回答コードについてブログ等で公開してもOK http://paiza.hatenablog.com/entry/2017/01/27/%E3%80%90%E8%A7%A3%E7%AD%94%E3%82%B3%E3%83%BC%E3%83%89%E5%85%AC%E9%96%8B%E3%80%91%E5%B8%B8%E9%A7%90%E5%85%88%E3%82%92%E5%A5%B3%E5%AD%90%E3%81%A0%E3%82%89%E3%81%91%E3%81%AB%E3%81%97%E3%81%9F%E3%82%A8 >もし女は回答コードや解法の公開・共有を歓迎しております とは言われてますね。 質問および添削依頼に関してまでは明記されてないかもしれませんが。
namnium1125

2018/02/02 23:00 編集

あのですね、実際に禁止かについて言っているわけではないのです。スキルチェックとゲームの違いぐらいは知っていましたよ。(ゲームの方コードの公開等が歓迎されているというのは流石に知りませんでしたが…) でもその違いを回答者全員が知っているとお思いですか? 「"paiza"と書くと『勘違い』される」ということが言いたいのです。どうしても"paiza"という単語を入れたければ今回みたいに毎度規約違反ではないことを言わなければならなくなりますよ? ネットをやっていると「事実がどうか」ばかり気にする人が多いですが、それよりも前に『事を荒立てない』というのも大切なことです。 最初のコメントはそういう意味で書きました。別に質問するなとは言っていません。"paiza"という単語は誤解を招くから書かない方がいいよというアドバイスです。 具体的にはタイトルには絶対に入れず、質問内容に"paiza"とどうしても書きたい時は規約違反ではないことをあらかじめ言う、それぐらいは必要だと思います。 ちょっとトゲのある言い方だったかもしれません。その点はすみませんでした。m(_ _)m
namnium1125

2018/02/02 23:00

> 利用規約も見ずにpaizaだから利用規約違反だと言う輩には言わせておけばいいのです でしたね。すみません前のコメントは思ったことをすぐに書いていたので気づきませんでした。 たしかにそうですが、前のコメントにも書いた通り『事を荒立てない』方が無難です。 どうか私としてはそれを重視していただきたいです。m(_ _)m
alcot

2018/02/02 23:05

そうですね面倒は嫌なので書かない様にします
okrt

2018/02/03 13:10

んー、私は逆に、質問するのであれば「この件に関しては回答公開OKだと公式が言っている」という情報元を質問者が提供するべきなのではないかと思っています。毎回混同されるよりは、毎回断り書きを入れるほうがマシじゃないかな、と。 別のゲームでも、その都度ブログかツイッターで言及されているはずです。 タイトルだけでなく内容もpaizaのことを避けて書く慣習になってしまうと、「一言で説明できないけど、前提条件をQiitaで丁寧に解説してくれてる人がいるから該当記事に乗っかったら楽だ」「でも該当記事はpaizaって書いてある」のような場合が面倒です。回答内容以外のことで回答候補者や閲覧者を悩ませる、困惑させるような事態は避けたほうが良いと思います。 別パターンとして、「自分が過去に解いた問題なので、具体的に問題の出処を書いてくれてたら早く回答できたのに勿体無い……」という可能性も。 ただし、公式の方針が今後変わることもあるかもしれないので、そこは注意する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問