分割して大文字にする


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

注意 :

  • 指定された入力は常に有効です。つまり、最初の文字列は常に、置換する文字の少なくとも1つのインスタンスを持つ文字列になります。2番目は常に単一の文字になります。
  • 入力文字列の長さは4より大きくなります。
  • 分割する文字が少なくとも1回出現します。

  • 入力には、文字と区切り文字のみが含まれることが保証されます(@Arnauldに感謝)

  • 区切り文字はアルファベットではないもの(az / AZ)(@Dennisが推奨)

受賞基準:

これはので、各言語のバイト単位の最短コードが優先されます。


  1. 2つの間違いを指摘してくれた@JonathanAllanに感謝します。

7
テストケースを作成する際のヒント:それぞれが少なくとも1つのコーナーケースをカバーするようにします。すべてのテストケースは基本的に同一です(を含むテストケースを除く1)。ソリューションがどのように失敗するかを考え、そのような状況のテストケースを作成してください。いくつかの例:セパレータとしての文字、最後の文字であるセパレータ、連続したセパレータなど。さまざまなことをテストしない多くのテストケースを用意する必要はありません。
スチューウィーグリフィン

最後のテストケースで区切り文字が欠落しています-があるはずです!そこ。自分で編集しますが、編集するのに十分なキャラクターがありません。
オリエン

1
仕様に複数の変更があったため、これを支持しました。追記では、あなたが言及ようにする必要があり多くのことを早く最後のテストケースよりも文字列が2以上の連続する「セパレータ」と私たちは、文字は常に「区切り」に従うことが保証されていないことを含むことができること。
シャギー

2
私は調べました:Stewieはテストケースを提案しませんでしたが、最初または最後の文字が区切り文字になるかどうか、連続する区切り文字があるかどうかを尋ねました。将来的には、サンドボックスを使用して、これらすべての詳細を整理してから公開することを検討してください。仕様が変更されたため、回答を無効にするとイライラします。最も驚くべきことは、たとえプログラムがそれを必要としない場合でも、文字を入力として使用するという制限です。それはまったく意味がありません。
デニス

1
separatorを使用したテストケース.を作成できますか?いくつかの文字列分割関数がこれに苦労していることが想像できます。
JAD

回答:




5

JavaScript(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バイトの慰め
コナーオブライエン

50バイト。または、2番目の入力を気にしない場合は47です。これは無関係です。
シャギー

1
@Shaggyありがとう!新しいルールは元のルールとはまったく異なるため、別バージョンとして追加しました。
アーナウルド

1
失敗!prob!!lem!s!Olved!!
-l4m2

@ l4m2は、仕様を再度変更する新しいテストケースです。+前の.正規表現では、それを回避します。
シャギー



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

オクターブ8366、64のバイト

Luis Mendoのおかげで2バイト節約されました。upperの代わりにtoupper

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

オンラインでお試しください!

うわー、これはおそらく私が今まで書いた中で最も厄介なオクターブコードです!これは、このヒントの質問に投稿された2つのトリック、つまり引数リストとセル配列を使用します。

説明:

引数リストの入力:

@(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ます。

セル配列本体:

2つの要素を持つセル配列を作成します。1つはすべてのi番目の文字をの対応する要素で置き換える必要があると言いk、もう1つsは既に更新されています。これを使用してインデックスを作成し{2}、変更された文字列全体のみを取得します。これはに送らstrsplitれ、セパレータ文字でセルに分割されます。を使用してコンマ区切りのリストに変換し、{:}角括弧を使用して連結して文字列に戻します[]

それはあなたに意味をなさない場合は謝罪...それは私にはほとんど意味がありません:P


3

Retina 0.8.2、20バイト

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

オンラインでお試しください!文字列のみを使用し、セパレータはオプションです。アルファベット以外の文字はすべて削除されますが、その後のアルファベット文字はすべて大文字になります。以前の34バイトバージョンは、任意の入力を受け入れました。

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

オンラインでお試しください!リンクにはテストスイートが含まれています。入力が連結された文字列と文字で構成されていると仮定します。説明:最初のステージでは、終了文字の出現直後のすべての文字が小文字から大文字に変換され、2番目のステージでは、終了文字の出現がすべて削除されます。

両方のソリューションで、右から左への一致を使用すること+も機能します。


入力にはアルファベット文字と区切り文字のみが含まれることが保証されているため[^a-z]、lookaheadsの代わりに使用できます。オンラインで試してください!
Kritixi Lithos


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]
Kritixi Lithos

2

V、6 7バイト

引数を使用しないことで1バイト節約

ÓÁˆ/õ±

オンラインでお試しください!

プログラムはテキストを入力として、charを引数として受け取ります。

Hexdump:

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

これは単純な置換です。非圧縮、次のようになります

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

グローバル置換を実行します。この\A場合、アルファベット以外の文字とそれに続く文字(.)が、大文字の\u最初のキャプチャグループに置き換えられます。\1


c特殊な正規表現文字がある入力では機能しません
コナーオブライエン

1
@ ConorO'Brien修正、これのおかげで短い解決策を見つけました:D
Kritixi Lithos

2

Scala、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ます。explodeではなくsplitを使用すると2バイト短くなりましたが、^テストは正規表現が原因で失敗します。

-8 Medに感謝


1
あなたは削除することができます{し、}ループのために、それが唯一の条件のボディとして次の文を扱いますから。
メッド

1
:あなたも、ループ内でエコーを行うことができます$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
メッド



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

Java 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

スタックス、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}

オンラインでお試しください!

2番目の引数なしで文字列のみを受け取ります。gsub!メソッドのブロックバージョンを使用しgsub! x,yます。これ$1は、一般的な構文では一致データがすぐに入力されないためです。|$正規表現は、最後にセパレータがあるテストケースに必要です。


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.
ダヴィンミラー

素敵な、それを動作させる、ここに移動し、動作するかどうかを確認します:TIO。教えてくれたら?
ムハンマドサルマン

おっとっと!私は、変数名の変更、C = []は、任意の他の変数であると仮定されている場合、私はミスを犯し実現
デーヴィンマイラー

@MuhammadSalman ここ
ダヴィンミラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.