2
Help us understand the problem. What are the problem?

posted at

updated at

Organization

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

はじめに

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

参考文献

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
2
Help us understand the problem. What are the problem?