분할 및 자본화


14

도전 :

특정 위치에서 문자열이 분리되어 주어진 단어의 첫 문자를 대문자로 표시합니다. 첫 글자의 첫 글자는 대문자 인 경우에만 대문자를 사용하십시오

입력 :

문자열 s과 문자 c.

출력 :

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

노트 :

  • 주어진 입력은 항상 유효합니다. 즉 : 첫 번째 문자는 항상 바꿀 문자의 인스턴스가 하나 이상인 문자열입니다. 두 번째는 항상 단일 문자입니다.
  • 입력 문자열의 길이는 4보다 큽니다.
  • 분할 할 캐릭터가 적어도 한 번 발생합니다.

  • 입력은 문자와 구분 기호 만 포함합니다 (감사합니다 @Arnauld).

  • 구분 기호는 알파벳이 아닌 것입니다 (az / AZ) (@ Dennis에서 제안 함)

우승 기준 :

이것은 이므로 각 언어 당 승리하는 가장 짧은 코드 (바이트)입니다.


  1. 두 가지 실수를 지적한 @JonathanAllan에게 감사합니다.

7
테스트 케이스 작성시 팁 : 각각 하나 이상의 코너 케이스를 포함하십시오. 모든 테스트 사례는 기본적으로 동일합니다 (을 제외한 경우 1). 솔루션이 어떻게 실패 할 수 있는지 생각하고 그러한 상황에 대한 테스트 사례를 만듭니다. 예 : 구분 기호 인 문자, 마지막 문자 인 구분 기호, 연속 구분 기호 등. 다른 것을 테스트하지 않는 많은 테스트 사례가 필요하지 않습니다.
Stewie Griffin

마지막 테스트 케이스에서 구분 기호가 누락되었습니다! 그곳에. 나는 그것을 직접 편집 할 것이지만 그것을 할 수있는 충분한 문자가 없습니다.
ollien

1
사양에 여러 변경 사항이 있기 때문에 이것을 하향 투표했습니다. 참고로 , 마지막 테스트 케이스보다 훨씬 빨리 언급해야 합니다. 문자열에 두 개 이상의 연속 "분리 자"가 포함될 수 있으며 문자가 항상 "분리 자"를 따를 것이라는 보장은 없습니다.
얽히고 설킨

2
Stewie는 테스트 사례를 제안하지 않았지만 첫 번째 문자 또는 마지막 문자가 구분 기호인지 연속적인 구분 기호가 있는지 여부를 물었습니다. 앞으로는 샌드 박스를 사용하여 모든 세부 정보를 실시간으로 정리해 보는 것이 좋습니다. 사양이 변경되어 답변이 무효화되는 것은 실망 스럽습니다. 가장 놀라운 것은 프로그램이 필요하지 않더라도 문자를 입력으로 사용하는 제한입니다. 전혀 말이되지 않습니다.
Dennis

1
separator가있는 테스트 케이스를 가질 수 있습니까? .저것으로 고생하는 문자열 분할 함수를 상상할 수 있습니다.
JAD

답변:




5

자바 스크립트 (ES6), 58 56 바이트

@ l4m2 / @Downgoat 덕분에 2 바이트 절약

카레 구문으로 입력을 (s)(c)받습니다.

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

s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase())특수 정규식 문자에 대해서는 작동하지 않으므로,에 대한 56 바이트
Conor O'Brien

50 바이트 . 또는 두 번째 입력을 귀찮게하지 않으면 47은 관련이 없습니다.
Shaggy

1
@Shaggy 감사합니다! 새 규칙이 원래 규칙과 상당히 다르기 때문에 별도의 버전으로 추가했습니다.
Arnauld

1
실패!prob!!lem!s!Olved!!
l4m2

@ l4m2, 그것은 스펙을 다시 바꾸는 새로운 테스트 케이스입니다 . RegEx 의 +앞에 A .가 그 주위를 돌아 다닐 것입니다.
얽히고 설킨



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 바이트

