เลือกคำรอบดัชนีที่กำหนดในสตริงที่กำหนด


20

ใน Windows เมื่อคุณดับเบิลคลิกที่ข้อความคำว่าเคอร์เซอร์ของคุณในข้อความจะถูกเลือก

(คุณสมบัตินี้มีคุณสมบัติที่ซับซ้อนมากขึ้น แต่ไม่จำเป็นต้องนำไปใช้กับความท้าทายนี้)

ตัวอย่างเช่นสมมติเป็นเคอร์เซอร์ของคุณใน|abc de|f ghi

จากนั้นเมื่อคุณคลิกสองครั้งสตริงย่อยdefจะถูกเลือก

Input / Output

คุณจะได้รับสองอินพุต: สตริงและจำนวนเต็ม

งานของคุณคือส่งคืนคำ - สตริงย่อยของสตริงรอบดัชนีที่ระบุโดยจำนวนเต็ม

เคอร์เซอร์ของคุณสามารถอยู่ข้างหน้าหรือหลังอักขระในสตริงที่ดัชนีที่ระบุ

หากคุณเคยใช้มาก่อนโปรดระบุในคำตอบของคุณ

ข้อมูลจำเพาะ (Specs)

ดัชนีจะรับประกันต้องอยู่ภายในคำจึงไม่มีกรณีขอบชอบหรือabc |def ghiabc def| ghi

สตริงจะมีอักขระ ASCII ที่พิมพ์ได้เท่านั้น (จาก U + 0020 ถึง U + 007E)

คำว่า "word" ถูกกำหนดโดย regex (?<!\w)\w+(?!\w)โดยที่\wถูกกำหนดโดย[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]หรือ "ตัวอักษรและตัวเลขใน ASCII รวมถึงขีดล่าง"

ดัชนีสามารถเป็นดัชนี 1 ดัชนีหรือดัชนี0 ดัชนี

หากคุณใช้ดัชนี 0 โปรดระบุในคำตอบของคุณ

Testcases

การทดสอบมีการทำดัชนี 1 รายการและเคอร์เซอร์อยู่หลังดัชนีที่ระบุ

ตำแหน่งเคอร์เซอร์ใช้สำหรับการสาธิตเท่านั้นซึ่งไม่จำเป็นต้องแสดงผล

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

2
สตริงสามารถมีการขึ้นบรรทัดใหม่ได้หรือไม่
orlp

@orlp ความท้าทายถูกแก้ไขเพื่อ จำกัด อินพุตให้พิมพ์ได้ ASCII ดังนั้นอินพุตจะไม่ขึ้นบรรทัดใหม่
FryAmTheEggman

การทดสอบของคุณไม่มีตัวคั่นอื่นนอกเหนือจากช่องว่าง คำพูดเป็นwe'reอย่างไร
orlp

2
สิ่งที่ควร"ab...cd", 3กลับมา?
ติตัส

5
@Titus "ดัชนีรับประกันว่าจะอยู่ในคำเดียว"
Martin Ender

คำตอบ:


10

V , 10, 9 7 ไบต์

À|diwVp

ลองออนไลน์!

คำตอบนี้ใช้การจัดทำดัชนีแบบ 1 ฐาน

สิ่งนี้อาจสั้นลงหากเราทำตามที่ชื่อกล่าวไว้: " เลือกคำรอบดัชนีที่กำหนดในสตริง" เราทำได้

À|viw

ซึ่งเลือกคำอย่างแท้จริง แต่น่าเสียดายที่ไม่ได้เปลี่ยนเอาท์พุทเลย ดังนั้นเราจึงต้องการวิธีแก้ปัญหาเพียงเล็กน้อยเพื่อให้มันทำงานได้โดยการตัดมันเป็นทะเบียนลบส่วนที่เหลือของข้อความแล้ววางลงทะเบียนกลับ

คำอธิบาย:

À|          " Jump the position of argument 1
  diw       " (d)elete (i)nside this (w)ord.
     V      " Select this line
      p     " And replace it with the word we just deleted

5

C, 104 ไบต์

p[99];i,d;main(l){for(scanf("%d",&i);scanf("%[^a-zA-Z0-9_]%[a-zA-Z0-9_]%n",&d,&p,&l),i>l;i-=l);puts(p);}

คาดว่าอินพุตบน stdin จะเป็นดัชนีที่อิง 0 ตามด้วยช่องว่างหนึ่งบรรทัดหรือบรรทัดใหม่แล้วตามด้วยสตริง ความยาวสูงสุดของคำคือ 99 ตัวอักษร เช่น:

2 abc def

มันเจ๋งมากที่เห็น C และ perl ผูกกับความท้าทายจากสายอักขระ :D
DJMcMayhem

สตริงอินพุตมีความยาวได้มากกว่า 100 ตัวอักษรหรือไม่?
Leun Nun

@LeakyNun ใช่ แต่คำเดียวต้องมีความยาวไม่เกิน 100 ตัวอักษร
orlp

คุณรู้สึกอยากใส่ข้อกำหนดนั้นไว้ในคำตอบของคุณหรือไม่?
Leun Nun

@DrGreenEggsandIronMan แย่มากฉันต้องแก้ไขคำตอบของฉันเพราะมันถูกคั่นด้วยช่องว่าง :(
orlp

4

C (gcc), 94 ไบต์

f(n,p)char*p;{for(p+=n-1;isalnum(*p)|*p==95&&n--;--p);for(;isalnum(*++p)|*p==95;putchar(*p));}

Zero-indexed กำหนดฟังก์ชั่นรับดัชนีจากนั้นสตริง


ฉันคิดว่าisalnum(*++p)|*p==95เป็นพฤติกรรมที่ไม่ได้กำหนด
owacoder

@owacoder มันเป็น แต่สิ่งที่สำคัญคือ gcc พ่นปฏิบัติการที่ใช้งานได้ *++p^95?isalnum(*p):1มีความยาวหนึ่งไบต์ แต่ใช้ได้กับคอมไพเลอร์ทุกตัว
orlp

ฉันคิดว่าพื้นที่ชั้นนำคือการพิมพ์ผิด? และนี่คือลิงค์ IDEone ที่ขี้เกียจ
FryAmTheEggman

isalnum(*++p)||*p==95ใช้งานได้สำหรับการเพิ่มหนึ่งไบต์
owacoder

@FryAmTheEggman ใช่มันได้รับการแก้ไขแล้ว
orlp

3

จอประสาทตา 22

(1) + ¶ - * \ ข (<1>.) | \ W. +

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด โปรแกรมปกติจะใช้ตำแหน่งเคอร์เซอร์เป็น unary แล้วตามด้วยบรรทัดใหม่แล้วตามด้วยสตริง ชุดทดสอบมีรหัสเพิ่มเติมเพื่อทำงานในโหมดต่อบรรทัดและใช้\เป็นตัวคั่นและใช้ทศนิยมเพื่อความสะดวก

ใช้กลุ่มที่สมดุลเพื่อค้นหาตำแหน่งเคอร์เซอร์จากนั้นย้อนรอยกลับไปจนถึงขอบเขตของคำ ลบข้อความจนถึงคำและหลังจากคำนั้น


2

C, 115 ไบต์

ฟังก์ชันf()ต้องการสตริงและดัชนี (ดัชนี 1 ดัชนี) เป็นพารามิเตอร์และพิมพ์ผลลัพธ์เป็น stdout เคอร์เซอร์ควรอยู่หลังอักขระที่ระบุ

f(char*p,int n){char*s=p+n;for(;s>=p&&isalnum(*s)+(*s==95);--s);for(p=s+1;*p&&isalnum(*p)+(*p==95);putchar(*p++));}

2

JavaScript (ES6), 57 ไบต์

f=(s,n)=>s.slice(0,n).match(/\w*$/)+s.slice(n).match(/\w*/)

เพียงแค่แบ่งสตริงที่จุดเคอร์เซอร์ (ซึ่งอยู่หน้าอักขระที่ทำดัชนี 0 ซึ่งทำงานออกมาเหมือนกันหลังจากอักขระที่มีการจัดทำดัชนี 1 ตัว) จากนั้นแยกและเชื่อมต่อคำที่อยู่ติดกัน แม้คืนค่าผลลัพธ์ที่สมเหตุสมผลเมื่อเคอร์เซอร์อยู่ที่จุดเริ่มต้นสิ้นสุดหรือไม่มีที่ใดใกล้คำ


คุณต้องการ * ใน regex ล่าสุดหรือไม่
Charlie Wynn

@CharlieWynn ใช่มิฉะนั้น testcase deสองเท่านั้นที่จะกลับมา
Neil

อ๊ะโชคไม่ดีกับการทดสอบที่ฉันวิ่ง
Charlie Wynn

2

Java 8, 86 78 ไบต์

(s,p)->{for(String t:s.split("\\W"))if((p-=t.length()+1)<0)return t;return"";}

Ungolfed กับกรณีทดสอบ:

class Indexer {
    public static String f(String s, int p) {
        for(String t : s.split("\\W"))
            if((p -= t.length()+1) < 0)
                return t;
        return "";
    }

    public static void main(String[] args) {
        System.out.println(f("abc def",2));
        System.out.println(f("abc def",5));
        System.out.println(f("abc abc",2));
        System.out.println(f("ab cd ef",4));
        System.out.println(f("ab   cd",6));
        System.out.println(f("ab!cd",1));
    }
}

แยกสตริงด้วยอักขระที่ไม่ใช่ตัวอักษรและตัวเลขจากนั้นทำการลบความยาวของแต่ละสตริงย่อยบวก 1 จากตำแหน่งที่ระบุจนกว่าจะกลายเป็นลบ เนื่องจากการทำซ้ำที่ไม่ใช่ตัวอักษรและตัวเลขได้รับการแสดงเป็นสตริงว่างตรรกะการลบจึงง่ายขึ้นอย่างมีนัยสำคัญ

รหัสนี้ไม่ได้รับการทดสอบอย่างกว้างขวางดังนั้นฉันต้องการดูว่ามีใครสามารถทำลายรหัสนี้ได้หรือไม่ นอกจากนี้เมื่อพิจารณาว่านี่เป็นโค้ด Java วิธีนี้ไม่ใช่คำตอบที่ยาวที่สุดที่นี่ : P


ฉันรู้ว่ามันเกือบสามปีแล้ว แต่(s,p)->สามารถs->p->ใช้การแสดงออกแลมบ์ดา (เช่นjava.util.function.Function<String, java.util.function.Function<String, String>> f) นอกจากนี้Stringอาจเป็นvarตอนนี้หากเปลี่ยนเป็น Java 10 แม้ว่าจะไม่สามารถใช้ได้ในเวลาที่แน่นอน โดยไม่คำนึงถึงคำตอบที่ดี ฉันเห็นว่าฉันได้อัปเดตแล้วที่ใดที่หนึ่งในอดีต :)
Kevin Cruijssen



