ค้นหาคำนำหน้าและทำรายการคำต่อท้ายทั้งหมดในข้อความ


17

ฉันใช้ "คำต่อท้าย" ที่นี่อย่างอิสระเพื่อหมายถึง "สตริงย่อยใด ๆ ที่ตามหลังคำนำหน้า"

"คำนำหน้า" ที่นี่หมายถึงการเริ่มต้นของคำที่คำเริ่มต้นถูกกำหนดให้เป็นหลังช่องว่างหรือจากอักขระตัวแรกของข้อความที่ป้อน (สำหรับคำแรก) "คำนำหน้า" ในช่วงกลางของคำจะถูกละเว้น

เช่นถ้าคำนำหน้าการป้อนข้อมูลของคุณคือ "แขน" และข้อความอินพุตคือ "กองทัพของดัมเบิลดอร์มีอาวุธครบมือสำหรับอาร์มาเก็ดดอนที่กำลังจะมา" ดังนั้นรายการเอาท์พุทจะมี (y, ed, ageddon)

กรณีทดสอบ

ถือว่าเป็นกรณี ๆ ไปสตริงสิ้นสุดลงหลังจากช่องว่าง อินพุตจะไม่ขึ้นต้นด้วยช่องว่าง

การลบรายการที่ซ้ำกันเป็นทางเลือก


Input prefix: "1"

Input text:

"He1in aosl 1ll j21j 1lj2j 1lj2 1ll l1j2i"

Output: (ll, lj2j, lj2) - in any permutation

Input prefix: "frac"

Input text: 

"fracking fractals fracted fractional currency fractionally fractioned into fractious fractostratic fractures causing quite a fracas"

Output: (king, tals, ted, tional, tionally, tioned, tious, tostratic, tures, as)

Input prefix: "href="https://www.astrotheme.com/astrology/"

Input text: 

"(div style="padding: 0; background: url('https://www.astrotheme.com/images/site/arrondi_450_hd.png') no-repeat; text-align: left; font-weight: bold; width: 450px; height: 36px")
  (div class="titreFiche" style="padding: 5px 0 0 6px")(a href="https://www.astrotheme.com/astrology/Nolwenn_Leroy" title="Nolwenn Leroy: Astrology, birth chart, horoscope and astrological portrait")Nolwenn Leroy(br /)
(/div)
  (div style="text-align: right; border-left: 1px solid #b2c1e2; border-right: 1px solid #b2c1e2; width: 446px; padding: 1px 1px 0; background: #eff8ff")
    (table style="width: 100%")(tr)(td style="width: 220px")
(div style="padding: 0; background: url('https://www.astrotheme.com/images/site/arrondi_450_hd.png') no-repeat; text-align: left; font-weight: bold; width: 450px; height: 36px")
  (div class="titreFiche" style="padding: 5px 0 0 6px")(a href="https://www.astrotheme.com/astrology/Kim_Kardashian" title="Kim Kardashian: Astrology, birth chart, horoscope and astrological portrait")Kim Kardashian(br /)(span style="font-weight: normal; font-size: 11px")Display her detailed horoscope and birth chart(/span)(/a)(/div)
(/div)
(div style="padding: 0; background: url('https://www.astrotheme.com/images/site/arrondi_450_hd.png') no-repeat; text-align: left; font-weight: bold; width: 450px; height: 36px")
  (div class="titreFiche" style="padding: 5px 0 0 6px")(a href="https://www.astrotheme.com/astrology/Julia_Roberts" title="Julia Roberts: Astrology, birth chart, horoscope and astrological portrait")Julia Roberts(br /)(span style="font-weight: normal; font-size: 11px")Display her detailed horoscope and birth chart(/span)(/a)(/div)
    (td id="cfcXkw9aycuj35h" style="text-align: right")
  (/div)"

Output: (Nolwenn_Leroy", Kim_Kardashian", Julia_Roberts")

ผู้ชนะ

นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ :)

สามารถรับอินพุตในลักษณะใดก็ได้ที่ทำงานได้ตราบใดที่โค้ดของคุณสามารถแก้ไขปัญหาตามอำเภอใจเช่นกรณีทดสอบ


2
เพื่อความชัดเจนคำนำหน้าจะต้องอยู่ที่จุดเริ่มต้นของคำหรือไม่ หากกรณีทดสอบที่สองมีคำว่า 'การเลี้ยวเบน' ในนั้นจะเปลี่ยนผลลัพธ์หรือไม่
sundar - Reinstate Monica

2
วิธีสามารถhttps://www.astrotheme.com/astrology/เป็นคำนำหน้าเมื่อนำหน้าด้วยhref="?
Neil

1
คำต่อท้ายอาจว่างเปล่าหรือไม่
user202729

1
ฉันขอแนะนำให้อนุญาตให้ผู้คนแบ่งพื้นที่สีขาวอื่น ๆ รวมถึงช่องว่างที่มีอยู่สองสามคนที่กำลังทำอยู่ ฉันขอแนะนำด้วยว่าจะไม่มีช่องว่างหลายช่องในหนึ่งแถวในอินพุต (หรือค่อนข้างเท่ากันว่าคำที่ว่างเปล่าอาจส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด) ฉันขอแนะนำทั้งสองสิ่งนี้เนื่องจากส่วนหลักของความท้าทายไม่ใช่การแยกเป็นส่วนคำ (ฉันขอแนะนำเพียงแค่อนุญาตให้มีรายการคำหรือแม้กระทั่งเพียงคำเดียวในการป้อนข้อมูล แต่มันก็สายเกินไปแล้วตอนนี้ด้วย 22 คำตอบ สำหรับความท้าทายในอนาคต)
Jonathan Allan

1
-1 ถึงอนุญาตให้แยกช่องว่างอื่น ๆ ได้ในขณะนี้ มันจะสมเหตุสมผลสำหรับความท้าทายที่เกิดขึ้น แต่ตอนนี้การเปลี่ยนแปลงจะแบ่งคำตอบออกเป็นคำตอบที่ทำสองสิ่งที่แตกต่างกัน และนี่ไม่เหมือนกับกรณีที่บางภาษาไม่สามารถจัดการได้เช่น ตัวเลข 64 บิตหรือบางอย่างนี่หมายถึงการใช้การจับคู่ที่ซับซ้อนมากขึ้นเล็กน้อย (อาจเป็นไปได้) ดังนั้นจึงเหมาะสมกว่าที่จะแก้ไขคำตอบด้วยสมมติฐานที่ผิดและอาจเพิ่มกรณีทดสอบเพื่อตรวจสอบสิ่งนี้ด้วย
sundar - Reinstate Monica

คำตอบ:


5

R , 63 ไบต์

function(s,p,z=el(strsplit(s,' ')))sub(p,'',z[startsWith(z,p)])

ลองออนไลน์!

การใช้งานเชิงบวก - lookbehind น่าเสียดายที่ 5 ไบต์นานขึ้นเนื่องจากการregmatches/gregexprรวมกันอย่างมาก:

function(s,p)regmatches(s,gregexpr(paste0('(?<=',p,')[^ ]*'),s,,T))

2
ย่อยไร้เดียงสา (grep ()) ดีกว่า lookbehind ที่ 66 เล็กน้อย แต่ก็ยังไม่เบียดเสียดกับ startsWith () ฉันไม่เห็นที่ว่างสำหรับการปรับปรุงที่นี่มากนักหากไม่มีการเปลี่ยนแปลงวิธีการ ลองออนไลน์!
อาชญากรคนร้าย

4

เยลลี่ 12 ไบต์

Ḳfṛ"€¥Ḋ€ṫ€L}

ลองออนไลน์!


งานศิลปะ : ') จะใช้สิ่งนี้เพื่อแยกวิเคราะห์ HTML เป็นรายการขอบคุณมาก :)
DrQuarius

2
@DrQuarius Regex ไม่สามารถแยก HTMLและดังนั้นจึงเป็นเยลลี่
user202729

ดูเหมือนว่าจะทำงานok กับฉัน ไม่แน่ใจว่าทำไม
DrQuarius

1
@DrQuarius มันเป็นเรื่องตลกที่มีชื่อเสียงและ user202729 ขยายมัน
Erik the Outgolfer

4

Japt , 9 ไบต์

8 ไบต์ถ้าเราสามารถใส่เป็นอาร์เรย์ของคำ

¸kbV msVl
¸         // Shorthand for `qS`, split into words.
 kbV      // Filter the words, selecting only those that start with the prefix.
     msVl // For each remaining word, remove prefix length chars from the start.

ลองออนไลน์!


ดีมาก แต่ดูเหมือนจะไม่ทำงานสำหรับกรณีทดสอบที่ผ่านมา อาจเป็นเพราะเครื่องหมายคำพูดอยู่ในสตริงหรือไม่ หรือบรรทัดใหม่
DrQuarius