Luis Mendo 덕분에 2 바이트를 절약했습니다. upper대신에 toupper.

@(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 번째 문자가의 대응 문자로 대체되어야 k하고 다른 하나 s는로 이미 업데이트되어 있다고 말합니다. 우리는 이것을 {2}수정하여 전체 수정 된 문자열 만 다시 얻습니다. 이로 공급되어 strsplit구분 문자에서 셀로 분할됩니다. 을 사용하여 쉼표로 구분 된 목록으로 변환하고 {:}대괄호를 사용하여 문자열로 다시 연결합니다 [].

그게 당신에게 이해가되지 않으면 사과 ... 그것은 거의 이해가되지 않습니다 : P


3

레티 나 0.8.2 , 20 바이트

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

온라인으로 사용해보십시오! 문자열 만 사용하고 구분 기호는 선택 사항입니다. 영문자 이외의 문자는 모두 삭제되지만 다음 영문자는 모두 대문자입니다. 이전 34 바이트 버전은 임의 입력을 허용했습니다.

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

온라인으로 사용해보십시오! 링크에는 테스트 스위트가 포함되어 있습니다. 입력이 함께 연결된 문자열과 문자로 구성되어 있다고 가정합니다. 설명 : 첫 번째 단계는 종료 문자가 발생한 직후의 모든 문자를 소문자에서 대문자로 음역하며 두 번째 단계는 종료 문자의 모든 발생을 삭제합니다.

두 솔루션 모두 오른쪽 대신 왼쪽 일치를 사용하는 +것도 효과적입니다.


입력에는 알파벳 문자와 구분 기호 만 포함되어 [^a-z]있으므로 미리보기 대신 사용할 수 있습니다 . 온라인으로 사용해보십시오!
user41805


2

로다 , 57 54 바이트

Cows quack 덕분에 -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정규식에서, 그리고 _[0:1]_[:1]
user41805

2

V , 6 7 바이트

인수를 사용하지 않고 1 바이트 저장

ÓÁˆ/õ±

온라인으로 사용해보십시오!

프로그램은 텍스트를 입력으로 사용하고 char을 인수로 사용합니다.

16 진 덤프 :

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

이것은 간단한 대체입니다. 압축되지 않은 다음과 같습니다.

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

\A알파벳이 아닌 문자 다음에 문자 (.)가 대문자의 \u첫 번째 캡처 그룹으로 대체 되는 전역 대체를 수행하십시오.\1


c특별한 정규 표현식 문자 인 입력에는 작동하지 않습니다
Conor O'Brien

1
ConorO'Brien @ 고정하고,이 I 덕분에 짧은 솔루션을 발견 : 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. 분해 대신 split을 사용하여 2 바이트가 짧았 지 만 ^ 테스트는 정규식으로 인해 실패합니다.

Med 덕분에 -8


1
for 루프를 제거 {하고 제거 할 수 }있으며 다음 명령문 만 조건의 본문으로 취급합니다.
Med

1
루프 내부에서 에코를 수행 할 수도 있습니다.$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Med



0

껍질 , 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

자바 10, 141 바이트

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

루비 -pl , 36 바이트

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

온라인으로 사용해보십시오!

두 번째 인수가없는 문자열 만 사용합니다. gsub!공통 gsub! x,y구문으로 $1는 일치 데이터로 쉽게 채워지지 않으므로 블록 버전의 메소드를 사용합니다 . |$정규식에서 끝에 분리기가있는 테스트 케이스에 필요합니다.


0

파이썬 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있어야합니까?
Muhammad Salman

@MuhammadSalmanA string s and a character c.
Davin Miler

사랑 스러워요, 작동 시키세요 여기로 가서 작동하는지 확인하십시오 : TIO . 언제 말해?
Muhammad Salman

죄송합니다! 변수 이름을 변경할 때 실수를했다는 사실을 깨달았습니다. c = []는 다른 변수 여야합니다
Davin Miler

@MuhammadSalman 여기
Davin Miler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.