bölün ve büyük harf kullanın


14

Meydan okuma :

Belirli konumlarda bölünmüş bir dize verilir ve verilen sözcüğün ilk karakterini büyük yapar. İlk kelimenin ilk karakterini büyük harfle yazmış ve yalnızca büyük harfle yazılmışsa

Giriş:

Bir dize sve bir karakter c.

Çıkış:

Her yinelemeye sahip dize c, ilk büyük harfle değiştirilir

Örnekler:

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

Not :

  • Verilen girdi her zaman geçerli olacaktır. ie: Birincisi her zaman adresinde değiştirilecek karakterin en az bir örneğine sahip bir dize olacaktır. İkincisi her zaman tek bir karakter olacaktır.
  • Giriş dizesinin uzunluğu 4'ten büyük olacaktır.
  • Bölünecek karakterin en az bir oluşumu olacaktır.

  • Girişin yalnızca harfler ve ayırıcı içerdiği garanti edilmektedir (Thanks @Arnauld)

  • Ayırıcı alfabe olmayan bir şeydir (az / AZ) (@Dennis tarafından önerilir)

Kazanma kriterleri:

Bu her dil için bayt olarak en kısa kod kazanır.


  1. @JonathanAllan'a iki hatayı işaret ettiği için teşekkür ederiz.

7
Test senaryoları oluştururken ipuçları: Her birini en az bir köşe vakası yapın. Tüm test senaryolarınız temelde aynıdır (belki olanlar hariç 1). Çözümlerin nasıl başarısız olabileceğini düşünmeye çalışın ve bu gibi durumlar için bir test örneği yapın. Bazı örnekler: Ayırıcı olarak harfler, ayırıcı son karakterdir, ardışık ayırıcılar vb. Farklı şeyleri test etmeyen birçok test vakasına gerek yoktur.
Stewie Griffin

Son test durumunda bir sınırlayıcı eksik - bir olmalı! Orada. Kendim düzenlerdim, ama benim için yeterli karakter yok.
ollien

1
Spesifikasyondaki çoklu değişiklikler nedeniyle bunu reddettim. Bir sidenote üzerinde , dizenin 2 veya daha fazla ardışık "ayırıcı" içerebileceğinden ve bir harfin her zaman bir "ayırıcı" izleyeceğinden emin olmadığımızdan son test durumundan çok daha erken bahsetmelisiniz .
Shaggy

2
Baktım: Stewie herhangi bir test vakası önermedi, ancak ilk veya son karakterin ayırıcı olup olmadığını ve ardışık ayırıcılar olup olmadığını sordu. Gelecekte, yayına geçmeden önce bu ayrıntıların tümünü almak için lütfen korumalı alanı kullanmayı düşünün. Şartnamedeki değişiklikler nedeniyle cevabınızı geçersiz kılmak sinir bozucudur. En şaşırtıcı olanı, programa ihtiyaç duymasa bile karakteri girdi olarak alma kısıtlamasıdır. Bu hiç mantıklı değil.
Dennis

1
Ayırıcılı bir test vakamız .olabilir mi, bununla mücadele eden bazı ip bölme işlevlerini hayal edebiliyorum.
JAD

Yanıtlar:




5

JavaScript (ES6), 58 56 bayt

@ L4m2 / @Downgoat sayesinde 2 bayt kaydedildi

Körili sözdiziminde girdi alır (s)(c).

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

Çevrimiçi deneyin!

Yorumlananlar

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())özel regex karakterler için çalışmadığı için 56 bayt için teselli
Conor O'Brien

50 bayt . Veya ikinci konuyla ilginizi çekmezse, bu da alakasızdır.
Shaggy

1
@Shaggy Teşekkürler! Yeni kurallar orijinal kurallardan oldukça farklı olduğu için ayrı bir sürüm olarak ekledim.
Arnauld

1
başarısız!prob!!lem!s!Olved!!
l4m2

@ l4m2, bu özelliği tekrar değiştiren yeni bir test vakası . A +önce .RegEx içinde etrafında alacak.
Shaggy



3

Jöle , 8 bayt

Œt⁸1¦«⁸ḟ

Çevrimiçi deneyin!

Nasıl çalışır

Œ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

Oktav , 83 , 66 , 64 bayt

Luis Mendo sayesinde 2 bayt tasarruf etti. upperyerine toupper.

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

Çevrimiçi deneyin!

Vay canına, bu muhtemelen şimdiye kadar yazdığım en dağınık Octave kod parçası! Bu, bu ipuçları sorusunda yayınlanan iki hileyi , yani Argüman listesi ve hücre dizilerini kullanır.

Açıklama:

Bağımsız değişken listesi girişi:

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

kburada, sher bir ayırıcıdan sonraki cbüyük harfe dönüştürülen ilk karakterdir . Büyük harfli her karakterin dizini içinde depolanır i.

Hücre dizi gövdesi:

İki öğeli bir hücre dizisi oluşturuyoruz, bir tanesi tüm i'ter karakterlerin yerine karşılık gelen k, diğeri sise zaten güncellenmiş olanlarla değiştirilmesi gerektiğini söylemiştik . Bunu {2}, yalnızca değiştirilmiş dizenin tamamını geri alabilmemiz için dizine ekleriz. Bu, strsplitayırıcı karakterde hücrelere ayıran beslenir . Bunu kullanarak virgülle ayrılmış bir listeye dönüştürüyoruz {:}ve köşeli parantez kullanarak dizgiye geri birleştiriyoruz [].

Bu senin için bir anlam ifade etmiyorsa özür dilerim ... Bana pek mantıklı gelmiyor: P


3

Retina 0.8.2 , 20 bayt

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

Çevrimiçi deneyin! Sadece dizgiyi alır, ayırıcı isteğe bağlıdır. Alfabetik olmayan tüm karakterler silinir, ancak aşağıdaki alfabetik karakterler büyük harfle yazılır. Önceki 34 bayt sürümü kabul edilen rasgele girdi:

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

Çevrimiçi deneyin! Bağlantı test paketini içerir. Girdinin, bir araya getirilen dize ve karakterden oluştuğunu varsayar. Açıklama: İlk aşama, son karakterin küçük harflerden büyük harfe kadar olan harflerini hemen takip eden tüm karakterleri dönüştürür ve ikinci aşama, bitiş karakterinin tüm örneklerini siler.

Her iki çözüm için de bir sağdan sola eşleme kullanmak +da işe yarıyor.


Girişin yalnızca alfabetik karakterler ve ayırıcı içereceği garanti edildiğinden [^a-z], gözcü yerine kullanabilirsiniz Çevrimiçi deneyin!
user41805


2

Röda , 57 54 bayt

İnekler quack sayesinde -3 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

Dışarı bırakabilir \Eregex gelen ve _[0:1]_[:1]
user41805

2

V , 6 7 bayt

Bağımsız değişken kullanılmadan 1 bayt kaydedildi

ÓÁˆ/õ±

Çevrimiçi deneyin!

Program metni girdi olarak ve karakteri bağımsız değişken olarak alır.

HexDump:

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

Bu basit bir ikame. Sıkıştırılmamış, aşağıdaki gibi görünüyor

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

\AAlfabetik olmayan bir karakterin ve ardından bir karakterin üst (.)harfli \uilk yakalama grubuyla değiştirildiği genel bir ikame gerçekleştirin\1


cÖzel bir normal ifade karakteri olan girdi için çalışmıyor
Conor O'Brien

1
@ ConorO'Brien Sabit ve bu
sayede

2

Scala, 83 bayt

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

Çevrimiçi deneyin!

Açıklama:

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 bayt

¡ćsvyćusJ

Çevrimiçi deneyin!

açıklama

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

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

İle çalıştırın -r. Patlama yerine split kullanıldığında 2 bayt daha kısa oldu, ancak regex nedeniyle ^ testi başarısız oldu.

-8 Med sayesinde


1
For döngüsünü kaldırabilir {ve }for döngüsünden, yalnızca bir sonraki ifadeyi koşulun gövdesi olarak ele alır.
Med

1
Hatta döngü içindeki yankıyı bile yapabilirsiniz:$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Med



0

Kabuk , 10 bayt

ΣΓ·:mΓo:ax

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin.

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Bu hileyi TIO'da düzgün bir şekilde yürütülemediğinden kullanır, bu yüzden simüle ederim.

Biz ihtiyacımız Ttest durumları aksi biri başarısız.


0

Stax , 11 bayt

óKo{cplòüö\

Çalıştır ve hata ayıkla

açıklama

/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

Bir şekilde düzeltmek istediğim birkaç parça var. Yaklaşık 8 bayta düşürebilirim, ancak son test durumunda başarısız oluyor>. <


0

Ruby -pl , 36 bayt

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

Çevrimiçi deneyin!

İkinci argüman olmadan sadece dizeyi alır. gsub!Ortak gsub! x,ysözdizimi $1ile eşleşme verileriyle kolayca doldurulmadığından , yöntemin blok sürümünü kullanır . |$regex içinde sonunda ayırıcı ile test durumda gereklidir.


0

Python 3 , 77 bayt

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

Çevrimiçi deneyin!

Bu, dizenin ASCII kodlu olduğunu sve cgirdiyi içeren ve önceden yüklenmiş değişkenler olduğunu varsayar .

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

Bu çözüm, ASCII kodlamasında küçük harflerin büyük harflerden sonra 32 girişe yerleştirilmesi üzerine çalışır

Düzenleme: ben sadece bu da değil dize ilk karakteri büyük harf olduğunu fark etti. ama saçma sapanımla gurur duyuyorum, bu yüzden izin verilirse bunu bırakacağım


Ne solmalı?
Muhammed Salman

@MuhammadSalmanA string s and a character c.
Davin Miler

Güzel, çalışmasını sağlayın, buraya gidin ve çalışıp çalışmadığını görün: TIO . Bana ne zaman söyler?
Muhammed Salman

ayy! Ben sadece değişken isimlerini değiştirirken bir hata yaptım, c = [] başka bir değişken olması gerekiyordu
Davin Miler

@MuhammadSalman burada
Davin Miler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.