Advertisement
HappySunChild

Isle 8-9 Autohack

Sep 5th, 2022
1,502
2
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.43 KB | Source Code | 2 0
  1. local Workspace = game:GetService("Workspace")
  2. local PlayersService = game:GetService("Players")
  3. --
  4. local LocalPlayer = PlayersService.LocalPlayer
  5.  
  6. local Services = Workspace:WaitForChild("Services")
  7. --
  8. local ALLOW_FREEZE = true
  9. local ARTIFICIAL_SUBMIT_DELAY = 0 -- (seconds); 60 will take a minute before submitting
  10.  
  11. local autohack = {}
  12. --
  13. local GetDictionaryLength, CharacterPresent, GetNumber, ParseExpression; do
  14.     function GetDictionaryLength(dictionary)
  15.         local length = 0
  16.         for key, value in pairs(dictionary) do
  17.             length = length + 1
  18.         end
  19.         return length
  20.     end
  21.    
  22.     function CharacterPresent(str, character)
  23.         for i=1, #str do
  24.             if string.sub(str, i, i) == character then
  25.                 return true
  26.             end
  27.         end
  28.         return false
  29.     end
  30.    
  31.     function GetNumber(expression)
  32.         local validCharacters = "0123456789.-"
  33.         local foundDigit = false
  34.         local i = 1
  35.         local currentCharacter = string.sub(expression, i, i)
  36.         while CharacterPresent(validCharacters, currentCharacter) do
  37.             if i == 1 then
  38.                 validCharacters = "0123456789."
  39.             end
  40.             if currentCharacter == "." then
  41.                 validCharacters = "0123456789"
  42.             end
  43.             if CharacterPresent("0123456789", currentCharacter) then
  44.                 foundDigit = true
  45.             end
  46.             i = i + 1
  47.             if i > #expression then
  48.                 break
  49.             end
  50.             currentCharacter = string.sub(expression, i, i)
  51.         end
  52.         if not foundDigit then
  53.             i = 1
  54.         end
  55.         return tonumber(string.sub(expression, 1, i-1)), string.sub(expression, i, #expression)
  56.     end
  57.    
  58.     function ParseExpression(expression, expectEndParentheses)
  59.         local expectingExpression = true
  60.         local lastExpressionWasParenthetical = false
  61.         local operators = "+-/*^%"
  62.         local parts = {}
  63.         local foundEndParentheses = false
  64.         expectEndParentheses = expectEndParentheses or false
  65.         while expression ~= "" do
  66.             local nextNumber, expressionAfterNumber = GetNumber(expression)
  67.             local nextCharacter = string.sub(expression, 1, 1)
  68.             local nextPiece = string.sub(expression, 1, 5)
  69.             if #expression <= 5 then
  70.                 nextPiece = nextPiece .. " [end]"
  71.             end
  72.             if expectingExpression then
  73.                 if nextCharacter == "(" then
  74.                     local nestedExpressionValue, expressionAfterParentheses = ParseExpression(string.sub(expression, 2, #expression), true)
  75.                     if nestedExpressionValue == nil then
  76.                         return nestedExpressionValue, expressionAfterParentheses
  77.                     end
  78.                     table.insert(parts, nestedExpressionValue)
  79.                     expression = expressionAfterParentheses
  80.                     lastExpressionWasParenthetical = true
  81.                 else
  82.                     if nextNumber == nil then
  83.                         return nil, "Expected number or '(', but found '"..nextPiece.."'"
  84.                     end
  85.                     table.insert(parts, nextNumber)
  86.                     expression = expressionAfterNumber
  87.                     lastExpressionWasParenthetical = false
  88.                 end
  89.             elseif CharacterPresent(operators, nextCharacter) then
  90.                 table.insert(parts, nextCharacter)
  91.                 expression = string.sub(expression, 2, #expression)
  92.             elseif nextCharacter == "(" or (lastExpressionWasParenthetical and nextNumber ~= nil) then
  93.                 table.insert(parts, "*")
  94.             elseif nextCharacter == ")" then
  95.                 if expectEndParentheses then
  96.                     expression = string.sub(expression, 2, #expression)
  97.                     foundEndParentheses = true
  98.                     break
  99.                 else
  100.                     return nil, "')' present without matching '(' at '"..nextPiece.."'"
  101.                 end
  102.             else
  103.                 return nil, "Expected expression, but found '"..nextPiece.."'"
  104.             end
  105.             expectingExpression = not expectingExpression
  106.         end
  107.         if expectEndParentheses and not foundEndParentheses then
  108.             return nil, "Expression unexpectedly ended ('(' present without matching ')')"
  109.         end
  110.         if expectingExpression then
  111.             return nil, "Expression unexpectedly ended"
  112.         end
  113.         local i = #parts
  114.         while i >= 1 do
  115.             if parts[i] == "^" then
  116.                 parts[i-1] = parts[i-1] ^ parts[i+1]
  117.                 table.remove(parts, i+1)
  118.                 table.remove(parts, i)
  119.             end
  120.             i = i - 1
  121.         end
  122.         i = 1
  123.         while i <= #parts do
  124.             if parts[i] == "*" then
  125.                 parts[i-1] = parts[i-1] * parts[i+1]
  126.                 table.remove(parts, i+1)
  127.                 table.remove(parts, i)
  128.             elseif parts[i] == "/" then
  129.                 parts[i-1] = parts[i-1] / parts[i+1]
  130.                 table.remove(parts, i+1)
  131.                 table.remove(parts, i)
  132.             elseif parts[i] == "%" then
  133.                 parts[i-1] = parts[i-1] % parts[i+1]
  134.                 table.remove(parts, i+1)
  135.                 table.remove(parts, i)
  136.             else
  137.                 i = i + 1
  138.             end
  139.         end
  140.         i = 1
  141.         while i <= #parts do
  142.             if parts[i] == "+" then
  143.                 parts[i-1] = parts[i-1] + parts[i+1]
  144.                 table.remove(parts, i+1)
  145.                 table.remove(parts, i)
  146.             elseif parts[i] == "-" then
  147.                 parts[i-1] = parts[i-1] - parts[i+1]
  148.                 table.remove(parts, i+1)
  149.                 table.remove(parts, i)
  150.             else
  151.                 i = i + 1
  152.             end
  153.         end
  154.  
  155.         return parts[1], expression
  156.     end
  157. end
  158.  
  159. local SubmitSolution = Services:WaitForChild("SubmitSolution")
  160.  
  161. local AllLetters = {"A", "B", "C", "D", "E", "F"}
  162.  
  163. function autohack.OnHack(expressions, usedLetters, answers, hints, objectId, objectCodeName)
  164.     local expectedLetters = #usedLetters
  165.     local generatedLetters = table.clone(hints)
  166.  
  167.     local lastGeneratedLetters
  168.  
  169.     local canSubmit = true
  170.     local canBeOptimized = (expectedLetters - #hints) == 1
  171.  
  172.     local lastGeneratedValue = 0
  173.     for index, expression in ipairs(expressions) do
  174.         expression = string.gsub(expression, "%s+", "")
  175.         --
  176.         local expectedAnswer = tonumber(answers[index])
  177.  
  178.         local generatedAnswer
  179.         repeat
  180.             local currentExpression = expression
  181.  
  182.             if lastGeneratedLetters then
  183.                 generatedLetters = lastGeneratedLetters
  184.             elseif GetDictionaryLength(generatedLetters) ~= expectedLetters then
  185.                 for _, letter in ipairs(usedLetters) do
  186.                     if not generatedLetters[letter] then
  187.                         if canBeOptimized then
  188.                             generatedLetters[letter] = lastGeneratedValue
  189.  
  190.                             lastGeneratedValue = lastGeneratedValue + 1
  191.                         else
  192.                             generatedLetters[letter] = math.random(0, 9)
  193.                         end
  194.                     end
  195.                 end
  196.             end
  197.  
  198.             for letter, value in pairs(generatedLetters) do
  199.                 currentExpression = string.gsub(currentExpression, letter, value)
  200.             end
  201.  
  202.             generatedAnswer = ParseExpression(currentExpression)
  203.  
  204.             if generatedAnswer ~= expectedAnswer then
  205.                 -- Generated number is wrong
  206.                 if lastGeneratedLetters == generatedLetters then
  207.                     -- It will just spam the remote without this line
  208.                     canSubmit = false
  209.                     -- Attempt again
  210.                     task.spawn(OnHack, expressions, usedLetters, answers, hints, objectId, objectCodeName)
  211.                     break
  212.                 end
  213.  
  214.                 generatedLetters = table.clone(hints)
  215.             end
  216.  
  217.             if not ALLOW_FREEZE then
  218.                 task.wait()
  219.             end
  220.         until generatedAnswer == expectedAnswer
  221.  
  222.         lastGeneratedLetters = generatedLetters
  223.     end
  224.  
  225.     if canSubmit then
  226.         -- Append missing letters
  227.         for _, letter in ipairs(AllLetters) do
  228.             if not generatedLetters[letter] then
  229.                 generatedLetters[letter] = 1
  230.             end
  231.         end
  232.  
  233.         task.delay(ARTIFICIAL_SUBMIT_DELAY, function()
  234.                 SubmitSolution:FireServer(objectId, generatedLetters, objectCodeName)
  235.             end)
  236.  
  237.         lastGeneratedValue = 0
  238.     end
  239. end
  240.  
  241. return autohack
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement