En Windows, cuando realiza doble clic en un texto, se seleccionará la palabra alrededor del cursor en el texto.
(Esta característica tiene propiedades más complicadas, pero no será necesario implementarlas para este desafío).
Por ejemplo, deje |
que su cursor entre abc de|f ghi
.
Luego, cuando haga doble clic, def
se seleccionará la subcadena .
De entrada y salida
Se le darán dos entradas: una cadena y un número entero.
Su tarea es devolver la subcadena de palabras de la cadena alrededor del índice especificado por el entero.
Su cursor puede estar justo antes o justo después del carácter en la cadena en el índice especificado.
Si usa antes , especifique en su respuesta.
Especificaciones (especificaciones)
El índice está garantizado para estar dentro de una palabra, por lo que no hay casos extremos como abc |def ghi
o abc def| ghi
.
La cadena solo contendrá caracteres ASCII imprimibles (de U + 0020 a U + 007E).
La palabra "palabra" está definida por la expresión regular (?<!\w)\w+(?!\w)
, donde \w
está definida por [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, o "caracteres alfanuméricos en ASCII incluyendo el guión bajo".
El índice puede ser 1 indexado o 0 indexado.
Si utiliza 0 indexado, especifíquelo en su respuesta.
Casos de prueba
Los casos de prueba están indexados en 1 y el cursor está justo después del índice especificado.
La posición del cursor es solo para fines de demostración, que no se requerirá que salga.
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
volver?Respuestas:
V ,
10, 97 bytesPruébalo en línea!
Esta respuesta utiliza indexación basada en 1.
Esto podría ser más corto si hacemos exactamente lo que dice el título: " Seleccione la palabra alrededor del índice dado en una cadena". Podríamos hacer
Que literalmente selecciona la palabra, pero desafortunadamente no cambia la salida en absoluto. Por lo tanto, necesitamos una pequeña solución para hacerlo funcionar cortándolo en un registro, eliminando el resto del texto y luego pegando el registro nuevamente.
Explicación:
fuente
C, 104 bytes
Espera que la entrada en stdin sea el índice basado en 0 seguido de un espacio o nueva línea, seguido de la cadena. La longitud máxima de una palabra es de 99 caracteres. P.ej:
fuente
:D
C (gcc), 94 bytes
Indexado a cero, define una función que toma el índice, luego la cadena.
fuente
isalnum(*++p)|*p==95
es un comportamiento indefinido.*++p^95?isalnum(*p):1
es un byte más largo, pero funciona en todos los compiladores.isalnum(*++p)||*p==95
también funciona, por un byte adicional.Retina, 22
Pruébalo en línea! o verificar todos los casos de prueba . El programa regular toma la posición del cursor en unario seguido de una nueva línea y luego la cadena. El conjunto de pruebas tiene un código adicional para ejecutarse en modo por línea, y usa a
\
como delimitador, y usa decimal, por conveniencia.Utiliza grupos de equilibrio para encontrar la posición del cursor, luego retrocede hasta un límite de palabra. Elimina el texto hasta la palabra y luego después de la palabra.
fuente
C, 115 bytes
La función
f()
requiere la cadena y el índice (1 indexado) como parámetros e imprime el resultado en stdout. El cursor debe estar después del carácter especificado.fuente
JavaScript (ES6), 57 bytes
Simplemente corta la cadena en el punto del cursor (que está antes del carácter indexado 0, que funciona igual que después del carácter indexado 1), luego extrae y concatena los fragmentos de palabras adyacentes. Incluso devuelve un resultado sensible cuando el cursor está al principio, al final o en ninguna parte cerca de una palabra.
fuente
de
.Java 8,
8678 bytesSin golfos con casos de prueba:
Divide la cadena por caracteres no alfanuméricos, luego resta la longitud de cada subcadena, más 1, de la posición especificada, hasta que se vuelve negativa. Dado que cualquier repetición no alfanumérica se representa como una cadena vacía, la lógica de resta es significativamente más fácil.
Este código no se ha probado exhaustivamente, por lo que me gustaría ver si alguien puede romper esto. Además, teniendo en cuenta que este es un código Java, ¿cómo es que esta no es la respuesta más larga aquí? :PAG
fuente
(s,p)->
puede sers->p->
usando una expresión lambda al curry (es decirjava.util.function.Function<String, java.util.function.Function<String, String>> f
). Además,String
podría servar
ahora si se cambia a Java 10, aunque eso no estaba disponible en el momento, por supuesto. De todos modos, buena respuesta. Veo que ya lo actualicé en algún lugar del pasado. :)Pyth, 16 bytes
Pruébalo en línea
fuente
Ruby,
4131 bytesPruébalo en línea!
-10 bytes de @MartinEnder
fuente
Pyke, 19 bytes
Pruébalo aquí!
Se utiliza
Q;
como no operativo para asegurarse de que la primera entrada se coloca correctamentefuente
Python 2,
7066 bytesDivide la cadena por separadores que no son palabras, una vez en la cadena original hasta el índice del cursor, luego en la cadena que comienza en el índice del cursor. Devuelve el último elemento de la división izquierda más el primer elemento de la división derecha. ¡Gracias a Leaky Nun por guardar 4 bytes!
fuente
Clojure, 92 bytes
Primero, divide la cadena de entrada en la posición
k
en dos cadenas. Luego, para estas cadenas, encuentre las ocurrencias de"\w+"
y devuélvalas como una lista. Luego concatene el último elemento de la primera lista y el primer elemento de la segunda lista.Véalo en línea: https://ideone.com/Dk2FIs
fuente
JavaScript (ES6), 52 bytes
fuente
(\\W+|^)
no?(\\W|^)
Lua,
7167 bytesWoohoo, ¡Lua no es la solución más larga! Todavía hay un byte detrás de Python, pero no sé cómo jugar golf. Los índices están basados en 1.
Gracias a @LeakyNun recordándome la existencia de
string.match
4 bytes guardadosViejo 71
Nota: las explicaciones todavía se basan en esta, porque también se aplica a la nueva, pero contiene información adicional sobre
gmatch
Explicación
Primero, descomprimimos los argumentos en
g
yh
porque son más cortos quearg[x]
Luego, construimos nuestra salida, que es la concatenación de la parte anterior al cursor y después de este.
La primera parte de la cadena es
Queremos encontrar la palabra al final de esta, así que usamos la función
string.gmatch
Esta coincidencia de patrón
0..n
multiplica por el conjunto de caracteres del alfabeto + guión bajo al final de la cadena.gmatch
devuelve un iterador en su lista de coincidencias en forma de función (utilizando el principio de cierre), por lo que lo ejecutamos una vez para obtener la primera parte de nuestra palabraObtenemos la segunda parte de nuestra palabra de la misma manera
La única diferencia es que no tenemos que especificar que queremos hacer coincidir al comienzo de la cadena (usando
[^%a_]*
), ya que será la coincidencia devuelta por el iterador cuando se llame por primera vez.fuente
g:sub(h+1):match"^[%a_]*"
?match
\ o / ahorra muchos bytes, graciasJavascript (usando una biblioteca externa) (168 bytes)
Enlace a lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Explicación del código: la biblioteca acepta una cadena, que se analiza en una matriz de caracteres. Se asigna a un objeto que almacena el índice y el carácter. La secuencia se divide en subsecuencias en cada aparición de "". Las subsecuencias se filtran comprobando si el índice del cursor está contenido dentro del índice mínimo y máximo de la subsecuencia. Luego tomamos la primera subsecuencia. Luego nos transformamos de nuevo a solo una matriz de caracteres. Luego concatenamos todos los caracteres con "" como delimitador. Luego validamos contra la palabra regex. Luego tomamos el primer partido.
fuente
(?<!\w)\w+(?!\w)
, donde\w
está definida por[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, o "caracteres alfanuméricos en ASCII incluyendo el guión bajo".Perl 6 , 34 bytes
Pruébalo en línea!
Codeblock anónimo que toma entradas curry, como
f(n)(string)
.Explicación:
fuente
Rubí , 30 bytes.
Pruébalo en línea!
Un enfoque diferente, solo 1 byte más corto y 3 años después. Por qué no?
fuente
APL (NARS), 58 caracteres, 116 bytes
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ encuentra dónde comienza la cadena ... Cómo usar y probar:
fuente
MATL ,
1615 bytesEl cursor está indexado en 1 y después del carácter (como en los casos de prueba).
Pruébalo en línea! O verificar todos los casos de prueba .
fuente
PowerShell v3 +,
103101bytesUna especie de solución tonta, pero un enfoque diferente a los demás.
Toma la entrada
$a
como el índice basado en 0 de la cadena$n
. Luego, encontramos los límites de nuestra palabra. Si bien no hemos llegado al final de la cadena y / o todavía estamos haciendo coincidir caracteres de palabras, nosotros++$a
. Luego, debido a la valla, nos pusimos$i=$a--
. A continuación, nos arrastramos hacia atrás, decrementando$a
hasta que sea0
o golpeemos un carácter que no sea de palabra. Luego dividimos la cadena de entrada en función de esas dos demarcaciones (con algunos incrementos / decrementos para tener en cuenta OBOE), y-join
la juntamos para producir el resultado.Ejemplos
fuente
select-the-word-around-the-index.ps1
PHP, 98 bytes
4
==PREG_SPLIT_OFFSET_CAPTURE
), recorre las palabras en bucle hasta alcanzar la posición.fuente
Python 3,
112140 bytes0 indexado.
Busca hacia atrás hasta el primer carácter alfanumérico del índice, luego avanza hasta el último carácter alfanumérico después del índice. Probablemente haya una forma más inteligente de hacer esto.
Intentalo
fuente
_
Se agregó @LeakyNun , aunque no estoy seguro de por qué obtendría un errorf('abc',1)
.JavaScript (ES 6),
4342 bytesJavaScript (ES 3), 65 bytes
fuente
05AB1E , 14 bytes
Puerto de @AndersKaseorg Es Pyth respuesta .
1 indexado como los casos de prueba de desafío.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente