Sous Windows, lorsque vous effectuez un double-clic dans un texte, le mot autour de votre curseur dans le texte sera sélectionné.
(Cette fonctionnalité a des propriétés plus compliquées, mais il ne sera pas nécessaire de les implémenter pour ce défi.)
Par exemple, laissez |
votre curseur entrer abc de|f ghi
.
Ensuite, lorsque vous double-cliquez, la sous-chaîne def
sera sélectionnée.
Entrée sortie
Vous recevrez deux entrées: une chaîne et un entier.
Votre tâche consiste à renvoyer la sous-chaîne de mots de la chaîne autour de l'index spécifié par l'entier.
Votre curseur peut être placé juste avant ou juste après le caractère de la chaîne à l'index spécifié.
Si vous utilisez juste avant , veuillez préciser dans votre réponse.
Spécifications (spécifications)
L'index est garanti à l'intérieur d'un mot, donc pas de cas de bord comme abc |def ghi
ou abc def| ghi
.
La chaîne ne contiendra que des caractères ASCII imprimables (de U + 0020 à U + 007E).
Le mot "mot" est défini par l'expression régulière (?<!\w)\w+(?!\w)
, où \w
est défini par [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, ou "caractères alphanumériques en ASCII, y compris le soulignement".
L'index peut être indexé 1 ou indexé 0.
Si vous utilisez l'index 0, veuillez le spécifier dans votre réponse.
Cas de test
Les cas de test sont indexés 1 et le curseur se trouve juste après l'index spécifié.
La position du curseur est uniquement à des fins de démonstration, qui ne devra pas être sortie.
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
revenir?Réponses:
V ,
10, 97 octetsEssayez-le en ligne!
Cette réponse utilise l'indexation basée sur 1.
Cela pourrait être plus court si nous faisons exactement ce que dit le titre: " Sélectionnez le mot autour de l'index donné dans une chaîne". Nous pourrions faire
Ce qui sélectionne littéralement le mot, mais ne change malheureusement pas du tout la sortie. Nous avons donc besoin d'une petite solution pour le faire fonctionner en le découpant dans un registre, en supprimant le reste du texte, puis en le collant à nouveau.
Explication:
la source
C, 104 octets
S'attend à ce que l'entrée sur stdin soit l'index de base 0 suivi d'un espace ou d'un saut de ligne, suivi de la chaîne. La longueur maximale d'un mot est de 99 caractères. Par exemple:
la source
:D
C (gcc), 94 octets
Zéro indexé, définit une fonction prenant l'index, puis la chaîne.
la source
isalnum(*++p)|*p==95
c'est un comportement indéfini.*++p^95?isalnum(*p):1
est un octet de plus, mais fonctionne sur tous les compilateurs.isalnum(*++p)||*p==95
fonctionne également, pour un octet supplémentaire.Rétine, 22
Essayez-le en ligne! ou vérifiez tous les cas de test . Le programme régulier prend la position du curseur en unaire suivi d'un retour à la ligne puis de la chaîne. La suite de tests a du code supplémentaire à exécuter en mode par ligne, et utilise un
\
comme délimiteur, et il utilise décimal, pour plus de commodité.Utilise des groupes d'équilibrage pour trouver la position du curseur, puis revient en arrière jusqu'à une limite de mot. Supprime le texte jusqu'au mot, puis après le mot.
la source
C, 115 octets
La fonction
f()
requiert la chaîne et l'index (indexé 1) comme paramètres et imprime le résultat sur stdout. Le curseur doit se trouver après le caractère spécifié.la source
JavaScript (ES6), 57 octets
Tranche simplement la chaîne au point du curseur (qui est avant le caractère indexé 0, ce qui revient au même qu'après le caractère indexé 1), puis extrait et concatène les fragments de mots adjacents. Renvoie même un résultat sensible lorsque le curseur est au début, à la fin ou loin d'un mot.
la source
de
.Java 8,
8678 octetsNon golfé avec des cas de test:
Divise la chaîne par des caractères non alphanumériques, puis continue de soustraire la longueur de chaque sous-chaîne, plus 1, de la position spécifiée, jusqu'à ce qu'elle devienne négative. Étant donné que tout caractère non alphanumérique répétitif est représenté sous forme de chaîne vide, la logique de soustraction est nettement plus facile.
Ce code n'est pas testé intensivement, donc j'aimerais voir si quelqu'un peut le casser. De plus, étant donné qu'il s'agit de code Java, comment n'est-ce pas la réponse la plus longue ici? : P
la source
(s,p)->
peut êtres->p->
en utilisant une expression lambda currying (iejava.util.function.Function<String, java.util.function.Function<String, String>> f
). De plus, celaString
pourrait être levar
cas si vous passiez à Java 10, bien que cela ne soit pas disponible à l'époque bien sûr. Quoi qu'il en soit, belle réponse. Je vois que je l'ai déjà mis à jour quelque part dans le passé. :)Pyth, 16 octets
Essayez-le en ligne
la source
Rubis,
4131 octetsEssayez-le en ligne!
-10 octets de @MartinEnder
la source
Pyke, 19 octets
Essayez-le ici!
Utilise
Q;
comme no-op pour s'assurer que la première entrée est placée correctementla source
Python 2,
7066 octetsFractionne la chaîne par des séparateurs autres que des mots, une fois sur la chaîne d'origine jusqu'à l'index du curseur, puis sur la chaîne commençant à l'index du curseur. Renvoie le dernier élément de la division gauche plus le premier élément de la division droite. Merci à Leaky Nun d'avoir économisé 4 octets!
la source
Clojure, 92 octets
Tout d'abord, divise la chaîne d'entrée à la position
k
en deux chaînes. Ensuite, pour ces chaînes, recherchez les occurrences de"\w+"
et renvoyez-les sous forme de liste. Ensuite, concaténez le dernier élément de la première liste et le premier élément de la deuxième liste.Voir en ligne: https://ideone.com/Dk2FIs
la source
JavaScript (ES6), 52 octets
la source
(\\W+|^)
pas(\\W|^)
Lua,
7167 octetsWoohoo, Lua n'est pas la solution la plus longue! Encore un octet derrière python, mais je ne sais pas comment jouer au golf. Les index sont basés sur 1.
Merci à @LeakyNun me rappelant l'existence de
string.match
, sauvé 4 octetsVieux 71
Remarque: les explications sont toujours basées sur celle-ci, car elle s'applique également à la nouvelle, mais contient des informations supplémentaires sur
gmatch
Explication
Tout d'abord, nous décompressons les arguments dans
g
eth
parce qu'ils sont plus courts quearg[x]
Ensuite, nous construisons notre sortie, qui est la concatanation de la pièce avant et après le curseur.
La première partie de la chaîne est
Nous voulons trouver le mot à la fin de celui-ci, nous utilisons donc la fonction
string.gmatch
Cette correspondance de motif
0..n
multiplie le jeu de caractères alphabet + trait de soulignement à la fin de la chaîne.gmatch
renvoie un itérateur sur sa liste de correspondance sous la forme d'une fonction (en utilisant le principe de fermeture), nous l'exécutons donc une fois pour obtenir la première partie de notre motNous obtenons la deuxième partie de notre parole de la même manière
La seule différence étant que nous n'avons pas à spécifier que nous voulons faire correspondre au début de la chaîne (en utilisant
[^%a_]*
), car ce sera la correspondance renvoyée par l'itérateur lors de son premier appel.la source
g:sub(h+1):match"^[%a_]*"
?match
\ o / enregistre beaucoup d'octets, merciJavascript (à l'aide d'une bibliothèque externe) (168 octets)
Lien vers la bibliothèque: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Explication du code: la bibliothèque accepte une chaîne, qui est analysée dans un tableau de caractères. Il est mappé à un objet stockant l'index et le caractère. La séquence est divisée en sous-séquences à chaque occurrence de "". Les sous-séquences sont filtrées en vérifiant si l'index du curseur est contenu dans l'index min et max de la sous-séquence. Ensuite, nous prenons la première sous-séquence. Ensuite, nous nous transformons en un simple tableau de caractères. Ensuite, nous concaténons tous les caractères avec "" comme délimiteur. Ensuite, nous validons le mot regex. Ensuite, nous prenons le premier match.
la source
(?<!\w)\w+(?!\w)
, où\w
est défini par[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, ou "caractères alphanumériques en ASCII, y compris le soulignement".Perl 6 , 34 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend les entrées au curry, comme
f(n)(string)
.Explication:
la source
Rubis , 30 octets
Essayez-le en ligne!
Une approche différente, seulement 1 octet plus court et 3 ans plus tard. Pourquoi pas?
la source
APL (NARS), 58 caractères, 116 octets
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ trouver où commencer la chaîne ... Comment utiliser et tester:
la source
MATL ,
1615 octetsLe curseur est indexé 1 et après le caractère (comme dans les cas de test).
Essayez-le en ligne! Ou vérifiez tous les cas de test .
la source
PowerShell v3 +,
103101 octetsUne sorte de solution loufoque, mais une approche différente des autres.
Prend l'entrée
$a
comme l'index basé sur 0 de la chaîne$n
. Ensuite, nous trouvons les limites de notre parole. Bien que nous n'ayons pas atteint la fin de la chaîne et / ou que nous correspondions toujours à des mots, nous++$a
. Puis, à cause de la clôture, nous nous sommes mis$i=$a--
. Ensuite, nous rampons vers l'arrière, en décrémentant$a
jusqu'à ce que ce soit0
ou que nous frappions un caractère autre qu'un mot. Nous coupons ensuite la chaîne d'entrée en fonction de ces deux démarcations (avec quelques incréments / diminutions pour tenir compte de l'OBOE), et-join
ensemble pour produire le résultat.Exemples
la source
select-the-word-around-the-index.ps1
PHP, 98 octets
4
==PREG_SPLIT_OFFSET_CAPTURE
), parcourt les mots jusqu'à ce que la position soit atteinte.la source
Python 3,
112140 octets0 indexé.
Recherche en arrière le premier caractère alphanumérique de l'index, puis avance jusqu'au dernier caractère alphanumérique après l'index. Il existe probablement une façon plus intelligente de procéder.
Essayez-le
la source
_
été ajouté, je ne sais pas pourquoi j'obtiendrais une erreurf('abc',1)
.JavaScript (ES 6),
4342 octetsJavaScript (ES 3), 65 octets
la source
05AB1E , 14 octets
Port de @AndersKaseorg « s réponse Pyth .
1-indexé comme les cas de test de défi.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source