berpisah dan bermodalkan

14

Tantangan:

Diberikan string split pada posisi tertentu dan huruf besar karakter pertama dari kata yang diberikan. Memanfaatkan huruf pertama kata pertama jika dan hanya jika sudah dikapitalisasi

Memasukkan :

String sdan karakter c.

Ouput:

String dengan setiap kemunculan cdiganti dengan karakter pertama dikapitalisasi

Contoh:

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

Catatan :

  • Masukan yang diberikan akan selalu valid. yaitu: Yang pertama akan selalu berupa string dengan setidaknya satu instance karakter untuk diganti pada. Yang kedua akan selalu menjadi karakter tunggal.
  • Panjang string input akan lebih besar 4.
  • Akan ada setidaknya satu kemunculan karakter untuk dipisah.

  • Input dijamin hanya mengandung huruf dan pemisah (Terima kasih @Arnauld)

  • Pemisah adalah segala sesuatu yang bukan alfabet (az / AZ) (disarankan oleh @Dennis)

Kriteria pemenang:

Ini adalah sehingga kode terpendek dalam byte untuk setiap bahasa menang.


  1. Terima kasih kepada @JonathanAllan karena menunjukkan dua kesalahan.
Muhammad Salman
sumber
7
Tips saat membuat kotak uji: Buat masing-masing penutup setidaknya satu kotak sudut. Semua test case Anda pada dasarnya identik (mungkin kecuali yang dengan 1). Coba pikirkan bagaimana solusi mungkin gagal, dan buat uji kasus untuk situasi seperti itu. Beberapa contoh: Surat sebagai pemisah, pemisah menjadi karakter terakhir, pemisah berurutan dan sebagainya. Tidak perlu memiliki banyak test case yang tidak menguji hal yang berbeda.
Stewie Griffin
Anda kehilangan pembatas dalam kasus uji terakhir - harus ada! sana. Saya akan mengeditnya sendiri, tetapi tidak ada cukup karakter untuk saya lakukan.
ollien
1
Saya telah menurunkan ini karena beberapa perubahan pada spesifikasi. Pada sidenote, Anda perlu menyebutkan banyak lebih cepat daripada test case terakhir bahwa string dapat berisi 2 atau lebih "pemisah" berturut-turut dan bahwa kami tidak dijamin bahwa surat akan selalu mengikuti "pemisah".
Shaggy
2
Saya mencarinya: Stewie tidak menyarankan kasus uji, tetapi dia bertanya apakah karakter pertama atau terakhir bisa menjadi pemisah dan apakah mungkin ada pemisah yang berurutan. Di masa mendatang, harap pertimbangkan menggunakan kotak pasir untuk menyelesaikan semua detail ini sebelum ditayangkan. Sangat frustasi untuk mendapatkan jawaban Anda batal karena perubahan dalam spesifikasi. Yang paling mengejutkan dari semuanya adalah pembatasan untuk mengambil karakter sebagai input, bahkan jika program tidak membutuhkannya. Itu tidak masuk akal sama sekali.
Dennis
1
Bisakah kita memiliki test-case dengan separator ., saya bisa membayangkan beberapa fungsi pemisah string berjuang dengan yang itu.
JAD

Jawaban:

5

C (gcc) , 61 53 55 byte

-8 byte terima kasih kepada Dennis!

f(s,c)char*s;{for(;*s;putchar(*s++))if(*s==c)*++s&=95;}

Cobalah online!

betseg
sumber
Sarankan *s==c?*++s&=95:0;daripadaif(*s==c)*++s&=95;
ceilingcat
5

JavaScript (ES6), 58 56 byte

Disimpan 2 byte berkat @ l4m2 / @Downgoat

Mengambil input dalam sintaks currying (s)(c).

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

Cobalah online!

Berkomentar

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()
Arnauld
sumber
penghiburan 56 byte untuk s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase()), karena tidak berfungsi untuk karakter regex khusus
Conor O'Brien
50 byte . Atau 47 jika Anda tidak repot-repot mengambil input kedua, yang tidak relevan.
Shaggy
1
@Shaggy Terima kasih! Saya telah menambahkannya sebagai versi terpisah, karena aturan baru sangat berbeda dari yang asli.
Arnauld
1
gagal!prob!!lem!s!Olved!!
14m2
@ l4m2, itu adalah test case baru yang mengubah spek lagi . A +sebelum .di RegEx akan menyiasatinya.
Shaggy
3

Jelly , 8 byte

Œt⁸1¦«⁸ḟ

Cobalah online!

Bagaimana itu bekerja

Œ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.
Dennis
sumber
3

Oktaf , 83 , 66 , 64 byte

Disimpan 2 byte berkat Luis Mendo. upperbukannya toupper.

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

Cobalah online!

Wow, itu mungkin bagian kode Octave yang paling berantakan yang pernah saya tulis! Ini menggunakan dua trik yang diposting dalam pertanyaan kiat ini , yaitu daftar Argumen, dan array sel.

Penjelasan:

Input daftar argumen:

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

kdi sini karakter pertama ssetelah setiap pemisah c, dikonversi ke huruf besar. Indeks setiap karakter dengan huruf kapital disimpan di i.

Badan susunan sel:

Kami membuat array sel dengan dua elemen, yang pertama adalah kita mengatakan bahwa semua karakter ke-i harus diganti dengan mitranya di k, dan yang lainnya dengan s, yang sekarang sudah diperbarui. Kami mengindeks ini menggunakan {2}sehingga kami hanya mendapatkan keseluruhan, string yang dimodifikasi kembali. Ini diumpankan ke strsplit, yang membaginya menjadi sel-sel di karakter pemisah. Kami mengonversinya menjadi daftar yang dipisahkan koma menggunakan {:}, dan menggabungkannya kembali ke string menggunakan tanda kurung [].

Maaf jika itu tidak masuk akal bagi Anda ... Ini hampir tidak masuk akal bagi saya: P

Stewie Griffin
sumber
3

Retina 0.8.2 , 20 byte

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

Cobalah online! Hanya mengambil string, pemisah opsional. Semua karakter non-alfabet dihapus tetapi setiap karakter alfabet berikut ini ditulis dengan huruf besar. Versi 34 byte sebelumnya menerima input sewenang-wenang:

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

Cobalah online! Tautan termasuk test suite. Asumsikan input terdiri dari string dan karakter yang disatukan. Penjelasan: Tahap pertama mentransliterasikan semua karakter segera setelah kemunculan karakter akhir dari huruf kecil ke huruf besar dan tahap kedua kemudian menghapus semua kemunculan karakter akhir.

Untuk kedua solusi, menggunakan kecocokan dari kanan ke kiri dan bukan +juga berfungsi.

Neil
sumber
Karena input dijamin hanya berisi karakter alfabet dan pemisah, Anda dapat menggunakan [^a-z]alih-alih pencarian yang ditampilkan Coba online!
Kritixi Lithos
2

Röda , 57 54 byte

-3 byte terima kasih kepada dukun Sapi

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

Cobalah online!

Penjelasan:

{
  (_/`\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 */
  }
}
fergusq
sumber
Anda dapat meninggalkan \Edari regex, dan _[0:1]_[:1]
Kritixi Lithos
2

V , 6 7 byte

1 byte disimpan dengan tidak menggunakan argumen

ÓÁˆ/õ±

Cobalah online!

Program menerima teks sebagai input dan char sebagai argumen.

Hexdump:

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

Ini adalah substitusi sederhana. Terkompresi, sepertinya yang berikut ini

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

Melakukan substitusi global di mana \A, karakter non-alfabet, diikuti oleh karakter (.)diganti dengan \ukelompok tangkapan pertama huruf besar\1

Kritixi Lithos
sumber
Tidak berfungsi untuk masukan di mana ckarakter regex khusus
Conor O'Brien
1
@ ConorO'Brien Tetap, dan terima kasih untuk ini saya menemukan solusi yang lebih pendek: 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}

Cobalah online!

Penjelasan:

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
}                                           //
Xavier Guihot
sumber
1

Merah , 87 byte

func[s c][b: split s c prin b/1 foreach w next b[if w <>""[w/1: uppercase w/1 prin w]]]

Cobalah online!

Galen Ivanov
sumber
1

05AB1E , 9 byte

¡ćsvyćusJ

Cobalah online!

Penjelasan

¡           # 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
Emigna
sumber
1

PHP, 91 83 byte

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

Jalankan dengan -r. Apakah 2 byte lebih pendek menggunakan split daripada meledak, tetapi uji ^ gagal karena regex.

-8 Terima kasih kepada Med

manassehkatz-Moving 2 Codidact
sumber
1
Anda dapat menghapus {dan }dari for loop, itu hanya akan memperlakukan pernyataan berikutnya sebagai body of condition.
Med
1
Anda bahkan dapat melakukan gema di dalam loop:$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Med
0

Groovy, 43 byte, 45 byte

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

Cobalah online . Test suite termasuk mengecualikan item terakhir karena tidak memiliki karakter pemisah c.

Matias Bjarland
sumber
0

Pergi, 138 92 87 byte

Turun 46 byte berkat @Dennis 'kasus judul ide.

func f(s,d string){p:=Split(s,d);Print(p[0]+Replace(Title(Join(p[1:]," "))," ","",-1))}

Cobalah online!

ollien
sumber
0

Sekam , 10 byte

ΣΓ·:mΓo:ax

Cobalah online!

Penjelasan

ΣΓ·: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"
ბიმო
sumber
0

F # (Mono) , 122 byte

let f(s:string)c=s|>Seq.mapi(fun i x->if i>0&&s.[i-1]=c then Char.ToUpper(x)else x)|>Seq.where((<>)c)|>Seq.toArray|>String

Cobalah online!

Henrik Hansen
sumber
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;}

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
0

R , 87 byte

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

Cobalah online!

Gunakan trik ini ini tidak bisa dijalankan dengan baik di TIO jadi saya mensimulasikannya.

Kita perlu Tkalau tidak salah satu kasus uji gagal.

JayCe
sumber
0

Stax , 11 byte

óKo{cplòüö\

Jalankan dan debug itu

Penjelasan

/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

Ada beberapa bagian yang ingin saya perbaiki. Saya bisa menurunkannya menjadi sekitar 8 byte, tetapi gagal pada test case terakhir>. <

Multi
sumber
0

Ruby -pl , 36 byte

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

Cobalah online!

Hanya mengambil string tanpa argumen kedua. Menggunakan metode versi blok gsub!karena dengan gsub! x,ysintaksis umum $1tidak mudah diisi dengan data yang cocok. |$di regex diperlukan untuk test case dengan separator pada akhirnya.

Kirill L.
sumber
0

Python 3 , 77 byte

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

Cobalah online!

Ini mengasumsikan bahwa string adalah ASCII disandikan dan mengasumsikan bahwa sdan cadalah variabel yang dimuat mengandung input.

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

Solusi ini bekerja pada kenyataan bahwa dalam pengkodean ASCII, huruf kecil diposisikan 32 entri setelah huruf kapital

Sunting: Saya baru menyadari bahwa ini juga menggunakan huruf besar karakter pertama dalam string, yang seharusnya tidak. tapi saya cukup bangga dengan omong kosong saya, jadi saya akan meninggalkan ini jika diizinkan

Davin Miler
sumber
Apa yang sseharusnya?
Muhammad Salman
@MuhammadSalmanA string s and a character c.
Davin Miler
Bagus, buat itu bekerja, Buka di sini dan lihat apakah itu berfungsi atau tidak: TIO . Kapan itu memberitahuku?
Muhammad Salman
Ups! saya baru sadar saya membuat kesalahan ketika mengganti nama variabel, c = [] seharusnya menjadi variabel lain
Davin Miler
@MuhammadSalman di sini
Davin Miler