読書・NBA・ポケモン

読書・ポケモン・NBA・統計学について書きます

五目並べ (paizaランク B 相当)をpython3で解答・解説

模範解答を確認すると、自分とはかなり違うコードが載っていたので、頭の整理も兼ねて自分の解答・解説を公開します。

考察

五目並べで決着が着くのはどんなときか?

五目並べで決着が着くパターンは大きく4通りに分けられます。すなわち、同じ記号が①横に5つ並ぶパターン、②縦に5つ並ぶパターン、③右上から左下へ斜めに5つ並ぶパターン、そして④左上から右下へ斜めに5つ並ぶパターンです。
 このうち③と④は、[横,縦]で石の配置を表すと、③については[0,0], [1,1], [2,2], [3,3], [4,4]に同じ記号が並ぶ場合のみ決着が着きます。また、④も[0,4], [1,3], [2,2], [3,1], [4,0]に同じ記号が並ぶ場合のみ決着が着きます。なので、if文を使ってこれらの位置の記号が同じかどうか調べるだけで、③と④で決着が着くかどうかがわかります。
 次にパターン①ですが、これで決着が着く記号の並び方は、同じく[横,縦]で表すと、たとえば[0,0], [0,1], [0,2], [0,3], [0,4]のように、横の数字iを固定した状態で、縦の数字が1~4とずらしていった位置に同じ記号が並んでいるときだとわかります。なので、2重にfor ループを回してあげればいいと考えました。
 最後にパターン②ですが、これで決着が着く記号の並び方は、同じく[横,縦]で表すと、たとえば[0,0], [1,0], [2,0], [3,0], [4,0]のように、縦の数字iを固定した状態で、横の数字が1~4とずらしていった位置に同じ記号が並んでいるときだとわかります。なので、これも2重にfor ループを回してあげればいいと思います。

解答

以上の考察を基に、書いたコードが次の通りです。

# coding: utf-8
# Your code here!

#勝負がついたかどうかを示すフラグを作る
match=False
#入力を二次元リストで受け取る
banmen=[]
for i in range(5):
    banmen.append(list(input()))
    
#左上から右下に5つ並んで勝つ場合
if banmen[0][0]==banmen[1][1]==banmen[2][2]==banmen[3][3]==banmen[4][4]:
    if banmen[0][0]==banmen[1][1]==banmen[2][2]==banmen[3][3]==banmen[4][4]==".":
        print("D")
        match=True
    else:
        print(str(banmen[0][0]))
    match=True
    
#右上から左下に5つ並んで勝つ場合
elif banmen[0][4]==banmen[1][3]==banmen[2][2]==banmen[3][1]==banmen[4][0]:
    if banmen[0][4]==banmen[1][3]==banmen[2][2]==banmen[3][1]==banmen[4][0]==".":
        print("D")
        match=True
    else:
        print(str(banmen[0][4]))
    match=True
    
else:
    #横に5つ並んで勝つ場合
    yoko5=[]    
    for yoko in range(5):
        for tate in range(5):
            yoko5.append(banmen[yoko][tate])
    
        if yoko5[0]==yoko5[1]==yoko5[2]==yoko5[3]==yoko5[4]:
            if yoko5[0]==yoko5[1]==yoko5[2]==yoko5[3]==yoko5[4]==".":
                print("D")
                match=True
            else:
                print(str(yoko5[0]))
                match=True
        yoko5=[]

    #縦に5つ並んで勝つ場合
    tate5=[]
    for tate in range(5):
        for yoko in range(5):
            tate5.append(banmen[yoko][tate])
        
        if tate5[0]==tate5[1]==tate5[2]==tate5[3]==tate5[4]:
            if tate5[0]==tate5[1]==tate5[2]==tate5[3]==tate5[4]==".":
                print("D")
                match=True
            else:
                print(str(tate5[0]))
                match=True
        tate5=[]
        
if match==False:
    print("D")

Python歴1週間の私が初心を忘れないうちにpaizaスキルチェック過去問題「野球の審判」の解答・解説をする

Pythonの勉強を初めて1週間の私が、初学者の気持ちを忘れないうちに、なるべく易しく「野球の審判」問題の解説・解答をします。
 私よりも先にまろ様が全く違う解説・解答を書いてくださっているので、そちらもご参照ください。
【解答付き】paizaのスキルチェック過去問題「野球の審判(Cランク)」を解説! | まろぶろぐ
 
 

問題

問題はこちらのリンクから読めます(要ログイン)。→https://paiza.jp/works/mondai/skillcheck_archive/umpire?language_uid=python3
 
 

方針

問題の条件のところに次のような記述があります。

投球はこの打者の番がちょうど終了するまで続きます。すなわち、最終的にこの打者にはアウトかフォアボールのいずれかが必ず与えられ、それ以降の投球はおこなわれません。

つまり、ストライクが合計3回か、ボールが合計4回入力されると、入力が終わるということです。なので、ストライクの数とボールの数を数えておき、ストライクが2回以下のときは「ストライク」、ストライクが3回以上になったら「アウト」、ボールが3回以下のときは「ボール」、ボールが4回以上になったら「フォアボール」を出力すればいいわけです。
 プログラミングの方針として、私は次のように処理を分解してみました。
 

プログラミングの方針

 
・入力の一行目の球数を取得する。
 
ストライクとボールの数を数えるために、0を値とする変数を2つ用意する。←個人的にポイントだと思うところ
 
・for ループを使って、入力の2行目〜N+1行目を受け取る。
 
・if 文を使って、入力が"ball"なのか"strike"なのか判定する。
 
・もし入力が"ball"なら、"ball!"を出力し、用意したボールを数える変数に1を足す。
 
・ただし、もしボールを数える変数が3以上のときに、"ball"が入力されたら、"ball!"の代わりに"fourball!"を出力する。
 
・もし入力が"strike"なら、"strike!"を出力し、用意したストライクを数える変数に1を足す。
 
・ただし、もしストライクを数える変数が2以上のときに、"strike"が入力されたら、"strike!"の代わりに"out!"を出力する。
 
 

プログラムを書く

で、実際に書いたコードが次のようなものです。

N=int(input())
 
strike=0#ストライクを数える変数を用意する
ball=0#ボールを数える変数を用意する
 
for i in range(N):
    word=input()
    if word=="ball":
        if ball>=3:
            print("fourball!")
        else:
            print("ball!")
        ball+=1#ボールを数える変数に1を足す。個人的にポイントだと思うところ2
 
    elif word=="strike":
        if strike>=2:
             print("out!")
        else:
            print("strike!")
        strike+=1#ストライクを数える変数に1を足す。個人的にポイントだと思うところ3

 
 

まとめ

というわけで、この解答のミソはストライクとボールを数える値0の変数をforループの前で用意することでした。初めてこのような作戦を見たときは「うまい方法があるもんだなぁ」と感心しました。その感動から、この解答が生まれたと言っても過言ではありません。
 

SNSアプリを消すとiPhoneの使用時間はどれくらい減るか?

はじめに

デジタル・ミニマリスト: 本当に大切なことに集中する

デジタル・ミニマリスト: 本当に大切なことに集中する

この本を読んで、自分がSNSを見過ぎており、余暇時間を有意義に使えていないのではないかと疑問を持つようになりました。そこで、この本で提唱されている「SNSアプリを全部消そう」を2020年3月16日から実践してみました。
 ただ、SNSアプリの中には私にとって必要不可欠なものもあります。そこで、TwitterFacebookYoutubeの3つを削除することにしました。この記事では、私がこれら3つのアプリを消すことによって、どれだけ「余暇時間におけるiPhone使用時間の割合」を減らすことができたかを、iPhoneの使用データを用いて検討します。
 結論を先に書くと「余暇時間におけるiPhone使用時間の割合」はSNSアプリ削除前の平均が29.719%、SNSアプリ削除後の平均が20.594%となり、iPhoneの使用時間が減少したことが分かりました。この結果は当然と思われるかもしれませんが、SNSアプリを消してもなお、iPhoneのウェブブラウザからSNSを見られたことを考えると意外性があるのではないでしょうか?

  • はじめに
  • 使用する生データについて
    • スクリーンタイム
    • 睡眠時間
    • ウォーキング+ランニングの距離
  • 注目する変数について
    • 余暇時間におけるiPhone使用時間の割合(%)
  • 分析
    • サンプルサイズ
    • データの確認
    • 平均値の比較
  • 考察
  • 反省
  • 終わりに
続きを読む

Bリーグ2019-20シーズンMIP(Most Improved Player)を勝手に決める

はじめに

コロナウイルスのせいで2019-20年のBリーグが終わってしまいました。それに合わせて、各スタッツのリーダーズが確定しました。
www.bleague.jp
しかし、まだMVP(最優秀選手)やMIP(Most Improved Player:最も成長した選手)ベストファイブの発表はされていません。そこで、今回の記事ではスタッツの分析を通じて、独自にMIPを決めたいと思います。どうして、MVPではなくて、MIPなのかって? それはプレータイムの伸び具合や後述するOffensive Efficiency(OE)の伸び具合を使えば、選手の成長具合を評価できると考えたからです。
 今回の分析では、推測統計は使わず、OEの伸び具合・プレータイムの伸び具合・PPGの伸び具合を散布図にプロットして、選手の成長を可視化し、MIPに相応しい選手を探すことを目標としました。結論を先に書くと、大阪エヴェッサの橋本拓哉がMIPに相応しいと私は思います。

  • はじめに
  • 考慮するスタッツ
    • Offensive Efficiency (OE)の伸び
    • プレータイムの伸び
    • 1試合の平均得点(point per game: PPG)とPPGの伸び
  • 分析
    • 使用するデータ
    • 散布図による成長の可視化
  • 引用文献
  • おまけ:分析に使ったコード(R)
続きを読む

富樫勇樹の今後1年のWikipediaの閲覧数を予測する――Prophetを用いた分析

○はじめに

Facebookが作ったProphetを用いて、Bリーグのスター選手である富樫勇樹選手のWikipediaの閲覧数を予測します。この予測を通じて、時系列分析の練習をするのが目的です。正直、予測そのものよりも、教師データの記述的な分析の方が読んでいて面白いと思います。

  • ○はじめに
  • ○データの取得&EDA
  • ○今後1年の閲覧数の予測
  • ○感想
  • ○おまけ(分析に使ったコード)
続きを読む

RでLightGBM――Titanicデータを例に

○この記事を書こうと思ったきっかけ

 RでLightGBMを使ったシンプルな分析が日本語ではほとんど公開されていなかったので、自分で作ろうと思いました。自分も間違っているところがあるかもしれないません。間違っているところはガンガン指摘してほしいです。
 データセットはこちらのタイタニックを使います(Titanic: Machine Learning from Disaster | Kaggle)。LightGBMを知っている方にはタイタニックの説明は不要かと思われますので、EDAやデータの説明は特にしません。

続きを読む

本当にBリーグにホームコートアドバンテージは存在するのか?――観客数の多い「チーム」に注目して

 先日、観客数が多いときに限って、得点にホームコートアドバンテージが存在するという記事を書いた。

morry0371.hatenablog.com

 しかし、観客数が多いチームは強いチームばかりなので、相手チームに勝つ可能性が高く、ホームチームとアウェイチームで得点に差が見られたという別の可能性がある。この記事では、この可能性について検討する。

  • 分析の方針
  • データセット
  • 分析
    • 観客数の分布と平均値・標準偏差
    • 観客数の多い試合を各チームが何試合行っていたか・観客数の多い試合を戦うチームの勝率は高いか 
  • まとめ
  • 反省
続きを読む