@DrQuarius กรณีทดสอบครั้งสุดท้ายของคุณผิดพลาดใช่มั้ย สตริงทั้งหมดที่คุณมองหาอยู่ในคำกลาง (ล้อมรอบด้วยurl('')) ไม่มีพวกเขาอยู่ที่จุดเริ่มต้น
นิตย์


4

C (gcc) , 113 109 106 105 105 ไบต์

-4 ไบต์ต้องขอบคุณ @LambdaBeta!
-3 ไบต์ขอบคุณ @WindmillCookies!

i;f(char*s,char*t){for(i=strlen(s);*t;t++)if(!strncmp(t,s,i))for(t+=i,puts("");*t^32&&*t;)putchar(*t++);}

ลองออนไลน์!


1
คุณสามารถบันทึกได้ 4 ไบต์โดยลบทั้งสอง^0อย่าง เพียง;*t;และ&&*t;
LambdaBeta

@ LambdaBeta ขอบคุณ! ฉันคิดถึงสิ่งนั้น
betseg

1
ฉันสามารถลดระดับลงได้ถึง107โดยใช้กลยุทธ์ที่แตกต่างกันขอโทษ :)
LambdaBeta

@ LambdaBeta ฉันคิดว่าวิธีการนั้นจริง ๆ แต่ฉันไม่คิดว่ามันจะสั้นกว่าโซลูชันที่ฉันโพสต์ คำตอบที่ดี upvoted
betseg

1
ใช้ put แทน putchar ตอนนี้คือ 107, outputs ในบรรทัดที่ต่างกัน: tio.run/…
Windmill Cookies

3

Japt , 16 12 ไบต์

พอร์ตของ Arnauld

-4 ไบต์จาก @Shaggy

iS qS+V Å®¸g

iS                  Insert S value (S = " ") at beginning of first input (Implicit)
   q                split using
    S+V             S + Second input
        Å           slice 1
         ®          map
          ¸         split using S
           g        get first position

ลองออนไลน์!



ควรพูดถึงว่านี่เป็นวิธีแก้ปัญหาของ Arnauld (แน่นอนว่ามันไม่ได้มาอย่างอิสระแน่นอน)
Shaggy

@Shaggy สุจริตฉันไม่ได้สังเกตเห็นว่านี่เป็นคำตอบเดียวกันแล้วฉันจะให้เครดิตเขา ขอโทษ
Luis felipe De jesus Munoz

มีวิธีแก้ปัญหา 9 ไบต์หากคุณต้องการทดลองใช้
Shaggy

@Shaggy คุณหมายถึงสิ่งนี้หรือคุณมีอะไรที่แตกต่างในใจใช่ไหม
นิตย์

3

05AB1E , 11 ไบต์

#ʒηså}εsgF¦

ลองออนไลน์! (ที่นี่คือตัวอย่างสำหรับสตริงหลายบรรทัด)

มันทำงานยังไง?

# ʒηså} εsgF¦ โปรแกรมเต็มรูปแบบ
# แยกอินพุตแรกด้วยช่องว่าง
 ʒ} กรองคำโดย ...
  ...så ... "อินพุตที่สองเกิดขึ้นในส่วนนำหน้าของคำหรือไม่"
      εและสำหรับแต่ละคำที่ถูกต้อง
       sg ดึงความยาวของอินพุตที่สอง
         F¦ และวางตัวอักษรตัวแรกของคำว่าจำนวนครั้ง

:) ดีมากขอบคุณสำหรับการสาธิตแบบหลายบรรทัด! ฉันคิดว่านั่นเป็นสาเหตุของปัญหาสำหรับโปรแกรมอื่น ๆ
DrQuarius

3

Stax , 8 ไบต์

·B¬╤²*6&

เรียกใช้และแก้ไขข้อบกพร่อง

คำอธิบาย:

