Meine Eingabe ist eine Tabelle, in der nach dem Format Erhaltung:Füllen Sie eine Tabelle Regeln
_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]]},
},
},
}
Jeder Eintrag in _input
hat die Felder min
, max
und pos
, während pos
selbst acht Einträge enthält, entweder nil
oder gefüllte mit Daten. Es werden nicht immer vier Elemente in _input
angegeben. Es kann mehr Gegenstände oder weniger Gegenstände geben.
Mein Ziel ist es, einen Algorithmus zu erstellen, die eine einzelne Tabelle erzeugt, gefüllt mit dem entsprechenden Werten aus _input
und die min
/max
Regeln zu bewahren (das heißt: die minimale/maximale Menge an Daten-Elemente aus pos
in dem Finaltisch. Es muss min
Elemente in der endgültigen Ausgabe sein und es kann max
Elemente in der endgültigen Ausgabe sein).
der Eingang über Gegeben, kann die Ausgabe wie folgt aussehen:
5
und 8
nil sind im obigen Beispiel:
_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,
}
Nicht jedes Feld in der Ausgabe gefüllt werden muss.
5
kann nicht ausgefüllt werden, da die einzigen möglichen Artikel Item2
und Item3
wären. Item2
hat bereits die maximale Menge erreicht und Item3
muss nicht die maximale Menge erreichen.
8
kann nicht gefüllt werden, da die möglichen Artikel Item1
und Item4
beide bereits ihre maximale Menge erreicht haben.
Dies ist mein Ansatz bisher, aber es behält nicht alle Regeln und produziert "falsche" Ausgabe. Außerdem würde ich es lieben, nicht jedes Mal die gleichen Ergebnisse aus dem gleichen Input zu erhalten.
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
Ich schulde dir ein Bier. Du hast mir viele Kopfschmerzen erspart! Vielen Dank! Eine Frage aus Neugier: Sie haben 'nicht nicht v.pos [i]' geschrieben - gibt es einen Grund für das Doppelte - nicht? –
Das ist eine explizite Konvertierung in Boolean (Array besteht nur aus Booleschen Werten anstelle von Nils und Tabellen). Natürlich können Sie "nicht nicht" weglassen, das würde nichts ändern. –