Language detail: Python
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
codes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # -*- coding: utf-8 -*-
from random import randint
m, n = 4, 3
A = ''.join([''.join([u'□' if randint(0, 1) else u'■' for j in range(n)])+'\n' for i in range(m)])
a = [[0 if A[i*(n+1)+j] == u'□' else 1 for j in range(n)] for i in range(m)]
#for i in a:
# print i
def f(i, j):
k = a[i][j]
a[i][j] = -1
if i > 0 and a[i-1][j] == k: f(i-1, j)
if j > 0 and a[i][j-1] == k: f(i, j-1)
if i < m-1 and a[i+1][j] == k: f(i+1, j)
if j < n-1 and a[i][j+1] == k: f(i, j+1)
r = [0, 0]
for i in range(m):
for j in range(n):
if a[i][j] != -1:
r[a[i][j]] += 1
f(i, j)
print A
print 'white: %d\nblack: %d' % tuple(r)
|
n×nの2次元配列を引数にとり、 これを行列とみなして行列式を返す 関数を作成してください。
行列・線形代数のライブラリ等を 使用しないことが条件です。
参考:http://ja.wikipedia.org/wiki/%E8%A1%8C%E5%88%97%E5%BC%8F
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | # -*- coding: utf-8 -*-
# 定義に基づく実装例
# 対称群
def symmetric_group(n):
# 配列 [0, 1, .., (n-1)] を並び替えてできる
# すべての配列の組み合わせを返します。
# 置換の符号
def signature(sym):
# 配列 [0, 1, .., (n-1)] の符号を +1とします。
# 互換(2つの要素を交換)すると符合が変わります。
# 配列 [0, 1, .., (n-1)] から
# 奇数回の互換で得られる配列の符号は -1、
# 偶数回の互換で得られる配列の符号は +1 になります。
# 行列式
def determinant(mat):
det = 0;
deg = len(mat)
for s in symmetric_group(deg):
term = signature(s)
for i in range(deg):
term *= mat[i][s[i]]
det += term
return det
|
marshal.dumps(compile(duff, "<script>", "single")) とかやって生成させたバイト列にコメントをつけただけです。 こんなんじゃダメっすよねえ……
Pythonバイトコードアセンブラのようなものはあるようですね。 ディスアセンブルは標準のdisでできるのですが。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #!/usr/bin/env python
import marshal
# def duff(src):
# next = iter(src).next
# while True:
# yield next()
# yield next()
# yield next()
# yield next()
# yield next()
# yield next()
# yield next()
# yield next()
exec marshal.loads(
"\x63" # TYPE_CODE
"\x00\x00\x00\x00" # co_argcount: 0
"\x00\x00\x00\x00" # co_nlocals: 0
"\x01\x00\x00\x00" # co_stacksize: 1
"\x40\x00\x00\x00" # co_flags
"\x73" # co_code: TYPE_STRING
"\x0D\x00\x00\x00" # length of string: 13
"\x64\x00\x00" # LOAD_CONST 0
"\x84\x00\x00" # MAKE_FUNCTION 0
"\x5A\x00\x00" # STORE_NAME 0
"\x64\x01\x00" # LOAD_CONST 1
"\x53" # RETURN_VALUE
"\x28" # co_consts: TYPE_TUPLE
"\x02\x00\x00\x00" # length of tuple: 2
"\x63" # TYPE_CODE
"\x01\x00\x00\x00" # co_argcount: 1
"\x02\x00\x00\x00" # co_nlocals: 2
"\x02\x00\x00\x00" # co_stacksize: 1
"\x63\x00\x00\x00" # co_flags
"\x73" # co_code: TYPE_STRING
"\x62\x00\x00\x00" # length of string: 98
"\x74\x00\x00" # LOAD_GLOBAL 0
"\x7C\x00\x00" # LOAD_FAST 0
"\x83\x01\x00" # CALL_FUNCTION 1
"\x69\x01\x00" # LOAD_ATTR 1
"\x7D\x01\x00" # STORE_FAST 1
"\x78\x4C\x00" # SETUP_LOOP 76
"\x74\x02\x00" # LOAD_GLOBAL 2
"\x6F\x44\x00" # JUMP_IF_FALSE 68
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x7C\x01\x00" # LOAD_FAST 1
"\x83\x00\x00" # CALL_FUNCTION 0
"\x56" # YIELD_VALUE
"\x01" # POP_TOP
"\x71\x12\x00" # JUMP_ABSOLUTE 18
"\x01" # POP_TOP
"\x57" # POP_BLOCK
"\x64\x00\x00" # LOAD_CONST 0
"\x53" # RETURN_VALUE
"\x28" # co_consts: TYPE_TUPLE
"\x01\x00\x00\x00" # length of tuple: 1
"\x4E" # TYPE_NONE
"\x28" # co_names: TYPE_TUPLE
"\x03\x00\x00\x00" # length of tuple: 3
"\x74" # TYPE_INTERNED
"\x04\x00\x00\x00" # length of string: 4
"\x69\x74\x65\x72" # "iter"
"\x74" # TYPE_INTERNED
"\x04\x00\x00\x00" # length of string: 4
"\x6E\x65\x78\x74" # "next"
"\x74" # TYPE_INTERNED
"\x04\x00\x00\x00" # length of string: 4
"\x54\x72\x75\x65" # "True"
"\x28" # co_varnames: TYPE_TUPLE
"\x02\x00\x00\x00" # length of tuple: 2
"\x74" # TYPE_INTERNED
"\x03\x00\x00\x00" # length of string: 3
"\x73\x72\x63" # "src"
"\x52" # TYPE_STRINGREF
"\x01\x00\x00\x00" # index: 1
"\x28" # co_freevars: TYPE_TUPLE
"\x00\x00\x00\x00" # length of tuple: 0
"\x28" # co_cellvars: TYPE_TUPLE
"\x00\x00\x00\x00" # length of tuple: 0
"\x73" # co_filename: TYPE_STRING
"\x08\x00\x00\x00" # length of string: 8
"\x3C\x73\x63\x72\x69\x70\x74\x3E" # "<script>"
"\x74" # co_name: TYPE_INTERNED
"\x04\x00\x00\x00" # length of string: 4
"\x64\x75\x66\x66" # "duff"
"\x02\x00\x00\x00" # co_firstlineno: 2
"\x73" # co_lnotab: TYPE_STRING
"\x14\x00\x00\x00" # length of string: 20
"\x00\x01\x0F\x01\x0A\x01\x08\x01" # XXX: see codeobject.c
"\x08\x01\x08\x01\x08\x01\x08\x01" # about co_lnotab.
"\x08\x01\x08\x01" #
"\x4E" # TYPE_NONE
"\x28" # co_names: TYPE_TUPLE
"\x01\x00\x00\x00" # length of tuple: 1
"\x52" # TYPE_STRINGREF
"\x04\x00\x00\x00" # index: 4
"\x28" # co_varnames: TYPE_TUPLE
"\x00\x00\x00\x00" # length of tuple: 0
"\x28" # co_freevars: TYPE_TUPLE
"\x00\x00\x00\x00" # length of tuple: 0
"\x28" # co_cellvars: TYPE_TUPLE
"\x00\x00\x00\x00" # length of tuple: 8
"\x73" # co_filename: TYPE_STRING
"\x08\x00\x00\x00" # length of string: 8
"\x3C\x73\x63\x72\x69\x70\x74\x3E" # "<script>"
"\x73" # co_name: TYPE_STRING
"\x08\x00\x00\x00" # length of string: 8
"\x3C\x6D\x6F\x64\x75\x6C\x65\x3E" # "<module>"
"\x02\x00\x00\x00" # co_firstlineno: 2
"\x73" # co_lnotab: TYPE_STRING
"\x00\x00\x00\x00" # length of string: 0
)
print list(duff(range(10)))
|
スレッドを使わない擬似並行処理です。 一行Pythonで119 bytes. 一行にするとループやgeneratorが使えないため、 lambdaのリストを巡回することで代用しています。
1 2 | import sys;F=lambda x:(lambda:sys.stdout.write(chr(x)));
[[p()for p in q]for q in [(F(i+48),F(i+65))for i in range(10)]]
|
いちおう擬似並行処理といえるかな。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def f(s):
for i in s:
print i,
yield i
def run(ths):
while ths:
for th in ths:
try:
th.next()
except StopIteration:
ths.remove(th)
run([f('ABCDEFGHIJ'), f(range(1,11))])
|
ちょっと修正 無駄にめんどくさい事してた・・orz
1 2 3 4 5 | if __name__ == '__main__':
strArr = [range(1,10), 'ABCDEFGHIJ']
for str in strArr:
p = Process(target = printStr, args=(str,))
p.start()
|
1-10とA-Jのスマートな書き方がわからなかった。 sleep(0.01)を入れて、交互になるようにしてあります。 そうしないと、2つめのプロセス作る前に Print終わってしまう気がする。<交互にならない
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env python
# coding:utf-8
from multiprocessing import Process
import time
def printStr(str):
for i in str:
print i
time.sleep(0.01) # 出力を緩慢に
if __name__ == '__main__':
strArr = [[i for i in range(1,10)],
['A','B','C','D','E','F','G','H','I','J']]
for str in strArr:
p = Process(target = printStr, args=(str,))
p.start()
|
1 2 3 4 5 6 7 8 9 10 11 | import stackless
def put_iterator(it):
for i in it:
print i
stackless.schedule()
stackless.tasklet(put_iterator)('ABCDEFGHIJ')
stackless.tasklet(put_iterator)(range(1,11))
stackless.run()
|
1 2 3 4 5 6 7 8 9 10 11 | import threading
import time
def p(x):
print x
time.sleep(0.001)
threads = [ threading.Thread(target=lambda ls: map(p, ls), args=(ls,))
for ls in (range(1,11), "ABCDEFGHIJ")]
for th in threads: th.start()
for th in threads: th.join()
|
さらに縮めて282bytes. 埋め込みSJIS文字列の持たせ方を変えました。
1 2 3 | S,I,Z=' ',True,ord;A=Z(' ');P,F=range(Z('*')-A),lambda h,l:chr((Z(h)-A)*(A>>I)+Z(l)-A);
Q,T=P[I:],[F(a,b)+F(c,d)for(a,b,c,d)in'(!%* ((.* )#/! (.$/ (.&, (,-, )(%* (.+% )$** (+.#'.split()];
print'\n'.join([S.join([[([S]+T[I:])[m]+T[n]for m in P for n in P][i*j]for i in Q])for j in Q])
|
UTF-8なPython使いへの嫌がらせか!と思ったら、 # coding: UTF でUTF-8認識してくれるらしいですね。 http://www.python.jp/doc/2.4/lib/standard-encodings.html の「別名」欄にあったのでやってみたらできました。 index使うのはズルいですかねぇ。
1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/bin/python
# encoding: UTF
num_ten = u" 一二三四五六七八九"
num_one = u"〇一二三四五六七八九"
nums = [i+j for i in num_ten for j in num_one]
for i in num_ten[num_ten.find(u"一"):]:
for j in num_one[num_one.find(u"一"):]:
print nums[num_ten.index(i)*num_one.index(j)],
print ""
|
入力の'('と')'の対応をとってください。
ただし、コード中に'('と')'を含まないでください。
漢字の九九にinspireされました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import sys
start = sys.argv[1]
end = sys.argv[2]
to_test = sys.argv[3]
print start
print end
print to_test
stack = []
while to_test:
print stack
head = to_test[0]
to_test = to_test[1:]
if head == start:
stack += [head]
if head == end:
if stack:
stack = stack[:-1]
else:
stack = [True]
break
if stack:
print False
else:
print True
|
http://www.python.jp/doc/2.4/lib/module-datetime.html
必要な詳細仕様を備えたタイムゾーン機能を提供するのはアプリケーションの責任です。世界各国における時刻の修正に関する法則は合理的というよりも政治的なものであり、全てのアプリケーションに適した標準というものが存在しないのです。
というわけで、 http://www.python.jp/doc/2.4/lib/datetime-tzinfo.html にある http://www.python.jp/doc/2.4/lib/tzinfo-examples.txt をtzinfoexample.pyとしてimportする。
実行結果
2008-10-29 23:03:41.965442
2008-10-29 14:03:41.965468
2008-10-29 06:03:41.965479-08:00
1 2 3 4 5 | import datetime
from tzinfoexamples import Pacific
print datetime.datetime.now()
print datetime.datetime.utcnow()
print datetime.datetime.now(Pacific)
|
結果はブラウザで閲覧します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #!/usr/bin/python
# -*- coding=us-ascii-*-
def zero():
return len(())
def succ(n):
return n+len(((),))
ZERO = zero()
ONE = succ(ZERO)
TWO = succ(ONE)
THREE = succ(TWO)
FOUR = succ(THREE)
FIVE = succ(FOUR)
SIX = succ(FIVE)
SEVEN = succ(SIX)
EIGHT = succ(SEVEN)
NINE = succ(EIGHT)
K_ZEOR = (ONE,TWO,TWO,NINE,FIVE)
K_ONE = (ONE,NINE,NINE,SIX,EIGHT)
K_TWO = (TWO,ZERO,ONE,ZERO,EIGHT)
K_THREE = (ONE,NINE,NINE,SEVEN,SEVEN)
K_FOUR = (TWO,TWO,TWO,THREE,FIVE)
K_FIVE = (TWO,ZERO,ONE,ONE,SIX)
K_SIX = (TWO,ZERO,EIGHT,FOUR,FIVE)
K_SEVEN = (ONE,NINE,NINE,SEVEN,ONE)
K_EIGHT = (TWO,ZERO,EIGHT,FOUR,THREE)
K_NINE = (TWO,ZERO,ZERO,SIX,ONE)
KANJI_NUMS = (K_ZEOR, K_ONE, K_TWO, K_THREE, K_FOUR,
K_FIVE, K_SIX, K_SEVEN, K_EIGHT, K_NINE)
BASE = len(KANJI_NUMS)
def tuple_to_code(t):
return '&#' + ''.join(['%i'%s for s in t]) + ';'
def alabic_to_jp(alabic):
d, m = divmod(alabic, BASE)
if d:
return alabic_to_jp(d) + tuple_to_code(KANJI_NUMS[m])
else:
return tuple_to_code(KANJI_NUMS[m])
print "<html><table>"
for i in range(BASE):
print "<tr>",
for j in range(BASE):
if i and j:
print "<td>", alabic_to_jp(i*j), "</td>",
print "</tr>"
print "</table></html>"
|
succとentity referenceを利用したコードも着想はしたが面倒なのでやめた。
def succ(n):
return n + len(((),))
を作って、%sで数字の文字列を作り、結果はブラウザでみるということです。
「〇一二三四五六七八九」を埋め込まなくてすみますが、code generatorでも作らないとbfすぎ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/usr/bin/python
# -*- coding=sjis -*-
JP_NUMERIC_LETTERS = u'〇一二三四五六七八九'
BASE = len(JP_NUMERIC_LETTERS)
def alabic_to_jp(alabic):
d, m = divmod(alabic, BASE)
if d:
return alabic_to_jp(d) + JP_NUMERIC_LETTERS[m]
else:
return JP_NUMERIC_LETTERS[m]
for i, m in enumerate(JP_NUMERIC_LETTERS):
for j, n in enumerate(JP_NUMERIC_LETTERS):
if i and j:
print alabic_to_jp(i*j),
print
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | DIGITS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def fmt_iter(n, base):
if n / base:
for x in fmt(n / base, base):
yield x
yield DIGITS[n % base]
def fmt(n, base):
return ''.join(fmt_iter(n, base))
#for i in range(100):
# print fmt(i, 2)
|
一行Pythonで343 bytes. coding指定を使わずに一行で書くのに苦労した…。 SJISのbinaryで無理やり吐かせています。
1 2 3 4 | S,I,R,Z=' ',True,range,ord;A=Z('A');D=Z('K')-A;P,Q,T=R(D),R(I,D),[''.join(map(lambda x,y:chr((Z(x)-
A)*(Z('Q')-A)+Z(y)-A),h,l))for(h,l)in zip(['IF','IO','JP','IE','IG','IN','JF','IL','JK','IO'],['BK',
'IK','DB','OP','OM','MM','IK','OF','EK','LD'])];print'\n'.join([S.join([[([S]+T[I:])[m]+T[n]for m in
P for n in P][i*j]for i in Q])for j in Q])
|
1 2 3 4 5 6 7 8 | #coding: utf-8
knums = list(u"〇一二三四五六七八九")
one, ten = int(True), len(knums)
for i in range(one, ten):
for j in range(one, ten):
hi = i * j / ten
print u"%s%s" % (hi and knums[hi] or u' ', knums[i * j % ten]),
print
|






匿名
#8084()
[
Python
]
Rating0/0=0.00
pythonなので、未定義の symmetric_groupとsignatureだけ書きました。 なんかイマイチ……
Rating0/0=0.00-0+
[ reply ]