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

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

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

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

Q&A

解決済

4回答

1842閲覧

python 基礎的な問題 カウンタなど

suisosui

総合スコア8

Python

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

0グッド

0クリップ

投稿2018/05/21 13:04

前提・実現したいこと

・繰り返し回数は1000回
・一回行うたびに1、繰り返し回数を減らしていく。
・〇が出たときは+1、×が出たときは-1の得点を加算する。
・〇が5回連続したときは得点に+5点とさらに+3点を加える。
また、繰り返し回数を1回増やす。
・×が出たときも同様で、5回連続→-5点とさらに-3点
繰り返し回数は1回減らす。

というプログラムを作成しています。
while文とカウンタif文をつかって考えているのですが、5回連続した場合などにどのように実装したら良いのかわかりません。
C言語・C++・pythonのどの言語でもよいので、考え方や参考プログラムをお願いします。

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

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

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

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

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

hayataka2049

2018/05/21 13:41

この問題の出典はどこですか? Web上の問題ですか? それとも学校や研修の課題などですか?
hayataka2049

2018/05/21 13:52

あと、連続のときのルールがあいまいです。「+5点とさらに+3点」の+5点は「〇が出たときは+1」の+1とは別に加えるのですか? また、6回連続した場合は5回目のときと6回目のときでそれぞれ加点ですか? 5回連続したら問答無用でリセットですか?
suisosui

2018/05/21 14:31

授業で作成しているプログラムの一部分です。日本語がおかしくなってしまって申し訳ないです!「〇が出たときは+1」の+1が5回の+5点分と、さらに3点分というものです。また、5回連続した場合は加点→リセットです。よろしくお願いします。
guest

回答4

0

かなり技巧的な得点を計算する処理です。

python

1inputを受け付ける処理は省略 2○なら1、×なら-1に変換したリストがある前提 3pandas,numpyのインポート省略 4 5df=pd.DataFrame(np.array(inlist).reshape(len(inlist),1)) 6score1=np.sum(inlist) 7df['renzoku']=df.rolling(window=5).sum() 8df['5kai']=0 9df.loc[df['renzoku']%5==0,'5kai']=1 10score2=np.sum(df['0']*df['5kai'])*3 11total_score=score1+score2

○なら+1.×なら-1なので、数値化して合計すればベースの得点になります。ボーナス得点は連続5回という条件なので、DataFrameのrollingメソッドを活用して5回分のトータルを計算して、5の倍数の時だけ得点対象とするように0と1を設定します。最後に正負の符合を割り振って、合計したものに3を掛ければボーナス得点が得られます。

入力値がコンソールから与えられるなら、このようなコードにする必要はありませんが、乱数を生成するような場合は役に立つはずです。特に1万回試行した結果の得点分布を可視化したい場合、計算量が大幅に減ると思います

投稿2018/05/22 08:35

R.Shigemori

総合スコア3376

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

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

0

前回の入力値と○or×の連続数を保持するとよいです。
疑似コードで示します。
なお、6回以上○or×が連続した場合の仕様が不明ですので明確にする必要があります。

Python

1前回値= ○でも×でもない値 # 前回の入力値○or× 2連続数 = 0 # ○or×の連続数 3while 繰り返し数: 4 # 入力 5 現在値 = input('○ or ×:') 6 # 入力値が○or×か適切に判定する 7 8 if 現在値 != 前回値: # ○or×に切り替わった 9 前回値 = 現在値 10 連続数 = 1 11 else: # 連続している 12 連続数 += 1 13 14 # ○または×が5回連続した 15 if 連続数 >= 5: 16 # 現在値から○or×どちらが連続したか分かる 17 # それにおうじて処理する 18 連続数 = 0 # 連続数をリセット(でよい?) 19 前回値 = (どうしたらいいだろう?)

投稿2018/05/21 14:01

編集2018/05/21 14:42
can110

総合スコア38258

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

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

0

ベストアンサー

考え方の参考にしたいということなので、擬似コードを示します。と言いつつ、これ実際に走るんですが(必要なものを定義してあげれば)。

python

1繰り返し回数 = 1000 2得点 = 0 3カウンタ = 0 4 5前の結果 = None 6連続カウンタ = 1 7 8while カウンタ < 繰り返し回数: 9 結果 = 結果を得る() 10 if 結果 == "○": 11 得点 += 1 12 else: 13 得点 -= 1 14 15 if 前の結果 == 結果: 16 連続カウンタ += 1 17 else: 18 連続カウンタ = 1 19 20 if 連続カウンタ == 5: 21 if 結果 == "○": 22 得点 += 3 23 繰り返し回数 += 1 24 else: 25 得点 -= 3 26 繰り返し回数 -= 1 27 連続カウンタ = 1 28 29 前の結果 = 結果 30 カウンタ += 1

投稿2018/05/21 14:37

hayataka2049

総合スコア30933

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

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

0

不明な点がいくつかありますが、こんな感じでしょうか?
問題の5連続に出た時の処理ですが、何かしらの方法で記憶する必要があります。
今回はリストを使いました。

また処理が複雑に感じるなら関数などで分けてあげるとロジックを組みたてやすいです。

python

1import random 2 3roop_num = 1000 4memory = [] 5point = 0 6 7def add_memory(memory, choice): 8 """ 9 listに何も収納されていなければ無条件でchoiceを追加 10 listに要素が存在すれば、末尾の要素を確認してchoiceと同じであれば追加 11 そうでなければ要素を全て削除 12 13 """ 14 if not memory: 15 memory.append(choice) 16 elif memory[-1] == choice: 17 memory.append(choice) 18 else: 19 del memory[:] 20 21#whileに条件式を書くよりもifにbreak条件を書いた方が個人的にはわかりやすい 22while True: 23 choice = random.choice(["〇", "×"]) 24 add_memory(memory, choice) 25 26 if choice == "〇": 27 #choiceが〇で尚且つmemoryの要素数が5以下だった時 28 if len(memory) < 5: 29 ... 30 #choiceが〇で尚且つmemoryの要素が5以上だった時 31 else: 32 ... 33 else: 34 #choiceが×で尚且つmemoryの要素数が5以下だった時 35 if len(memory) < 5: 36 ... 37 #choiceが×で尚且つmemoryの要素が5以上だった時 38 else: 39 ... 40 41 roop_num -= 1 42 43 if roop_num == 0: 44 break

分岐の部分は実装していないので、ご自身で考えてみてください

投稿2018/05/21 14:30

編集2018/05/21 14:38
puroko3

総合スコア185

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問