-
Notifications
You must be signed in to change notification settings - Fork 0
/
project_euler_112.rb
36 lines (31 loc) · 1.18 KB
/
project_euler_112.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# Bouncy numbers
# Problem 112
# Working from left-to-right if no digit is exceeded by the digit to its left it is called an increasing number; for example, 134468.
#
# Similarly if no digit is exceeded by the digit to its right it is called a decreasing number; for example, 66420.
#
# We shall call a positive integer that is neither increasing nor decreasing a "bouncy" number; for example, 155349.
#
# Clearly there cannot be any bouncy numbers below one-hundred, but just over half of the numbers below one-thousand (525) are bouncy. In fact, the least number for which the proportion of bouncy numbers first reaches 50% is 538.
#
# Surprisingly, bouncy numbers become more and more common and by the time we reach 21780 the proportion of bouncy numbers is equal to 90%.
#
# Find the least number for which the proportion of bouncy numbers is exactly 99%.
least = 100
bouncy_count = 0
def bouncy?(i)
!(increasing?(i) || decreasing?(i))
end
def increasing?(i)
i.to_s.chars.sort.join == i.to_s
end
def decreasing?(i)
i.to_s.chars.sort.reverse.join == i.to_s
end
loop.with_index(least) do |_, i|
bouncy_count += 1 if bouncy?(i)
if bouncy_count * 100 / i == 99
puts i
break
end
end