2016-09-07 3 views
0

Я пытаюсь написать функцию, которая получает значение, val и выводит наименьшее большее число, чем данное значение. Это число относится к набору положительных целых чисел, которые обладают следующими свойствами: их цифры встречаются только один раз, они нечетные и кратные трем.Как получить число выше заданного значения

Это код, который я написал до сих пор:

def next_numb(n) 

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

Как я могу проверить для уникальных номеров? Кроме того, если я вхожу 12 ответ 15 и то же самое для 13.

+0

будет 'next_numb (15)' '15' возврата или' 21'? –

+0

будет '21', так как OP ищет следующий номер. – davidhu2000

+0

Не думаю, что я видел эту аббревиатуру для слова «число». –

ответ

1

Чтобы проверить, если число имеет только уникальные значения, вы можете сделать это:

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

Вы распределяете каждое число в его отдельные цифры, как строки, а затем запустить uniq для удаления дубликатов, и, если это то же самое, что и массив без uniq, то у вас есть номер с недвойственными цифрами.

Если добавить к вашему if заявлению, он получит довольно долго, поэтому я предлагаю вам обернуть это метод, который возвращает true или false:

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

Вашего if заявление будет:

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

Я заметил что-то еще о вашем коде, он добавит только 3 к n и проверяет, соответствует ли номер всем условиям, если да, то он вернет номер, а если нет, он вернется nil.

Если у вас есть вход 15, ваша функция вернет nil, потому что 18 не является нечетным. Правильный номер, чтобы вернуться в 21, так что вам потребуется цикл:

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 
+0

, поэтому метод будет читать 'def next_numb (n) x = n + 3 if x% 2 == 1 && x% 3 == 0 && x.to_s.split (//). Uniq == x. to_s.split (//) return x end end' – AltBrian

+0

да, но, как я уже сказал, я предлагаю положить эту последнюю часть в методе для удобочитаемости. – davidhu2000

+0

'next_numb 125 # => nil' –

Смежные вопросы