五目並べ (paizaランク B 相当)をpython3で解答・解説
模範解答を確認すると、自分とはかなり違うコードが載っていたので、頭の整理も兼ねて自分の解答・解説を公開します。
問題
こちらから確認できます(要ログイン)→https://paiza.jp/works/mondai/prob60/tic_tac_toe_9?language_uid=python3&t=31a0e4966a392e1aee45f2aef8281d41
考察
五目並べで決着が着くのはどんなときか?
五目並べで決着が着くパターンは大きく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の使用時間はどれくらい減るか?
はじめに
- 作者:カル・ニューポート
- 発売日: 2019/10/03
- メディア: 単行本(ソフトカバー)
ただ、SNSアプリの中には私にとって必要不可欠なものもあります。そこで、Twitter、Facebook、Youtubeの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)