Di Windows, ketika Anda melakukan klik dua kali dalam sebuah teks, kata di sekitar kursor Anda dalam teks akan dipilih.
(Fitur ini memiliki sifat yang lebih rumit, tetapi tidak perlu diterapkan untuk tantangan ini.)
Misalnya, biarkan |
kursor Anda masuk abc de|f ghi
.
Kemudian, ketika Anda mengklik dua kali, substring def
akan dipilih.
Input output
Anda akan diberikan dua input: string dan integer.
Tugas Anda adalah mengembalikan kata-substring dari string di sekitar indeks yang ditentukan oleh integer.
Kursor Anda bisa tepat sebelum atau tepat setelah karakter dalam string di indeks yang ditentukan.
Jika Anda menggunakan tepat sebelumnya , sebutkan jawaban Anda.
Spesifikasi (Spesifikasi)
Indeks dijamin berada di dalam kata, jadi tidak ada tepi kasus seperti abc |def ghi
atau abc def| ghi
.
String hanya akan berisi karakter ASCII yang dapat dicetak (dari U + 0020 hingga U + 007E).
Kata "kata" didefinisikan oleh regex (?<!\w)\w+(?!\w)
, di mana \w
didefinisikan oleh [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, atau "karakter alfanumerik di ASCII termasuk garis bawah".
Indeks dapat diindeks 1 atau 0 diindeks.
Jika Anda menggunakan 0-diindeks, harap tentukan dalam jawaban Anda.
Testcases
Testcases diindeks 1, dan kursor tepat setelah indeks ditentukan.
Posisi kursor hanya untuk tujuan demonstrasi, yang tidak akan diminta untuk dikeluarkan.
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
dikembalikan?Jawaban:
V ,
10, 97 byteCobalah online!
Jawaban ini menggunakan pengindeksan berbasis 1.
Ini bisa lebih pendek jika kita melakukan persis apa yang dikatakan judul: " Pilih kata di sekitar indeks yang diberikan dalam sebuah string". Kita bisa lakukan
Yang benar-benar memilih kata, tetapi sayangnya tidak mengubah output sama sekali. Jadi kita perlu sedikit solusi untuk membuatnya bekerja dengan memotongnya menjadi register, menghapus sisa teks, lalu menempelkan register kembali.
Penjelasan:
sumber
C, 104 byte
Mengharapkan input pada stdin menjadi indeks berbasis 0 diikuti oleh satu spasi atau baris baru, diikuti oleh string. Panjang maksimal kata adalah 99 karakter. Misalnya:
sumber
:D
C (gcc), 94 byte
Diindeks nol, mendefinisikan fungsi mengambil indeks, lalu string.
sumber
isalnum(*++p)|*p==95
adalah perilaku yang tidak terdefinisi.*++p^95?isalnum(*p):1
lebih panjang satu byte, tetapi bekerja pada setiap kompiler.isalnum(*++p)||*p==95
juga berfungsi, untuk satu byte tambahan.Retina, 22
Cobalah online! atau verifikasi semua kasus uji . Program reguler mengambil posisi kursor di unary diikuti oleh baris baru dan kemudian string. Test suite memiliki kode tambahan untuk dijalankan dalam mode per baris, dan menggunakan
\
sebagai pembatas, dan menggunakan desimal, untuk kenyamanan.Menggunakan kelompok penyeimbang untuk menemukan posisi kursor, lalu mundur ke batas kata. Menghapus teks hingga kata, lalu setelah kata.
sumber
C, 115 byte
Fungsi
f()
membutuhkan string dan indeks (1-diindeks) sebagai parameter dan mencetak hasilnya ke stdout. Kursor harus setelah karakter yang ditentukan.sumber
JavaScript (ES6), 57 byte
Cukup iris string pada titik kursor (yang sebelum karakter 0-diindeks, yang bekerja sama seperti setelah karakter 1-diindeks), lalu ekstrak dan gabungkan fragmen kata yang berdekatan. Bahkan mengembalikan hasil yang masuk akal ketika kursor berada di awal, akhir, atau tempat dekat kata.
sumber
de
.Java 8,
8678 byteTidak disatukan dengan kasus uji:
Pisahkan string dengan karakter non-alfanumerik, lalu terus kurangi panjang setiap substring, ditambah 1, dari posisi yang ditentukan, hingga menjadi negatif. Karena non-alfanumerik berulang diwakili sebagai string kosong, logika pengurangan lebih mudah.
Kode ini tidak diuji secara luas, jadi saya ingin melihat apakah seseorang dapat memecahkan ini. Juga, mengingat ini adalah kode Java, bagaimana ini bukan jawaban terpanjang di sini? : P
sumber
(s,p)->
bisas->p->
dengan menggunakan ekspresi lambda yang kari (yaitujava.util.function.Function<String, java.util.function.Function<String, String>> f
). Selain itu,String
bisa jadivar
sekarang jika beralih ke Java 10, meskipun itu tidak tersedia pada saat itu tentu saja. Apapun, jawaban yang bagus. Saya melihat saya sudah memperbaruinya di suatu tempat di masa lalu. :)Pyth, 16 byte
Cobalah online
sumber
Ruby,
4131 byteCobalah online!
-10 byte dari @MartinEnder
sumber
Pyke, 19 byte
Coba di sini!
Digunakan
Q;
sebagai no-op untuk memastikan input pertama ditempatkan dengan benarsumber
Python 2,
7066 bytePisahkan string dengan pemisah non-kata, sekali pada string asli hingga indeks kursor, kemudian pada string yang dimulai pada indeks kursor. Mengembalikan elemen terakhir dari perpecahan kiri ditambah elemen pertama dari perpecahan kanan. Terima kasih kepada Leaky Nun karena telah menghemat 4 byte!
sumber
Clojure, 92 byte
Pertama, pisahkan string input pada posisi
k
menjadi dua string. Kemudian untuk string ini menemukan kemunculan"\w+"
dan kembalikan sebagai daftar. Kemudian gabungkan elemen terakhir dari daftar pertama dan elemen pertama dari daftar kedua.Lihat online: https://ideone.com/Dk2FIs
sumber
JavaScript (ES6), 52 byte
sumber
(\\W+|^)
tidak(\\W|^)
Lua,
7167 BytesWoohoo, Lua bukan solusi terpanjang! Masih satu byte di belakang python, tetapi tidak tahu cara bermain golf ini. Indeks berbasis 1.
Terima kasih kepada @LeakyNun yang mengingatkan saya akan keberadaannya
string.match
, menyelamatkan 4 byte71 tahun
Catatan: penjelasannya masih didasarkan pada yang ini, karena juga berlaku untuk yang baru, tetapi berisi beberapa informasi tambahan tentang
gmatch
Penjelasan
Pertama, kami membongkar argumen ke
g
danh
karena mereka lebih pendek dariarg[x]
Kemudian, kami membuat output kami, yang merupakan penutup bagian sebelum kursor dan setelahnya.
Bagian pertama dari string adalah
Kami ingin menemukan kata di akhir kata ini, jadi kami menggunakan fungsinya
string.gmatch
Pola ini cocok dengan
0..n
kali rangkaian karakter alfabet + garis bawah pada akhir string.gmatch
mengembalikan iterator pada daftar kecocokannya dalam bentuk fungsi (menggunakan prinsip penutupan), jadi kami menjalankannya sekali untuk mendapatkan bagian pertama dari kata kamiKita mendapatkan bagian kedua dari kata kita dengan cara yang sama
Satu-satunya perbedaan adalah kita tidak harus menentukan kita ingin mencocokkan pada awal string (menggunakan
[^%a_]*
), karena itu akan menjadi pertandingan yang dikembalikan oleh iterator saat itu disebut pertama kali.sumber
g:sub(h+1):match"^[%a_]*"
?match
\ o / menghemat banyak byte, terima kasihJavascript (menggunakan perpustakaan eksternal) (168 byte)
Tautan ke lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js
Penjelasan kode: Perpustakaan menerima string, yang akan diuraikan menjadi array char. Itu akan dipetakan ke objek yang menyimpan indeks dan char. Urutan dibagi menjadi beberapa bagian pada setiap kemunculan "". Selanjutnya disaring dengan memeriksa apakah indeks kursor terkandung dalam indeks minimum dan maksimum dari indeks berikutnya. Kemudian kita ambil urutan pertama. Kemudian kita mengubahnya kembali menjadi hanya array char. Lalu kami menggabungkan semua karakter dengan "" sebagai pembatas. Kemudian kami memvalidasi terhadap kata regex. Lalu kami mengambil pertandingan pertama.
sumber
(?<!\w)\w+(?!\w)
, di mana\w
didefinisikan oleh[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]
, atau "karakter alfanumerik di ASCII termasuk garis bawah".Perl 6 , 34 byte
Cobalah online!
Kode kunci anonim yang memerlukan input kari, seperti
f(n)(string)
.Penjelasan:
sumber
Ruby , 30 byte
Cobalah online!
Pendekatan yang berbeda, hanya 1 byte lebih pendek dan 3 tahun kemudian. Kenapa tidak?
sumber
APL (NARS), 58 karakter, 116 byte
⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺ temukan di mana memulai string ... Cara menggunakan dan menguji:
sumber
MATL ,
1615 byteKursor diindeks 1 dan setelah karakter (seperti dalam kasus uji).
Cobalah online! Atau verifikasi semua kasus uji .
sumber
PowerShell v3 +,
103101 byteSemacam solusi konyol, tetapi pendekatan yang berbeda dari yang lain.
Mengambil input
$a
sebagai indeks string berbasis 0$n
. Kemudian, kami menemukan batasan kata kami. Meskipun kami belum mencapai akhir string dan / atau kami masih mencocokkan karakter kata, kami++$a
. Lalu, karena fenceposting, kami atur$i=$a--
. Selanjutnya, kami merangkak mundur, mengurangi$a
sampai itu baik0
atau kami menekan karakter non-kata. Kami kemudian mengiris string input berdasarkan pada dua demarkasi tersebut (dengan beberapa penambahan / pengurangan untuk memperhitungkan OBOE), dan-join
bersama-sama menghasilkan hasilnya.Contohnya
sumber
select-the-word-around-the-index.ps1
PHP, 98 byte
4
==PREG_SPLIT_OFFSET_CAPTURE
), loop melalui kata-kata sampai posisi tercapai.sumber
Python 3,
112140 byteDiindeks 0.
Cari mundur ke karakter alfanumerik pertama dari indeks, lalu maju ke karakter alfanumerik terakhir setelah indeks. Mungkin ada cara yang lebih cerdas untuk melakukan ini.
Cobalah
sumber
_
ditambahkan, saya tidak yakin mengapa saya akan mendapatkan kesalahanf('abc',1)
.JavaScript (ES 6),
4342 BytesJavaScript (ES 3), 65 Bytes
sumber
05AB1E , 14 byte
Pelabuhan @AndersKaseorg 's Pyth jawabannya .
1-diindeks seperti kasus uji tantangan.
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber