;--------------------------------------------------------------------------- ; Markov Algorithm.ahk ; by wolf_II ;--------------------------------------------------------------------------- ; interpreter for a Markov Algorithm ;--------------------------------------------------------------------------- ;--------------------------------------------------------------------------- AutoExecute: ; auto-execute section of the script ;--------------------------------------------------------------------------- #SingleInstance, Force ; only one instance allowed #NoEnv ; don't check empty variables StartupDir := A_WorkingDir ; remember startup directory SetWorkingDir, %A_ScriptDir% ; change directoy StringCaseSense, On ; case sensitive comparisons ;----------------------------------------------------------------------- AppName := "Markov Algorithm" Gosub, GuiCreate Gui, Show,, %AppName% Return ;--------------------------------------------------------------------------- GuiCreate: ; create the GUI ;--------------------------------------------------------------------------- ; GUI options Gui, -MinimizeBox Gui, Add, Edit, y0 h0 ; catch the focus ; Ruleset Gui, Add, GroupBox, w445 h145 Section, Ruleset Gui, Add, Edit, xs+15 ys+20 w300 r8 vRuleset Gui, Add, Button, x+15 w100, Load Ruleset Gui, Add, Button, wp, Save Ruleset Gui, Add, Button, w30, 1 Gui, Add, Button, x+5 wp, 2 Gui, Add, Button, x+5 wp, 3 Gui, Add, Button, xs+330 y+6 wp, 4 Gui, Add, Button, x+5 wp, 5 ; String Gui, Add, GroupBox, xs w445 h75 Section, String Gui, Add, Edit, xs+15 ys+20 w300 vString Gui, Add, Button, x+15 w100, Apply Ruleset Gui, Add, Button, xp wp Hidden, Stop Gui, Add, CheckBox, xs+15 yp+30 vSingleStepping, Single Stepping? ; Output Gui, Add, GroupBox, xs w445 h235 Section, Output Gui, Add, Edit, xs+15 ys+20 w415 r15 ReadOnly vOutput HwndhOut Return ;--------------------------------------------------------------------------- GuiClose: ;--------------------------------------------------------------------------- ExitApp Return ;--------------------------------------------------------------------------- ButtonLoadRuleset: ; load ruleset from file ;--------------------------------------------------------------------------- Gui, +OwnDialogs FileSelectFile, RulesetFile,,, Load Ruleset, *.markov If Not SubStr(RulesetFile, -6) = ".markov" RulesetFile .= ".markov" If FileExist(RulesetFile) { FileRead, Ruleset, %RulesetFile% GuiControl,, Ruleset, %Ruleset% } Else MsgBox, 16, Error - %AppName%, File not found:`n`n"%RulesetFile%" Return ;--------------------------------------------------------------------------- ButtonSaveRuleset: ; save ruleset to file ;--------------------------------------------------------------------------- Gui, +OwnDialogs Gui, Submit, NoHide FileSelectFile, RulesetFile, S16,, Save Ruleset, *.markov If Not SubStr(RulesetFile, -6) = ".markov" RulesetFile .= ".markov" FileDelete, %RulesetFile% FileAppend, %Ruleset%, %RulesetFile% Gui, Show Return _ ;--------------------------------------------------------------------------- Button1: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm#Ruleset_1 ;--------------------------------------------------------------------------- GuiControl,, Output ; clear output GuiControl,, String, I bought a B of As from T S. GuiControl,, Ruleset, (LTrim # 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 ) Return ;--------------------------------------------------------------------------- Button2: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm#Ruleset_2 ;--------------------------------------------------------------------------- GuiControl,, Output ; clear output GuiControl,, String, I bought a B of As from T S. GuiControl,, Ruleset, (LTrim # Slightly modified from the rules on Wikipedia A -> apple B -> bag S -> .shop T -> the the shop -> my brother a never used -> .terminating rule ) Return ;--------------------------------------------------------------------------- Button3: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm#Ruleset_3 ;--------------------------------------------------------------------------- GuiControl,, Output ; clear output GuiControl,, String, I bought a B of As W my Bgage from T S. GuiControl,, Ruleset, (LTrim # 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 ) Return ;--------------------------------------------------------------------------- Button4: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm#Ruleset_4 ;--------------------------------------------------------------------------- GuiControl,, Output ; clear output GuiControl,, String, _1111*11111_ GuiControl,, Ruleset, (LTrim ### 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 _+_ -> ) Return ;--------------------------------------------------------------------------- Button5: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm#Ruleset_5 ;--------------------------------------------------------------------------- GuiControl,, Output ; clear output GuiControl,, String, 000000A000000 GuiControl,, Ruleset, (LTrim # 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 ) Return ;--------------------------------------------------------------------------- ButtonApplyRuleset: ; flow control for Algorithm ;--------------------------------------------------------------------------- ; prepare Gui, Submit, NoHide GuiControl,, Output ; clear Controls(False) ; disable Count := 0 Subst := True Stop := False ; keep substituting for as long as necessary While, Subst { Subst := False ; reset control variable IfEqual, Stop, 1, Break Gosub, Algorithm } ; clean up Output("Substitution count: " Count) Controls(True) ; re-enable Return ;--------------------------------------------------------------------------- ButtonStop: ; this button is initially hidden ;--------------------------------------------------------------------------- Stop := True Return ;--------------------------------------------------------------------------- Algorithm: ; http://rosettacode.org/wiki/Execute_a_Markov_algorithm ;--------------------------------------------------------------------------- ; Parse the ruleset and apply each rule to the string. Whenever a rule ; has changed the string goto first rule. Continue until a encountering ; a terminating rule, or until no further changes to the strings are ; made. ;----------------------------------------------------------------------- Loop, Parse, Ruleset, `n, `r ; always start from the beginning { ; check for comment If SubStr(A_LoopField, 1, 1) = "#" Continue ; get next line ; split a rule into $Search, $Terminator and $Replace LookFor := "(?P.+) -> (?P\.?)(?P.+)" RegExMatch(A_LoopField, LookFor, $) ; single stepping through possible substitutions If SingleStepping MsgBox,, %AppName%, % "" . "Rule = """ A_LoopField """`n`n" . "Search`t= """ $Search """`n" . "Replace`t= """ $Replace """`n" . "Termintor`t= """ ($Terminator ? "True" : "False") """`n" ; try to substitute StringReplace, String, String, %$Search%, %$Replace%, UseErrorLevel ; any success? If ErrorLevel { ; yes, substitution done Count++ ; keep count Subst := True ; set control variable Output(String) ; write new string to output } ; terminate? If $Terminator { ; yes, terminate Stop := True ; set control variable Break ; back to flow control } ; we are not yet terminated ... If Subst ; but we just did a substitution Break ; back to flow control } Return ;--------------------------------------------------------------------------- Controls(Bool) { ; [en|dis]able controls ;--------------------------------------------------------------------------- Enable := Bool ? "+" : "-" Disable := Bool ? "-" : "+" Loop, 2 GuiControl, %Disable%ReadOnly, % "Edit" A_Index + 1 Loop, 7 GuiControl, %Disable%Disabled, % "Button" A_Index + 1 GuiControl, %Disable%Disabled, Edit4 GuiControl, %Disable%Hidden, Button10 GuiControl, %Enable%Hidden, Button11 GuiControl, %Disable%Disabled, Button12 } ;--------------------------------------------------------------------------- Output(Text) { ; append text to output ;--------------------------------------------------------------------------- static EM_REPLACESEL = 0xC2 global hOut Sleep, 100 Text .= "`r`n" SendMessage, EM_REPLACESEL,, &Text,, ahk_id %hOut% } ;---------- end of file ----------------------------------------------------