59 lines
1.3 KiB
Text
59 lines
1.3 KiB
Text
local fmt = require "fmt"
|
|
|
|
local function fairshare(n, base)
|
|
local res = table.create(n)
|
|
for i = 1, n do
|
|
local j = i - 1
|
|
local sum = 0
|
|
while j > 0 do
|
|
sum += j % base
|
|
j //= base
|
|
end
|
|
res[i] = sum % base
|
|
end
|
|
return res
|
|
end
|
|
|
|
local function turns(n, fss)
|
|
local m = {}
|
|
for fss as fs do
|
|
local k = m[fs]
|
|
if !k then
|
|
m[fs] = 1
|
|
else
|
|
m[fs] = k + 1
|
|
end
|
|
end
|
|
local m2 = {}
|
|
for m:keys() as k do
|
|
local v = m[k]
|
|
local k2 = m2[v]
|
|
if !k2 then
|
|
m2[v] = 1
|
|
else
|
|
m2[v] = k2 + 1
|
|
end
|
|
end
|
|
local res = {}
|
|
local sum = 0
|
|
for m2:keys() as k do
|
|
local v = m2[k]
|
|
sum += v
|
|
res:insert(k)
|
|
end
|
|
if sum != n then return $"only {sum} have a turn" end
|
|
res:sort()
|
|
local res2 = table.create(#res)
|
|
for i = 1, #res do res2[i] = tostring(res[i]) end
|
|
return res2:concat(" or ")
|
|
end
|
|
|
|
for {2, 3, 5, 11} as base do
|
|
fmt.write("%2d : ", base)
|
|
fmt.tprint("%2d", fairshare(25, base), 25)
|
|
end
|
|
print("\nHow many times does each get a turn in 50,000 iterations?")
|
|
for {191, 1377, 49999, 50000, 50001} as base do
|
|
local t = turns(base, fairshare(50000, base))
|
|
fmt.print(" With %5d people: %s", base, t)
|
|
end
|