はじめに
【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を3回繰り返したもの』に一致したときに「ラブ注入♡」と標準出力して終了するプログラムを作成せよ(配点:5点)
こちらのツイートが社内で話題になっていました。
そこで、試しにPythonワンライナーで書いてみました。
そんな遊びの記事です。
コード
__import__('sys').setrecursionlimit(10**6);print((lambda f: f('','',0,f))(lambda s,l,i,f: s+'ラブ注入♡' if i==3 else f(s,'',i+1,f) if l=='dsss' else f(s,'',0,f) if len(l)>=4 else f(s+'ドド', l+'d',i,f) if __import__('random').getrandbits(1) else f(s+'スコ', l+'s',i,f)))
実行結果
解説
Pythonワンライナーではループや変数の代入がちょっと面倒なので、lambda
を使用して再帰しています。
ただし、デフォルトでは再帰の深さが1000と圧倒的に足りないので、最初に__import__('sys').setrecursionlimit(10**6)
を呼んで適当に深さを$10^6 = 1,000,000$に設定しています。
なお、手元のWSL2環境(Windows 11, Ubuntu 20.04 LTS, Python 3.8.10)ではそれなりの確率でSegmentation fault
で落ちます。
また、Windows環境(Windows 11, Python 3.10.5)だと100%無言で落ちます。3221225725 (0xc00000fd)
というエラーコードで終了するので、どうやらスタックオーバーフローしているようです。
おわりに
業務終了後に深夜テンションで書いたので、もう少し改善できる余地があるかも知れません。
こういうちょっとしたプログラミングコンテスト的な問題は、色々な人の色々なコードを見られるので面白いですね。
書いた後で気付いたのですが、問題に「配列{"ドド","スコ"}から~」とあるのにそのような配列を使ってないので、厳密にはアウトかも知れません。
追記
社内でこのツイートが話題になるきっかけになった同期が、
新入社員の方向けにJavaコードで解答した記事を書いていました。
https://qiita.com/na0y/items/1f5ed3ce215297d70d3a