43 lines
1.4 KiB
Julia
43 lines
1.4 KiB
Julia
using Combinatorics
|
|
|
|
toi(set) = parse(Int, join(set, ""))
|
|
drop1(c, set) = toi(filter(x -> x != c, set))
|
|
|
|
function anomalouscancellingfractions(numdigits)
|
|
ret = Vector{Tuple{Int, Int, Int, Int, Int}}()
|
|
for nset in permutations(1:9, numdigits), dset in permutations(1:9, numdigits)
|
|
if nset < dset # only proper fractions
|
|
for c in nset
|
|
if c in dset # a common digit exists
|
|
n, d, nn, dd = toi(nset), toi(dset), drop1(c, nset), drop1(c, dset)
|
|
if n // d == nn // dd # anomalous cancellation
|
|
push!(ret, (n, d, nn, dd, c))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
ret
|
|
end
|
|
|
|
function testfractionreduction(maxdigits=5)
|
|
for i in 2:maxdigits
|
|
results = anomalouscancellingfractions(i)
|
|
println("\nFor $i digits, there were ", length(results),
|
|
" fractions with anomalous cancellation.")
|
|
numcounts = zeros(Int, 9)
|
|
for r in results
|
|
numcounts[r[5]] += 1
|
|
end
|
|
for (j, count) in enumerate(numcounts)
|
|
count > 0 && println("The digit $j was crossed out $count times.")
|
|
end
|
|
println("Examples:")
|
|
for j in 1:min(length(results), 12)
|
|
r = results[j]
|
|
println(r[1], "/", r[2], " = ", r[3], "/", r[4], " ($(r[5]) crossed out)")
|
|
end
|
|
end
|
|
end
|
|
|
|
testfractionreduction()
|