ランダムケースデバッグのすすめ (camel_case)
競技プログラミングを嗜む人間が例外なく頭を悩ませるもの、それはコーナーケース
主要コンテストサイトでは大体1ケースのWAで0点にされ、ここからが労力の残り半分みたいなシチュエーションもままある
N = 1のパターン一つくらいなら(特に1ケースWAなどで示唆されていれば) 見落とす可能性は低いが、2つ3つと考慮すべきケースがた場合すべてを網羅するための注意力は並大抵では済まない
________ じゃあ、テストケースの全部がコーナーケースみたいな問題があったら ...?
概要
今まで面倒や~と思ってランダムテストケース生成の上でのデバッグをしたことがなかったのですが、精進中にどうしようもなくなったので初めてやりました。
特に今回は「提出解と愚直解を比較」みたいなものではなくただただ「たくさんテストケースを投げて目で違和感頼りのデバッグをする」みたいなしょうもない方法だったのですが、それでも意外と有効でした。
なお若干タイトル詐欺感ありますが、解説要素は薄めの精進ログです。
camel_case
問題概要は省略しますが、仕様を正確に理解して正確に実装する に尽きます。
ホントに全部場合分け、みたいな感じ。ほんまに何??
3WAくらい使って地道に考えたものの1ケース残り、禁忌テストケース閲覧 に頼ろうとするも古すぎて存在せず。
しょうがないので生成器を書く。
def make_c(): # 適当に "_" に確率の比重を置く return random.choice(["_"] * 50 + [chr(ord("A") + i) for i in range(26)] + [chr(ord("a") + i) for i in range(26)] + [chr(ord("1") + i) for i in range(9)]) def main(): # 試行 100回 for i in range(100): # 5 ~ 10文字 n = random.randint(5, 10) solve("".join([make_c() for i in range(n)])) return
この問題では "" の重要度が高かったので、選ばれる確率を高くしています。
make_c関数では ["". "". "". "". ... , "". "A", ... "Z", "a" ... "z"] の配列からランダムで1文字選ぶみたいなことをやっています。
これを実行すると、こう。
大半のケースは意味ないんですが、適度に目を凝らしながら出力を見ていきます。
結論としては、単語間の "_" が2連続以上のケースを実装し忘れていました。
もう二度とやりたくないです。Writerの皆様、想い、届いていますか
結論
コーナーケースが100個ある幾何問題は存在しないため人に投げることができないが、camel_caseは人に投げることができる!
皆もcamel_caseを布教して、知り合いのデバッグ力を高めよう!
まだcamel_caseを通していないそこのあなた!今すぐ実装をしよう!