Tea break

ちょっとした息抜きに

Pythonでオークの代わりに女騎士の感度を3000倍にする

どうも、風邪を引くもたまたま家にあったカロナール500で楽になったwisteria30です。
TLで女騎士とオークの組み合わせを見つけたと思ったら、如何にして女騎士の感度を3000倍にしようかという問題だった(?)

女騎士「わ、私を感度3000倍にさせて一体何をさせるんだ…」オーク「ククク…」

オークA「感度を半分にするクスリだ」
オークB「感度を900マイナスにするクスリだ」
オークC「感度を2000プラスにするクスリだ」
オークD「感度を5倍するクスリだ」
オークE「感度を500プラスにするクスリだ」

女騎士「はじめの感度の値が0であった場合、感度の値を3000にするためにオーク達はどんな順序でクスリを飲ませることになるんだ...!?」

知能の高いオーク達ですね(すっとぼけ)
これだけ賢そうなオーク達なら大丈夫かもしれませんが、この問題を解くのに5分も10分もかけてしまっては興ざめになってしまいます。(何がとは言わない)
そんなオーク君達に変わってこの問題を解いてあげましょう。
順序を決める問題も標準ライブラリを使ってすばやく解くことができる

そう、Pythonならね

というわけで以下コード

import itertools


def A(n):
    return n // 2


def B(n):
    return n - 900


def C(n):
    return n + 2000


def D(n):
    return n * 5


def E(n):
    return n + 500


if __name__ == "__main__":
    fc = [A, B, C, D, E]
    for i in itertools.permutations(fc):
        n = 0
        for f in i:
            n = f(n)

        if n == 3000:
            for f in i:
                print(f.__name__)
            break

出力

B
C
D
E
A

これで焦らされることなくムフフなシーンがすぐに見れますね(誰かはよ)
関数オブジェクトを配列に入れてウンタラみたいなことをあまりしてこなかったのですが、こういう書き方も意識していかないとですね
まぁオークの数が増え始めるとこの書き方ではダメになりそうですが...

ところで、なんでこんな記事書いたんでしょうね(熱に浮かされた謎のテンション)