2

Pyke, 19 ไบต์

#Q;cjmli<i+s)lttjR@

ลองที่นี่!

ใช้Q;เป็น no-op เพื่อให้แน่ใจว่าอินพุตแรกถูกวางอย่างถูกต้อง

#          )   -  first where
   c           -       input.split()
    ml         -      map(len, ^)
      i<       -     ^[:i]
        i+     -    ^+[i]
          s    -   sum(^)
            lt - len(^)-2

ฉันพบข้อผิดพลาด 504 เมื่อฉันคลิกลิงก์ของคุณ
Leun Nun

@LeakyNun ใช่ฉันฆ่ามันโดยไม่ได้ตั้งใจในขณะที่เขียนซึ่งเป็นสาเหตุที่ฉันมีลิงก์ localhost มันจะกลับมา
Blue


1
ดูเหมือนว่าโปรแกรมของคุณจะแสดงผลลัพธ์เป็น N โดยที่คำ Nth เป็นคำที่เลือก แต่เราต้องการคำเต็ม
Value Ink

2

Python 2, 70 66 ไบต์

import re
f=lambda x,y,r=re.split:r('\W',x[:y])[-1]+r('\W',x[y:])[0]

แยกสตริงโดยตัวคั่นที่ไม่ใช่คำหนึ่งครั้งในสตริงเดิมจนถึงดัชนีเคอร์เซอร์จากนั้นบนสตริงที่เริ่มต้นที่ดัชนีเคอร์เซอร์ ส่งคืนองค์ประกอบสุดท้ายของการแยกซ้ายบวกองค์ประกอบแรกของการแยกขวา ขอบคุณ Leaky Nun สำหรับการบันทึก 4 ไบต์!


