109 lines
2.7 KiB
Ruby
109 lines
2.7 KiB
Ruby
def indexOf(haystack, needle)
|
|
idx = 0
|
|
for straw in haystack
|
|
if straw == needle then
|
|
return idx
|
|
else
|
|
idx = idx + 1
|
|
end
|
|
end
|
|
return -1
|
|
end
|
|
|
|
def getDigits(n, le, digits)
|
|
while n > 0
|
|
r = n % 10
|
|
if r == 0 or indexOf(digits, r) >= 0 then
|
|
return false
|
|
end
|
|
le = le - 1
|
|
digits[le] = r
|
|
n = (n / 10).floor
|
|
end
|
|
return true
|
|
end
|
|
|
|
POWS = [1, 10, 100, 1000, 10000]
|
|
def removeDigit(digits, le, idx)
|
|
sum = 0
|
|
pow = POWS[le - 2]
|
|
i = 0
|
|
while i < le
|
|
if i == idx then
|
|
i = i + 1
|
|
next
|
|
end
|
|
sum = sum + digits[i] * pow
|
|
pow = (pow / 10).floor
|
|
i = i + 1
|
|
end
|
|
return sum
|
|
end
|
|
|
|
def main
|
|
lims = [ [ 12, 97 ], [ 123, 986 ], [ 1234, 9875 ], [ 12345, 98764 ] ]
|
|
count = Array.new(5, 0)
|
|
omitted = Array.new(5) { Array.new(10, 0) }
|
|
|
|
i = 0
|
|
for lim in lims
|
|
n = lim[0]
|
|
while n < lim[1]
|
|
nDigits = [0] * (i + 2)
|
|
nOk = getDigits(n, i + 2, nDigits)
|
|
if not nOk then
|
|
n = n + 1
|
|
next
|
|
end
|
|
d = n + 1
|
|
while d <= lim[1] + 1
|
|
dDigits = [0] * (i + 2)
|
|
dOk = getDigits(d, i + 2, dDigits)
|
|
if not dOk then
|
|
d = d + 1
|
|
next
|
|
end
|
|
nix = 0
|
|
while nix < nDigits.length
|
|
digit = nDigits[nix]
|
|
dix = indexOf(dDigits, digit)
|
|
if dix >= 0 then
|
|
rn = removeDigit(nDigits, i + 2, nix)
|
|
rd = removeDigit(dDigits, i + 2, dix)
|
|
if (1.0 * n / d) == (1.0 * rn / rd) then
|
|
count[i] = count[i] + 1
|
|
omitted[i][digit] = omitted[i][digit] + 1
|
|
if count[i] <= 12 then
|
|
print "%d/%d = %d/%d by omitting %d's\n" % [n, d, rn, rd, digit]
|
|
end
|
|
end
|
|
end
|
|
nix = nix + 1
|
|
end
|
|
d = d + 1
|
|
end
|
|
n = n + 1
|
|
end
|
|
print "\n"
|
|
i = i + 1
|
|
end
|
|
|
|
i = 2
|
|
while i <= 5
|
|
print "There are %d %d-digit fractions of which:\n" % [count[i - 2], i]
|
|
j = 1
|
|
while j <= 9
|
|
if omitted[i - 2][j] == 0 then
|
|
j = j + 1
|
|
next
|
|
end
|
|
print "%6s have %d's omitted\n" % [omitted[i - 2][j], j]
|
|
j = j + 1
|
|
end
|
|
print "\n"
|
|
i = i + 1
|
|
end
|
|
end
|
|
|
|
main()
|