« プログラミング教育に関する考察 |Main| 日記 »

« PythonとRubyでパスカルの三角形ワンライナー | Python | グローバルよりも広いもの »

Just Another Python Hacker, その2

>>> print (lambda a,t,g,c:''.join([chr(x)for x in[g-t-c*t&a,a&a*-a/g,a-c&a,g/t+a
-c&a,t*g&t,-a*a&a-t,-g-a%g*t&a,a+a*a*g&a,g/t+a-c&a,a&-c-c,g/c^g+c&g-c,a^a&c-a,t*
g&t,g&t-g-g,t+a+a+a+t&a,g/t+a-c&a,a&-c-c,a+a*a*g&a,-g-a%g*t&a,t*g&t,g+g%-c&a,g-a
+g&a,a^g*a+c&a,a&c-a-t%c-g,g/c^g+c&g-c,a^a&c-a,g%c*t-c&t]]))(*[ord(c)for c in un
icode('西尾泰和','sjis')])
Just Another Python Hacker,

自分専用JAPH。デフォルトエンコーディングの設定をきちんとやればエンコーディング指定の'sjis'はいらなくなると思います。ちなみにバイオに詳しくない人のために説明すると、ATGCは人間の遺伝情報を構成する4種類の部品の頭文字です。

ソースコードは、自分の得たい物が得られてしまうと他の人のために読みやすくしたりバグを取ったりするモチベーションがなくなるのでうまく動くかどうか知りませんが、一応公開しておきます。フォーマット文字列を使わないで西尾泰和の日記(2006-02-02)と同じ方法を使えばもっと短く書けたかもしれませんが…まぁいいや。


__ 追記。大文字の方がいいかも。

>>> print (lambda A,T,G,C:''.join([chr(N)for N in[G-T-C*T&A,A&A*-A/G,A-C&A,G/T+A
-C&A,T*G&T,-A*A&A-T,-G-A%G*T&A,A+A*A*G&A,G/T+A-C&A,A&-C-C,G/C^G+C&G-C,A^A&C-A,T*
G&T,G&T-G-G,T+A+A+A+T&A,G/T+A-C&A,A&-C-C,A+A*A*G&A,-G-A%G*T&A,T*G&T,G+G%-C&A,G-A
+G&A,A^G*A+C&A,A&C-A-T%C-G,G/C^G+C&G-C,A^A&C-A,G%C*T-C&T]]))(*[ord(N)for N in
unicode('西尾泰和','sjis')])
# -*- coding: cp932 -*-
#
# Just Another Python Hacker,
#
queryStr = "Just Another Python Hacker,"
query = [ord(c) for c in queryStr]

targetStr = "西尾泰和"
seeds = [ord(c) for c in unicode(targetStr, "sjis")]
print seeds

needs = []
for q in query:
    if not(q  in needs):
        needs.append(q)


caches = [{}]
numOp = {}
for i in range(4):
    caches[0][seeds[i]] = str(seeds[i])
    numOp[seeds[i]] = 0

def applyOpBuilder(c):
    def applyOp(p):
        return "%%s%s%%s" % c % p
    return applyOp

def applyOpBuilderInvert(c):
    def applyOp((x, y)):
        return "%%s%s%%s" % c % (y, x)
    return applyOp

operators = [applyOpBuilder(c) for c in "+-*/&|^"]
operators.extend([applyOpBuilderInvert(c) for c in "-/"])
operators.extend([applyOpBuilder(s) for s in ("%%",)])
operators.extend([applyOpBuilderInvert(s) for s in ("%%",)])

def evalAndCache(eq):
    try:
        v = eval(eq)
        if numOp.has_key(v):
            return
        if v < -50000 or 50000 < v:
            return
        numOp[v] = level
        eqs[v] = eq
        if v in needs:
            needs.remove(v)
    except Exception, e:
        print eq, e

try:
    for level in range(1, 100):
        print level
        eqs = {}
        for eq in caches[level - 1].values():
            evalAndCache("-%s" % eq)

        for i in range(level):
            j = level - i - 1
            if j < i: break
            for a in caches[i].values():
                for b in caches[j].values():
                    for f in operators:
                        eq = f((a, b))
                        evalAndCache(eq)
                        if needs == []:
                            caches.append(eqs) 
                            raise "Finished!!"



        caches.append(eqs)
except:
    data = "''.join([chr(x) for x in [%s]])" % ",".join(
        [caches[numOp[q]][q] for q in query])
    for i in range(4):
        data = data.replace(str(seeds[i]), "atgc"[i])
    print "print (lambda a,t,g,c:%s)(*unicode(targetStr, 'sjis'))" % data

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/214

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.