Advertisement
Waffle3z

Chameleon

Jun 26th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.28 KB | None | 0 0
  1. return"Chameleon",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 function rep2()
  21. local r,len=math.random(3)-1,0
  22. for i=#t-1,1,-1 do
  23. local v=t[i+1]
  24. for j=0,i do
  25. if t[i-j]==t[#t-j]then
  26. if j>=len then
  27. r,len=(v+1)%3,j+1
  28. end
  29. else
  30. break
  31. end
  32. end
  33. end
  34. return r
  35. end
  36. names[rep2]="rep2"
  37. local function repbias()
  38. local a,b,c=0,0,0
  39. for i=#t-1,1,-1 do
  40. local v=t[i+1]
  41. for j=0,i do
  42. if t[i-j]==t[#t-j]then
  43. local n=3^j/(#t-i)
  44. if v==0 then a=a+n elseif v==1 then b=b+n else c=c+n end
  45. else
  46. break
  47. end
  48. end
  49. end
  50. if a>b and a>c then return 1
  51. elseif b>a and b>c then return 2
  52. elseif c>a and c>b then return 0
  53. elseif a>b and a==c then return 0
  54. elseif b>c and b==a then return 1
  55. elseif c>a and c==b then return 2
  56. else return math.random(3)-1 end
  57. end
  58. names[repbias]="repbias"
  59. local function hist()return #t==0 and math.random(3)-1 or(t[math.random(#t)]+1)%3 end
  60. names[hist]="hist"
  61. local function hist3()return #t==0 and math.random(3)-1 or(t[math.random(math.max(1,#t-3),#t)]+1)%3 end
  62. names[hist3]="hist3"
  63. local randbias do
  64. local r,p,s=0,0,0
  65. local function f(x)
  66. if x==0 then r=r+1 elseif x==1 then p=p+1 else s=s+1 end
  67. end
  68. for i=1,#t do f(t[i])end
  69. randbias=function()
  70. if #t~=0 then f(t[#t])else return math.random(3)-1 end
  71. local x=math.random(r+p+s)
  72. if x<=r then return 1 end
  73. if x<=r+p then return 2 end
  74. return 0
  75. end
  76. end
  77. names[randbias]="randbias"
  78. local even do
  79. local r,p,s=0,0,0
  80. even=function()
  81. if math.random(2)==1 then
  82. if p>r and r < s then r=r+1 return 0 end
  83. if p < r and p < s then p=p+1 return 1 end
  84. if s < r and p>s then s=s+1 return 2 end
  85. if r < s and p < s then if math.random(2)==1 then r=r+1 return 0 else p=p+1 return 1 end end
  86. if p>r and p>s then if math.random(2)==1 then r=r+1 return 0 else s=s+1 return 2 end end
  87. if p < r and s < r then if math.random(2)==1 then p=p+1 return 1 else s=s+1 return 2 end end
  88. end
  89. local n=math.random(3)-1
  90. if n==0 then r=r+1 elseif n==1 then p=p+1 else s=s+1 end
  91. return n
  92. end
  93. end
  94. names[even]="even"
  95. local f={}for a,_ in pairs(names)do f[#f+1],set[a]=a,0 end
  96. 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
  97. 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
  98. local function rand()return math.random(3)-1 end set[rand]=0 names[rand]="rand"
  99. local last={}
  100. return function()
  101. local r=t[#t]
  102. local name="rand"
  103. if r then
  104. local mv,m=-math.huge,rand
  105. for f,v in pairs(set)do
  106. local a,b=last[f],r
  107. if a==(b+1)%3 then
  108. v=v+1 set[f]=v
  109. elseif a~=b then
  110. v=v-1 set[f]=v
  111. end
  112. if v>mv then m,mv=f,v end
  113. end
  114. ret=m()name=names[m]
  115. else
  116. ret=rand()
  117. end
  118. for f,v in pairs(set)do last[f]=f()end
  119. return ret
  120. end
  121. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement