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
|
||||
Loading…
Add table
Add a link
Reference in a new issue