Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- класс для перебора комбинаций из N по K
- -- state выглядит как [i1,i2,...,iK] где i1...iK - текущий активный индекс от 1 до N
- -- для работы класса внутреннее состяние state'a должно быть отсортировано так что для любого индекса не может быть справа значений меньше него
- function createCombHelper(N,K)
- local obj = {}
- obj.N = N
- obj.K = K
- obj.state = nil
- function obj.setState(state) -- задаем новый state (может быть не отсортированным)
- local sz = #state
- if sz > obj.K then
- print("state can have only K("..obj.K..") active indexes, recieved "..#state)
- return false
- end
- for i = 1,sz do
- if state[i] > obj.N then
- print("state cannot be greater than N("..obj.N.."), recieved "..state[i])
- return false
- end
- for j = i+1,sz do
- if state[i] == state[j] then
- print("state cannot have duplicate values, recieved duplicate of "..state[i])
- return false
- end
- end
- end
- obj.state = {table.unpack(state)}
- table.sort(obj.state)
- end
- function obj.getState()
- return obj.state
- end
- function obj.next() -- задает индексы в крайниве левые положения если state еще не определен и задает новый state, nil если новые состояния закончились
- local K = obj.K
- local N = obj.N
- local state = obj.state
- if not obj.state then
- obj.state = {}
- for i = 1,obj.K do
- obj.state[i] = i
- end
- return obj.state
- else
- if state[1] == N-K+1 then
- return nil
- end
- for i=K,1,-1 do
- if state[i]+1 <= N-K + i then
- state[i]=state[i]+1
- for j = i+1,K do
- state[j]=state[i]+j-i
- end
- --res[#res+1] = {table.unpack(state)}
- break
- end
- end
- return obj.state
- end
- end
- return obj
- end
- a = createCombHelper(5,2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement