76 lines
1.5 KiB
Lua
76 lines
1.5 KiB
Lua
function turn(base, n)
|
|
local sum = 0
|
|
while n ~= 0 do
|
|
local re = n % base
|
|
n = math.floor(n / base)
|
|
sum = sum + re
|
|
end
|
|
return sum % base
|
|
end
|
|
|
|
function fairShare(base, count)
|
|
io.write(string.format("Base %2d:", base))
|
|
for i=1,count do
|
|
local t = turn(base, i - 1)
|
|
io.write(string.format(" %2d", t))
|
|
end
|
|
print()
|
|
end
|
|
|
|
function turnCount(base, count)
|
|
local cnt = {}
|
|
|
|
for i=1,base do
|
|
cnt[i - 1] = 0
|
|
end
|
|
|
|
for i=1,count do
|
|
local t = turn(base, i - 1)
|
|
if cnt[t] ~= nil then
|
|
cnt[t] = cnt[t] + 1
|
|
else
|
|
cnt[t] = 1
|
|
end
|
|
end
|
|
|
|
local minTurn = count
|
|
local maxTurn = -count
|
|
local portion = 0
|
|
for _,num in pairs(cnt) do
|
|
if num > 0 then
|
|
portion = portion + 1
|
|
end
|
|
if num < minTurn then
|
|
minTurn = num
|
|
end
|
|
if maxTurn < num then
|
|
maxTurn = num
|
|
end
|
|
end
|
|
|
|
io.write(string.format(" With %d people: ", base))
|
|
if minTurn == 0 then
|
|
print(string.format("Only %d have a turn", portion))
|
|
elseif minTurn == maxTurn then
|
|
print(minTurn)
|
|
else
|
|
print(minTurn .. " or " .. maxTurn)
|
|
end
|
|
end
|
|
|
|
function main()
|
|
fairShare(2, 25)
|
|
fairShare(3, 25)
|
|
fairShare(5, 25)
|
|
fairShare(11, 25)
|
|
|
|
print("How many times does each get a turn in 50000 iterations?")
|
|
turnCount(191, 50000)
|
|
turnCount(1377, 50000)
|
|
turnCount(49999, 50000)
|
|
turnCount(50000, 50000)
|
|
turnCount(50001, 50000)
|
|
end
|
|
|
|
main()
|