RosettaCodeData/Task/Fairshare-between-two-and-more/Pluto/fairshare-between-two-and-more.pluto
2026-04-30 12:34:36 -04:00

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