В Windows при двойном щелчке по тексту будет выделено слово вокруг курсора в тексте.
(Эта функция имеет более сложные свойства, но их не нужно будет реализовывать для этой задачи.)
Например, пусть |
ваш курсор в abc de|f ghi
.
Затем при двойном щелчке def
будет выбрана подстрока .
Ввод, вывод
Вам будет дано два ввода: строка и целое число.
Ваша задача - вернуть слово-подстроку строки вокруг индекса, указанного целым числом.
Ваш курсор может находиться прямо перед или сразу после символа в строке с указанным индексом.
Если вы используете прямо раньше , пожалуйста, укажите в своем ответе.
Технические характеристики (спецификации)
Индекс гарантированно находится внутри слова, поэтому никакие крайние случаи, такие как abc |def ghi
или abc def| ghi
.
Строка будет содержать только печатные символы ASCII (от U + 0020 до U + 007E).
Слово «слово» определяется регулярным выражением (?<!\w)\w+(?!\w)
, где \w
оно определяется [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
или «буквенно-цифровыми символами в ASCII, включая подчеркивание».
Индекс может быть 1-индексирован или 0-индексирован.
Если вы используете 0-индексированный, укажите это в своем ответе.
Testcases
Тестовые случаи 1-индексированы, и курсор находится сразу после указанного индекса.
Положение курсора только для демонстрационных целей, которые не требуется выводить.
string index output cursor position
abc def 2 abc ab|c def
abc def 5 def abc d|ef
abc abc 2 abc ab|c abc
ab cd ef 4 cd ab c|d ef
ab cd 6 cd ab c|d
ab!cd 1 ab a|b!cd
we're
?"ab...cd", 3
вернуться?Ответы:
V ,
10, 97 байтПопробуйте онлайн!
Этот ответ использует индексирование на основе 1.
Это может быть короче, если мы сделаем именно то, что написано в заголовке: « Выберите слово вокруг заданного индекса в строке». Мы могли бы сделать
Который буквально выбирает слово, но, к сожалению, не меняет вывод вообще. Поэтому нам нужно немного обойти это, чтобы он работал, вырезав его в регистр, удалив остальную часть текста, а затем вставив регистр обратно.
Объяснение:
источник
C 104 байта
Ожидается, что вводом в stdin будет индекс, основанный на 0, за которым следуют один пробел или символ новой строки, за которым следует строка. Максимальная длина слова составляет 99 символов. Например:
источник
:D
C (gcc), 94 байта
Индексируется нулями, определяет функцию, которая берет индекс, затем строку.
источник
isalnum(*++p)|*p==95
неопределенное поведение.*++p^95?isalnum(*p):1
на один байт длиннее, но работает на каждом компиляторе.isalnum(*++p)||*p==95
также работает, для добавленного одного байта.Сетчатка, 22
Попробуйте онлайн! или проверьте все контрольные примеры . Обычная программа занимает позицию курсора в унарном виде, за которой следует новая строка, а затем строка. В тестовом наборе есть дополнительный код для запуска в построчном режиме,
\
в качестве разделителя используется a, а для удобства используется десятичный.Использует группы балансировки, чтобы найти позицию курсора, а затем возвращается к границе слова. Удаляет текст до слова, а затем после слова.
источник
C, 115 байтов
Функция
f()
требует строку и индекс (1-indexed) в качестве параметров и выводит результат в стандартный вывод. Курсор должен быть после указанного символа.источник
JavaScript (ES6), 57 байт
Просто нарезает строку в точке курсора (которая находится перед 0-индексированным символом, который работает так же, как после 1-индексированного символа), затем извлекает и объединяет соседние фрагменты слова. Даже возвращает разумный результат, когда курсор находится в начале, конце или рядом с словом.
источник
de
.Java 8,
8678 байтРазоблачен тестовыми примерами:
Разбивает строку не буквенно-цифровыми символами, затем продолжает вычитать длину каждой подстроки плюс 1 из указанной позиции, пока она не станет отрицательной. Поскольку любые повторяющиеся не алфавитно-цифровые символы представляются в виде пустой строки, логика вычитания значительно упрощается.
Этот код не был тщательно протестирован, поэтому я хотел бы посмотреть, сможет ли кто-нибудь это сломать. Кроме того, учитывая, что это код Java, как это не самый длинный ответ здесь? :П
источник
(s,p)->
может бытьs->p->
с помощью карри лямбда-выражения (то естьjava.util.function.Function<String, java.util.function.Function<String, String>> f
). Кроме того,String
может бытьvar
сейчас, если переключиться на Java 10, хотя это было недоступно в то время, конечно. Независимо, хороший ответ. Я вижу, я уже обновил его где-то в прошлом. :)Pyth, 16 байт
Попробуйте онлайн
источник
Рубин,
4131 байтПопробуйте онлайн!
-10 байт от @MartinEnder
источник
Пайк, 19 байт
Попробуй это здесь!
Используется
Q;
как неактивный, чтобы убедиться, что первый вход размещен правильноисточник
Python 2,
7066 байтРазбивает строку на разделители без слов: один раз на исходную строку до индекса курсора, затем на строку, начинающуюся с индекса курсора. Возвращает последний элемент разделения слева и первый элемент разделения справа. Спасибо Leaky Nun за сохранение 4 байта!
источник
Clojure, 92 байта
Сначала разбивает входную строку в позиции
k
на две строки. Затем для этих строк найдите вхождения"\w+"
и верните их в виде списка. Затем объедините последний элемент первого списка и первый элемент второго списка.Смотрите это онлайн: https://ideone.com/Dk2FIs
источник
JavaScript (ES6), 52 байта
источник
(\\W+|^)
нет(\\W|^)
Луа,
7167 байтWoohoo, Lua не самое длинное решение! Еще один байт позади питона, но я не знаю, как это сделать. Индексы основаны на 1.
Благодаря @LeakyNun, напоминающему мне о существовании
string.match
, сэкономлено 4 байтаСтарый 71
Примечание: объяснения все еще основаны на этом, потому что это также относится к новому, но содержит некоторую дополнительную информацию о
gmatch
объяснение
Сначала мы распаковываем аргументы в
g
иh
потому что они корочеarg[x]
Затем мы создаем наш вывод, который является конкатенацией части перед курсором и после него.
Первая часть строки
Мы хотим найти слово в конце этого, поэтому мы используем функцию
string.gmatch
Этот шаблон соответствует
0..n
времени набора символов алфавита + подчеркивания в конце строки.gmatch
возвращает итератор в своем списке совпадений в виде функции (используя принцип замыкания), поэтому мы выполняем его один раз, чтобы получить первую часть нашего словаМы получаем вторую часть нашего слова таким же образом
Единственное отличие заключается в том, что нам не нужно указывать, что мы хотим сопоставить в начале строки (используя
[^%a_]*
), поскольку это будет совпадение, возвращаемое итератором при первом вызове.источник
g:sub(h+1):match"^[%a_]*"
?match
\ o / экономит много байтов, спасибоJavascript (с использованием внешней библиотеки) (168 байт)
Ссылка на lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Объяснение кода: Библиотека принимает строку, которая разбирается в массив символов. Он сопоставляется с объектом, хранящим индекс и символ. Последовательность разбивается на подпоследовательности при каждом появлении "". Подпоследовательности фильтруются путем проверки того, содержится ли указатель курсора в указателе min и max подпоследовательности. Затем мы берем первую подпоследовательность. Затем мы преобразуем обратно в просто массив символов. Затем мы объединяем все символы с "" в качестве разделителя. Затем мы проверяем слово regex. Тогда мы берем первый матч.
источник
(?<!\w)\w+(?!\w)
, где\w
оно определяется[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
или «буквенно-цифровыми символами в ASCII, включая подчеркивание».Perl 6 , 34 байта
Попробуйте онлайн!
Анонимный кодовый блок, который принимает ввод карри, как
f(n)(string)
.Объяснение:
источник
Рубин , 30 байтов
Попробуйте онлайн!
Другой подход, только на 1 байт короче и спустя 3 года. Почему нет?
источник
APL (NARS), 58 символов, 116 байтов
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ найти начало строки ... Как использовать и тестировать:
источник
MATL ,
1615 байтКурсор индексируется 1 и после символа (как в тестовых примерах).
Попробуйте онлайн! Или проверьте все тестовые случаи .
источник
PowerShell v3 +,
103101 байтВид глупого решения, но другой подход, чем другие.
Принимает ввод
$a
как нулевой индекс строки$n
. Затем мы находим границы нашего слова. Пока мы не достигли конца строки и / или мы все еще сопоставляем слова-символы, мы++$a
. Затем из-за забора мы устанавливаем$i=$a--
. Затем мы ползем назад, уменьшаясь,$a
пока не будет0
мы не столкнемся с несловесным символом. Затем мы нарезаем входную строку на основе этих двух разграничений (с некоторыми приращениями / уменьшениями для учета OBOE), и-join
это вместе для получения результата.Примеры
источник
select-the-word-around-the-index.ps1
PHP, 98 байт
4
==PREG_SPLIT_OFFSET_CAPTURE
), циклически перебирает слова, пока не будет достигнута позиция.источник
Python 3,
112140 байт0 индексированные.
Поиск назад к первому буквенно-цифровому символу из индекса, а затем переход к последнему буквенно-цифровому символу после индекса. Вероятно, есть более разумный способ сделать это.
Попытайся
источник
_
был добавлен, я не уверен, почему я получил ошибку,f('abc',1)
хотя.JavaScript (ES 6),
4342 байтаJavaScript (ES 3), 65 байт
источник
05AB1E , 14 байтов
Порт @AndersKaseorg 's Pyth answer .
1-индексируется как контрольные тесты.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник