Wenn Sie unter Windows auf einen Text doppelklicken, wird das Wort um den Cursor im Text ausgewählt.
(Diese Funktion hat kompliziertere Eigenschaften, für diese Herausforderung ist jedoch keine Implementierung erforderlich.)
Lassen |
Sie zum Beispiel Ihren Cursor in sein abc de|f ghi
.
Wenn Sie darauf doppelklicken, wird die Teilzeichenfolge def
ausgewählt.
Input-Output
Sie erhalten zwei Eingaben: eine Zeichenfolge und eine Ganzzahl.
Ihre Aufgabe ist es, den Wortteilstring der Zeichenfolge um den durch die Ganzzahl angegebenen Index zurückzugeben.
Ihr Cursor kann direkt vor oder direkt nach dem Zeichen in der Zeichenfolge am angegebenen Index stehen.
Wenn Sie direkt zuvor verwenden , geben Sie dies bitte in Ihrer Antwort an.
Spezifikationen (Specs)
Der Index ist garantiert innerhalb eines Wortes, also keine Kantenfälle wie abc |def ghi
oder abc def| ghi
.
Die Zeichenfolge enthält nur druckbare ASCII-Zeichen (von U + 0020 bis U + 007E).
Das Wort „Wort“ wird durch die Regex definiert (?<!\w)\w+(?!\w)
, wo \w
durch definiert ist [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, oder „alphanumerische Zeichen in ASCII einschließlich Strich“.
Der Index kann 1-indiziert oder 0-indiziert sein.
Wenn Sie 0-indiziert verwenden, geben Sie dies bitte in Ihrer Antwort an.
Testfälle
Die Testfälle sind 1-indiziert und der Cursor befindet sich direkt hinter dem angegebenen Index.
Die Cursorposition dient nur zu Demonstrationszwecken und muss nicht ausgegeben werden.
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
zurückkehren?Antworten:
V ,
10, 9,7 BytesProbieren Sie es online!
Diese Antwort verwendet eine 1-basierte Indizierung.
Dies könnte kürzer sein, wenn wir genau das tun, was der Titel sagt: " Wählen Sie das Wort um den angegebenen Index in einer Zeichenfolge aus". Wir könnten
Was das Wort buchstäblich auswählt, aber leider die Ausgabe überhaupt nicht verändert. Wir brauchen also eine kleine Umgehung, um es zum Laufen zu bringen, indem wir es in ein Register schneiden, den Rest des Textes löschen und das Register dann wieder einfügen.
Erläuterung:
quelle
C 104 Bytes
Erwartet, dass die Eingabe für stdin der auf 0 basierende Index gefolgt von einem Leerzeichen oder einer neuen Zeile, gefolgt von der Zeichenfolge, ist. Die maximale Länge eines Wortes beträgt 99 Zeichen. Z.B:
quelle
:D
C (gcc) 94 Bytes
Nullindexiert, definiert eine Funktion, die zuerst den Index und dann die Zeichenfolge verwendet.
quelle
isalnum(*++p)|*p==95
ist undefiniertes Verhalten.*++p^95?isalnum(*p):1
ist ein Byte länger, funktioniert aber auf jedem Compiler.isalnum(*++p)||*p==95
funktioniert auch für ein zusätzliches Byte.Netzhaut, 22
Probieren Sie es online! oder überprüfen Sie alle Testfälle . Das reguläre Programm setzt den Cursor auf unary, gefolgt von einer neuen Zeile und der Zeichenfolge. Die Testsuite verfügt über zusätzlichen Code, der im zeilenweisen Modus ausgeführt werden kann.
\
Als Begrenzer wird ein und zur Vereinfachung ein Dezimalzeichen verwendet.Verwendet Bilanzgruppen, um die Cursorposition zu finden, und fährt dann bis zu einer Wortgrenze zurück. Löscht den Text bis zum Wort und anschließend nach dem Wort.
quelle
C 115 Bytes
Die Funktion
f()
benötigt den String und den Index (1-indiziert) als Parameter und gibt das Ergebnis an stdout aus. Der Cursor sollte nach dem angegebenen Zeichen stehen.quelle
JavaScript (ES6), 57 Byte
Schneiden Sie einfach die Zeichenfolge an der Cursorposition (die vor dem mit 0 indizierten Zeichen liegt, was genauso funktioniert wie nach dem mit 1 indizierten Zeichen) und extrahieren und verketten Sie dann die benachbarten Wortfragmente. Gibt sogar dann ein sinnvolles Ergebnis zurück, wenn sich der Cursor am Anfang, Ende oder bei weitem nicht in der Nähe eines Wortes befindet.
quelle
de
.Java 8,
8678 BytesUngolfed mit Testfällen:
Teilt die Zeichenfolge durch nicht alphanumerische Zeichen und subtrahiert dann die Länge jeder Teilzeichenfolge plus 1 von der angegebenen Position, bis sie negativ wird. Da sich wiederholende nicht-alphanumerische Zeichen als leere Zeichenfolge dargestellt werden, ist die Subtraktionslogik wesentlich einfacher.
Dieser Code wird nicht ausgiebig getestet, daher würde ich gerne sehen, ob jemand dies brechen kann. Wenn man bedenkt, dass dies Java-Code ist, wie ist dies nicht die längste Antwort hier? : P
quelle
(s,p)->
ich kanns->p->
einen Lambda-Curry-Ausdruck (dhjava.util.function.Function<String, java.util.function.Function<String, String>> f
) verwenden. AußerdemString
könntevar
jetzt auf Java 10 umgestellt werden, obwohl das zum Zeitpunkt natürlich nicht verfügbar war. Egal, nette Antwort. Ich sehe, ich habe es schon irgendwo in der Vergangenheit aktualisiert. :)Pyth, 16 Bytes
Probieren Sie es online aus
quelle
Ruby,
4131 BytesProbieren Sie es online!
-10 Bytes von @MartinEnder
quelle
Pyke, 19 Bytes
Probieren Sie es hier aus!
Wird
Q;
als No-Op verwendet, um sicherzustellen, dass die erste Eingabe korrekt platziert wurdequelle
Python 2,
7066 BytesTeilt die Zeichenfolge nach Nicht-Worttrennzeichen auf, einmal in der ursprünglichen Zeichenfolge bis zum Cursorindex und dann in der Zeichenfolge, die am Cursorindex beginnt. Gibt das letzte Element der linken Aufteilung plus das erste Element der rechten Aufteilung zurück. Vielen Dank an Leaky Nun für das Speichern von 4 Bytes!
quelle
Clojure, 92 Bytes
Teilt zuerst die Eingabezeichenfolge an der Position
k
in zwei Zeichenfolgen auf. Dann finden Sie für diese Zeichenfolgen Vorkommen von"\w+"
und geben sie als Liste zurück. Verketten Sie dann das letzte Element der ersten Liste und das erste Element der zweiten Liste.Sehen Sie es online: https://ideone.com/Dk2FIs
quelle
JavaScript (ES6), 52 Byte
quelle
(\\W+|^)
nicht(\\W|^)
Lua,
7167 BytesWoohoo, Lua ist nicht die längste Lösung! Noch ein Byte hinter Python, aber ich weiß nicht, wie ich Golf spielen soll. Indizes basieren auf 1.
Dank @LeakyNun erinnerte mich die Existenz von
string.match
, 4 Bytes gespeichertAlt 71
Hinweis: Die Erläuterungen basieren immer noch auf dieser, da sie auch für die neue gelten, aber einige zusätzliche Informationen zu enthalten
gmatch
Erläuterung
Zuerst packen wir die Argumente in
g
und aus,h
weil sie kürzer als sindarg[x]
Dann konstruieren wir unsere Ausgabe, die die Konkatanation des Teils vor und nach dem Cursor darstellt.
Der erste Teil der Zeichenfolge ist
Wir wollen das Wort am Ende dieses Wortes finden, also benutzen wir die Funktion
string.gmatch
Dieses Muster stimmt mit
0..n
dem Zeichensatz aus Alphabet + Unterstrich am Ende der Zeichenfolge überein .gmatch
Gibt einen Iterator auf seiner Übereinstimmungsliste in Form einer Funktion zurück (nach dem Prinzip des Abschlusses), sodass wir ihn einmal ausführen, um den ersten Teil unseres Wortes zu erhaltenWir bekommen den zweiten Teil unseres Wortes auf die gleiche Weise
Der einzige Unterschied besteht darin, dass wir nicht angeben müssen, dass eine Übereinstimmung am Anfang der Zeichenfolge (mit
[^%a_]*
) erfolgen soll, da dies die Übereinstimmung ist, die der Iterator beim ersten Aufruf zurückgibt.quelle
g:sub(h+1):match"^[%a_]*"
?match
\ o / saves Menge Bytes total vergessen , dankeJavascript (mit externer Bibliothek) (168 Bytes)
Link zu lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Erklärung des Codes: Library akzeptiert einen String, der in ein char-Array zerlegt wird. Es wird einem Objekt zugeordnet, in dem der Index und das Zeichen gespeichert sind. Die Sequenz wird bei jedem Auftreten von "" in Teilsequenzen aufgeteilt. Die Untersequenzen werden gefiltert, indem geprüft wird, ob der Cursorindex im Min- und Max-Index der Untersequenz enthalten ist. Dann nehmen wir die erste Untersequenz. Dann wandeln wir uns zurück in ein Zeichen-Array. Dann verketten wir alle Zeichen mit "" als Trennzeichen. Dann validieren wir gegen das Wort Regex. Dann nehmen wir das erste Spiel.
quelle
(?<!\w)\w+(?!\w)
, wo\w
durch definiert ist[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, oder „alphanumerische Zeichen in ASCII einschließlich Strich“.Perl 6 , 34 Bytes
Probieren Sie es online!
Anonymer Codeblock, der Eingaben wie gewohnt entgegennimmt
f(n)(string)
.Erläuterung:
quelle
Ruby , 30 Bytes
Probieren Sie es online!
Ein anderer Ansatz, nur 1 Byte kürzer und 3 Jahre später. Warum nicht?
quelle
APL (NARS), 58 Zeichen, 116 Byte
⍵ {⍵≤1: ⍵⋄m⍵⋄: ⍺∇⍵-1⋄⍵ + 1} ⍺ finde, wo der String anfängt ... Wie man es benutzt und testet:
quelle
MATL ,
1615 BytesDer Cursor ist 1-indiziert und steht nach dem Zeichen (wie in den Testfällen).
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
quelle
PowerShell v3 +,
103101 ByteEine Art doofe Lösung, aber ein anderer Ansatz als andere.
Übernimmt die Eingabe
$a
als 0-basierten Index der Zeichenfolge$n
. Dann finden wir die Grenzen unseres Wortes. Obwohl wir das Ende der Zeichenkette noch nicht erreicht haben und / oder immer noch nach Wortzeichen suchen, haben wir++$a
. Dann setzten wir uns wegen der Zaunpfosten$i=$a--
. Als nächstes kriechen wir rückwärts und dekrementieren,$a
bis entweder0
ein Nicht-Wort-Zeichen getroffen wird. Wir schneiden dann die Eingabezeichenfolge auf der Grundlage dieser zwei Abgrenzungen (mit einigen Inkrementen / Dekrementen, um OBOE zu berücksichtigen) und-join
sie zusammen, um das Ergebnis zu erzeugen.Beispiele
quelle
select-the-word-around-the-index.ps1
PHP, 98 Bytes
4
==PREG_SPLIT_OFFSET_CAPTURE
). Durchläuft die Wörter, bis die Position erreicht ist.quelle
Python 3,
112140 Bytes0-indiziert.
Springt rückwärts zum ersten alphanumerischen Zeichen im Index und springt dann vorwärts zum letzten alphanumerischen Zeichen nach dem Index. Es gibt wahrscheinlich einen intelligenteren Weg, dies zu tun.
Versuch es
quelle
_
wurde hinzugefügt, ich bin mir aber nicht sicher, warum ich eine Fehlermeldung bekommen würdef('abc',1)
.JavaScript (ES 6),
4342 BytesJavaScript (ES 3), 65 Bytes
quelle
05AB1E , 14 Bytes
Hafen von @AndersKaseorg Pyth-Antwort .
1-indiziert wie die Challenge-Testfälle.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle