No Windows, quando você clica duas vezes em um texto, a palavra ao redor do cursor no texto será selecionada.
(Esse recurso tem propriedades mais complicadas, mas não será necessário implementá-lo para esse desafio.)
Por exemplo, deixe |
seu cursor entrar abc de|f ghi
.
Então, quando você clicar duas vezes, a substring def
será selecionada.
Entrada / Saída
Você receberá duas entradas: uma sequência e um número inteiro.
Sua tarefa é retornar a palavra-substring da string em torno do índice especificado pelo número inteiro.
Seu cursor pode estar logo antes ou logo após o caractere na sequência no índice especificado.
Se você usar logo antes , especifique na sua resposta.
Especificações (Especificações)
É garantido que o índice esteja dentro de uma palavra, portanto, não há casos extremos como abc |def ghi
ou abc def| ghi
.
A sequência conterá apenas caracteres ASCII imprimíveis (de U + 0020 a U + 007E).
A palavra "palavra" é definida pelo regex (?<!\w)\w+(?!\w)
, onde \w
é definido por [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, ou "caracteres alfanuméricos em ASCII, incluindo sublinhado".
O índice pode ser indexado 1 ou 0.
Se você usa o índice 0, especifique-o na sua resposta.
Casos de teste
As caixas de teste são indexadas em 1 e o cursor fica logo após o índice especificado.
A posição do cursor é apenas para fins de demonstração, que não precisará ser emitida.
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
retornar?Respostas:
V ,
10, 97 bytesExperimente online!
Esta resposta usa indexação baseada em 1.
Isso pode ser menor se fizermos exatamente o que o título diz: " Selecione a palavra ao redor do índice especificado em uma string". Nós poderíamos fazer
Que literalmente seleciona a palavra, mas infelizmente não altera a saída. Portanto, precisamos de uma solução alternativa para fazê-lo funcionar, cortando-o em um registro, excluindo o restante do texto e colando o registro novamente.
Explicação:
fonte
C, 104 bytes
Espera que a entrada no stdin seja o índice baseado em 0 seguido por um espaço ou nova linha, seguido pela sequência. O comprimento máximo de uma palavra é de 99 caracteres. Por exemplo:
fonte
:D
C (gcc), 94 bytes
Indexado a zero, define uma função que aceita o índice e depois a sequência.
fonte
isalnum(*++p)|*p==95
é um comportamento indefinido.*++p^95?isalnum(*p):1
é um byte mais longo, mas funciona em todos os compiladores.isalnum(*++p)||*p==95
também funciona, para um byte adicionado.Retina, 22
Experimente online! ou verifique todos os casos de teste . O programa regular assume a posição do cursor em unário, seguido por uma nova linha e depois pela string. O conjunto de testes possui código adicional para executar no modo por linha e usa a
\
como delimitador e decimal, por conveniência.Usa grupos de balanceamento para encontrar a posição do cursor e depois recua até um limite de palavras. Exclui o texto até a palavra e depois da palavra.
fonte
C, 115 bytes
A função
f()
requer a string e o índice (indexados 1) como parâmetros e imprime o resultado em stdout. O cursor deve estar após o caractere especificado.fonte
JavaScript (ES6), 57 bytes
Simplesmente fatie a sequência no ponto do cursor (que está antes do caractere indexado 0, que funciona da mesma forma que o caractere indexado 1), depois extrai e concatena os fragmentos de palavras adjacentes. Even retorna um resultado sensível quando o cursor está no início, no final ou em nenhum lugar perto de uma palavra.
fonte
de
.Java 8,
8678 bytesSem jogar com casos de teste:
Divide a sequência por caracteres não alfanuméricos e continua subtraindo o comprimento de cada substring, mais 1, da posição especificada, até que se torne negativo. Como qualquer não alfanumérico repetido é representado como uma sequência vazia, a lógica de subtração é significativamente mais fácil.
Esse código não é extensivamente testado, então eu gostaria de ver se alguém pode quebrar isso. Além disso, considerando que esse é o código Java, como essa não é a resposta mais longa aqui? : P
fonte
(s,p)->
pode sers->p->
usando uma expressão lambda de curry (iejava.util.function.Function<String, java.util.function.Function<String, String>> f
). Além disso,String
poderia servar
agora se alternado para o Java 10, embora isso não estivesse disponível no momento. Independentemente, boa resposta. Vejo que já o atualizei em algum lugar no passado. :)Pitão, 16 bytes
Experimente online
fonte
Ruby,
4131 bytesExperimente online!
-10 bytes de @MartinEnder
fonte
Pyke, 19 bytes
Experimente aqui!
Utiliza-se
Q;
como não operacional para garantir que a primeira entrada seja colocada corretamentefonte
Python 2,
7066 bytesDivide a sequência por separadores que não são palavras, uma vez na sequência original até o índice do cursor e depois na sequência iniciada no índice do cursor. Retorna o último elemento da divisão esquerda mais o primeiro elemento da divisão direita. Agradecimentos a Leaky Nun por salvar 4 bytes!
fonte
Clojure, 92 bytes
Primeiro, divide a string de entrada na posição
k
em duas strings. Em seguida, para essas cadeias, encontre ocorrências"\w+"
e retorne-as como lista. Em seguida, concatene o último elemento da primeira lista e o primeiro elemento da segunda lista.Veja on-line: https://ideone.com/Dk2FIs
fonte
JavaScript (ES6), 52 bytes
fonte
(\\W+|^)
não(\\W|^)
Lua,
7167 BytesWoohoo, Lua não é a solução mais longa! Ainda um byte por trás do python, mas não sei como resolver isso. Os índices são baseados em 1.
Graças a @LeakyNun me lembrando a existência de
string.match
, salvou 4 bytesAntigo 71
Nota: as explicações ainda se baseiam nesta, porque também se aplica à nova, mas contém algumas informações extras sobre
gmatch
Explicação
Primeiro, descompactamos os argumentos em
g
eh
porque são mais curtos do quearg[x]
Em seguida, construímos nossa saída, que é a concatanação da peça antes e depois do cursor.
A primeira parte da string é
Queremos encontrar a palavra no final deste, então usamos a função
string.gmatch
Essa correspondência de padrão
0..n
vezes o conjunto de caracteres do alfabeto + sublinhado no final da sequência.gmatch
retorna um iterador em sua lista de correspondências na forma de uma função (usando o princípio de fechamento); portanto, executamos uma vez para obter a primeira parte da nossa palavraRecebemos a segunda parte da nossa palavra da mesma maneira
A única diferença é que não precisamos especificar que queremos corresponder no início da string (using
[^%a_]*
), pois será a correspondência retornada pelo iterador quando for chamada pela primeira vez.fonte
g:sub(h+1):match"^[%a_]*"
?match
\ o / poupa muito bytes, graçasJavascript (usando biblioteca externa) (168 bytes)
Link para lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Explicação do código: Library aceita uma string, que é analisada em uma matriz char. Ele é mapeado para um objeto que armazena o índice e o caractere. A sequência é dividida em subsequências a cada ocorrência de "". As subsequências são filtradas, verificando se o índice do cursor está contido nos índices mínimo e máximo da subsequência. Então tomamos a primeira subsequência. Depois, transformamos novamente em apenas uma matriz de caracteres. Em seguida, concatenamos todos os caracteres com "" como delimitador. Em seguida, validamos com a palavra regex. Então vamos dar a primeira partida.
fonte
(?<!\w)\w+(?!\w)
, onde\w
é definido por[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, ou "caracteres alfanuméricos em ASCII, incluindo sublinhado".Perl 6 , 34 bytes
Experimente online!
Codeblock anônimo que recebe entrada com curry, como
f(n)(string)
.Explicação:
fonte
Ruby , 30 bytes
Experimente online!
Uma abordagem diferente, apenas 1 byte mais curto e 3 anos depois. Por que não?
fonte
APL (NARS), 58 caracteres, 116 bytes
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ encontre onde iniciar a string ... Como usar e testar:
fonte
MATL ,
1615 bytesO cursor é indexado em 1 e após o caractere (como nos casos de teste).
Experimente online! Ou verifique todos os casos de teste .
fonte
PowerShell v3 +,
103101 bytesUma espécie de solução pateta, mas com uma abordagem diferente das outras.
Recebe a entrada
$a
como o índice baseado em 0 da sequência$n
. Então, encontramos os limites da nossa palavra. Enquanto não chegamos ao final da string e / ou ainda estamos combinando caracteres de palavra, nós++$a
. Então, por causa da colocação de cerca, nós montamos$i=$a--
. Em seguida, rastreamos para trás, decrementando$a
até que seja um0
ou atingimos um caractere que não seja palavra. Em seguida, dividimos a sequência de entrada com base nessas duas demarcações (com alguns incrementos / decréscimos para contabilizar o OBOE), e-join
juntas para produzir o resultado.Exemplos
fonte
select-the-word-around-the-index.ps1
PHP, 98 bytes
4
==PREG_SPLIT_OFFSET_CAPTURE
), percorre as palavras até que a posição seja atingida.fonte
Python 3,
112140 bytesIndexado a 0.
Procura de volta para o primeiro caractere alfanumérico do índice e depois avança para o último caractere alfanumérico após o índice. Provavelmente existe uma maneira mais inteligente de fazer isso.
Tente
fonte
_
foi adicionado, mas não sei por que receberia um errof('abc',1)
.JavaScript (ES 6),
4342 bytesJavaScript (ES 3), 65 bytes
fonte
05AB1E , 14 bytes
Porto de @AndersKaseorg é resposta Pyth .
1 indexado como os casos de teste de desafio.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte