2015-11-02 2 views
0

Каков наилучший способ разобрать список переносимых слов и вернуть начальные и конечные слова?Порядок переключения дешёвых слов

Вход:

spider-man 
wonder-woman 

Выход:

man-spider 
woman-wonder 
+1

Добро пожаловать на переполнение стека. Вместо того, чтобы просить нас о коде, вам нужно провести исследование, а затем попробуйте, когда у вас возникнет проблема, укажите минимальный код, который вы написали для решения проблемы, некоторые данные ввода и вывода, и мы поможем вам. Как и нет, мы не можем сказать, пытались ли вы, и похоже, что вы просите нас написать код для вас, а это не то, что для Stack Overflow. –

ответ

4

Вы можете разбить его и затем повернуть его вспять.

"spider-man".split('-').reverse.join('-') 
#=> "man-spider" 
2

Вы можете использовать split, reverse и join

words = ['spider-man', 'super-woman'] 

words.map do |word| 
    word.split('-').reverse.join('-') 
end 

# => ['man-spider', woman-super'] 
3

Вы могли бы пойти с регулярным выражением

"spider-man".gsub(/^(.+)-(.+)$/, '\2-\1') 
#=> "man-spider" 

И это будет в два раза медленнее, чем @ rohit89 раствора;)

+1

Итак, вы будете нажимать пальцами, ожидая его окончания? Есть что-то о расколе, обработке, соединении с решеткой. Я полагаю, что он читается лучше, но я по-прежнему предпочитаю работать с строкой напрямую, как вы это делали. –

+0

Если вы хотите сделать тесты, возможно, используя '([^ -] *)' вместо первого '(. +)' Быстрее (не тестировалось). вы также можете использовать 'sub' вместо' gsub' –

+0

@CarySwoveland. Я думаю, что разделенное решение гораздо более идиоматично Ruby. С точки зрения скорости можно было выбрать что-то вроде 'pos = str.index (« - »); str [pos + 1 ..- 1] + "-" + str [0 ... pos] '. А также, когда вы работаете со строками напрямую, вы всегда должны знать о своей изменчивой природе. – fl00r

2

Похоже, это контрольное время:

require 'fruity' 

STR = 'spider-man' 

compare do 
    split_reverse_join {STR.split('-').reverse.join('-') } 
    regex { STR.gsub(/^(.+)-(.+)$/, '\2-\1') } 
end 

# >> Running each test 2048 times. Test will take about 1 second. 
# >> split_reverse_join is faster than regex by 3x ± 0.1 

Сравнивая незначительные изменения в схеме:

require 'fruity' 

STR = 'spider-man' 

compare do 
    regex1 { STR.gsub(/^(.+)-(.+)$/, '\2-\1') } 
    regex2 { STR.gsub(/^([^-]*)-(.+)$/, '\2-\1') } 
end 
# >> Running each test 1024 times. Test will take about 1 second. 
# >> regex1 is similar to regex2 

Сравнение gsub к sub:

compare do 
    gsub_regex { STR.gsub(/^(.+)-(.+)$/, '\2-\1') } 
    sub_regex { STR.sub(/^(.+)-(.+)$/, '\2-\1') } 
end 
# >> Running each test 2048 times. Test will take about 1 second. 
# >> sub_regex is faster than gsub_regex by 70.0% ± 10.0% 

sub всегда быстрее, чем gsub, так как он будет выручать после первого поиска попаданием , вместо поиска дополнительных хитов.


Самый быстрый будет уродливый один. pos = str.index("-"); str[pos+1..-1] + "-" + str[0...pos]

compare do 
    split_reverse_join {STR.split('-').reverse.join('-') } 
    regex { STR.gsub(/^(.+)-(.+)$/, '\2-\1') } 
    pos { 
    pos = STR.index("-") 
    STR[pos+1..-1] + "-" + STR[0...pos] 
    } 
end 

# >> Running each test 2048 times. Test will take about 1 second. 
# >> pos is faster than split_reverse_join by 19.999999999999996% ± 10.0% 
# >> split_reverse_join is faster than regex by 3x ± 0.1 
+0

Самый быстрый из них будет самым уродливым. 'pos = str.index (" - "); str [pos + 1 ..- 1] + "-" + str [0 ... pos] ' – fl00r

+0

Я сделал тест несколько раз, и я получаю очень неустойчивые результаты между 60% и 3x (но всегда в пользу разделения/join). –

+0

Я не могу прокомментировать это, так как я не знаю, как вы это сделали. Я использую Fruity почти исключительно сейчас, так как он очень последователен в своем тестировании и отчетности. Выполнение нескольких тестов чаще всего возвращает указанные результаты. –

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