Waffle3z

PatternMatch

Jun 26th, 2016
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.21 KB | None | 0 0
  1. return"PatternMatch",function(t,t2)
  2. local set,names={},{}
  3. local function rep()
  4. local r,len=math.random(3)-1,0
  5. for i=#t-1,1,-1 do
  6. local v=t[i+1]
  7. for j=0,i do
  8. if t[i-j]==t[#t-j]and t2[i-j]==t2[#t2-j]then
  9. if j>=len then
  10. r,len=(v+1)%3,j+1
  11. end
  12. else
  13. break
  14. end
  15. end
  16. end
  17. return r
  18. end
  19. names[rep]="rep"
  20. local f={}for a,_ in pairs(names)do f[#f+1],set[a]=a,0 end
  21. for i=1,#f do local x=function()t,t2=t2,t local r=f[i]()t,t2=t2,t return r end set[x]=0 names[x]="anti"..names[f[i]]f[#f+1]=x end
  22. for i=1,#f do local x=function()return(f[i]()+1)%3 end local y=function()return(f[i]()+2)%3 end set[x]=0 set[y]=0 names[x]=names[f[i]].."+1" names[y]=names[f[i]].."+2"end
  23. local function rand()return math.random(3)-1 end set[rand]=0 names[rand]="rand"
  24. local last={}
  25. return function()
  26. local r=t[#t]
  27. local name="rand"
  28. if r then
  29. local mv,m=-math.huge,rand
  30. for f,v in pairs(set)do
  31. local a,b=last[f],r
  32. if a==(b+1)%3 then
  33. v=v+1 set[f]=v
  34. elseif a~=b then
  35. v=v-1 set[f]=v
  36. end
  37. if v>mv then m,mv=f,v end
  38. end
  39. ret=m()name=names[m]
  40. else
  41. ret=rand()
  42. end
  43. for f,v in pairs(set)do last[f]=f()end
  44. return ret
  45. end
  46. end
Advertisement
Add Comment
Please, Sign In to add comment