ランダムケースデバッグのすすめ (camel_case)

競技プログラミングを嗜む人間が例外なく頭を悩ませるもの、それはコーナーケース

主要コンテストサイトでは大体1ケースのWAで0点にされ、ここからが労力の残り半分みたいなシチュエーションもままある

N = 1のパターン一つくらいなら(特に1ケースWAなどで示唆されていれば) 見落とす可能性は低いが、2つ3つと考慮すべきケースがた場合すべてを網羅するための注意力は並大抵では済まない

________ じゃあ、テストケースの全部がコーナーケースみたいな問題があったら ...?

atcoder.jp

概要

今まで面倒や~と思ってランダムテストケース生成の上でのデバッグをしたことがなかったのですが、精進中にどうしようもなくなったので初めてやりました。
特に今回は「提出解と愚直解を比較」みたいなものではなくただただ「たくさんテストケースを投げて目で違和感頼りのデバッグをする」みたいなしょうもない方法だったのですが、それでも意外と有効でした。
なお若干タイトル詐欺感ありますが、解説要素は薄めの精進ログです。

camel_case

B - 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文字選ぶみたいなことをやっています。

これを実行すると、こう。
f:id:socha77:20200824221340p:plain

大半のケースは意味ないんですが、適度に目を凝らしながら出力を見ていきます。
結論としては、単語間の "_" が2連続以上のケースを実装し忘れていました。

もう二度とやりたくないです。Writerの皆様、想い、届いていますか

結論

コーナーケースが100個ある幾何問題は存在しないため人に投げることができないが、camel_caseは人に投げることができる!

皆もcamel_caseを布教して、知り合いのデバッグ力を高めよう!

まだcamel_caseを通していないそこのあなた!今すぐ実装をしよう!