2012-04-10 6 views
0

Я пытаюсь создать программу, в которой пользователь вводит четыре числа, используя регулярные выражения. Если одно из этих чисел равно 13, то цифры слева не учитываются в сумме. Моя проблема заключается в создании исключения, когда ни одно из чисел не равняться 13. Я не могу показаться, чтобы найти регулярное выражение для моего исключенияruby ​​regular expressions

puts "enter a number then hit enter four times" 

number1 = STDIN.gets 

number2 = STDIN.gets 
number3 = STDIN.gets 

number4 = STDIN.gets 


if number1 =~ /13/ then 
    puts number2.to_i + number3.to_i + number4.to_i 
end 

if number2 =~/13/ then 
    puts number3.to_i + number4.to_i 
end 

if number3 =~/13/ then 
    puts number4.to_i 
if number4 =~/13/ then 
    puts "0" 
end 
if number1 != 13 or number2 != 13 or number3 != 13 or number4 != 13 
    puts number1.to_i + number2.to_i + number3.to_i + number4.to_i 
end 
end 
+0

@AndrewMarshall - это приятное вежливое напоминание - это нормально, если я копирую для использования в качестве шаблона? то это будет легко с autohotkey и т. д., когда это необходимо – Coffee

+1

@Adel Никаких проблем! У меня есть куча шаблонов комментариев SO, которые я сделал сохраненными как фрагменты, так как я думаю, что ссылки лучше, и я не хочу их каждый раз искать: '. –

+0

@AndrewMarshall - Спасибо, много! Да, я тоже сделаю подборку шаблонов! – Coffee

ответ

0

Если вы хотите использовать регулярные выражения, следует отметить, что следующая логика будет давать верно для более чем просто 13. Это также будет соответствовать 413, 131, 941771341, ...

if number1 =~ /13/ then 

Изменение это до if number =~ /^13$/ then будет более точным, но не так хорошо, как с помощью to_i.

Другая линия в вопросе ...

if number1 != 13 or number2 != 13 or number3 != 13 or number4 != 13 

... не работает, как ожидалось, потому что вы сравниваете строку в число, и логика присоединиться должна быть and. Сравнение с «13» тоже не будет работать, так как это «13 \ n». Вы можете использовать number1.to_i != 13 and number2.to_i != 13 или что-то вроде number1 !~ /^13$/ and number2 !~ /^13$/ .... Вы также можете выяснить, где использовать заявление else.

Я действительно рекомендую изучить другие ответы. Они гораздо более элегантные и рубические.

6

Я не хочу, чтобы переписать всю логику, но вы можете использовать перечислимый модуль и что-то вроде

puts "enter a number then hit enter four times" 

# Collect 4 numbers 
numbers = 4.times.map{ STDIN.gets }.reverse 

# Take the numbers until the first 13, then sum them 
puts numbers.map(&:to_i).take_while{ |a| a != 13 }.reduce(:+) 
+2

Почему бы не «4 раза сделать ... конец»? –

+0

Действительно, мой плохой. – gmalette

+1

Не беспокойтесь! Просто полезное предложение ':)'. –

2

gmalette, это действительно интересный синтаксис. Я узнал об этом. Однако вам необходимо, чтобы метод take_while возвращался назад с конца массива. Кроме того, метод уменьшения добавит укусов вместе. Итак, «44» + «55» = «4455». Это работает:

puts "Enter four numbers separated by spaces:" 
numbers = STDIN.gets.split 
numbers.reverse!.collect! {|s| s.to_i } 
puts numbers.take_while{ |a| a != 13 }.reduce(:+) 

Это сокращение действительно интересно.

+1

Кроме того, вы можете сократить метод сбора (карты) с помощью &: to_i, как в моем ответе – gmalette

+0

gmalette, вы даете самые «рубиновые» ответы, которые я когда-либо видел. :) – user1182000

+0

Спасибо большое :) – gmalette

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