Execute a Markov algorithm: Difference between revisions

→‎{{header|REXX}}: added the REXX language. -- ~~~~
(Added BBC BASIC)
(→‎{{header|REXX}}: added the REXX language. -- ~~~~)
Line 1,676:
assert replace(text4, extractreplacements(grammar5)) \
== '00011H1111000'</lang>
 
=={{header|REXX}}==
<lang rexx>/*REXX pgm to execute a Markov algorithm(s) against specified entries.*/
parse arg low high . /*allow which ruleset to process.*/
if low=='' | low==',' then low=1 /*assume a default if none given.*/
if high=='' | high==',' then high=6 /*assume a default if none given.*/
tellE = low<0; tellR = high<0 /*flags: 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 done.*/
/*───────────────────────────────EXECRULES──────────────────────────────*/
execRules: parse arg q .; if tellE | tellR then say
do f=1 /* forever */
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 value before 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 /*Entry changed? Then start over*/
end /*k*/
leave
end /*f*/
return
/*───────────────────────────────READRULES──────────────────────────────*/
readRules: parse arg ? .; rFID='MARKOV_R.'?; if tellR then say
@.= /*placeholder: all Markov rules.*/
do r=1 while lines(rFID)\==0 /*read the input file until E-O-F*/
@.r=linein(rFID); if tellR then say 'ruleSet' ?"."left(r,4)'≡'@.r
end /*r*/ /*(above) read and maybe echo it.*/
return
/*───────────────────────────────READENTRY──────────────────────────────*/
readEntry: eFID='MARKOV.ENT'; if tellE then say
!.= /*placeholder: all test entries.*/
do e=1 while lines(eFID)\==0 /*read the input file until E-O-F*/
!.e=linein(eFID); if tellE then say 'test entry' e"≡"!.e
end /*e*/ /*(above) read and maybe echo it.*/
return</lang>
'''output''' when using the default input and files:
<pre style="overflow:scroll">
result for ruleset 1≡I bought a bag of apples from my brother.
result for ruleset 2≡I bought a bag of apples from T shop.
result for ruleset 3≡I bought a bag of apples with my money from T shop.
result for ruleset 4≡11111111111111111111
result for ruleset 5≡00011H1111000
result for ruleset 6≡|||||
</pre>
'''Ruleset 6''' is:
<pre style="overflow:scroll">
# Rewrite binary numbers to their unary value (| bars).
# I.E.: 101 [base 2] will be converted to 5 bars.
#──────────────────────────────────────────────────────
|0 -> 0||
1 -> 0|
0 ->
</pre>
 
=={{header|Ruby}}==