1

Clojure, 92 ไบต์

(fn[x k](let[[u i](map #(re-seq #"\w+"(apply str %))(split-at k x))](str(last u)(nth i 0))))

ขั้นแรกให้แยกสตริงอินพุตที่ตำแหน่งkเป็นสองสตริง จากนั้นสำหรับสตริงเหล่านี้พบว่าเกิดขึ้น"\w+"และส่งกลับพวกเขาเป็นรายการ จากนั้นเชื่อมองค์ประกอบสุดท้ายของรายการแรกและองค์ประกอบแรกของรายการที่สอง

ดูแบบออนไลน์ได้ที่: https://ideone.com/Dk2FIs


1

JavaScript (ES6), 52 ไบต์

(s,n)=>RegExp(`^.{0,${n}}(\\W+|^)(\\w+)`).exec(s)[2]

const F = (s,n) => RegExp(`^.{0,${n}}(\\W+|^)(\\w+)`).exec(s)[2]

class Test extends React.Component {
    constructor(props) {
        super(props);
        const input = props.input || '';
        const index = props.index || 0;
        this.state = {
            input,
            index,
            valid: /\w/.test(input),
        };
    }
    onInput = () => {
        const input = this.refs.input.value;
        const index = Math.min(+this.refs.index.value, input.length);
        this.setState({
            input,
            index,
            valid: /\w/.test(input),
        });
    }
    render() {
        const {input, index, valid} = this.state;
        return (
            <tr>
                <td>{ this.props.children }</td>
                <td>
                    <input ref="input" type="text" onInput={this.onInput} value={input} />
                    <input ref="index" type="number" onInput={this.onInput} min="1" max={input.length} value={index} />
                </td> 
                {valid && [
                    <td>{F(input, index)}</td>,
                    <td><pre>{input.slice(0, index)}|{input.slice(index)}</pre></td>,
                ]}
            </tr>
        );
    }
}

class TestList extends React.Component {
    constructor(props) {
        super(props);
        this.tid = 0;
        this.state = {
            tests: (props.tests || []).map(test => Object.assign({
                key: this.tid++
            }, test)),
        };
    }
    addTest = () => {
        this.setState({
            tests: [...this.state.tests, { key: this.tid++ }],
        });
    }
    removeTest = key => {
        this.setState({
            tests: this.state.tests.filter(test => test.key !== key),
        });
    }
    
    render() {
        return (
            <div>
                <table>
                    <thead>
                        <th/>
                        <th>Test</th>
                        <th>Output</th>
                        <th>Diagram</th>
                    </thead>
                    <tbody>
                        {
                            this.state.tests.map(test => (
                                <Test key={test.key} input={test.input} index={test.index}>
                                    <button onClick={() => this.removeTest(test.key)} style={{
                                        verticalAlign: 'middle',
                                    }}>-</button>
                                </Test>
                            ))
                        }
                    </tbody>
                    <tfoot>
                        <td/>
                        <td>
                            <button onClick={this.addTest} style={{
                                width: '100%',
                            }}>Add test case</button>
                        </td>
                    </tfoot>
                </table>
            </div>
        );
    }
}

ReactDOM.render(<TestList tests={[
    { input: 'abc def', index: 2 },
    { input: 'abc def', index: 5 },
    { input: 'abc abc', index: 2 },
    { input: 'ab cd ef', index: 4 },
    { input: 'ab   cd', index: 6 },
    { input: 'ab!cd', index: 1 },
]} />, document.body);
input[type="number"] {
  width: 3em;
}
table {
  border-spacing: 0.5em 0;
  border-collapse: separate;
  margin: 0 -0.5em ;
}
td, input {
    font-family: monospace;
}
th {
  text-align: left;
}
tbody {
  padding: 1em 0;
}
pre {
  margin: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>


ทำไม(\\W+|^)ไม่ลอง(\\W|^)
l4m2

1

Lua, 71 67 ไบต์

Woohoo Lua ไม่ใช่ทางออกที่ยาวที่สุด! ยังคงเป็นหนึ่งไบต์หลังหลาม แต่ไม่ทราบวิธีตีกอล์ฟลง ดัชนีเป็นแบบ 1

ขอบคุณ @LeakyNun เตือนฉันถึงการมีอยู่ของstring.matchบันทึก 4 ไบต์

g,h=...print(g:sub(1,h):match"[%a_]*$"..g:sub(h+1):match("[%a_]+"))

อายุ 71

หมายเหตุ: คำอธิบายยังคงยึดตามสิ่งนี้เพราะมันยังใช้กับคำใหม่ แต่มีข้อมูลเพิ่มเติมบางส่วนเกี่ยวกับ gmatch

g,h=...print(g:sub(1,h):gmatch"[%a_]*$"()..g:sub(h+1):gmatch"[%a_]*"())

คำอธิบาย

อันดับแรกเราคลายข้อโต้แย้งลงgและhเนื่องจากสั้นกว่าarg[x]

g,h=...

จากนั้นเราสร้างผลลัพธ์ของเราซึ่งเป็นส่วนเชื่อมต่อของส่วนหน้าเคอร์เซอร์และหลังจากนั้น

ส่วนแรกของสตริงคือ

g:sub(1,h)

เราต้องการค้นหาคำที่ท้ายคำนี้ดังนั้นเราจึงใช้ฟังก์ชั่น string.gmatch

:gmatch"[%a_]*$"

รูปแบบนี้จับคู่0..nกับชุดอักขระของตัวอักษร + ขีดล่างที่ส่วนท้ายของสตริง gmatchส่งคืนตัววนซ้ำในรายการของการจับคู่ในรูปแบบของฟังก์ชั่น (โดยใช้หลักการของการปิด) ดังนั้นเราดำเนินการหนึ่งครั้งเพื่อรับส่วนแรกของคำของเรา

g:sub(1,h):gmatch"[%a_]*$"()

เราได้ส่วนที่สองของคำของเราด้วยวิธีเดียวกัน

g:sub(h+1):gmatch"[%a_]*"())

ความแตกต่างเพียงอย่างเดียวคือเราไม่จำเป็นต้องระบุว่าเราต้องการจับคู่ในตอนเริ่มต้นของสตริง (โดยใช้[^%a_]*) เนื่องจากจะเป็นการจับคู่ที่ส่งคืนโดยตัววนซ้ำเมื่อเรียกว่าครั้งแรก


g:sub(h+1):match"^[%a_]*"?
Leun Nun

@LeakyNun ลืมการมีอยู่ทั้งหมดของ match \ o / บันทึกจำนวนมากขอบคุณ
Katenkyo

-1 สำหรับ "ดัชนี"
Leun Nun


ฉันไม่สนใจยัง -1 สำหรับ "ดัชนี"
Leun Nun

1

Javascript (ใช้ไลบรารีภายนอก) (168 ไบต์)

(n,w)=> _.From(w).Select((x,i)=>({i:i,x:x})).Split((i,v)=>v.x==" ").Where(a=>a.Min(i=>i.i)<=n-1&&a.Max(i=>i.i)>=n-2).First().Select(i=>i.x).Write("").match(/^\w*^\w*/)[0]

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable/blob/master/linq.js

คำอธิบายของรหัส: ห้องสมุดยอมรับสตริงซึ่งได้รับการแยกวิเคราะห์ลงในอาร์เรย์ถ่าน มันถูกแมปไปยังวัตถุที่จัดเก็บดัชนีและตัวอักษร ลำดับจะถูกแบ่งออกเป็นองค์ประกอบที่เกิดขึ้นทุก "" ลำดับจะถูกกรองโดยการตรวจสอบว่าดัชนีเคอร์เซอร์อยู่ภายในนาทีและดัชนีสูงสุดของลำดับ จากนั้นเราก็นำลำดับแรก จากนั้นเราเปลี่ยนกลับไปเป็นเพียงชุดอักขระ จากนั้นเราจะต่ออักขระทั้งหมดด้วย "" เป็นตัวคั่น จากนั้นเราตรวจสอบกับ word regex จากนั้นเราจะจับคู่แรก

ป้อนคำอธิบายรูปภาพที่นี่


คำว่า "word" ถูกกำหนดโดย regex (?<!\w)\w+(?!\w)โดยที่\wถูกกำหนดโดย[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]หรือ "ตัวอักษรและตัวเลขใน ASCII รวมถึงขีดล่าง"
Leun Nun

เมื่อฉันเรียกใช้ regex นั้นกับ ab! cd บน regex101.com ฉันได้รับสิ่งนี้: ไม่มีกลุ่มการแข่งขันถูกดึงออกมา ซึ่งหมายความว่ารูปแบบของคุณตรงกับ แต่ไม่มี (การจับ (กลุ่ม)) ที่ตรงกับสิ่งใด ๆ ในสตริงหัวเรื่อง บางทีฉันอาจทำผิดพลาดที่ไหนสักแห่ง ...
applejacks01

ทำไมฉันต้องจับอะไร
Leun Nun

ฉันรู้ว่านี่ไม่ใช่สถานที่ที่จะเรียนรู้ แต่ฉันกำลังบอกว่าเมื่อฉันใช้ regex นั้นเทียบกับ ab! cd ฉันไม่ได้อะไรเลย เหตุใดจึง 'ab' เป็นผลลัพธ์ที่ถูกต้อง
applejacks01


1

Perl 6 , 34 ไบต์

->\b{&{first *.to>b,m:g/<<\w+>>/}}

ลองออนไลน์!

codeblock f(n)(string)ที่ไม่ระบุชื่อที่จะเข้าแกงกะหรี่เช่น

คำอธิบาย:

->\b{                            }   # Anonymous code block that takes a number
     &{                         }    # And returns another code block that
       first       ,m:g/<<\w+>>/     # Finds the first word in the input
             *.to>b                  # Where the start is after the number


1

APL (NARS), 58 ตัวอักษร, 116 ไบต์

{m←⎕A,⎕a,⎕D,'_'⋄↑v⊂⍨m∊⍨v←⍵↓⍨¯1+⍵{⍵≤1:⍵⋄m∊⍨⍵⊃⍺:⍺∇⍵-1⋄⍵+1}⍺}

⍵ {⍵≤1: ⍵⋄m∊⍨⍵⊃⍺: ⍺∇⍵-1⋄⍵ + 1} ⍺หาที่เริ่มต้นสตริง ... วิธีใช้และทดสอบ:

  f←{m←⎕A,⎕a,⎕D,'_'⋄↑v⊂⍨m∊⍨v←⍵↓⍨¯1+⍵{⍵≤1:⍵⋄m∊⍨⍵⊃⍺:⍺∇⍵-1⋄⍵+1}⍺}
  2 f 'abc def'
abc
  5 f 'abc def'
def
  2 f 'abc abc'
abc
  4 f 'ab cd ef'
cd
  1 f 'ab!cd'
ab
  6 f 'ab   cd'
cd 

0

MATL , 16 15 ไบต์

'\w+'5B#XXi>)1)

เคอร์เซอร์ถูกจัดทำดัชนี 1 และหลังตัวละคร (เช่นในกรณีทดสอบ)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

'\w+'    % Push string to be used as regex pattern
5B#XX    % Take input string implicitly. Apply regex. Push matches and ending indices
i>       % Take input number. Compare with obtained ending indices. Gives true for
         % ending indices that exceed the input number
)        % Use as logical index to select the corresponding matches
1)       % Select the first match. Implicitly display

0

PowerShell v3 +, 103 101 ไบต์

param($a,$n)for(;$n[++$a]-match'\w'){}$i=$a--;for(;$n[--$a]-match'\w'-and$a-ge0){}-join$n[++$a..--$i]

เป็นวิธีที่โง่เขลา แต่แตกต่างจากวิธีอื่น

จะเข้า$aเป็นดัชนี 0-based $nของสตริง จากนั้นเราพบขอบเขตของคำพูดของเรา แม้ว่าเราจะยังไม่ถึงจุดสิ้นสุดของสตริงและ / หรือเรายังคงจับคู่คำกับเรา++$aอยู่ แล้วเพราะ fenceposting $i=$a--เราตั้ง ต่อไปเราจะคลานไปข้างหลังลดลง$aจนกว่าจะเป็นอย่างใดอย่างหนึ่ง0หรือเรากดอักขระที่ไม่ใช่คำ จากนั้นเราจะแบ่งสตริงอินพุตตามการแบ่งเขตทั้งสอง (โดยมีการเพิ่ม / ลดลงบางอย่างเพื่อบัญชีสำหรับ OBOE) และ-joinรวมเข้าด้วยกันเพื่อสร้างผลลัพธ์

ตัวอย่าง

PS C:\Tools\Scripts\golfing> .\select-the-word-around-the-index.ps1 2 'This!test'
This

PS C:\Tools\Scripts\golfing> .\select-the-word-around-the-index.ps1 5 'This!test'
test

select-the-word-around-the-index.ps1
Leun Nun

0

PHP, 98 ไบต์

function f($s,$p){foreach(preg_split('#\W+#',$s,-1,4)as$m)if($m[1]+strlen($m[0])>=$p)return$m[0];}
  • แยกสตริงด้วยอักขระที่ไม่ใช่คำโดยจดจำตำแหน่งของพวกเขา ( 4== PREG_SPLIT_OFFSET_CAPTURE) วนรอบคำจนกระทั่งถึงตำแหน่ง
  • สตริง PHP เป็น 0 ดัชนีเคอร์เซอร์หน้าตัวละคร แต่อาจจะอยู่ก่อนหรือหลังคำ

0

Python 3, 112 140 ไบต์

from string import*
p='_'+printable[:62]
def f(s,h,r=''):
 while s[h]in p and h>-1:h-=1
 while h+1<len(s)and s[h]in p:h+=1;r+=s[h]
 return r

0 การจัดทำดัชนี

ค้นหาย้อนกลับไปที่ตัวอักษรและตัวเลขตัวแรกจากดัชนีจากนั้นไปข้างหน้าไปยังตัวอักษรและตัวเลขตัวสุดท้ายหลังดัชนี อาจมีวิธีที่ฉลาดกว่าในการทำเช่นนี้

ลองมัน


@LeakyNun _ถูกเพิ่มเข้ามาผมไม่แน่ใจว่าทำไมฉันได้รับข้อผิดพลาดสำหรับf('abc',1)แม้ว่า
กายวิภาคศาสตร์

0

JavaScript (ES 6), 43 42 ไบต์

s=>n=>s.replace(/\w*/g,(x,y)=>y<n?s=x:0)&&s

JavaScript (ES 3), 65 ไบต์

function(s,n){s.replace(/\w*/g,function(x,y){y<n?s=x:0});alert(s)}

0

05AB1E , 14 ไบต์

ð«._DžjмS¡Á2£J

ท่าเรือ@AndersKaseorg 'คำตอบ Pyth

ดัชนี 1 เช่นกรณีทดสอบความท้าทาย

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ð«              # Append a space to the (implicit) input-String
  ._            # Rotate this string the (implicit) input-integer amount of times
                #  towards the left
     D          # Duplicate this string
      žjм       # Remove [a-zA-Z0-9_] from the string
         S¡     # Split the rotated string by each of the remaining characters
           Á    # Rotate the resulting list once towards the right
            2£J # And only leave the first two items, joined together
                # (which is output implicitly)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.