用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
相关文档:
def delVss(path)
if File.directory?(path)
for f in d = Dir.open(path)
fpath = File.join(path, f)
if(f!="."&&f!="..")
......
两种不同的语言,不同的表达!
Python脚本实现.
""
"
File Name : clean.py
File Date : 2009/11/5 14:22:56
Author : DannyLai
Purpose : Cle ......
1、文件的打开与关闭
``r'' Read-only, starts at beginning of file (default mode).
``r+'' Read-write, starts at beginning of file.
``w'' Write-only, truncates existing file to zero length or creates a new file for writing. ......
有些同学提问:我写数据到文件中会把老的数据替换掉。
怎么在源文件的基础上添加内容,而不是重写
【ruby code】
def txt_write(value,memo)
File.open("c:\\my_text.txt", 'a') do |f|
......
While looking for information on the subject, I looked into the ONLamp article Extending Ruby with C by Garrett Rooney, the Extending Ruby chapter in the Pickaxe, README.EXT (located at /usr/share/doc/ruby1.8-dev/README.EXT.gz on my Ubuntu system) and got some help from Kjetil.
The resulting file c ......