用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
相关文档:
有些时候可能会根据一些有限的信息,来查找页面的元素,这里举一个例子利用页面文字来查找所在的标签,以淘宝的登录页面为例,使用以下代码可以实现根据账户名来识别对应的节点名称:
require ‘watir’
#ie = Watir::IE.attach(:url, /member1.taobao.com/)
ie = Watir::IE.start(”http://memb ......
一 安装ruby
$sudo apt-get install ruby irb rdoc
二 安装gem
1.到这里下载 ,最好是最新版本,我的1.3.5
解压,切换到当前目录,执行$sudo ruby setup.rb
或者这样:
$ tar xzvf rubygems-1.3.5.tgz (解压)
$ cd rubygems-1.3.5 (切换到此目录)
$ sudo ruby setup ......
有些同学提问:我写数据到文件中会把老的数据替换掉。
怎么在源文件的基础上添加内容,而不是重写
【ruby code】
def txt_write(value,memo)
File.open("c:\\my_text.txt", 'a') do |f|
......
#include < ruby.h > //
static int id_sum;
int Values[] = {5, 10 ,15,-1,20,0};
static VALUE wrap_sum(VALUE args)
{
VALUE * values = (VALUE *) args;
VALUE summer = values[0];
VALUE max = values[1];
return rb_funcall(summer,id_sum,1,max);
}
static VALUE ......