W systemie Windows po dwukrotnym kliknięciu tekstu zostanie wybrane słowo wokół kursora w tekście.
(Ta funkcja ma bardziej skomplikowane właściwości, ale nie będzie wymagana implementacja tego wyzwania).
Na przykład, |
bądź kursorem abc de|f ghi
.
Następnie po dwukrotnym kliknięciu def
wybrany zostanie podciąg .
Wejście wyjście
Otrzymasz dwa wejścia: ciąg znaków i liczbę całkowitą.
Twoim zadaniem jest zwrócenie podłańcuchu ciągu znaków wokół indeksu określonego przez liczbę całkowitą.
Kursor może znajdować się tuż przed lub bezpośrednio po znaku w ciągu o określonym indeksie.
Jeśli korzystasz już wcześniej , proszę podać w swojej odpowiedzi.
Dane techniczne (specyfikacje)
Indeks jest gwarantowana być w środku wyrazu, więc żadne przypadki brzegowe podoba abc |def ghi
lub abc def| ghi
.
Ciąg będzie zawierał tylko drukowalne znaki ASCII (od U + 0020 do U + 007E).
Słowo „słowo” jest zdefiniowane przez wyrażenie regularne (?<!\w)\w+(?!\w)
, gdzie \w
jest zdefiniowane przez [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
lub „znaki alfanumeryczne w ASCII, w tym podkreślenie”.
Indeks może być indeksowany 1 lub 0.
Jeśli korzystasz z indeksu 0, podaj go w swojej odpowiedzi.
Przypadki testowe
Przypadki testowe mają indeks 1, a kursor znajduje się tuż za określonym indeksem.
Pozycja kursora służy wyłącznie do celów demonstracyjnych, których wysłanie nie będzie wymagane.
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
zwrócić?Odpowiedzi:
V ,
10, 97 bajtówWypróbuj online!
Ta odpowiedź używa indeksowania 1.
Może to być krótsze, jeśli zrobimy dokładnie to, co mówi tytuł: „ Wybierz słowo wokół podanego indeksu w ciągu”. Moglibyśmy zrobić
Który dosłownie wybiera słowo, ale niestety wcale nie zmienia wyniku. Potrzebujemy więc trochę obejścia, aby działało, wycinając go do rejestru, usuwając resztę tekstu, a następnie wklejając go z powrotem.
Wyjaśnienie:
źródło
C, 104 bajty
Oczekuje, że wejście na stdin będzie indeksem opartym na 0, po którym będzie spacja lub znak nowej linii, a następnie ciąg. Maksymalna długość słowa wynosi 99 znaków. Na przykład:
źródło
:D
C (gcc), 94 bajty
Zero-indeksowane, definiuje funkcję pobierającą indeks, a następnie ciąg.
źródło
isalnum(*++p)|*p==95
zachowanie jest niezdefiniowane.*++p^95?isalnum(*p):1
jest o jeden bajt dłużej, ale działa na każdym kompilatorze.isalnum(*++p)||*p==95
działa również dla dodanego jednego bajtu.Retina, 22
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe . Zwykły program zajmuje pozycję kursora w jedności, po której następuje nowa linia, a następnie ciąg. Zestaw testowy ma dodatkowy kod do uruchomienia w trybie dla poszczególnych linii, i używa
\
jako separatora, a dla wygody używa dziesiętnych.Korzysta z grup równoważących, aby znaleźć pozycję kursora, a następnie cofa się do granicy słowa. Usuwa tekst do słowa, a następnie po słowie.
źródło
C, 115 bajtów
Funkcja
f()
wymaga łańcucha i indeksu (1-indeksowany) jako parametrów i wypisuje wynik na standardowe wyjście. Kursor powinien znajdować się za określonym znakiem.źródło
JavaScript (ES6), 57 bajtów
Po prostu wycina ciąg w punkcie kursora (znajdującym się przed znakiem o indeksie 0, który działa tak samo jak po znaku o indeksie 1), a następnie wyodrębnia i konkatenuje sąsiednie fragmenty słowa. Zwraca nawet sensowny wynik, gdy kursor znajduje się na początku, na końcu lub nigdzie w pobliżu słowa.
źródło
de
.Java 8,
8678 bajtówNieoznakowane przypadkami testowymi:
Dzieli ciąg znaków na znaki niealfanumeryczne, a następnie odejmuje długość każdego podłańcucha plus 1 od określonej pozycji, aż stanie się ujemny. Ponieważ wszelkie powtarzające się znaki nie alfanumeryczne są reprezentowane jako pusty ciąg, logika odejmowania jest znacznie łatwiejsza.
Ten kod nie jest dokładnie testowany, więc chciałbym sprawdzić, czy ktoś może to zepsuć. Biorąc również pod uwagę, że jest to kod Java, dlaczego nie jest to najdłuższa odpowiedź tutaj? : P
źródło
(s,p)->
można to zrobićs->p->
, używając wyrażenia curda lambda (tjjava.util.function.Function<String, java.util.function.Function<String, String>> f
.). PonadtoString
można govar
teraz było zmienić na Javę 10, chociaż oczywiście nie było to wtedy dostępne. Niezależnie od tego, miła odpowiedź. Widzę, że już go gdzieś aktualizowałem. :)Pyth, 16 bajtów
Wypróbuj online
źródło
Rubin,
4131 bajtówWypróbuj online!
-10 bajtów od @MartinEnder
źródło
Pyke, 19 bajtów
Wypróbuj tutaj!
Służy
Q;
jako brak operacji, aby upewnić się, że pierwsze wejście jest poprawnie umieszczoneźródło
Python 2,
7066 bajtówDzieli ciąg według separatorów innych niż słowa, raz na oryginalny ciąg do indeksu kursora, a następnie na ciąg rozpoczynający się od indeksu kursora. Zwraca ostatni element lewego podziału plus pierwszy element prawego podziału. Dzięki Leaky Nun za zaoszczędzenie 4 bajtów!
źródło
Clojure, 92 bajty
Najpierw dzieli ciąg wejściowy w pozycji
k
na dwa ciągi. Następnie dla tych ciągów znajdź wystąpienia"\w+"
i zwróć je jako listę. Następnie połącz ostatni element z pierwszej listy i pierwszy element z drugiej listy.Zobacz online: https://ideone.com/Dk2FIs
źródło
JavaScript (ES6), 52 bajty
źródło
(\\W+|^)
nie(\\W|^)
Lua,
7167 bajtówWoohoo, Lua nie jest najdłuższym rozwiązaniem! Jeszcze jeden bajt za pytonem, ale nie wiem, jak to zagrać w golfa. Indeksy są oparte na 1.
Dzięki @LeakyNun przypominając mi o istnieniu
string.match
, zapisano 4 bajtyStary 71
Uwaga: wyjaśnienia są nadal oparte na tym, ponieważ dotyczy to również nowego, ale zawiera dodatkowe informacje na temat
gmatch
Wyjaśnienie
Najpierw rozpakowujemy argumenty
g
ih
ponieważ są one krótsze niżarg[x]
Następnie konstruujemy nasz wynik, który jest konkatacją części przed kursorem i po nim.
Pierwsza część łańcucha to
Chcemy znaleźć słowo na końcu tego, więc używamy funkcji
string.gmatch
Ten wzorzec dopasowuje
0..n
czasy zestawu znaków alfabetu + podkreślenia na końcu łańcucha.gmatch
zwraca iterator z listy dopasowań w postaci funkcji (zgodnie z zasadą zamknięcia), więc wykonujemy go raz, aby uzyskać pierwszą część naszego słowaDrugą część słowa otrzymujemy w ten sam sposób
Jedyną różnicą jest to, że nie musimy określać, że chcemy dopasować na początku łańcucha (używając
[^%a_]*
), ponieważ będzie to dopasowanie zwracane przez iterator przy pierwszym wywołaniu.źródło
g:sub(h+1):match"^[%a_]*"
?match
\ o / oszczędza wiele bajtów, dziękiJavaScript (przy użyciu zewnętrznej biblioteki) (168 bajtów)
Link do lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Objaśnienie kodu: Biblioteka akceptuje ciąg znaków, który jest analizowany w tablicy znaków. Zostaje odwzorowany na obiekt przechowujący indeks i znak. Sekwencja jest podzielona na podsekwencje przy każdym wystąpieniu „”. Podsekwencje są filtrowane poprzez sprawdzenie, czy indeks kursora jest zawarty w indeksie minimalnym i maksymalnym podsekwencji. Następnie bierzemy pierwszą podsekwencję. Następnie przekształcamy się z powrotem w tablicę char. Następnie łączymy wszystkie znaki ze znakiem „” jako separatorem. Następnie sprawdzamy poprawność względem wyrażenia regularnego. Następnie bierzemy pierwszy mecz.
źródło
(?<!\w)\w+(?!\w)
, gdzie\w
jest zdefiniowane przez[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
lub „znaki alfanumeryczne w ASCII, w tym podkreślenie”.Perl 6 , 34 bajtów
Wypróbuj online!
Anonimowy blok kodu, który pobiera dane wejściowe curry, jak
f(n)(string)
.Wyjaśnienie:
źródło
Rubinowy , 30 bajtów
Wypróbuj online!
Inne podejście, tylko 1 bajt krótszy i 3 lata później. Dlaczego nie?
źródło
APL (NARS), 58 znaków, 116 bajtów
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ znajdź, od czego zacząć ciąg ... Jak używać i testować:
źródło
MATL ,
1615 bajtówKursor jest indeksowany 1 i po znaku (jak w przypadkach testowych).
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
źródło
PowerShell v3 +,
103101 bajtówRodzaj głupiego rozwiązania, ale inne podejście niż inne.
Pobiera dane wejściowe
$a
jako indeks ciągu 0$n
. Następnie znajdujemy granice naszego słowa. Chociaż nie dotarliśmy do końca łańcucha i / lub nadal dopasowujemy znaki słów, my++$a
. Następnie, ze względu na ogrodzenie, ustawiliśmy$i=$a--
. Następnie pełzamy do tyłu, zmniejszając się,$a
aż pojawi się albo0
trafimy na znak inny niż słowo. Następnie przecinamy ciąg wejściowy na podstawie tych dwóch rozgraniczeń (z pewnym przyrostem / zmniejszeniem, aby uwzględnić OBOE) i-join
razem, aby uzyskać wynik.Przykłady
źródło
select-the-word-around-the-index.ps1
PHP, 98 bajtów
4
==PREG_SPLIT_OFFSET_CAPTURE
), zapętla słowa, aż do osiągnięcia pozycji.źródło
Python 3,
112140 bajtów0-indeksowane.
Szuka wstecz do pierwszego znaku alfanumerycznego z indeksu, a następnie przechodzi do ostatniego znaku alfanumerycznego po indeksie. Prawdopodobnie jest na to lepszy sposób.
Spróbuj
źródło
_
został dodany, ale nie jestem pewien, dlaczego wystąpił błądf('abc',1)
.JavaScript (ES 6),
4342 bajtówJavaScript (ES 3), 65 bajtów
źródło
05AB1E , 14 bajtów
Port @AndersKaseorg @AndersKaseorg .
1-indeksowane, jak przypadki testowe.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło