振り返りです。

Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 299) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
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」ボタンをクリックしよう!

test_dataA = [ { "in":"""10 .|..*...|. """, "out": """in """ },{ "in":"""10 .|..|.*... """, "out": """out """ },{ "in":"""3 |*| """, "out": """in """ }, ] def A(): pass test_all(A)

自由欄

コンテスト中

正規表現殺しを意図したであろう設問ですが、細々確認する時間が惜しいのでこんな感じです。

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()の違いとか。

def A(): import re input() print("in" if re.search(r"\|.*\*.*\|", input()) else "out") test_all(A)

結果:#41929387

自由欄

B - Trick Taking

関係ないですけど、1ヶ月以上空けて振り返って新鮮な気持ちで書いたコードが、当時のコンテスト中の提出と全く同じで、なんだか複雑な気持ちになりました。。 (成長してないと見るべきか、この問題に必要な知識は定着していて都度引き出し可能と見るべきか🤔)

C - Dango

やってみよう!

C関数を完成させて「Run」ボタンをクリックしよう!

test_dataC = [ { "in":"""10 o-oooo---o """, "out": """4 """ },{ "in":"""1 - """, "out": """-1 """ },{ "in":"""30 -o-o-oooo-oo-o-ooooooo--oooo-o """, "out": """7 """ },{ "in":"""5 oooo- """, "out": """4 """ },{ "in":"""5 ----- """, "out": """-1 """ },{ "in":"""2 -o """, "out": """1 """ }, ] def C(): pass test_all(C)

自由欄

コンテスト中

コンテスト中の提出がこんな感じ。

  • 連続した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ヶ月弱サボるとこの体たらく。。精進します!

def C(): import re N = int(input()) S = input() max_len = max(len(m) for m in [""] + re.findall("o+", S)) if max_len > 0 and "-" in S: print(max_len) else: print(-1) test_all(C)

結果:#42114972

自由欄

解説を見る

解説を見ます。
あ、split・・・。その手があったか😭

あと「特定の文字を含む」はsetで一発判定できますね。

def C(): input() S = input() print(max(map(len, S.split("-"))) if set('o-') == set(S) else "-1") test_all(C)

結果:#42115796

自由欄

D - Find by Query

結論から言うと二分探索なのですが、コンテスト中は「同じ文字が連続してない!にぶたん使えない!分からん寝る!」とあっさり諦めてしまいました。
そこでもうちょい粘って「二分探索に当てはめてみるとどうなるか」を考えてみれば、同じ文字が連続してなくとも適用できることに気づけたはず。

やるからには心身ともに万全のコンディションで臨むべきなのですが、最近は忙しさにかまけてセルフマネジメントができておらず、奇しくもAtcoderでそれば顕在化されてしまいました。
まずは生活リズムを整えるということと、ルーティンの有用性(毎週土曜のAtcoderの結果、というよりいかにして問題を解けたかor解けなかったかでコンディションが分かる)を再認識です。

と言いつつ、直近ではそのルーティンすらこなせてないのが問題です・・・

自由欄