用Ruby 写Turing 机
最近在看John E.Hopcroft,Rajeev Motwani,Jeffrey D.Ullman 三巨头写的Introduction to Automata Theory,Language,and Computation,想写一个Turing 机验证一下自己写的状态转移函数对不对。懒得很,网上搜了几个不错的。但Ruby Quiz 上的这个最简单。
162 Turing 机
问题描述
Quiz
description by James Edward Gray II
Turing 机是十九世纪三十年代提出的一种结构很简单的计算模型。虽然它比如今的任何计算机都要简单,但大量研究表明其计算能力丝毫不弱于任何能想到的机器(当然,用起来不太方便)。
这周的任务是造台Turing 机来玩玩。
一台Turing 机包括三个简单部件:
* 一个状态寄存器
* 一条无限长的纸带,纸带被分为无数小格,每个格子能容纳一个字符。还有一个读写头,在任何时刻都会指向一个确定的小格。纸带上默认是空字符。
* 一组有限指令集。程序就是一个状态迁移的大表格。Turing 机根据状态寄存器的当前值和读写头所指的字符查得一条指令。这条指令包括寄存器的新状态,填入读写头指向单元的字符和读写头下一步移动的方向。
为了让我们的Turing 机足够简单,我们规定状态寄存器容纳的字应能被正则表达式 /\w+/ 匹配上,而纸带上的字符要能被 /\w/ 匹配上。另外,我们规定空字符为下划线(_)。
Turing 机的程序格式如下:
CurrentState _ NewState C R
上述格式意思是:如果当前状态是CurrentState 而读写头所指的字符是空字符的话,把状态置为NewState ,并用字符C 替换空字符,然后读写头右移一格。这五个部分写在一行里面,用空格隔开。允许程序中出现单行注释,该行中井号(#)所起的部分为注释。注释、空白行将被忽略。
你的Turing 机应被初始为程序第一行中的CurrentState。当然随你,你也可在程序载入时预置好纸带的内容,但缺省为空字符。当程序找不到一条与当前状态和读写头所指字符对应的指令时,打印出纸带上从第一个非空字符到最后一个非空字符之间的内容,然后退出。
下面是一个示例,你可以看到我的Turing 机是怎么运行的:
$ cat palindrome.tm
# Report whether a string of 0 and 1 (ie. a binary
# number) is a palindrome.
look_first 0 go_end_0 _ R
look_first 1 go_end_1 _ R
look_first _ write_es Y R
go_end_0 0 go_end_0 0 R
go_end_0 1 go_end_0 1 R
go_end_0 _ check_end_0 _ L
go_end_1 0 go_end_1 0 R
go_e
相关文档:
Ruby虽然是动态脚本语言,但是和Java一样,带有VM,有自己的内存堆,创建对象的时候在堆里面分配内存,对象使用完毕由GC进行回收。但是通过我们运营Rails网站两年多的实践来看,Ruby VM的GC还是存在很大的问题。简单的来说,就是GC之后,尽管对象已经完全回收,但是物理内存释放不够充分,有泄漏的现象。通过pmap来dump rub ......
SOAP 服务端:
#!/usr/local/bin/ruby
require 'soap/rpc/standaloneServer'
module MySOAP
class Timer
def now
Time.new.strftime("%Y-%m-%d %H:%M:%S")
end
end
class Add
def add(i, j)
return i.to_i + j.to_i
&nb ......
Ruby 101:对象和方法
Written by Allen Lee
从静态方法说起
在上一篇文章末尾,我们提到了受保护的静态方法……受保护的静态方法??Ruby的protected不是用来向相同类型的不同实例开放受限方法的访问的吗(忘记protected的用法了?不要紧,回去上一篇文章复习一下吧。) ......
上一篇文章
说了Ruby的安装和运行,也简单的说了下类和对象。这里主要谈谈变量的问题。
先说常量
。如果变量名以大写字母开头,就被视为常量,但通常是所有字母都大写。但和其他语言不同,在Ruby中,你仍然可以改变常量的值,当然解释器会抛出一个警告:
#! /usr/bin/ruby
CONSTANT = 1
print "#{CONSTANT}\n&qu ......