aboutsummaryrefslogtreecommitdiff
path: root/julia/112-bouncy_numbers.jl
diff options
context:
space:
mode:
Diffstat (limited to 'julia/112-bouncy_numbers.jl')
-rw-r--r--julia/112-bouncy_numbers.jl39
1 files changed, 39 insertions, 0 deletions
diff --git a/julia/112-bouncy_numbers.jl b/julia/112-bouncy_numbers.jl
new file mode 100644
index 0000000..4877ed9
--- /dev/null
+++ b/julia/112-bouncy_numbers.jl
@@ -0,0 +1,39 @@
+###
+# 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%.
+###
+
+
+using Base.Iterators
+
+function is_bouncy(n)
+ s = collect(string(n))
+ !(issorted(s) || issorted(s, rev=true))
+end
+
+const RATIO = 0.99
+
+bouncy_count = 0
+for n in countfrom(0)
+ global bouncy_count
+ if is_bouncy(n)
+ bouncy_count += 1
+ end
+ if bouncy_count / n >= RATIO
+ println(n)
+ exit(0)
+ end
+end