chia và viết hoa


14

Thử thách :

Cho một chuỗi phân chia tại các vị trí cụ thể và viết hoa ký tự đầu tiên của từ đã cho. Viết hoa chữ cái đầu tiên của từ đầu tiên khi và chỉ khi nó đã được viết hoa

Đầu vào :

Một chuỗi svà một nhân vật c.

Ouput:

Chuỗi với mỗi lần xuất hiện được cthay thế bằng ký tự char đầu tiên

Ví dụ:

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

Ghi chú :

  • Cho đầu vào sẽ luôn luôn hợp lệ. tức là: Đầu tiên sẽ luôn là một chuỗi có ít nhất một thể hiện của ký tự để thay thế tại. Thứ hai sẽ luôn là một nhân vật duy nhất.
  • Độ dài của chuỗi đầu vào sẽ lớn hơn 4.
  • Sẽ có ít nhất một lần xuất hiện của nhân vật để phân chia tại.

  • Đầu vào được đảm bảo chỉ chứa các chữ cái và dấu phân cách (Cảm ơn @Arnauld)

  • Dấu phân cách là bất cứ thứ gì không phải là bảng chữ cái (az / AZ) (được đề xuất bởi @Dennis)

Tiêu chí chiến thắng:

Đây là để mã ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng.


  1. Cảm ơn @JonathanAllan vì đã chỉ ra hai sai lầm.

7
Mẹo khi tạo trường hợp kiểm tra: Thực hiện mỗi trường hợp bao gồm ít nhất một trường hợp góc. Tất cả các trường hợp thử nghiệm của bạn về cơ bản là giống hệt nhau (có thể ngoại trừ trường hợp với 1). Cố gắng suy nghĩ về cách giải pháp có thể thất bại, và làm một trường hợp thử nghiệm cho các tình huống như vậy. Một số ví dụ: Chữ cái là dấu phân cách, dấu phân cách là ký tự cuối cùng, dấu phân cách liên tiếp, v.v. Không cần phải có nhiều trường hợp kiểm tra mà không kiểm tra những thứ khác nhau.
Stewie Griffin

Bạn đang thiếu một dấu phân cách trong trường hợp thử nghiệm cuối cùng - nên có một! ở đó Tôi sẽ tự chỉnh sửa nó, nhưng không đủ nhân vật để tôi làm điều đó.
ollien

1
Tôi đã đánh giá thấp điều này do nhiều thay đổi đối với thông số kỹ thuật. Trên một sidenote, bạn cần đề cập sớm hơn rất nhiều so với trường hợp kiểm tra cuối cùng rằng chuỗi có thể chứa 2 "dấu phân cách" liên tiếp trở lên và chúng tôi không đảm bảo rằng một chữ cái sẽ luôn đi theo "dấu phân cách".
Xù xì

2
Tôi nhìn lên: Stewie không đề xuất bất kỳ trường hợp thử nghiệm nào, nhưng anh ta hỏi liệu nhân vật đầu tiên hay cuối cùng có thể là một dấu tách và liệu có thể có các dấu phân cách liên tiếp không. Trong tương lai, vui lòng xem xét sử dụng hộp cát để có được tất cả các chi tiết này được sắp xếp trước khi đi vào hoạt động. Thật bực bội khi câu trả lời của bạn bị vô hiệu vì những thay đổi trong đặc tả. Điều đáng ngạc nhiên nhất là hạn chế lấy ký tự làm đầu vào, ngay cả khi chương trình không cần nó. Điều đó làm cho không có ý nghĩa gì cả.
Dennis

1
Chúng ta có thể có một trường hợp thử nghiệm với dấu phân cách không ., tôi có thể tưởng tượng một số hàm tách chuỗi đang vật lộn với cái đó.
JAD

Câu trả lời:




5

JavaScript (ES6), 58 56 byte

Đã lưu 2 byte nhờ @ l4m2 / @Downgoat

Đưa đầu vào theo cú pháp currying (s)(c).

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

Hãy thử trực tuyến!

Đã bình luận

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()

