แยกและใช้ประโยชน์


14

ถาม:

รับค่าสตริงที่ตำแหน่งเฉพาะและใช้อักษรตัวแรกของคำที่กำหนด ใช้อักษรตัวแรกของตัวพิมพ์ใหญ่ถ้าเป็นตัวพิมพ์ใหญ่แล้ว

อินพุต:

สตริงและตัวอักษรsc

Ouput:

สตริงที่มีการเกิดขึ้นแต่ละครั้งcถูกแทนที่ด้วยถ่านตัวแรกที่ใช้เป็นตัวพิมพ์ใหญ่

ตัวอย่าง :

STRING(s)             CHARACTER(c)  RESULT
Hello_world           _             HelloWorld
me,no,like            ,             meNoLike
you-got-it            -             youGotIt
Am^I^clear            ^             AmIClear
go!full!caps          !             goFullCaps
weird&but&tRue        &             weirdButTRue
ProbleM1fixed1no      1             ProbleMFixedNo
!prob!!lem!s!Olved!!  !             ProbLemSOlved

บันทึก :

  • การป้อนข้อมูลที่ให้มาจะถูกต้องเสมอ ie: สตริงแรกจะเป็นสตริงที่มีอักขระอย่างน้อยหนึ่งตัวที่จะแทนที่ ที่สองจะเป็นตัวละครเดียวเสมอ
  • ความยาวของสตริงอินพุตจะมากกว่า 4
  • จะมีอย่างน้อยหนึ่งเหตุการณ์ที่ตัวละครจะแยกตัว

  • ข้อมูลเข้ารับประกันว่าจะมีเพียงตัวอักษรและตัวคั่น (ขอบคุณ @Arnauld)

  • ตัวคั่นคือสิ่งที่ไม่ใช่ตัวอักษร (az / AZ) (แนะนำโดย @Dennis)

เกณฑ์การชนะ:

นี่คือสั้นที่สุดในหน่วยไบต์สำหรับแต่ละภาษาที่ชนะ


  1. ขอบคุณ @JonathanAllan ที่ชี้ให้เห็นข้อผิดพลาดสองข้อ

7
เคล็ดลับเมื่อสร้างกรณีทดสอบ: ทำให้แต่ละปกอย่างน้อยหนึ่งกรณีมุม กรณีทดสอบทั้งหมดของคุณเหมือนกัน (อาจยกเว้นกรณีทดสอบ1) พยายามคิดว่าวิธีแก้ปัญหาอาจล้มเหลวและทำกรณีทดสอบสำหรับสถานการณ์ดังกล่าว ตัวอย่างบางส่วน: ตัวอักษรเป็นตัวคั่นตัวคั่นเป็นอักขระตัวสุดท้ายตัวคั่นที่ต่อเนื่องและอื่น ๆ ไม่จำเป็นต้องมีกรณีทดสอบมากมายที่ไม่ได้ทดสอบสิ่งต่าง ๆ
Stewie Griffin

คุณไม่มีตัวคั่นในกรณีทดสอบครั้งสุดท้าย - ควรมี! ที่นั่น ฉันจะแก้ไขด้วยตัวเอง แต่มีตัวละครไม่พอที่จะทำ
ollien

1
ฉันลงคะแนนนี้เนื่องจากมีการเปลี่ยนแปลงสเปคหลายครั้ง เมื่อวันที่ sidenote คุณต้องให้พูดถึงมากเร็วกว่ากรณีทดสอบสุดท้ายที่สตริงอาจมี 2 หรือติดต่อกันมากขึ้น "แยก" และที่เราไม่รับประกันว่าตัวอักษรมักจะเป็นไปตาม "คั่น"
Shaggy

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

1
เราสามารถทดสอบกรณีที่มีตัวคั่นได้.ไหมฉันสามารถจินตนาการฟังก์ชั่นการแยกสตริงที่ดิ้นรนกับอันนั้นได้
JAD

คำตอบ:




5

JavaScript (ES6), 58 56 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @ l4m2 / @Downgoat

(s)(c)จะเข้าในไวยากรณ์ currying

s=>c=>s.replace(u=/./g,x=>u=x==c?'':u?x:x.toUpperCase())

ลองออนไลน์!

แสดงความคิดเห็น

s => c =>                  // given s and c
  s.replace(u = /./g, x => // initialize u to a RegExp; replace each character x in s with,
    u =                    // and update u to:
      x == c ?             //   if x is the separator:
        ''                 //     an empty string
      :                    //   else:
        u ?                //     if u is not an empty string:
          x                //       x unchanged
        :                  //     else:
          x.toUpperCase()  //       x capitalized
  )                        // end of replace()

การปลอบใจ 56 ไบต์s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase())เนื่องจากไม่สามารถใช้กับอักขระพิเศษ regex
Conor O'Brien

50 ไบต์ หรือ 47 ถ้าคุณไม่รบกวนการป้อนข้อมูลครั้งที่สองซึ่งไม่เกี่ยวข้อง
Shaggy

1
@Shaggy ขอบคุณ! ฉันได้เพิ่มมันเป็นเวอร์ชันแยกต่างหากเนื่องจากกฎใหม่ค่อนข้างแตกต่างจากกฎดั้งเดิม
Arnauld

1
ล้มเหลว!prob!!lem!s!Olved!!
l4m2

@ l4m2 ว่าเป็นกรณีทดสอบใหม่ซึ่งการเปลี่ยนแปลงสเปคอีกครั้ง +ก่อน.ใน RegEx จะได้รับรอบ
Shaggy


3

sed 4.2.2 (-r), 21

s/[^a-z]+(.)?/\u\1/gi

ฉันพยายาม\Wแทนแต่โชคร้ายที่ไม่ตรงกับ[^a-z]_

ลองออนไลน์!


ตามมาตรฐานใหม่ของเราภาวนาของธงแต่ละถือว่าเป็นภาษาที่แตกต่างกันsed 4.2.2 (-r), 21 bytesและทำให้คำตอบของคุณสามารถเปลี่ยนเป็น
นาย Xcoder

@ Mr.Xcoder ฟังดูดี - ขอบคุณ!
บาดเจ็บทางดิจิทัล

3

เยลลี่ 8 ไบต์

Œt⁸1¦«⁸ḟ

ลองออนไลน์!

มันทำงานอย่างไร

Œt⁸1¦«⁸ḟ  Main link. Left argument: s (string). Right argument: c (character).

Œt        Title case; capitalize the first character of each word.
  ⁸1¦     Replace the first character of the result with the first character of s.
     «⁸   Take the character-wise minimum of the result and s.
          Note that uppercase letters have lower code points than lowercase ones.
       ḟ  Filterfalse; remove all occurrences of c.

3

อ็อกเทฟ , 83 , 66 , 64 ไบต์

บันทึก 2 ไบต์ขอบคุณ Luis Mendo แทนuppertoupper

@(s,c,k=upper(s(i=find(s==c)+1)))[strsplit({s(i)=k,s}{2},c){:}];

ลองออนไลน์!

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

คำอธิบาย:

อินพุตรายการอาร์กิวเมนต์:

@(s,c,k        % An anonymous function that may take three input variables, s, c, k
               % where the third argument has the default value:
 k=upper(s(i=find(s==c)+1))

kอยู่ที่นี่ตัวอักษรตัวแรกsหลังจากแต่ละตัวคั่นcแปลงเป็นตัวพิมพ์ใหญ่ iดัชนีของแต่ละตัวอักษรตัวพิมพ์ใหญ่ถูกเก็บไว้ใน

ร่างกายของเซลล์อาร์เรย์:

เราสร้างอาร์เรย์ของเซลล์ที่มีสององค์ประกอบหนึ่งเราบอกว่าตัวละคร i'th ทั้งหมดควรจะถูกแทนที่ด้วยคู่ในkและอีกหนึ่งด้วยsที่ตอนนี้มีการปรับปรุงแล้ว เราจัดทำดัชนีการใช้นี้{2}เพื่อให้เราได้รับทั้งสตริงที่ถูกปรับเปลี่ยนกลับ สิ่งนี้จะถูกส่งไปยังstrsplitซึ่งจะแบ่งมันออกเป็นเซลล์ที่อักขระตัวคั่น เราแปลงเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคโดยใช้{:}และเชื่อมกลับเป็นสตริงโดยใช้วงเล็บเหลี่ยม[]มันกลับไปสตริงใช้วงเล็บ

ขออภัยหากคุณไม่เข้าใจอะไรเลย ...


3

เรติน่า 0.8.2 , 20 ไบต์

T`lLp`LL_`[\W\d_]+.?

ลองออนไลน์! รับค่าสตริงเท่านั้นตัวคั่นจะเลือกหรือไม่ก็ได้ อักขระที่ไม่ใช่ตัวอักษรทั้งหมดจะถูกลบ แต่อักขระที่เป็นตัวอักษรต่อไปนี้จะเป็นตัวพิมพ์ใหญ่ รุ่นก่อนหน้าขนาด 34 ไบต์ยอมรับอินพุตแบบกำหนดเอง:

T`l`L`(?=.*(.)$)\1+.
(?=.*(.)$)\1

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

สำหรับทั้งสองวิธีการใช้การจับคู่จากขวาไปซ้ายแทนการใช้+งานได้เช่นกัน


เนื่องจากอินพุตรับประกันว่ามีเพียงตัวอักษรและตัวคั่นเท่านั้นคุณสามารถใช้[^a-z]แทน lookaheads ลองใช้ออนไลน์!
user41805


2

Röda , 57 54 ไบต์

-3 ไบต์ขอบคุณที่นักต้มตุ๋นวัว

{(_/`\Q$_`)|{pull;[upperCase(_[:1]),_1[1:]]if[#_1>0]}}

ลองออนไลน์!

คำอธิบาย:

{
  (_/`\Q$_`)| /* Pull two strings and split the first with the second */
  {
    pull;                /* Pull one string and print it */
                         /* For each string _1 in the stream: */
                         /*   If _1 is not empty: */
    [                    /*     Print: */
      upperCase(_[:1]),  /*       The first character capitalized */
      _1[1:]             /*       The rest of characters */
    ]if[#_1>0]           /*   End if */
  }
}

คุณสามารถออก\Eจาก regex และ_[0:1]_[:1]
user41805

2

V , 6 7ไบต์

บันทึก 1 ไบต์โดยไม่ใช้อาร์กิวเมนต์

ÓÁˆ/õ±

ลองออนไลน์!

โปรแกรมใช้ข้อความเป็นอินพุตและอักขระ char เป็นอาร์กิวเมนต์

hexdump:

00000000: d3c1 882f f5b1                           .../..

นี่เป็นการทดแทนอย่างง่าย ไม่บีบอัดดูเหมือนว่าต่อไปนี้

:s/\A(.)/\u\1/g

ดำเนินการทดแทนทั่วโลกซึ่ง\Aตัวละครที่ไม่ใช่ตัวอักษรตามด้วยตัวละคร(.)จะถูกแทนที่ด้วย\uกลุ่มจับภาพตัวพิมพ์ใหญ่ตัวแรก\1


ไม่ทำงานสำหรับการป้อนข้อมูลที่cมีอักขระพิเศษ regex
Conor O'Brien

1
@ ConorO'Brien คงที่และด้วยเหตุนี้ฉันจึงพบวิธีแก้ปัญหาที่สั้นกว่า: D
user41805

2

สกาลา, 83 ไบต์

def f(s:String)={val w=s.split("[^a-zA-Z]");w(0)+w.tail.map(_.capitalize).mkString}

ลองออนไลน์!

คำอธิบาย:

def f(s: String) = {                        // takes a String "s" as input
  val w = s.split("[^a-zA-Z]");             // split on non-alpha chars
  w(0) + w.tail.map(_.capitalize).mkString  // upper case first letter of all words except first one and join array into a String
}                                           //


1

05AB1E , 9 ไบต์

¡ćsvyćusJ

ลองออนไลน์!

คำอธิบาย

¡           # split the string on the char
 ć          # extract the head of the resulting list
  s         # swap the head to the bottom of the stack
   vy       # for each string y in the rest of the list
     ću     # extract the head and capitalize it
       s    # swap it below the rest of the string
        J   # join everything to one string

1

PHP, 91 83 ไบต์

$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);

ทำงานด้วย -rทำงานด้วยสั้นลง 2 ไบต์โดยใช้การแยกแทนการระเบิด แต่การทดสอบ ^ ล้มเหลวเนื่องจาก regex

-8 ขอบคุณMed


1
คุณสามารถลบ{และออก}จากห่วงสำหรับมันจะรักษาคำสั่งต่อไปเป็นร่างกายของเงื่อนไข
Med

1
คุณยังสามารถทำเสียงสะท้อนในวงได้:$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Med

0

Groovy, 43 ไบต์, 45 ไบต์

s.replaceAll(/\$c(.)/){it[1].toUpperCase()}

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



0

Huskขนาด 10 ไบต์

ΣΓ·:mΓo:ax

ลองออนไลน์!

คำอธิบาย

ΣΓ·:mΓ(:a)x  -- example inputs: 'x' "abxbcxcdxdex"
          x  -- split on character: ["ab","bc","cd","de"]
 Γ           -- pattern match (x = head) (xs = tail) and do..
  ·:         -- | construct list (x:xs) but with the second argument do..
    m        -- | | map (eg. "bc")
     Γ(  )   -- | | | pattern match on first character
      ( a)   -- | | | | upper-case it
      (: )   -- | | | | and join again
             -- | | | : "Bc"
             -- | | : ["Bc","Cd","De"]
             -- : ["ab","Bc","Cd","De"]
Σ            -- concatenate: "abBcCdDe"


0

Java 10, 141 bytes

s->c->{var r=s.split("\\"+c);var r=a[0],t;for(int i=0;++i<a.length;r+=t.isEmpty()?"":(char)(t.charAt(0)&~32)+t.substring(1))t=a[i];return r;}

ลองออนไลน์

คำอธิบาย:

s->c->{                    // Method with String and character parameters and String return-type
  var r=s.split("\\"+c);   //  Split String by character (with potential regex char)
  var r=a[0],              //  Result-String, starting at the first item
      t;                   //  Temp-String to reduce bytes
  for(int i=0;++i<a.length;//  Loop in the range [1, length_of_array)
      r+=                  //    After every iteration: append the result-String with:
         t.isEmpty()?      //     If the current item empty:
          ""               //      Append nothing
         :                 //     Else:
          (char)(t.charAt(0)&~32)
                           //      Capitalize the first character
          +t.substring(1)) //     And append the other characters as is
    t=a[i];                //   Set `t` to the current String-item of the array
  return r;}               //  Return the result-String

0

R , 87 ไบต์

g<-function(s,x,z=strsplit(s,x,T)[[1]])cat(z[1],capwords(z[-1]),sep="")
example(chartr)

ลองออนไลน์!

ใช้เคล็ดลับนี้ไม่สามารถดำเนินการได้อย่างถูกต้องใน TIO ดังนั้นฉันจึงจำลอง

เราต้องการTกรณีทดสอบอย่างใดอย่างหนึ่งล้มเหลว


0

Stax , 11 ไบต์

óKo{cplòüö\

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

คำอธิบาย

/BsF1:/s^s|dl                 # Full Program, unpacked, Implicit Input
/                             # Split on substrings (Split input with symbol to split on)
 B                            # Remove first element from array. Push the tail of the array, then the removed element.
  s                           # Swap first two elements of stack
   F                          # Start for loop
    1:/                       # Split array at index; push both parts.
       s^s                    # Swap first two elements of stack, capitalize character, swap first two elements 
         |dl                  # Get length of stack, listify that amount (entire stack), implicit output of array

มีบางส่วนที่ฉันต้องการแก้ไขอย่างใด ฉันสามารถทำให้มันลดลงเหลือ 8 ไบต์ แต่มันล้มเหลวในกรณีทดสอบล่าสุด>


0

Ruby -pl , 36 ไบต์

$_.gsub!(/[^a-z]+(.|$)/i){$1.upcase}

ลองออนไลน์!

รับเฉพาะสตริงที่ไม่มีอาร์กิวเมนต์ที่สอง ใช้วิธีบล็อกรุ่นgsub!เนื่องจากมีgsub! x,yไวยากรณ์ทั่วไป$1ไม่ได้เต็มไปด้วยข้อมูลการจับคู่ |$ใน regex เป็นสิ่งจำเป็นสำหรับกรณีทดสอบที่มีตัวคั่นในท้ายที่สุด


0

Python 3 , 77 ไบต์

o=[]
for x in s.split(c): o.append(chr(ord(x[0])-32)+x[1:])
print(''.join(o))

ลองออนไลน์!

นี่ถือว่าเป็นสตริงที่มีการเข้ารหัส ASCII และถือว่าsและcเป็นตัวแปรที่โหลดไว้ล่วงหน้าที่มีอินพุต

for x in s.split(x)       #loop through items in the string s split by x
    o.append(             #add the following to c
        chr(              #turn the following number into a character
            ord(          #turn the following character into a number
                x[0]      #the first character in string x
            )-32          #subtract 32 from this number
        +x[1:]            #add everything past and including the second character in string x

วิธีการแก้ปัญหานี้ทำงานบนข้อเท็จจริงที่ว่าในการเข้ารหัส ASCII ตัวอักษรตัวเล็กเป็น 32 รายการหลังจากตัวอักษรตัวพิมพ์ใหญ่

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


สิ่งที่sควรจะเป็น
มูฮัมหมัดซาลมาน

@MuhammadSalmanA string s and a character c.
Davin Miler

น่ารักทำให้การทำงานไปที่นี่และดูว่าการทำงานหรือไม่: TIO เมื่อไหร่จะบอกฉัน
มูฮัมหมัดซาลมาน

โอ๊ะ! ฉันเพิ่งรู้ว่าผมทำผิดพลาดเมื่อมีการเปลี่ยนชื่อตัวแปร, c = [] ควรจะเป็นตัวแปรใด ๆ อื่น ๆ
Davin Miler

@MuhammadSalman ที่นี่
Davin Miler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.