Advertisement
maxeebon

combination_helper.lua

May 23rd, 2024 (edited)
527
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.04 KB | Gaming | 0 0
  1. -- класс для перебора комбинаций из N по K
  2. -- state выглядит как [i1,i2,...,iK] где i1...iK - текущий активный индекс от 1 до N
  3. -- для работы класса внутреннее состяние state'a должно быть отсортировано так что для любого индекса не может быть справа значений меньше него
  4.  
  5. function createCombHelper(N,K)
  6.    
  7.     local obj = {}
  8.     obj.N = N
  9.     obj.K = K
  10.     obj.state = nil
  11.    
  12.     function obj.setState(state) -- задаем новый state (может быть не отсортированным)
  13.         local sz = #state
  14.         if sz > obj.K then
  15.             print("state can have only K("..obj.K..") active indexes, recieved "..#state)
  16.             return false
  17.         end
  18.         for i = 1,sz do
  19.             if state[i] > obj.N then
  20.                 print("state cannot be greater than N("..obj.N.."), recieved "..state[i])
  21.                 return false
  22.             end
  23.             for j = i+1,sz do
  24.                 if state[i] == state[j] then
  25.                     print("state cannot have duplicate values, recieved duplicate of "..state[i])
  26.                     return false
  27.                 end
  28.             end
  29.         end
  30.         obj.state = {table.unpack(state)}
  31.         table.sort(obj.state)
  32.     end
  33.    
  34.     function obj.getState()
  35.         return obj.state
  36.     end
  37.    
  38.     function obj.next()  -- задает индексы в крайниве левые положения если state еще не определен и задает новый state, nil если новые состояния закончились
  39.         local K = obj.K
  40.         local N = obj.N
  41.         local state = obj.state
  42.         if not obj.state then
  43.             obj.state = {}
  44.             for i = 1,obj.K do
  45.                 obj.state[i] = i
  46.             end
  47.             return obj.state
  48.         else
  49.             if state[1] == N-K+1 then
  50.                 return nil
  51.             end
  52.             for i=K,1,-1 do
  53.                 if state[i]+1 <= N-K + i then
  54.                     state[i]=state[i]+1
  55.                     for j = i+1,K do
  56.                         state[j]=state[i]+j-i
  57.                     end
  58.                     --res[#res+1] = {table.unpack(state)}
  59.                     break
  60.                 end
  61.             end
  62.             return obj.state
  63.            
  64.         end    
  65.     end
  66.    
  67.     return obj
  68. end
  69.  
  70. a = createCombHelper(5,2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement