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

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

ただいまの
回答率

90.51%

  • Python

    7987questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 194

suisosui

score 2

 前提・実現したいこと

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/05/21 22:41

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

    キャンセル

  • hayataka2049

    2018/05/21 22:52

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

    キャンセル

  • suisosui

    2018/05/21 23:31

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

    キャンセル

回答 4

+1

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

前回値= ○でも×でもない値 # 前回の入力値○or×
連続数 = 0                 # ○or×の連続数
while 繰り返し数:
    # 入力
    現在値 = input('○ or ×:')
    # 入力値が○or×か適切に判定する

    if 現在値 != 前回値:    # ○or×に切り替わった
        前回値 = 現在値
        連続数 = 1
    else:                  # 連続している
        連続数 += 1

    # ○または×が5回連続した
    if 連続数 >= 5:
        # 現在値から○or×どちらが連続したか分かる
        # それにおうじて処理する
        連続数 = 0 # 連続数をリセット(でよい?)
        前回値 = (どうしたらいいだろう?)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

inputを受け付ける処理は省略
○なら1、×なら-1に変換したリストがある前提
pandas,numpyのインポート省略

df=pd.DataFrame(np.array(inlist).reshape(len(inlist),1))
score1=np.sum(inlist)
df['renzoku']=df.rolling(window=5).sum()
df['5kai']=0
df.loc[df['renzoku']%5==0,'5kai']=1
score2=np.sum(df['0']*df['5kai'])*3
total_score=score1+score2

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

繰り返し回数 = 1000
得点 = 0
カウンタ = 0

前の結果 = None
連続カウンタ = 1

while カウンタ < 繰り返し回数:
    結果 = 結果を得る()
    if 結果 == "○":
        得点 += 1
    else:
        得点 -= 1

    if 前の結果 == 結果:
        連続カウンタ += 1        
    else:
        連続カウンタ = 1

    if 連続カウンタ == 5:
        if 結果 == "○":
            得点 += 3
            繰り返し回数 += 1
        else:
            得点 -= 3
            繰り返し回数 -= 1
        連続カウンタ = 1

    前の結果 = 結果
    カウンタ += 1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

import random

roop_num = 1000
memory = []
point = 0

def add_memory(memory, choice):
    """
    listに何も収納されていなければ無条件でchoiceを追加
    listに要素が存在すれば、末尾の要素を確認してchoiceと同じであれば追加
    そうでなければ要素を全て削除

    """
    if not memory:
        memory.append(choice)
    elif memory[-1] == choice:
        memory.append(choice)
    else:
        del memory[:]

#whileに条件式を書くよりもifにbreak条件を書いた方が個人的にはわかりやすい
while True:
    choice = random.choice(["〇", "×"])
    add_memory(memory, choice)

    if choice == "〇":
        #choiceが〇で尚且つmemoryの要素数が5以下だった時
        if len(memory) < 5:
            ...
        #choiceが〇で尚且つmemoryの要素が5以上だった時
        else:
            ...
    else:
        #choiceが×で尚且つmemoryの要素数が5以下だった時
        if len(memory) < 5:
            ...
        #choiceが×で尚且つmemoryの要素が5以上だった時
        else:
            ...

    roop_num -= 1

    if roop_num == 0:
        break

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7987questions

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