an ủi 56 byte cho s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase()), vì nó không hoạt động cho các ký tự regex đặc biệt
Conor O'Brien

50 byte . Hoặc 47 nếu bạn không bận tâm đến đầu vào thứ hai, điều này không liên quan.
Xù xì

1
@Shaggy Cảm ơn! Tôi đã thêm nó dưới dạng phiên bản riêng biệt, vì các quy tắc mới khá khác so với quy tắc ban đầu.
Arnauld

1
thất bại!prob!!lem!s!Olved!!
l4m2

@ l4m2, đó là trường hợp thử nghiệm mới thay đổi thông số kỹ thuật một lần nữa . A +trước khi .trong RegEx sẽ đi xung quanh nó.
Xù xì


3

sed 4.2.2 (-r), 21

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

Tôi đã thử \Wthay thế [^a-z], nhưng tiếc là điều đó không phù hợp _.

Hãy thử trực tuyến!


Theo tiêu chuẩn mới của chúng tôi, mỗi lần gọi cờ được coi là một ngôn ngữ khác nhau và do đó câu trả lời của bạn có thể được thay đổi thành sed 4.2.2 (-r), 21 bytes.
Ông Xcoder

@ Mr.Xcoder Âm thanh tốt - cảm ơn!
Chấn thương kỹ thuật số

3

Thạch , 8 byte

Œt⁸1¦«⁸ḟ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Œ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

Octave , 83 , 66 , 64 byte

Đã lưu 2 byte nhờ Luis Mendo. upperthay vì toupper.

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

Hãy thử trực tuyến!

Ồ, đó có lẽ là đoạn mã Octave lộn xộn nhất tôi từng viết! Điều này sử dụng hai trong số các thủ thuật được đăng trong câu hỏi mẹo này , cụ thể là danh sách Đối số và mảng ô.

Giải trình:

Danh sách đối số đầu vào:

@(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Đây là ký tự đầu tiên ssau mỗi dấu phân cách c, được chuyển thành chữ hoa. Chỉ mục của mỗi ký tự viết hoa được lưu trữ trong i.

Cơ thể mảng di động:

Chúng tôi tạo ra một mảng ô có hai phần tử, một là chúng tôi nói rằng tất cả các ký tự thứ i nên được thay thế bằng đối tác của nó kvà một phần tử khác s, hiện đã được cập nhật. Chúng tôi lập chỉ mục này bằng cách sử dụng {2}để chúng tôi chỉ lấy lại toàn bộ chuỗi đã sửa đổi. Cái này được cho ănstrsplit , phân tách nó thành các ô ở ký tự phân cách. Chúng tôi chuyển đổi nó thành một danh sách được phân tách bằng dấu phẩy bằng cách sử dụng {:}và nối nó lại thành một chuỗi bằng dấu ngoặc vuông [].

Xin lỗi nếu điều đó không có ý nghĩa gì với bạn ... Nó hầu như không có ý nghĩa với tôi: P


3

Võng mạc 0.8.2 , 20 byte

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

Hãy thử trực tuyến! Chỉ lấy chuỗi, dấu phân cách tùy chọn. Tất cả các ký tự không phải là chữ cái đều bị xóa nhưng bất kỳ ký tự chữ cái nào sau đây đều được ghi đè. Phiên bản 34 byte trước được chấp nhận đầu vào tùy ý:

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Giả sử đầu vào bao gồm chuỗi và ký tự được nối với nhau. Giải thích: Giai đoạn đầu tiên chuyển ngữ tất cả các ký tự ngay sau lần xuất hiện của ký tự kết thúc từ chữ thường sang chữ hoa và giai đoạn thứ hai sau đó xóa tất cả các lần xuất hiện của ký tự kết thúc.

Đối với cả hai giải pháp, sử dụng khớp từ phải sang trái thay vì +cũng hoạt động.


Vì đầu vào được đảm bảo chỉ chứa các ký tự chữ cái và dấu phân cách, bạn có thể sử dụng [^a-z]thay cho giao diện Hãy thử trực tuyến!
Kritixi Lithos


2

Röda , 57 54 byte

-3 byte nhờ vào quẻ bò

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

Hãy thử trực tuyến!

Giải trình:

{
  (_/`\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 */
  }
}

Bạn có thể rời khỏi \Eregex và _[0:1]_[:1]
Kritixi Lithos

2

V , 6 7 byte

Lưu 1 byte bằng cách không sử dụng đối số

ÓÁˆ/õ±

Hãy thử trực tuyến!

Chương trình lấy văn bản làm đầu vào và char làm đối số.

Hexdump:

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

Đây là một sự thay thế đơn giản. Không nén, có vẻ như sau

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

Thực hiện thay thế toàn cầu trong đó \A, một ký tự không phải là chữ cái, theo sau là một ký tự (.)được thay thế bằng \unhóm chụp đầu tiên được đặt trước\1


Không hoạt động cho đầu vào clà một ký tự regex đặc biệt
Conor O'Brien

1
@ ConorO'Brien Đã sửa, và nhờ điều này, tôi đã tìm thấy một giải pháp ngắn hơn: D
Kritixi Lithos

2

Scala, 83 byte

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

Hãy thử trực tuyến!

Giải trình:

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 byte

¡ćsvyćusJ

Hãy thử trực tuyến!

Giải trình

¡           # 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 byte

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

Chạy với -r . Đã ngắn hơn 2 byte khi sử dụng split thay vì explode, nhưng ^ test thất bại do regex.

-8 cảm ơn Med


1
Bạn có thể loại bỏ {}từ vòng lặp for, nó sẽ chỉ coi câu lệnh tiếp theo là phần thân của điều kiện.
Med

1
Bạn thậm chí có thể thực hiện tiếng vang bên trong vòng lặp:$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Med



0

Husk , 10 byte

ΣΓ·:mΓo:ax

Hãy thử trực tuyến!

Giải trình

ΣΓ·: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 byte

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;}

Hãy thử trực tuyến.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

Sử dụng thủ thuật này không thể được thực thi đúng trong TIO nên tôi đã mô phỏng nó.

Chúng tôi cần Tmột trong những trường hợp thử nghiệm thất bại.


0

Stax , 11 byte

óKo{cplòüö\

Chạy và gỡ lỗi nó

Giải trình

/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

Có một vài phần tôi thực sự muốn sửa chữa bằng cách nào đó. Tôi có thể giảm xuống còn khoảng 8 byte, nhưng nó đã thất bại trong trường hợp thử nghiệm cuối cùng>. <


0

Ruby -pl , 36 byte

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

Hãy thử trực tuyến!

Chỉ có chuỗi mà không có đối số thứ hai. Sử dụng phiên bản khối của gsub!phương thức vì với gsub! x,ycú pháp chung $1không dễ dàng điền vào dữ liệu khớp. |$trong regex là cần thiết cho trường hợp thử nghiệm với dấu phân cách cuối cùng.


0

Python 3 , 77 byte

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

Hãy thử trực tuyến!

Điều này giả định rằng chuỗi được mã hóa ASCII và giả định rằng sclà các biến được tải sẵn có chứa đầu vào.

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

Giải pháp này hoạt động dựa trên thực tế là trong mã hóa ASCII, các chữ cái viết thường được định vị 32 mục sau các chữ cái viết hoa

Chỉnh sửa: tôi chỉ nhận ra rằng điều này cũng viết hoa ký tự đầu tiên trong chuỗi, điều này không nên. nhưng tôi khá tự hào về sự vô nghĩa của mình, vì vậy tôi sẽ bỏ qua chuyện này nếu điều đó được cho phép


Điều gì được scho là?
Muhammad Salman

@MuhammadSalmanA string s and a character c.
Davin Miler

Đáng yêu, làm cho nó hoạt động, vào đây và xem nếu nó hoạt động hay không: TIO . Khi nào nó nói với tôi?
Muhammad Salman

Giáo sư! tôi chỉ nhận ra mình đã mắc lỗi khi thay đổi tên biến, c = [] được coi là bất kỳ biến nào khác
Davin Miler

@MuhammadSalman tại đây
Davin Miler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.