June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -0,0 +1,48 @@
|
|||
module MarkovAlgos
|
||||
|
||||
struct MarkovRule{F,T}
|
||||
patt::F
|
||||
repl::T
|
||||
term::Bool
|
||||
end
|
||||
|
||||
isterminating(r::MarkovRule) = r.term
|
||||
Base.show(io::IO, rule::MarkovRule) =
|
||||
print(io, rule.patt, " → ", isterminating(rule) ? "." : "", rule.repl)
|
||||
function Base.convert(::Type{MarkovRule}, s::AbstractString)
|
||||
rmatch = match(r"^(.+)\s+->\s*(\.)?(.*)?$", s)
|
||||
if rmatch ≡ nothing || isempty(rmatch.captures)
|
||||
throw(ParseError("not valid rule: " * s))
|
||||
end
|
||||
patt, term, repl = rmatch.captures
|
||||
return MarkovRule(patt, repl ≢ nothing ? repl : "", term ≢ nothing)
|
||||
end
|
||||
|
||||
function ruleset(file::Union{AbstractString,IO})
|
||||
ruleset = Vector{MarkovRule}(0)
|
||||
for line in eachline(file)
|
||||
ismatch(r"(^#|^\s*$)", line) || push!(ruleset, MarkovRule(line))
|
||||
end
|
||||
return ruleset
|
||||
end
|
||||
|
||||
apply(text::AbstractString, rule::MarkovRule) = replace(text, rule.patt, rule.repl)
|
||||
function apply(file::Union{AbstractString,IO}, ruleset::AbstractVector{<:MarkovRule})
|
||||
text = readstring(file)
|
||||
redo = !isempty(text)
|
||||
while redo
|
||||
matchrule = false
|
||||
for rule in ruleset
|
||||
if contains(text, rule.patt)
|
||||
matchrule = true
|
||||
text = apply(text, rule)
|
||||
redo = !isterminating(rule)
|
||||
break
|
||||
end
|
||||
end
|
||||
redo = redo && matchrule
|
||||
end
|
||||
return text
|
||||
end
|
||||
|
||||
end # module MarkovAlgos
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
include("module.jl")
|
||||
|
||||
let rulesets = @.("data/markovrules0" * string(1:5) * ".txt"),
|
||||
ruletest = @.("data/markovtest0" * string(1:5) * ".txt")
|
||||
for i in eachindex(rulesets, ruletest)
|
||||
rules = MarkovAlgos.ruleset(rulesets[i])
|
||||
println("# Example n.$i")
|
||||
println("Original:\n", readstring(ruletest[i]))
|
||||
println("Transformed:\n", MarkovAlgos.apply(ruletest[i], rules))
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
// version 1.1.51
|
||||
|
||||
import java.io.File
|
||||
import java.util.regex.Pattern
|
||||
|
||||
/* rulesets assumed to be separated by a blank line in file */
|
||||
fun readRules(path: String): List<List<String>> {
|
||||
val ls = System.lineSeparator()
|
||||
return File(path).readText().split("$ls$ls").map { it.split(ls) }
|
||||
}
|
||||
|
||||
/* tests assumed to be on consecutive lines */
|
||||
fun readTests(path: String) = File(path).readLines()
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val rules = readRules("markov_rules.txt")
|
||||
val tests = readTests("markov_tests.txt")
|
||||
val pattern = Pattern.compile("^([^#]*?)\\s+->\\s+(\\.?)(.*)")
|
||||
|
||||
for ((i, origTest) in tests.withIndex()) {
|
||||
val captures = mutableListOf<List<String>>()
|
||||
for (rule in rules[i]) {
|
||||
val m = pattern.matcher(rule)
|
||||
if (m.find()) {
|
||||
val groups = List<String>(m.groupCount()) { m.group(it + 1) }
|
||||
captures.add(groups)
|
||||
}
|
||||
}
|
||||
var test = origTest
|
||||
|
||||
do {
|
||||
val copy = test
|
||||
var redo = false
|
||||
for (c in captures) {
|
||||
test = test.replace(c[0], c[2])
|
||||
if (c[1] == ".") break
|
||||
if (test != copy) { redo = true; break }
|
||||
}
|
||||
}
|
||||
while (redo)
|
||||
|
||||
println("$origTest\n$test\n")
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +1,42 @@
|
|||
/*REXX program executes a Markov algorithm(s) against specified entries. */
|
||||
parse arg low high . /*allows which ruleset to process. */
|
||||
if low=='' | low==',' then low=1 /*Not specified? Then use the default.*/
|
||||
if high=='' | high==',' then high=6 /* " " " " " " */
|
||||
tellE=low<0; tellR=high<0 /*flags: used to display file contents.*/
|
||||
/*REXX program executes a Markov algorithm(s) against specified entries. */
|
||||
parse arg low high . /*allows which ruleset to process. */
|
||||
if low=='' | low=="," then low=1 /*Not specified? Then use the default.*/
|
||||
if high=='' | high=="," then high=6 /* " " " " " " */
|
||||
tellE= low<0; tellR= high<0 /*flags: used to display file contents.*/
|
||||
call readEntry
|
||||
do j=abs(low) to abs(high) /*process each of these rulesets. */
|
||||
call readRules j /*read a particular ruleset. */
|
||||
call execRules j /*execute " " " */
|
||||
say 'result for ruleset' j"≡"!.j
|
||||
end /*j*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
execRules: parse arg q .; if tellE | tellR then say /*a blank line*/
|
||||
do f=1
|
||||
do k=1 while @.k\==''; if left(@.k,1)=='#' | @.k='' then iterate
|
||||
parse var @.k a ' ->' b; a=strip(a); b=strip(b)
|
||||
fullstop= left(b,1)=='.' /*is this a "fullstop" rule? */
|
||||
if fullstop then b=substr(b,2) /*purify the B part of the rule. */
|
||||
old=!.q /*remember the value before the change.*/
|
||||
!.q=changestr(a, !.q, b) /*implement the ruleset change. */
|
||||
if fullstop then if old\==!.q then return /*should we stop? */
|
||||
if old\==!.q then iterate f /*Has Entry changed? Then start over.*/
|
||||
end /*k*/
|
||||
leave
|
||||
end /*f*/
|
||||
return
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
readRules: parse arg ? .; rFID='MARKOV_R.'?; if tellR then say
|
||||
@.= /*placeholder for all the Markov rules.*/
|
||||
do r=1 while lines(rFID)\==0 /*read the input file until End-Of-File*/
|
||||
@.r=linein(rFID); if tellR then say 'ruleSet' ?"."left(r,4)'≡'@.r
|
||||
end /*r*/ /*(above) read and maybe echo the rule.*/
|
||||
return
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
readEntry: eFID='MARKOV.ENT'; if tellE then say
|
||||
!.= /*placeholder for all the test entries.*/
|
||||
do e=1 while lines(eFID)\==0 /*read the input file until End-Of-File*/
|
||||
!.e=linein(eFID); if tellE then say 'test entry' e"≡"!.e
|
||||
end /*e*/ /*(above) read and maybe echo the entry*/
|
||||
return
|
||||
do j=abs(low) to abs(high) /*process each of these rulesets. */
|
||||
call readRules j /*read a particular ruleset. */
|
||||
call execRules j /*execute " " " */
|
||||
say 'result for ruleset' j "───►" !.j
|
||||
end /*j*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
execRules: parse arg q .; if tellE | tellR then say /*show a blank line?*/
|
||||
do f=1
|
||||
do k=1 while @.k\==''; if left(@.k, 1)=='#' | @.k='' then iterate
|
||||
parse var @.k a ' ->' b /*obtain the A & B parts from rule.*/
|
||||
a=strip(a); b=strip(b) /*strip leading and/or trailing blanks.*/
|
||||
fullstop= left(b, 1)==. /*is this a "fullstop" rule? 1≡yes */
|
||||
if fullstop then b=substr(b, 2) /*purify the B part of the rule. */
|
||||
old=!.q /*remember the value before the change.*/
|
||||
!.q=changestr(a, !.q, b) /*implement the ruleset change. */
|
||||
if fullstop then if old\==!.q then return /*should we stop? */
|
||||
if old\==!.q then iterate f /*Has Entry changed? Then start over.*/
|
||||
end /*k*/
|
||||
return
|
||||
end /*f*/
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
readEntry: eFID= 'MARKOV.ENT'; if tellE then say /*show a blank line?*/
|
||||
!.= /*placeholder for all the test entries.*/
|
||||
do e=1 while lines(eFID)\==0 /*read the input file until End-Of-File*/
|
||||
!.e=linein(eFID); if tellE then say 'test entry' e "───►" !.e
|
||||
end /*e*/ /* [↑] read and maybe echo the entry. */
|
||||
return
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
readRules: parse arg ? .; rFID= 'MARKOV_R.'?; if tellR then say /*show a blank line?*/
|
||||
@.= /*placeholder for all the Markov rules.*/
|
||||
do r=1 while lines(rFID)\==0 /*read the input file until End-Of-File*/
|
||||
@.r=linein(rFID); if tellR then say 'ruleSet' ?"."left(r,4) '───►' @.r
|
||||
end /*r*/ /* [↑] read and maybe echo the rule. */
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue