16
3

More than 1 year has passed since last update.

Pythonワンライナーで「ドドスコスコスコ」してみた

Last updated at Posted at 2022-08-03

はじめに

【問題】配列{"ドド","スコ"}からランダムに要素を標準出力し続け、『その並びが「ドドスコスコスコ」を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

参考文献

16
3
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
3