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