Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
76
Task/Eertree/M2000-Interpreter/eertree.m2000
Normal file
76
Task/Eertree/M2000-Interpreter/eertree.m2000
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
If Version<9.5 Then exit
|
||||
If Version=9.5 And Revision<2 Then Exit
|
||||
Class Node {
|
||||
inventory myedges
|
||||
length, suffix=0
|
||||
Function edges(s$) {
|
||||
=-1 : if exist(.myedges, s$) then =eval(.myedges)
|
||||
}
|
||||
Module edges_append (a$, where) {
|
||||
Append .myedges, a$:=where
|
||||
}
|
||||
Class:
|
||||
Module Node(.length) {
|
||||
Read ? .suffix, .myedges
|
||||
}
|
||||
}
|
||||
function eertree(s$) {
|
||||
Const evenRoot=0, oddRoot=1
|
||||
Inventory Tree= oddRoot:=Node(-1,1),evenRoot:=Node(0,1)
|
||||
k=0
|
||||
suffix=oddRoot
|
||||
for i=0 to len(s$)-1 {
|
||||
c$=mid$(s$,i+1,1)
|
||||
n=suffix
|
||||
Do {
|
||||
k=tree(n).length
|
||||
b=i-k-1
|
||||
if b>=0 then if mid$(s$,b+1,1)=c$ Then exit
|
||||
n =tree(n).suffix
|
||||
} Always
|
||||
e=tree(n).edges(c$)
|
||||
if e>=0 then suffix=e :continue
|
||||
suffix=len(Tree)
|
||||
|
||||
Append Tree, len(Tree):=Node(k+2)
|
||||
Tree(n).edges_append c$, suffix
|
||||
If tree(suffix).length=1 then tree(suffix).suffix=0 : continue
|
||||
Do {
|
||||
n=tree(n).suffix
|
||||
b=i-tree(n).length-1
|
||||
if b>0 Then If mid$(s$, b+1,1)=c$ then exit
|
||||
} Always
|
||||
e=tree(n).edges(c$)
|
||||
if e>=0 then tree(suffix).suffix=e
|
||||
|
||||
}
|
||||
=tree
|
||||
}
|
||||
children=lambda (s, tree, n, root$="")->{
|
||||
L=Len(tree(n).myEdges)
|
||||
if L=0 then =s : exit
|
||||
L--
|
||||
For i=0 to L {
|
||||
c=tree(n).myEdges
|
||||
c$=Eval$(c, i) ' read keys at position i
|
||||
nxt=c(i!) ' read value using position
|
||||
p$ = if$(n=1 -> c$, c$+root$+c$)
|
||||
append s, (p$,)
|
||||
\\ better use lambda() and not children()
|
||||
\\ for recursion when we copy this lambda to other identifier.
|
||||
s = lambda(s, tree, nxt, p$)
|
||||
}
|
||||
= s
|
||||
}
|
||||
aString=Lambda ->{
|
||||
Push Quote$(Letter$)
|
||||
}
|
||||
aLine=Lambda ->{
|
||||
Shift 2 ' swap two top stack items
|
||||
if stackitem$()="" then { Drop} Else Push letter$+", "+Letter$
|
||||
}
|
||||
Palindromes$=Lambda$ children, aString, aLine (Tree)-> {
|
||||
="("+children(children((,), Tree, 0), Tree, 1)#Map(aString)#Fold$(aline,"")+")"
|
||||
}
|
||||
|
||||
Print Palindromes$(eertree("eertree"))
|
||||
Loading…
Add table
Add a link
Reference in a new issue