ABC299の振り返り
振り返りです。
import sys from io import StringIO input = lambda: sys.stdin.readline()[:-1] def test(f, data): stdin = sys.stdin stdout = sys.stdout sys.stdin = StringIO(data["in"]) out = StringIO() sys.stdout = out err = None try: f() except BaseException as e: err = e else: ans = out.getvalue() exp = data["out"] sys.stdin = stdin sys.stdout = stdout if err: raise err result = "AC" if exp == ans else "WA" print(f"{result}: expected: {exp}, output: {ans}") def test_all(f): for i, data in enumerate(eval(f'test_data{f.__name__[0]}'), 1): print(f"case {i}") test(f, data)A - Treasure Chest
やってみよう!
A
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
コンテスト中
正規表現殺しを意図したであろう設問ですが、細々確認する時間が惜しいのでこんな感じです。
def A(): input() S = input() a, b = [i for i, c in enumerate(S) if c == "|"] c = S.index("*") if a < c < b: print("in") else: print("out") test_all(A)結果:#40832394
振り返り
正規表現の練習。たまに触れないと忘れちゃいますね😩
正規表現構文もそうだし、reモジュールのsearch()
とmatch()
の違いとか。
結果:#41929387
自由欄
B - Trick Taking
略
関係ないですけど、1ヶ月以上空けて振り返って新鮮な気持ちで書いたコードが、当時のコンテスト中の提出と全く同じで、なんだか複雑な気持ちになりました。。 (成長してないと見るべきか、この問題に必要な知識は定着していて都度引き出し可能と見るべきか🤔)
C - Dango
やってみよう!
C
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
コンテスト中
コンテスト中の提出がこんな感じ。
- 連続した
o
の最大値を求める - 回答
-
が含まれない(=ans: -1):-1
o
が含まれない(=ans: 0):-1
- 上記以外:
ans
ここらへんの考え方をキレイに実装に落とし込めず、WA x 2となりました・・・(⬇のACコードも場当たり的に修正して分かりづらい😇)
def C(): N = int(input()) S = input() ans = -1 now = 0 for c in S: if c == "o": now += 1 else: ans = max(ans, now) now = 0 if ans != -1: ans = max(ans, now) print(ans if ans != 0 else -1) test_all(C)結果:#41999202
自由欄
振り返り:reモジュールを使う
A問題の振り返りでreモジュールを使ったのでここでも使ってみます。
⇛re.findall(pattern, string, flags=0)
考え方は同じで、
- 連続する
o
の個数の最大値が1以上かつ-
を含む:連続するo
の個数の最大値 - 上記以外:
-1
まぁまぁスッキリ書けました。
が、実は記憶ゼロで振り返ってやってみた時も大分ハマりました・・・。2ヶ月弱サボるとこの体たらく。。精進します!
結果:#42114972
自由欄
解説を見る
解説を見ます。
あ、split
・・・。その手があったか😭
あと「特定の文字を含む」はset
で一発判定できますね。
結果:#42115796
自由欄
D - Find by Query
略
結論から言うと二分探索なのですが、コンテスト中は「同じ文字が連続してない!にぶたん使えない!分からん寝る!」とあっさり諦めてしまいました。
そこでもうちょい粘って「二分探索に当てはめてみるとどうなるか」を考えてみれば、同じ文字が連続してなくとも適用できることに気づけたはず。
やるからには心身ともに万全のコンディションで臨むべきなのですが、最近は忙しさにかまけてセルフマネジメントができておらず、奇しくもAtcoderでそれば顕在化されてしまいました。
まずは生活リズムを整えるということと、ルーティンの有用性(毎週土曜のAtcoderの結果、というよりいかにして問題を解けたかor解けなかったかでコンディションが分かる)を再認識です。
と言いつつ、直近ではそのルーティンすらこなせてないのが問題です・・・