『AtCoder Beginner Contest 126』A~CをPythonで解いた

けっこう久しぶりのはてぶです
定期的に書く習慣がつかないままフェードアウトしそうだったので慌てて書きました

第一印象

A:K文字目をlower()して切り貼りすればよさそう
B:if-elseの範囲分けを脳内でイメージしようとして無理で泣いた
C:例1が親切すぎて光明が見えた(のちに2つのWAを返していただくこととなる)
D:自分で7頂点の例作って考えてみたら塗分け出来なくて「???」ってなって終わった
E:完全に理解した、あとはプログラムにするだけだ(完全に理解していない)
F:10進数のXOR、そんなんもおったなぁそういえば(逃)

我ながら身の丈に合った3完と言えるでしょう...



A - Changing a Character

すべて英大文字の文字列のK番目だけを小文字にする問題

Pythonは文字列のインデックス指定ができるので
K文字目まで、K文字目を抜き出してlower()関数で小文字にしたやつ、K+1文字目以降
を貼り合わせます

n, k = map(int, input().split())
s = input()

print(s[:k-1] + s[k-1].lower() + s[k:])

B - YYMM or MMYY

長さ4の数字列がMMYY記法、YYMM記法になり得るかを判定する問題
キレイなif-elseの入れ子構造が分からず
前2桁、後ろ2桁がそれぞれ1-12か13-99かを見て「どちらにもなる」「MMYY」「YYMM」「どちらでもない」の4パターンを条件分としてべた書きしたところWA...
親切に例3に'1700'があるのに、'0012'のように00があってもイケる可能性を完全に見落としてました

s = input()
former, latter = int(s[:2]), int(s[2:])

if 1 <= former <= 12 and 1 <= latter <= 12:
  print('AMBIGUOUS')
elif 1 <= former <= 12 and (latter == 0 or 13 <= latter <= 99):
  print('MMYY')
elif (former == 0 or 13 <= former <= 99) and 1 <= latter <= 12:
  print('YYMM')
else:
  print('NA')

C - Dice and Coin

例1の説明が親切だったので方針がすぐ見えた方が他にもいらっしゃったと思います
N(サイコロのマックス目)がK(目標スコア)より小さい時
1からNまでの各出目ごとに、コインの表を出し続けなければならない回数を計算し、各目の確率を全て足し合わせていきます
NがKより大きい時
K以上の目を出せば一瞬で勝つので、K未満の目において上記の計算を行い、「K以上の目が出る確率」と足し合わせればよいです

n, k = map(int, input().split())

win_prob = 0

import math
if n < k:
  for i in range(1, n+1):
    win_prob += 0.5 ** math.ceil(math.log2(k / i))
  print(win_prob / n)
else:
  for i in range(1, k):
    win_prob += 0.5 ** math.ceil(math.log2(k / i))
  print(win_prob / n + (n - k + 1) / n)

例題では分数として計算し終わってから割り算して小数点にしていましたが、このやり方だと逐次的に小数を足していきます
競プロで誤差の許容範囲という概念に初めて出くわし、びびりながら書きましたが何ともなかったので良かったです


雑記

最近は東大の大学院を1年休学して(株)ABEJAでインターンしてます
マジで楽しいんですが、お笑い芸人かミュージシャンになりたいです
この話はまた近々書こうかな...

まだ競プロの勉強時間を全く取っていないので、レートが頭打ちになったら頑張ります