振り返りです。
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
関数を完成させて「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
自由欄
略
関係ないですけど、1ヶ月以上空けて振り返って新鮮な気持ちで書いたコード が、当時のコンテスト中の提出 と全く同じで、なんだか複雑な気持ちになりました。。
(成長してないと見るべきか、この問題に必要な知識は定着していて都度引き出し可能と見るべきか🤔)
やってみよう!
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
自由欄
略
結論から言うと二分探索なのですが、コンテスト中は「同じ文字が連続してない!にぶたん使えない!分からん寝る!」とあっさり諦めてしまいました。
そこでもうちょい粘って「二分探索に当てはめてみるとどうなるか」を考えてみれば、同じ文字が連続してなくとも適用できることに気づけたはず。
やるからには心身ともに万全のコンディションで臨むべきなのですが、最近は忙しさにかまけてセルフマネジメントができておらず、奇しくもAtcoderでそれば顕在化されてしまいました。
まずは生活リズムを整えるということと、ルーティンの有用性(毎週土曜のAtcoderの結果、というよりいかにして問題を解けたかor解けなかったかでコンディションが分かる)を再認識です。
と言いつつ、直近ではそのルーティンすらこなせてないのが問題です・・・
自由欄