Каков наилучший способ разобрать список переносимых слов и вернуть начальные и конечные слова?Порядок переключения дешёвых слов
Вход:
spider-man
wonder-woman
Выход:
man-spider
woman-wonder
Каков наилучший способ разобрать список переносимых слов и вернуть начальные и конечные слова?Порядок переключения дешёвых слов
Вход:
spider-man
wonder-woman
Выход:
man-spider
woman-wonder
Вы можете разбить его и затем повернуть его вспять.
"spider-man".split('-').reverse.join('-')
#=> "man-spider"
Вы могли бы пойти с регулярным выражением
"spider-man".gsub(/^(.+)-(.+)$/, '\2-\1')
#=> "man-spider"
И это будет в два раза медленнее, чем @ rohit89 раствора;)
Итак, вы будете нажимать пальцами, ожидая его окончания? Есть что-то о расколе, обработке, соединении с решеткой. Я полагаю, что он читается лучше, но я по-прежнему предпочитаю работать с строкой напрямую, как вы это делали. –
Если вы хотите сделать тесты, возможно, используя '([^ -] *)' вместо первого '(. +)' Быстрее (не тестировалось). вы также можете использовать 'sub' вместо' gsub' –
@CarySwoveland. Я думаю, что разделенное решение гораздо более идиоматично Ruby. С точки зрения скорости можно было выбрать что-то вроде 'pos = str.index (« - »); str [pos + 1 ..- 1] + "-" + str [0 ... pos] '. А также, когда вы работаете со строками напрямую, вы всегда должны знать о своей изменчивой природе. – fl00r
Похоже, это контрольное время:
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
Самый быстрый из них будет самым уродливым. 'pos = str.index (" - "); str [pos + 1 ..- 1] + "-" + str [0 ... pos] ' – fl00r
Я сделал тест несколько раз, и я получаю очень неустойчивые результаты между 60% и 3x (но всегда в пользу разделения/join). –
Я не могу прокомментировать это, так как я не знаю, как вы это сделали. Я использую Fruity почти исключительно сейчас, так как он очень последователен в своем тестировании и отчетности. Выполнение нескольких тестов чаще всего возвращает указанные результаты. –
Добро пожаловать на переполнение стека. Вместо того, чтобы просить нас о коде, вам нужно провести исследование, а затем попробуйте, когда у вас возникнет проблема, укажите минимальный код, который вы написали для решения проблемы, некоторые данные ввода и вывода, и мы поможем вам. Как и нет, мы не можем сказать, пытались ли вы, и похоже, что вы просите нас написать код для вас, а это не то, что для Stack Overflow. –