AltBrian - 1 month ago 5x
Ruby Question

# How to get a number higher than a given value

I'm trying to write a function that receives a value,

`val`
and outputs the smallest higher number than the given value. This number belongs to a set of positive integers that have the following properties: Their digits occur only once, they are odd and they are multiple of three.

This is the code that I have written so far:

``````def next_numb(n)

x = n + 3
if x % 2 == 1 && x % 3 == 0
return x
end
end
``````

How can I test for unique numbers? Also, if I enter 12 the answer is 15 and the same is for 13.

To test if the number only has unique values, you can do this:

``````num.to_s.split('').uniq == num.to_s.split('')
``````

You are splitting each number into its individual digits, as strings, and then running `uniq` to remove duplicates, and, if that is the same as the array without `uniq`, then you have a number with non-duplicate digits.

If you add this to your `if` statement, it will get pretty long, so I suggest you wrap this in a method that returns `true` or `false`:

``````def unique_digits?(num)
num.to_s.split('').uniq == num.to_s.split('')
end
``````

Your `if` statement will be:

``````def next_numb(n)
x = n + 3
if x % 2 == 1 && x % 3 == 0 && unique_digits?(x)
return x
end
end
``````

I noticed something else about your code, it will only add 3 to `n` and checks if the number meets all of the conditions, if so, it will return the number, and if not, it will return `nil`.

If you have an input of `15`, your function will return `nil`, because `18` is not odd. The right number to return is `21`, so you will need a loop:

``````def next_numb(n)
x = n + 1
until x % 2 == 1 && x % 3 == 0 && unique_digits?(x)
x += 1
end
x
end

def unique_digits?(num)
num.to_s.split('').uniq == num.to_s.split('')
end

next_numb(13)  #=> 15
next_numb(15)  #=> 21
next_numb(125) #=> 129
``````