Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -0,0 +1,37 @@
defmodule Digital do
def mdroot(n), do: mdroot(n, 0)
defp mdroot(n, persist) when n < 10, do: {n, persist}
defp mdroot(n, persist), do: mdroot(product(n, 1), persist+1)
defp product(0, prod), do: prod
defp product(n, prod), do: product(div(n, 10), prod*rem(n, 10))
def task1(data) do
IO.puts "Number: MDR MP\n====== === =="
Enum.each(data, fn n ->
{mdr, persist} = mdroot(n)
:io.format "~6w: ~w ~2w~n", [n, mdr, persist]
end)
end
def task2(m \\ 5) do
IO.puts "\nMDR: [n0..n#{m-1}]\n=== ========"
map = add_map(0, m, Map.new)
Enum.each(0..9, fn i ->
first = map[i] |> Enum.reverse |> Enum.take(m)
IO.puts " #{i}: #{inspect first}"
end)
end
defp add_map(n, m, map) do
{mdr, _persist} = mdroot(n)
new_map = Dict.update(map, mdr, [n], fn vals -> [n | vals] end)
min_len = Dict.values(new_map) |> Enum.map(&length(&1)) |> Enum.min
if min_len < m, do: add_map(n+1, m, new_map),
else: new_map
end
end
Digital.task1([123321, 7739, 893, 899998])
Digital.task2(5)

View file

@ -0,0 +1,10 @@
function digitalmultroot{S<:Integer,T<:Integer}(n::S, bs::T=10)
-1 < n && 1 < bs || throw(DomainError())
ds = n
pers = 0
while bs <= ds
ds = prod(digits(ds, bs))
pers += 1
end
return (pers, ds)
end

View file

@ -0,0 +1,34 @@
const bs = 10
const excnt = 5
println("Testing Multiplicative Digital Root.\n")
for i in [123321, 7739, 893, 899998]
(pers, ds) = digitalmultroot(i, bs)
print(@sprintf("%8d", i))
print(" has persistence ", pers)
println(" and digital root ", ds)
end
dmr = zeros(Int, bs, excnt)
hasroom = trues(bs)
dex = ones(Int, bs)
i = 0
while any(hasroom)
(pers, ds) = digitalmultroot(i, bs)
ds += 1
if hasroom[ds]
dmr[ds, dex[ds]] = i
dex[ds] += 1
if dex[ds] > excnt
hasroom[ds] = false
end
end
i += 1
end
println("\n MDR: First ", excnt, " numbers having this MDR")
for (i, d) in enumerate(0:(bs-1))
print(@sprintf("%4d: ", d))
println(join([@sprintf("%6d", dmr[i, j]) for j in 1:excnt], ","))
end