розщеплювати і капіталізувати


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). Постарайтеся подумати про те, як рішення можуть провалюватися, і складіть тестовий випадок для таких ситуацій. Деякі приклади: Літери як роздільники, роздільник є останнім символом, послідовні роздільники тощо. Не потрібно мати багато тестових випадків, які не перевіряють різні речі.
Стюі Гріффін

У останньому тестовому випадку вам не вистачає роздільника - має бути! там. Я б сам це відредагував, але для мене не вистачає символів.
ollien

1
Я спростував це через кілька змін у специфікації. Що стосується сторони, вам потрібно згадати набагато раніше, ніж останній тестовий випадок, що рядок може містити 2 або більше послідовних "роздільників", і що ми не гарантуємо, що лист завжди буде слідувати "роздільника".
Кудлатий

2
Я переглянув це: Стюї не запропонував жодних тестових випадків, але він запитав, чи може перший чи останній символ бути роздільником і чи можуть бути послідовні роздільники. Надалі рекомендуємо скористатися пісочницею, щоб розібрати всі ці деталі перед тим, як виходити в ефір. Неприємно втратити вашу відповідь через зміни в специфікації. Найдивніше з усіх - це обмеження приймати символ як вхід, навіть якщо програмі цього не потрібно. Це зовсім не має сенсу.
Денніс

1
Чи можемо ми мати тестовий випадок з роздільником ., я можу уявити, що деякі функції розщеплення рядків борються з цим.
JAD

Відповіді:




5

JavaScript (ES6), 58 56 байт

Збережено 2 байти завдяки @ l4m2 / @Downgoat

Здійснює введення в синтаксис currying (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()

втішання 56 байт за s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase()), оскільки він не працює для спеціальних символів регулярного виразів
Conor O'Brien

50 байт . Або 47, якщо ви не переймаєтесь другим входом, що не має значення.
Кудлатий

1
@Shaggy Дякую! Я додав його як окрему версію, оскільки нові правила сильно відрізняються від початкових.
Арнольд

1
провал!prob!!lem!s!Olved!!
l4м2

@ L4m2, це новий тест , який змінює специфікацію ще раз . A +перед тим, як .в RegEx обійдеться.
Кудлатий


3

sed 4.2.2 (-r), 21

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

Я намагався \Wзамість цього [^a-z], але, на жаль, це не відповідає _.

Спробуйте в Інтернеті!


За нашими новими стандартами, кожне виклик прапорів вважається різною мовою , і, таким чином, вашу відповідь можна змінити на sed 4.2.2 (-r), 21 bytes.
Містер Xcoder

@ Mr.Xcoder Звучить добре - дякую!
Цифрова травма

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 байти

Збережено 2 байти завдяки Луїсу Мендо. upperзамість toupper.

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

Спробуйте в Інтернеті!

Нічого собі, це, мабуть, найгаласніший фрагмент коду Octave, який я коли-небудь писав! Тут використовуються два викладені в цьому трюки питанні щодо підказок, а саме список аргументів та масиви комірок.

Пояснення:

Введення списку аргументів:

@(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]замість марок пошуку Спробуйте це онлайн!
користувач41805


2

Рода , 57 54 байти

-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]
регексу

2

V , 6 7 байт

1 байт збережено, не використовуючи аргумент

ÓÁˆ/õ±

Спробуйте в Інтернеті!

Програма приймає текст як введення, а графік як аргумент.

Hexdump:

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

Це проста підміна. Не стиснений, це виглядає наступним чином

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

Виконайте глобальну заміну, при якій \Aнеалфавітний символ з подальшим символом (.)замінюється на верхній регістр \uпершої групи захоплення\1


Не працює для введення даних, де cє спеціальний виразний символ
Conor O'Brien

1
@ ConorO'Brien Виправлено, і завдяки цьому я знайшов коротше рішення: 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. Був на 2 байти коротшим, використовуючи спліт замість вибуху, але ^ тест не вдається через регулярне вираження.

-8 завдяки Мед


1
Ви можете вилучити {і }з циклу for, він буде розглядати лише наступне твердження як тіло стану.
Мед

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

R , 87 байт

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

Спробуйте в Інтернеті!

Використання цього трюку неможливо виконати належним чином у TIO, тому я його моделював.

Нам потрібно, Tінакше один із тестових випадків не вдасться.


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}

Спробуйте в Інтернеті!

Бере лише рядок без другого аргументу. Використовує блок-версію 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.
Davin Miler

Чудовий, змуси його працювати, піди сюди і подивись, працює він чи ні: TIO . Коли це мені скаже?
Мухаммад Салман

ой! я щойно зрозумів, що помилився, змінивши імена змінних, c = [] має бути будь-якою іншою змінною
Давін Міллер

@MuhammadSalman тут
Мілер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.