patternMinor
Ugly Numbers: A Rags-to-Riches Story
Viewed 0 times
uglynumbersstoryragsriches
Problem
I stumbled upon an unaswered question, which looked like a good fit for a functional programming language.
Here is the problem statement from codeeval:
UGLY NUMBERS
CHALLENGE DESCRIPTION:
Credits: This challenge has appeared in a google competition before.
Once upon a time in a strange situation, people called a number ugly
if it was divisible by any of the one-digit primes (2, 3, 5 or 7).
Thus, 14 is ugly, but 13 is fine. 39 is ugly, but 121 is not. Note
that 0 is ugly. Also note that negative numbers can also be ugly: -14
and -39 are examples of such numbers.
One day on your free time, you are gazing at a string of digits,
something like:
You are amused by how many possibilities there are if you are
allowed to insert plus or minus signs between the digits. For example
you can make:
which is ugly. Or
which is not ugly.
It is easy to count the number of different ways you can play with the
digits: Between each two adjacent digits you may choose put a plus
sign, a minus sign, or nothing. Therefore, if you start with \$D\$ digits
there are \$3^{D-1}\$ expressions you can make. Note that it is fine to
have leading zeros for a number. If the string is
Your task is simple: Among the \$3^{D-1}\$ expressions, count how many of
them evaluate to an ugly number.
INPUT SAMPLE:
Your program should accept as its first argument a path to a filename.
Each line in this file is one test case. Each test case will be a
single line containing a non-empty string of decimal digits. The
string in each test case will be non-empty and will contain only
characters '0' through '9'. Each string is no more than 13 characters
long. E.g.
OUTPUT SAMPLE:
Print out the number of expressions that evaluate to an
Here is the problem statement from codeeval:
UGLY NUMBERS
CHALLENGE DESCRIPTION:
Credits: This challenge has appeared in a google competition before.
Once upon a time in a strange situation, people called a number ugly
if it was divisible by any of the one-digit primes (2, 3, 5 or 7).
Thus, 14 is ugly, but 13 is fine. 39 is ugly, but 121 is not. Note
that 0 is ugly. Also note that negative numbers can also be ugly: -14
and -39 are examples of such numbers.
One day on your free time, you are gazing at a string of digits,
something like:
123456You are amused by how many possibilities there are if you are
allowed to insert plus or minus signs between the digits. For example
you can make:
1 + 234 - 5 + 6 = 236which is ugly. Or
123 + 4 - 56 = 71which is not ugly.
It is easy to count the number of different ways you can play with the
digits: Between each two adjacent digits you may choose put a plus
sign, a minus sign, or nothing. Therefore, if you start with \$D\$ digits
there are \$3^{D-1}\$ expressions you can make. Note that it is fine to
have leading zeros for a number. If the string is
01023, then01023, 0+1-02+3 and 01-023 are legal expressions. Your task is simple: Among the \$3^{D-1}\$ expressions, count how many of
them evaluate to an ugly number.
INPUT SAMPLE:
Your program should accept as its first argument a path to a filename.
Each line in this file is one test case. Each test case will be a
single line containing a non-empty string of decimal digits. The
string in each test case will be non-empty and will contain only
characters '0' through '9'. Each string is no more than 13 characters
long. E.g.
1
9
011
12345OUTPUT SAMPLE:
Print out the number of expressions that evaluate to an
Solution
What is the purpose of the
This might be useful in other situations (like printing all the possibilities), but I don't see a reason for it here. Basically, it's an unnecessary level of abstraction.
You don't need the special case for negative numbers,
Expression type? Why doesn't expressions just return all the possible results?This might be useful in other situations (like printing all the possibilities), but I don't see a reason for it here. Basically, it's an unnecessary level of abstraction.
if n < 0L then
isUgly -n
else
n = 0L || n % 2L = 0L || n % 3L = 0L || n % 5L = 0L || n % 7L = 0LYou don't need the special case for negative numbers,
% works for them too.Code Snippets
if n < 0L then
isUgly -n
else
n = 0L || n % 2L = 0L || n % 3L = 0L || n % 5L = 0L || n % 7L = 0LContext
StackExchange Code Review Q#57556, answer score: 4
Revisions (0)
No revisions yet.