j{x:[fmx|- Full program, implicit input: On stack in order, 1st input in X register
j          Split string on spaces
 {   f     Filter:
  x:[        Is X a prefix?
      m    Map passing elements:
       x|-   Remove all characters in X the first time they occur in the element
             Implicit output

ฉันยังสามารถใช้x%t(ความยาวของ X, ตัดจากซ้าย) ซึ่งเป็นอย่างเท่าเทียมกันยาว แต่แพ็ค 9 ไบต์


สวย. :) ฉันคิดว่านี่อาจเป็นผู้ชนะ ผู้ที่ทำคะแนนได้ต่ำสุดส่วนใหญ่ไม่สามารถแยกวิเคราะห์กรณีทดสอบที่สามได้ :)
DrQuarius

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

3

เรติน่า 31 ไบต์

L`(?<=^\2¶(.|¶)*([^ ¶]+))[^ ¶]+

ลองออนไลน์! บรรทัดแรกควรเป็นคำนำหน้าที่ต้องการส่วนที่เหลือเป็นข้อความอินพุต ห้ามลบรายการซ้ำ จะเป็น 25 ไบต์หากพื้นที่สีขาวเป็นตัวคั่นที่ถูกต้อง คำอธิบาย: เราต้องการที่จะแสดงรายการคำต่อท้ายของคำนำหน้าที่ถูกต้อง [^ ¶]+ตรงกับคำต่อท้ายของตัวเอง คำนำหน้าของ regexp คือ lookbehind ที่ทำให้แน่ใจว่าคำนำหน้าของคำต่อท้ายคือคำนำหน้าอินพุต เนื่องจาก lookbehind ได้รับการประเมินจากขวาไปซ้ายการดำเนินการนี้จะเริ่มต้นด้วยการจับคู่คำนำหน้า (ใช้รูปแบบเดียวกัน แต่ใช้รูปแบบเดียวกัน()เพื่อจับภาพ) จากนั้นอักขระใด ๆ ก่อนที่จะจับคู่คำนำหน้าในบรรทัดของตัวเอง


พื้นที่สีขาวหมายถึงช่องว่างและ / หรือการขึ้นบรรทัดใหม่? ฉันคิดว่านั่นเป็นวิธีแก้ปัญหาที่ถูกต้องหากเป็นเช่นนั้น แต่เพื่อความเป็นธรรมกับทุกคนฉันจะปล่อยให้ปัญหาดังกล่าว
DrQuarius

@DrQuarius ไม่มีพื้นที่สีขาวใด ๆ รวมถึงแท็บ formfeeds และแม้กระทั่งวงรี
Neil

Retina เป็นภาษาแรกที่นึกถึงเมื่อฉันเห็นโพสต์ (แม้ว่าฉันยังไม่รู้ภาษา) ฉันคิดว่ามันจะสั้นกว่านี้ ฉันขอรบกวนคุณสำหรับคำอธิบายได้ไหม? สำหรับเช่น เอกสารบอกว่าเป็นตัวอักษรขึ้นบรรทัดใหม่ แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมจึงมีความจำเป็นมากมายที่นี่
sundar - Reinstate Monica

@Sundar ขออภัยฉันรู้สึกเร่งรีบในเวลานั้น ครั้งแรกให้แน่ใจว่าบรรทัดแรกทั้งหมดถูกจับคู่กับคำนำหน้า ที่สองเป็นสิ่งจำเป็นเพราะมันไม่รู้ว่ามีกี่เส้นกลาง สองคนสุดท้ายทำงานในลักษณะเดียวกัน - คลาสอักขระที่ถูกทำให้เป็นโมฆะจะรวมถึงการขึ้นบรรทัดใหม่ แต่เราไม่ต้องการที่นี่
Neil

ไม่มีปัญหาขอขอบคุณที่เพิ่มเข้าไป "โดยปกติจะมีการขึ้นบรรทัดใหม่ แต่เราไม่ต้องการที่นี่" <- หากฉันเข้าใจอย่างถูกต้องเราต้องการที่นี่ OP ระบุอย่างเคร่งครัดว่าเฉพาะการเว้นวรรคที่นับเป็นตัวคั่นคำนำหน้านั้นเริ่มต้นที่และท้ายคำต่อท้ายที่ช่องว่าง ดังนั้นสำหรับเช่น "dif \ nfractional" ไม่ควรตรงกับ "frac" เพราะคำนำหน้ามาหลังจากขึ้นบรรทัดใหม่ไม่ใช่ช่องว่าง ในทำนองเดียวกัน "แตกหัก - \ nrelated" ควรกลับคำต่อท้าย "ture- \ nrelated" ฉันคิดว่านี่เป็นข่าวดีที่ดีเพราะคุณสามารถลบอย่างน้อยหนึ่งอาจจะมากกว่า
sundar - Reinstate Monica

3

Brachylog , 24 21 ไบต์

tṇ₁W&h;Wz{tR&h;.cR∧}ˢ

ลองออนไลน์!

อาจสั้นลงสักสองสามไบต์หากมีการแบ่งปันตัวแปรกับเพรดิเคตแบบอินไลน์

อินพุตเป็นอาร์เรย์ที่มีคำนำหน้าเป็นองค์ประกอบแรกและข้อความเป็นองค์ประกอบที่สอง

tṇ₁W                    % Split the text at spaces, call that W
    &h;Wz               % Zip the prefix with each word, to give a list of pairs
         {         }ˢ   % Select the outputs where this predicate succeeds:
          tR            % Call the current word R
            &h;.c       % The prefix and the output concatenated
                 R      % should be R
                  ∧     % (No more constraints on output)

2

สูตร IBM / Lotus Notes ขนาด 54 ไบต์

c:=@Explode(b);@Trim(@If(@Begins(c;a);@Right(c;a);""))

จะใช้เวลาของการป้อนข้อมูลจากสองเขตข้อมูลชื่อและa bทำงานได้เนื่องจากสูตรจะใช้ฟังก์ชันซ้ำกับรายการซ้ำโดยไม่จำเป็นต้องใช้@Forวนซ้ำ

ไม่มี TIO ให้ดูที่นี่เป็นภาพหน้าจอ:

enter image description here


2

APL (Dyalog Unicode) , 23 ไบต์SBCS

โปรแกรมเต็มรูปแบบ พร้อมต์สำหรับข้อความและคำนำหน้าจาก stdin พิมพ์รายการไปยัง stdout

(5'(\w+)\b',⎕)⎕S'\1'⊢⎕

ลองออนไลน์!

 พรอมต์ (สำหรับข้อความ)

 ให้ผลผลิตนั้น (แยก'\1'จาก)

()⎕S'\1' PCRE ค้นหาและส่งคืนรายการกลุ่มการจับ 1 จาก regex ต่อไปนี้:

 พรอมต์ (สำหรับคำนำหน้า)

'(\w+)\b', เติมสตริงนี้ (กลุ่มของอักขระคำตามด้วยขอบเขตคำ)

5⌽ หมุน 5 ตัวอักษรแรกไปจนสุด; '\bPREFIX(\w+)'


2

C (เสียงดังกราว) , 107 ไบต์

i;f(s,t,_)char*s,*t,*_;{i=strlen(s);_=strtok(t," ");while((strncmp(_,s,i)||puts(_+i))&&(_=strtok(0," ")));}

ลองออนไลน์!

รายละเอียด:

i;f(s,t,_)char*s,*t,*_;{   // F takes s and t and uses i (int) and s,t,u (char*)
    i=strlen(s);           // save strlen(s) in i
    _=strtok(t," ");       // set _ to the first word of t
    while(                 // while loop
        (strncmp(_,s,i)||  // short-circuited if (if _ doesn't match s to i places)
         puts(_+i))        // print _ starting at the i'th character
        &&                 // the previous expression always returns true
        (_=strtok(0," "))) // set _ to the next word of t
    ;                      // do nothing in the actual loop
}

ต้องมีเสียงดังเพราะ gcc segfaults ที่ไม่มี#include <string.h>ปัญหาของ strtok



2

MATL, 17 ไบต์

Yb94ih'(.*)'h6&XX

ลองใช้กับ MATL Online

อย่างไร?

Yb - แยกอินพุตที่ช่องว่างวางผลลัพธ์ในอาร์เรย์เซลล์

94- รหัส ASCII สำหรับ^ตัวละคร

ih - รับอินพุต (พูดว่า "frac") เชื่อมต่อ '^' และอินพุต

'(.*)'h- กดสตริง'(.*)'ลงในสแต็กเชื่อม '^ frac' และ '(. *)' ดังนั้นตอนนี้เรามี'^frac(.*)regex ที่ตรงกับ "frac" ที่จุดเริ่มต้นของสตริงและจับสิ่งที่เกิดขึ้นหลังจากนั้น

6&XX - เรียกใช้การจับคู่ regexp ด้วย 6&ระบุโหมด 'โทเค็น' เช่นกลุ่มการจับคู่ที่ตรงกันจะถูกส่งคืนแทนการจับคู่ทั้งหมด

แสดงผลลัพธ์โดยปริยาย


นั่นคือสิ่งที่'Tokens'ทำ ดีแล้วที่รู้!
Luis Mendo

1
ฮ่าฮ่า ฉันก็ไม่รู้เหมือนกันคิดออกโดยการลองผิดลองถูกสำหรับคำตอบนี้
sundar - Reinstate Monica


2

PowerShell 3.0, 60 62 59 ไบต์

param($p,$s)-split$s|%{if($_-cmatch"^$p(.*)"){$Matches[1]}}

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


โซลูชันที่มีขนาด 60 ไบต์จะให้คำตอบสองเท่าในบางกรณีking, tals, ted, tional, tional, tionally, tioned, tioned, tious, tostratic, tures,tures,tures, tures, asและแสดงข้อผิดพลาดของดัชนีในHe1inตัวอย่าง PowerShell 5.1, 6.0.2 การแก้ปัญหาด้วย 62 ไบต์คือตกลง
mazzy

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




1

แกลบขนาด 11 ไบต์

สวยมากแค่พอร์ตของคำตอบ Haskell :

m↓L⁰foΠz=⁰w

ลองออนไลน์!

คำอธิบาย

m↓L⁰f(Πz=⁰)w  -- prefix is explicit argument ⁰, the other one implicit. eg: ⁰ = "ab" and implicit "abc def"
           w  -- words: ["abc","def"]
    f(    )   -- filter by (example w/ "abc"
       z=⁰    -- | zip ⁰ and element with equality: [1,1]
      Π       -- | product: 1
              -- : ["abc"]
m             -- map the following
 ↓            -- | drop n elements
  L⁰          -- | n being the length of ⁰ (2)
              -- : ["c"]

1

เยลลี่ ,  11  9 ไบต์

Ḳœṣ€ḢÐḟj€

ลิงก์ dyadic ยอมรับข้อความ (รายการอักขระ) ทางด้านซ้ายและคำนำหน้า (รายการอักขระ) ทางด้านขวาซึ่งให้รายการของรายการอักขระ (ส่วนต่อท้ายที่เป็นผลลัพธ์)

ลองออนไลน์! (ส่วนท้ายร่วมกับช่องว่างเพื่อหลีกเลี่ยงการดีดโดยนัยของโปรแกรมเต็มรูปแบบ)
หมายเหตุ: ฉันเพิ่มสามกรณีขอบลงในสตริงใน OP - unfrackled และ nofracfracheremate ที่จุดเริ่มต้นซึ่งไม่ควรเอาท์พุทและ fracfracit ไปยังจุดสิ้นสุดซึ่งควรส่งออก fracit

อย่างไร?

Ḳœṣ€ḢÐḟj€ - Link: text, prefix                        e.g. "fracfracit unfracked", "frac"
Ḳ         - split (text) at spaces -> list of words        ["fracfracit", "unfracked"]
   €      - for each (word):
 œṣ       -   split around sublists equal to (prefix)       ["","","it"]  ["un","ked"]
     Ðḟ   - filter discard items for which this is truthy:
    Ḣ     -   head
          -   -- Crucially this modifies the list:             ["","it"]       ["ked"]
          -   -- and yields the popped item:                 ""            "un"
          -   -- and only non-empty lists are truthy:       kept          discarded
          -            ...so we end up with the list:      [["","it"]]
        € - for each (remaining list of lists of characters):
       j  -   join with the prefix                          "fracit"                                             
          -                                                ["fracit"]

11 byter ก่อนหน้า:

Ḳs€L}Ḣ⁼¥ƇẎ€

นอกจากนี้ลิงค์ dyadic ดังกล่าวข้างต้น

ลองออนไลน์!


1

Perl 5 กับ -asE, 23 22 21 bytes (?)

say/^$b(.*)/ for@F

ลองออนไลน์!

สามารถทำงานเป็น commandline หนึ่งซับ เป็นหรือชื่อไฟล์ในสถานที่ที่ผ่านมาperl -asE 'say/^$b(.*)/ for@F' -- -b=frac - หรือจากไฟล์สคริปต์ให้พูด-
perl -as -M5.010 script.pl -b=frac - (ขอบคุณ @Brad Gilbert b2gills สำหรับลิงก์ TIO ที่แสดงถึงสิ่งนี้)

รหัสตัวเองคือ 18 ไบต์ฉันเพิ่ม 3 ไบต์สำหรับ-b=ตัวเลือกที่กำหนดค่า (อินพุตคำนำหน้า) ให้กับตัวแปรที่มีชื่อ$bในรหัส ที่ให้ความรู้สึกเหมือนเป็นข้อยกเว้นสำหรับฉันทามติ "ธงไม่นับ"

-a@Fแยกสายการป้อนข้อมูลแต่ละพื้นที่และสถานที่ผลในอาร์เรย์ -sเป็นวิธีลัดของการกำหนดอาร์กิวเมนต์บรรทัดคำสั่งเป็นตัวแปรโดยให้ชื่อบนบรรทัดคำสั่ง นี่อาร์กิวเมนต์เป็น-b=fracสถานที่ที่คำนำหน้า "frac" $bในตัวแปร

/^$b(.*)/- จับคู่ค่า$bที่จุดเริ่มต้นของสตริง .*เป็นสิ่งที่เกิดขึ้นหลังจากนั้นจนกว่าจะสิ้นสุดของคำและ parantheses โดยรอบจับค่านี้ sayค่าที่ถูกจับจะถูกส่งกลับโดยอัตโนมัติที่จะพิมพ์โดย วนซ้ำคำที่คั่นด้วยช่องว่างด้วยfor @Fหมายความว่าเราไม่จำเป็นต้องตรวจสอบช่องว่างเริ่มต้นหรือช่องว่างสุดท้าย



1

Perl 6 , 30 ไบต์

{$^t.comb: /[^|' ']$^p <(\S+/}

ทดสอบมัน

ขยาย:

{  # bare block lambda with placeholder params $p, $t

  $^t.comb:    # find all the substrings that match the following
  /
    [ ^ | ' ' ] # beginning of string or space
    $^p        # match the prefix
    <(         # don't include anything before this
    \S+        # one or more non-space characters (suffix)
  /
}


ดูเหมือนว่าคุณจะมีช่องว่างเพิ่มเติมระหว่าง 'p' และ '<' btw
sundar - Reinstate Monica

@sundar ช่องว่างระหว่างpและ<(จำเป็นเช่นนั้นอาจถูกมองว่า$v<…>สั้น$v{qw '…'}เกินไป
แบรดกิลเบิร์ต b2gills

1
ดูเหมือนว่าจะทำงานโดยไม่มีมันแม้ว่าอย่างน้อยในกรณีนี้
sundar - Reinstate Monica

1
@sundar ในทางเทคนิคแล้วมันแค่เตือน แต่ฉันไม่ชอบการเขียนโค้ดที่เตือนเมื่อมันเป็นเพียงหนึ่งไบต์ที่แตกต่างจากรหัสที่ไม่ได้เตือน
แบรดกิลเบิร์ต b2gills

1

Java 10, 94 ไบต์

p->s->{for(var w:s.split(" "))if(w.startsWith(p))System.out.println(w.substring(p.length()));}

ลองออนไลน์ได้ที่นี่ที่นี่

Ungolfed:

p -> s -> { // lambda taking prefix and text as Strings in currying syntax
    for(var w:s.split(" ")) // split the String into words (delimited by a space); for each word ...
        if(w.startsWith(p)) //  ... test whether p is a prefix ...
            System.out.println(w.substring(p.length())); // ... if it is, output the suffix
}

1

พื้นฐานขนาดเล็ก 242 ไบต์

สคริปต์ที่ไม่รับอินพุตและเอาต์พุตไปยังTextWindowObject

c=TextWindow.Read()
s=TextWindow.Read()
i=1
While i>0
i=Text.GetIndexOf(s," ")
w=Text.GetSubText(s,1,i)
If Text.StartsWith(w,c)Then
TextWindow.WriteLine(Text.GetSubTextToEnd(w,Text.GetLength(c)+1))
EndIf
s=Text.GetSubTextToEnd(s,i+1)
EndWhile

ลองที่ SmallBasic.com! ต้องใช้ IE / Silverlight


1

Python 2 , 53 ไบต์

lambda i,j:[w.split()[0]for w in j.split(i)if len(w)]

ลองออนไลน์!


แนวคิดที่น่าสนใจ แต่ล้มเหลวสำหรับกรณีทดสอบครั้งแรกอินพุต: "1", "He1in aosl 1ll j21j 1lj2j 1lj2 1ll l1j2i 1"
Chas Brown

ใช่ฉันจะลองทำเล่น ๆ ฉันแน่ใจว่าฉันกำลังทำอะไรอยู่ ...
RaphaëlCôté

1

Brachylogขนาด 12 ไบต์

hṇ₁∋R&t;.cR∧

ลองออนไลน์!

รับอินพุต[text, prefix]ผ่านตัวแปรอินพุตและสร้างแต่ละคำผ่านตัวแปรเอาต์พุต นี่เป็นคำตอบเดิมของ sundar ซึ่งฉันเริ่มลองเล่นกอล์ฟหลังจากอ่านแล้วว่า "อาจสั้นลงสักสองสามไบต์หากมีการแบ่งปันตัวแปรกับภาคแสดงอินไลน์" ซึ่งเป็นไปได้ตอนนี้ ปรากฎว่าเอาท์พุทเครื่องกำเนิดไฟฟ้าช่วยประหยัดไบต์ได้มากขึ้น

    R           R
   ∋            is an element of
h               the first element of
                the input
 ṇ₁             split on spaces,
     &          and the input
      t         's last element
         c      concatenated
       ;        with
        .       the output variable
          R     is R
           ∧    (which is not necessarily equal to the output).

สองความพยายามครั้งแรกของฉันในการตีกอล์ฟโดยใช้คุณสมบัติใหม่ของภาษา:

ด้วยตัวแปรส่วนกลางที่หวังไว้: hA⁰&tṇ₁{∧A⁰;.c?∧}ˢ(18 ไบต์)

ด้วย metapredicate นำไปใช้กับ: ṇ₁ᵗz{tR&h;.cR∧}ˢ(16 ไบต์)

และโซลูชันดั้งเดิมของฉัน:

Brachylogขนาด 15 ไบต์

ṇ₁ʰlᵗ↙X⟨∋a₀⟩b↙X

ลองออนไลน์!

I / O เดียวกัน นี่คือเครื่องกำเนิดไฟฟ้าสำหรับคำที่มีคำนำหน้า, ṇ₁ʰ⟨∋a₀⟩ซึ่งแก้ไขเพื่อลบคำนำหน้า

                   The input variable
  ʰ                with its first element replaced with itself
ṇ₁                 split on spaces
    ᵗ              has a last element
   l               the length of which
     ↙X            is X,
       ⟨   ⟩       and the output from the sandwich
       ⟨∋  ⟩       is an element of the first element of the modified input
       ⟨ a₀⟩       and has the last element of the input as a prefix.
                   The output variable
       ⟨   ⟩       is the output from the sandwich
            b      with a number of characters removed from the beginning
             ↙X    equal to X.

เพรดิเคตที่แตกต่างกันมากโดยมีจำนวนไบต์เดียวกัน:

Brachylogขนาด 15 ไบต์

hṇ₁∋~c₂Xh~t?∧Xt

ลองออนไลน์!

I / O เดียวกัน

   ∋               An element of
h                  the first element of
                   the input variable
 ṇ₁                split on spaces
    ~c             can be un-concatenated
      ₂            into a list of two strings
       X           which we'll call X.
        h          Its first element
         ~t        is the last element of
           ?       the input variable,
            ∧      and
             Xt    its last element is
                   the output variable.


0

Pyth , 21 20 18 17 16 ไบต์

AQVcH)IqxNG0:NG"

ลองออนไลน์!

-1 โดยใช้VแทนFNเพราะVตั้งค่าโดยปริยายN

-2 หลังจากอ่านเพิ่มเติมเกี่ยวกับตัวเลือกการแบ่งสตริง

-1 ใช้xเพื่อตรวจสอบสถานะของสตริงย่อยที่ดัชนี 0

-1 ใช้แทนที่ด้วย "" สำหรับการสิ้นสุดของสตริง

ฉันแน่ใจว่าสิ่งนี้สามารถใช้การเล่นกอล์ฟอย่างจริงจังได้ แต่ในฐานะผู้เริ่มต้นของ Pyth การทำงานให้เป็นโบนัส

มันทำงานยังไง?

assign('Q',eval_input())
assign('[G,H]',Q)
for N in num_to_range(chop(H)):
    if equal(index(N,G),0):
        imp_print(at_slice(N,G,""))

0

Excel VBA ขนาด 86 ไบต์

รับอินพุตเป็นส่วนนำหน้า[A1]และค่าใน[B1]และเอาต์พุตไปยังคอนโซล

For each w in Split([B1]):?IIf(Left(w,[Len(A1)])=[A1],Mid(w,[Len(A1)+1])+" ","");:Next
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.