2013-02-21 3 views
1

Я знаю, что это простая проблема, но по какой-то причине она не нажимает. Я хочу повторять символы в строке для фиксированной суммы. Например:Повторить символы в строке

str = 'abcde' 
temp = '' 
x = 8 
for i in 0..x 
    if str[i].nil? 
     temp << '' 
    else 
     temp << str[i] 
    end 
end 

За исключением случаев, когда я не получаю никаких данных. Что мне нужно:

abcdeabc

Пожалуйста, любая помощь будет оценена. Если есть лучший рабочий способ сделать это вместо того, чтобы мой не работает наивный подход, я хотел бы знать,

ответ

4

ljust Использование должен сделать это:

str = 'abcde' 

str.ljust(8, str) 
# => "abcdeabc" 

str.ljust(12, str) 
# => "abcdeabcdeab" 
+0

Это не одна строка. :). – Linuxios

+0

Ah :) Исправлено. – Zabba

+0

+1, но, возможно, '' '.ljust (8, str) 'несколько лучше (заботясь о длинах steenslag

1

Вы можете легко сделать это с помощью slicing

def repeat_x_chars(str, x) 
    # special cases 
    return str if x == 0 
    return "" if str.length == 0 

    return str + str[0..(str.length % x)] # slicing 
end 
+0

Спасибо за вашу помощь! – nizbit

3

Если вы хотите повторить строку несколько раз, использование *. Мы можем объединить, что с нарезкой, чтобы получить это решение:

def repfill(str, n) 
    nrep = (Float(n)/str.length).ceil 
    return (str * nrep)[0...n] 
end 

Пример:

irb(main):030:0> repfill('abcde', 8) 
=> "abcdeabc" 

Что касается вашего решения, что вам не хватает является по модулю повторить строку из начиная:

str = 'abcde' 
temp = '' 
x = 8 
for i in 0...x # note ... to exclude last element of range 
    temp << str[i % str.length] 
end 
+0

+1 приятное решение. –

+0

Хорошее решение. Мне удалось поместить его в однострочный. – Linuxios

+0

Спасибо за помощь! – nizbit

0

Попробуйте однострочник:

res = (str * (x/str.length)) + str[0...(x%str.length)] 
+0

Ваше целочисленное деление сбросит результат. –

+0

@ HunterMcMillen; Нет, это не произойдет из-за автоматического целочисленного разделения Rubys вместо float-деления. – Linuxios

+0

@HunterMcMillen: Это намеренно! Выполнение этого, как я это делал, - это, в основном, автоматический вызов «пол». – Linuxios

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