1. Qiita
  2. 投稿
  3. Python

ズンドコキヨシ on pythonワンライナー

  • 3
    いいね
  • 3
    コメント

偉大なる元祖かつ、すべての元凶

流行っていたので、私の十八番 python onlinerで実装してみました。

地味にpython3.5でもpython2.7でもウゴクようにしました。(python3 python2 compatible!)

kiyoshi=lambda:list((lambda t,r,c,s:map(lambda q:s.stdout.write(q+'\n')and q or q,t.chain((lambda d=c.deque([],6):t.takewhile(lambda n:d.append(n)or"".join(d)[:-2]!=u"ズンズンズンズンドコ",(r.choice([u"ズン",u"ドコ"])for _ in t.count())))(),[u"キ・ヨ・シ!"])))(*map(lambda n:__import__(n),'itertools;random;collections;sys'.split(';'))))

わかりやすくインデントつけるとこんな感じ、関数型言語触ってる人間にはいい感じにわかるかも

どうしてもkiyoshi()の返り値をlistにしたいがために、外側でmap()をつかっています。

こだわり捨てて、もっとがんばればcode golf :golf: できそう(現在317bytes

kiyoshi = lambda:list(
    (lambda t,r,c,s:
        map(
            lambda q:s.stdout.write(q+'\n')and q or q,
                # python2だと`sys.stdout.write('youjo')`->None
                # python3だと`sys.stdout.write('youjo')`->5 の仕様の違いのため、python3だけならprint()で十分
            t.chain(
                (lambda d=c.deque([],6): # 引数が参照渡しなのをいいことに状態もたせてる
                    t.takewhile(
                        lambda n:d.append(n)or"".join(d)[:-2]!=u"ズンズンズンズンドコ",
                            # ↑takewhileは条件がfalseになった瞬間に打ち切るので、一個多めにgeneratorを回す
                        (r.choice([u"ズン",u"ドコ"])for _ in t.count()) #←ズンドコ無限generator
                    )
                )(), #←ズンドコgeneratorここまで
                [u"キ・ヨ・シ!"]
            )
        )
    )(
        *map(
            lambda n:__import__(n),
            'itertools;random;collections;sys'.split(';') # :golf:
        )
    )
)

functools.reduce()使ってもできそうですけど、無限ジェネレータの停止条件を記述するのにitertools.takewhile()itertools.dropwhile()ぐらいしか思いつかなかったのでこんなかんじになってますです。

(:golf:るにもimportは減らしたかった。)

Pythonワンライナーで実装した方がいらっしゃいましたら教えてください。 :+1::thumbsup: します・ω・

Pythonワンライナー書きたいと思っちゃった危篤な方へ

昔の記事ですがどうぞ 闇Pythonista入門(Pythonワンライナーのテクニック集)

@私 仕事しろ

Comments Loading...