2
내 입력은 다음과 같은 형식의 테이블 규칙을 보존 채우테이블이
_input = {
["Item1"] = {
min = 1,
max = 1,
pos = {
[1] = nil,
[2] = {--[[somedata]]},
[3] = nil,
[4] = {--[[somedata]]},
[5] = nil,
[6] = {--[[somedata]]},
[7] = nil,
[8] = {--[[somedata]]},
},
},
["Item2"] = {
min = 1,
max = 1,
pos = {
[1] = nil,
[2] = nil,
[3] = nil,
[4] = {--[[somedata]]},
[5] = {--[[somedata]]},
[6] = {--[[somedata]]},
[7] = nil,
[8] = nil,
},
},
["Item3"] = {
min = 1,
max = 2,
pos = {
[1] = nil,
[2] = {--[[somedata]]},
[3] = nil,
[4] = {--[[somedata]]},
[5] = {--[[somedata]]},
[6] = {--[[somedata]]},
[7] = nil,
[8] = nil,
},
},
["Item4"] = {
min = 1,
max = 3,
pos = {
[1] = {--[[somedata]]},
[2] = {--[[somedata]]},
[3] = {--[[somedata]]},
[4] = nil,
[5] = nil,
[6] = nil,
[7] = {--[[somedata]]},
[8] = {--[[somedata]]},
},
},
}
_input
의 각 항목은, nil
또는 채워진 중 하나를 자체가 여덟 항목이 포함 pos
동안 필드 min
, max
및 pos
을 가지고 데이터. 항상 4 개의 항목이 _input
에있는 것은 아닙니다. 더 많은 항목이나 더 적은 항목이있을 수 있습니다. 최종 테이블 pos
로부터 데이터 아이템의 최소/최대 값 :
내 목표 _input
에서 적절한 값으로 채워진 하나의 테이블을 생성하는 알고리즘을 작성하고 min
/max
규칙 (즉 보존한다. 최종 출력에는 min
개의 항목이 있어야하며 최종 출력에는 max
개의 항목이있을 수 있습니다. 상기 입력이 주어
출력은 다음과 같을 수있다 :
_output = {
[1] = {
type = "Item4",
data = {--[[the data from _input["Item4"].pos[1] ]]},
},
[2] = {
type = "Item1",
data = {--[[the data from _input["Item1"].pos[2] ]]},
},
[3] = {
type = "Item4",
data = {--[[the data from _input["Item4"].pos[3] ]]},
},
[4] = {
type = "Item3",
data = {--[[the data from _input["Item3"].pos[4] ]]},
},
[5] = nil,
[6] = {
type = "Item2",
data = {--[[the data from _input["Item2"].pos[6] ]]},
},
[7] = {
type = "Item4",
data = {--[[the data from _input["Item4"].pos[7] ]]},
},
[8] = nil,
}
없음 출력의 각 필드가 작성되어야한다 :
5
및
8
위 예에서는 전무하다. 가능한 항목은
Item2
및
Item3
이므로
5
을 입력 할 수 없습니다.
Item2
이 이미 최대 금액에 도달했으며
Item3
이 최대 금액에 도달 할 필요가 없습니다. 가능한 항목
Item1
및
Item4
이 이미 최대 값에 도달했기 때문에
8
을 채울 수 없습니다.
이것은 지금까지 나의 접근 방식이지만 모든 규칙을 보존하지 않고 "잘못된"출력을 생성합니다. 또한 매번 동일한 입력으로부터 동일한 결과를 얻지 않기를 바랍니다.
local _output = {
[1] = nil,
[2] = nil,
[3] = nil,
[4] = nil,
[5] = nil,
[6] = nil,
[7] = nil,
[8] = nil,
}
for key in pairs(_input) do
local _item = _input[key]
for i=0,math.random(_item.min, _item.max),1 do
-- I omit deepCopy() for readability
local _possibleCopy = deepCopy(_item.pos)
for i=1,8,1 do
if _output[i] ~= nil then
_possibleCopy[i] = nil
end
end
local _possibleSlots = {}
for i=1,8,1 do
if _possibleCopy[i] ~= nil then
_possibleSlots[#_possibleSlots+1] = i
end
end
local _slot = _possibleSlots[math.random(1,#_possibleSlots)]
if _slot then
_output[_slot] = {
type = key,
data = _item.pos[_slot],
}
end
end
end
나는 당신에게 맥주를 빚지고있다. 너 나에게 많은 두통을 덜어 줬어! 고맙습니다! 호기심에 대한 한 가지 질문 : 당신은'v.pos [i]'가 아니라고 썼다 - 이중성에 대한 이유가 있나? –
이것은 명시 적 변환을 부울로 사용합니다 (배열은 nils 및 테이블 대신 부울 값으로 만 구성됩니다). 물론, 당신은'not '을 생략 할 수 있습니다. –