2014-01-14 2 views
2

Отказ от ответственности: Да, это домашнее задание и да, я уже решил это.Различные способы создания этой строки в Ruby?

Задача: Создание строки "0 10 20 30 40 50 60 70 80 90 100" < - Обратите внимание, что нет пробелов

Очевидно, не используя прямое назначение, но с использованием таких инструментов, как петли, диапазоны, расщепление и такое. Я уже закончил это с использованием 10-инкрементного цикла, и я уверен, что есть способы более интеллектуальных способов его решения, и мне интересно об альтернативах.

Как бы вы построили такую ​​строку?

ответ

3

Да там используется Range#step и Array#*:

(0..100).step(10).to_a * " " 
# => "0 10 20 30 40 50 60 70 80 90 100" 
+0

Так '*" «' это просто сокращенная версия 'Array.join()'? – krystah

+0

@ krystah Да, это ... –

+1

Обратите внимание, что [Руководство по стилю Ruby] (https://github.com/bbatsov/ruby-style-guide) предлагают одобрить использование 'Array # join' over' Array # * 'с строковым аргументом. – toro2k

3

Второй вариант использования Range#step:

(0..100).step(10).to_a.join(' ') 
# "0 10 20 30 40 50 60 70 80 90 100" 
+2

'(0..100) .step (10) .to_a.join ('')' достаточно ... не нужно делать строчную интерполяцию .. –

+1

@ArupRakshit: Да, вы правы :). Спасибо :) – ram

2

Просто быть разными и не использовать #step:

(0..10).map{|x| x * 10}.join(' ') 
1

Numeric#step будет работать , тоже (здесь с Руби 2,1 стиле хэш-аргумента)

0.step(by: 10).take(11).join(' ') 
#=> "0 10 20 30 40 50 60 70 80 90 100" 
+0

Интересная альтернатива! – krystah

0

Просто быть наоборот, вот некоторые используя times с map, with_object и inject:

10.times.map{ |i| "#{ 10 * (i + 1) }" }.join(' ') # => "10 20 30 40 50 60 70 80 90 100" 
10.times.with_object([]) { |i, o| o << "#{ 10 * (i + 1) }" }.join(' ') # => "10 20 30 40 50 60 70 80 90 100" 
10.times.inject([]) { |o, i| o << "#{ 10 * (i + 1) }" }.join(' ') # => "10 20 30 40 50 60 70 80 90 100" 
Смежные вопросы