InTesting

KS2Hash (KS2Hash.util)

Oct 13th, 2021 (edited)
94
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local util = {}
  2. local selection = game.Selection
  3.  
  4. util.base = {}
  5. util.Instance = {}
  6. util.misc = {}
  7. util.scientificNotation = {}
  8. util.string = {}
  9. util.table = {}
  10.  
  11. -- functions
  12. do
  13.     --  base
  14.     function util.base:factNumToStrFromBase(charsDict)
  15.         local base = #charsDict + 1
  16.  
  17.         return function(num)
  18.             local res = ''
  19.  
  20.             local iterations = 1 + math.max(0, math.floor( math.log(num, base)))
  21.  
  22.             for i = iterations, 1, -1  do -- going down number places
  23.                 local factor = base ^ (i - 1)
  24.  
  25.                 local index = base - 1
  26.  
  27.                 for largestDigit = base, 0, -1 do -- going down the base to 1
  28.                     local num2 = factor * largestDigit
  29.  
  30.                     if num - num2 < 0 then continue end
  31.  
  32.                     index = largestDigit
  33.                     num -= num2
  34.  
  35.                     break
  36.                 end
  37.                 res ..= charsDict[index]
  38.             end
  39.  
  40.             return res
  41.         end
  42.     end
  43.  
  44.     function util.base:factStrToNumFromBase(charsDict)
  45.         local base = #charsDict + 1
  46.         local flippedCharacters = util.table:flipTable(charsDict)
  47.  
  48.         return function(str)
  49.             assert(type(str) == 'string')
  50.  
  51.             local res = 0
  52.  
  53.             for index = 1, #str do -- iterate each letter
  54.                 local letter = str:sub(index, index)
  55.  
  56.                 local num = flippedCharacters[letter] * base ^ (#str - index)
  57.  
  58.                 res += num
  59.             end
  60.  
  61.             return res
  62.         end
  63.     end
  64.  
  65.     --  Instance
  66.     function util.Instance:new(className,props)
  67.         local i = Instance.new(className)
  68.  
  69.         util.table:changeIndex(i, props, true)
  70.  
  71.         return i
  72.     end
  73.  
  74.     function util.Instance:create(className)
  75.         return function(props)
  76.             return util.Instance:new(className,props)
  77.         end
  78.     end
  79.  
  80.     --  scientific notation
  81.     function util.scientificNotation:getScifiNotatSet(num, customBase)
  82.         customBase = customBase or 10
  83.  
  84.         assert(
  85.             type(num) == 'number' and
  86.                 type(customBase) == 'number'
  87.         )
  88.  
  89.         local res = {
  90.             exponent = 0;
  91.             rational = num;
  92.             sign = math.sign(num)
  93.         }
  94.  
  95.         local absNum = math.abs(num)
  96.  
  97.         if absNum ~= 0 then
  98.             -- check out function later
  99.             -- get how many digits - 1 they have
  100.             local logN = math.floor(math.log(absNum, customBase))
  101.  
  102.             res.exponent = logN
  103.  
  104.             local rational = absNum * customBase ^ (-logN)
  105.  
  106.             res.rational = rational
  107.         else
  108.             res.sign = 1
  109.         end
  110.  
  111.         return res
  112.     end
  113.  
  114.     function util.scientificNotation:factNumToSciFiNotif(charsDict)
  115.         local base = #charsDict + 1
  116.  
  117.         local numToStrConvert = util.base:factNumToStrFromBase(charsDict)
  118.  
  119.         return function(num)
  120.             assert(type(num) == 'number')
  121.  
  122.             local res = {
  123.                 sign = charsDict[0];
  124.                 rational = '';
  125.                 exponent = charsDict[1]
  126.             }
  127.  
  128.             -- get set
  129.             local scifiNotifSet = util.scientificNotation:getScifiNotatSet(num, base)
  130.  
  131.             -- set results
  132.             res.sign = charsDict[scifiNotifSet.sign == -1 and 0 or 1]
  133.             res.exponent = numToStrConvert(scifiNotifSet.exponent + 150)
  134.  
  135.             -- set rational
  136.             local rationalStr = ''
  137.  
  138.             local rational = scifiNotifSet.rational
  139.  
  140.             local str = tostring(rational):gsub('%.','')
  141.  
  142.             local digit = 0
  143.  
  144.  
  145.             --  repeat until we eventually reach near zero, note, we round instead of checking exactly because
  146.             --    there is uncountably infinite amount of numbers between 0 and 1 and hitting 0 in a sea of
  147.             --    numbers is touch. Also we offset the rational with 1e12 to try to preserve the decimals.
  148.             while math.round(rational * 1e12) ~= 0 do
  149.  
  150.                 -- go down the vase
  151.                 for index = 0, base do
  152.                     local num1 = index * (base ^ -digit)
  153.                     local num2 = rational - num1
  154.  
  155.  
  156.                     if math.sign(num2) == -1 then
  157.  
  158.                         rational -= ((index - 1) * (base ^ -digit))
  159.                        
  160.                        
  161.                         rationalStr ..= charsDict[index - 1]
  162.  
  163.                         break
  164.                     end
  165.                 end
  166.  
  167.                 digit += 1
  168.             end
  169.  
  170.             res.rational = rationalStr
  171.  
  172.             -- return
  173.             return res
  174.         end
  175.     end
  176.  
  177.     function util.scientificNotation:factSciFiNotifToNum(charsDict)
  178.         local base = #charsDict + 1
  179.  
  180.         local strToNumBaseConvert = util.base:factStrToNumFromBase(charsDict)
  181.         local flippedDict = util.table:flipTable(charsDict)
  182.  
  183.         return function(scifiNotif)
  184.             assert(
  185.                 type(scifiNotif) == 'table' and
  186.                     type(scifiNotif.exponent) == 'string' and
  187.                     type(scifiNotif.rational) == 'string' and
  188.                     type(scifiNotif.sign) == 'string'
  189.             )
  190.  
  191.             local res = 0
  192.  
  193.             -- exponent and sign
  194.             local exponent = strToNumBaseConvert(scifiNotif.exponent) - 150
  195.             local sign = flippedDict[scifiNotif.sign] == 0 and -1 or 1
  196.  
  197.             -- give the int and mantissa their own section
  198.             local rationalStr = scifiNotif.rational
  199.             local intStr = rationalStr:sub(1,1)
  200.             local mantissaStr = rationalStr:sub(2)
  201.  
  202.             local number = 0
  203.  
  204.             for exponentB = 0, #rationalStr - 1 do
  205.                 local charIndex = exponentB + 1
  206.  
  207.                 local char = rationalStr:sub(charIndex, charIndex)
  208.  
  209.                 number += flippedDict[char] * (base ^ -exponentB)
  210.             end
  211.  
  212.             -- construct result
  213.             res = sign * (number * (base ^ exponent))
  214.  
  215.             return res
  216.         end
  217.     end
  218.  
  219.     --  string
  220.     function util.string:splitChars(str)
  221.         str = tostring(str)
  222.  
  223.         return str:split''
  224.     end
  225.  
  226.     --  table
  227.     function util.table:changeIndex(tabFrom, newChanges, printErrors)
  228.         assert(
  229.             (type(tabFrom) == 'table' or typeof(tabFrom) == 'Instance') and type(newChanges) == 'table'
  230.         )
  231.  
  232.         for prop, newVal in next, newChanges do
  233.             local s, e = pcall(function()
  234.                 tabFrom[prop] = newVal
  235.             end)
  236.  
  237.             if not s and printErrors then
  238.                 warn('Util Error: ', e, tabFrom, prop, newVal)
  239.             end
  240.         end
  241.     end
  242.  
  243.     function util.table:flipTable(t)
  244.         local t2 = {}
  245.  
  246.         for i, v in next, t do
  247.             t2[v] = i
  248.         end
  249.  
  250.         return t2
  251.     end
  252.  
  253.     --  misc
  254.     function util.misc:arrayToCharDict(arr)
  255.         local dict = {}
  256.  
  257.         for i, v in next, arr do
  258.             dict[i - 1] = v
  259.         end
  260.  
  261.         return dict
  262.     end
  263.    
  264. end
  265.  
  266.  
  267. -- return
  268. return util
RAW Paste Data