Execute a Markov algorithm: Difference between revisions

m (On seeing this again, the use of a module hinders clarity, so I removed it)
Line 2,767:
=={{header|Ruby}}==
{{works with|Ruby|1.8.7}}
<lang Ruby>def setup(ruleset)
<lang Ruby>raise "Please input an input code file, an input data file, and an output file." if ARGV.size < 3
ruleset.each_line.inject([]) do |rules, line|
 
if line =~ /^\s*#/
rules = File.readlines(ARGV[0]).inject([]) do |rules, line|
if line =~ /^\s*#/ rules
elsif line =~ /^(.+)\s+->\s+(\.?)(.*)$/
rules
rules << [$1, $3, $2 != ""]
elsif line =~ /^(.+)\s+->\s+(\.?)(.*)$/
else
rules << [$1, $3, $2 != ""]
raise "Syntax error: #{line}"
else
end
raise "Syntax error: #{line}"
end
end
 
def morcov(ruleset, input_data)
File.open(ARGV[2], "w") do |file|
rules = setup(ruleset)
file.write(File.read(ARGV[1]).tap { |input_data|
while (matched = rules.find { |match, replace, term|
input_data[match] and input_data.sub!(match, replace)
}) and !matched[2]
end
input_data
})
end</lang>
 
'''Test:'''
<lang Ruby>ruleset1 = <<EOS
# This rules file is extracted from Wikipedia:
# http://en.wikipedia.org/wiki/Markov_Algorithm
A -> apple
B -> bag
S -> shop
T -> the
the shop -> my brother
a never used -> .terminating rule
EOS
 
puts morcov(ruleset1, "I bought a B of As from T S.")
 
ruleset2 = <<EOS
# Slightly modified from the rules on Wikipedia
A -> apple
B -> bag
S -> .shop
T -> the
the shop -> my brother
a never used -> .terminating rule
EOS
 
puts morcov(ruleset2, "I bought a B of As from T S.")
 
ruleset3 = <<EOS
# BNF Syntax testing rules
A -> apple
WWWW -> with
Bgage -> ->.*
B -> bag
->.* -> money
W -> WW
S -> .shop
T -> the
the shop -> my brother
a never used -> .terminating rule
EOS
 
puts morcov(ruleset3, "I bought a B of As W my Bgage from T S.")
 
ruleset4 = <<EOS
### Unary Multiplication Engine, for testing Markov Algorithm implementations
### By Donal Fellows.
# Unary addition engine
_+1 -> _1+
1+1 -> 11+
# Pass for converting from the splitting of multiplication into ordinary
# addition
1! -> !1
,! -> !+
_! -> _
# Unary multiplication by duplicating left side, right side times
1*1 -> x,@y
1x -> xX
X, -> 1,1
X1 -> 1X
_x -> _X
,x -> ,X
y1 -> 1y
y_ -> _
# Next phase of applying
1@1 -> x,@y
1@_ -> @_
,@_ -> !_
++ -> +
# Termination cleanup for addition
_1 -> 1
1+_ -> 1
_+_ ->
EOS
 
puts morcov(ruleset4, "_1111*11111_")
 
ruleset5 = <<EOS
# Turing machine: three-state busy beaver
#
# state A, symbol 0 => write 1, move right, new state B
A0 -> 1B
# state A, symbol 1 => write 1, move left, new state C
0A1 -> C01
1A1 -> C11
# state B, symbol 0 => write 1, move left, new state A
0B0 -> A01
1B0 -> A11
# state B, symbol 1 => write 1, move right, new state B
B1 -> 1B
# state C, symbol 0 => write 1, move left, new state B
0C0 -> B01
1C0 -> B11
# state C, symbol 1 => write 1, move left, halt
0C1 -> H01
1C1 -> H11
EOS
 
puts morcov(ruleset5, "000000A000000")</lang>
 
{{out}}
<pre>
I bought a bag of apples from my brother.
I bought a bag of apples from T shop.
I bought a bag of apples with my money from T shop.
11111111111111111111
00011H1111000
</pre>
 
=={{header|Scala}}==
Anonymous user