deflogstringbuffers(s): ''' 用来调试查看stringbuffers的函数 ''' for i in s: print''.join(i)
# 每一行的状态 status = [START for i in xrange(rows)] # 每一行的游标 vernier = [INITVERNIER for i in xrange(rows)] # 每一行准备字符串缓冲区 stringbuffers = [[] for i in xrange(rows)]
deffuncall(f,seq): for i in seq: ifnot f(i): returnFalse returnTrue
whileTrue: for i, line inenumerate(lines): # 根据条件切换状态 if status[i] == DEAD: continue elif status[i] == START: if line[vernier[i]] == BLANKCHAR: status[i] = READBLANK else: status[i] = READWORD elif status[i] == READBLANK and line[vernier[i]] != BLANKCHAR: status[i] = FINDWORD elif status[i] == READWORD : if line[vernier[i]] == BLANKCHAR: status[i] = READWORDFINISH elif line[vernier[i]] == ENDCHAR: status[i] = DEAD # 读取状态向缓冲区发送普通字符 if status[i] == READWORD: stringbuffers[i].append(line[vernier[i]]) # 等待状态向缓冲区发送补齐字符(空白符) elif status[i] == READWORDFINISH: stringbuffers[i].append(BLANKCHAR) # 读取单词和读取空白符时候将移动游标 if status[i] == READWORD or status[i] == READBLANK: vernier[i] += 1
# 如果所有的都是 DEAD,那么break if funcall(lambda x: x == DEAD, status): break # 都读取完字符,就可以开始下一轮“杀”空字符 if funcall(lambda x: x == READWORDFINISH or x == DEAD, status): for i,s inenumerate(status): if s == READWORDFINISH: status[i] = READBLANK # 都准备好了,就可以开始下一轮读取单词 if funcall(lambda x: x == FINDWORD or x == DEAD, status): for i,s inenumerate(status): if s == FINDWORD: status[i] = READWORD
# 打印字符串缓冲区 logstringbuffers(stringbuffers)
状态机变换
| ... ... tornado ... ...|
S R F R R R D
T E I E E E E
A A N A A A A
R D D D D D D
T B W W W B
L O O O L
A R R R A
N D D D N
K F K
I
N
I
S
H