разделить и использовать

14

Вызов :

Задана строка, разбитая на определенные позиции и использующая заглавные буквы первого символа данного слова. Прописать первый символ первого слова, если и только если оно уже было написано

Вход:

Строка sи символ c.

Ouput:

Строка с каждым вхождением 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
Я понизил это из-за многочисленных изменений в спецификации. В отношении sidenote вам нужно намного раньше, чем в последнем тестовом примере, упомянуть, что строка может содержать 2 или более последовательных «разделителя» и что мы не гарантируем, что буква всегда будет следовать за «разделителем».
лохматый
2
Я посмотрел на него: Стьюи не предлагал никаких тестовых случаев, но спросил, может ли первый или последний символ быть разделителем и могут ли быть последовательные разделители. В будущем, пожалуйста, рассмотрите возможность использования песочницы, чтобы разобраться во всех этих деталях, прежде чем начать работу. Очень неприятно, что ваш ответ признан недействительным из-за изменений в спецификации. Самым удивительным из всех является ограничение на использование символа в качестве ввода, даже если программе это не нужно. Это не имеет никакого смысла.
Денис
1
Можем ли мы иметь тестовый случай с разделителем ., я могу представить некоторые функции разбиения строк, борющиеся с этим.
JAD

Ответы:

5

JavaScript (ES6), 58 56 байт

Сохранено 2 байта благодаря @ l4m2 / @Downgoat

Принимает ввод в синтаксисе карри (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()
Arnauld
источник
утешение 56 байт s=>c=>s.replace(RegExp(c+".","g"),m=>m[1].toUpperCase()), поскольку оно не работает для специальных символов регулярных выражений
Конор О'Брайен,
50 байтов . Или 47, если вы не удосуживаетесь принять второй вход, что не имеет значения.
Лохматый
1
@ Shaggy Спасибо! Я добавил его как отдельную версию, поскольку новые правила сильно отличаются от оригинальных.
Арно
1
сбой!prob!!lem!s!Olved!!
l4m2
@ l4m2, это новый тестовый пример, который снова меняет спецификацию . А +перед этим .в 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){:}];

Попробуйте онлайн!

Вау, это, наверное, самый грязный кусок октавного кода, который я когда-либо писал! При этом используются два трюка, опубликованных в этом вопросе, а именно список аргументов и массивы ячеек.

Объяснение:

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

@(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 +также работает.

Нил
источник
Поскольку входные данные гарантированно содержат только буквенные символы и разделитель, вы можете использовать их [^a-z]вместо заглядывания Попробуйте онлайн!
Kritixi Lithos
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 */
  }
}
fergusq
источник
Вы можете \E_[0:1]_[:1]
опустить
2

V 6 7 байт

1 байт сохранен без использования аргумента

ÓÁˆ/õ±

Попробуйте онлайн!

Программа принимает текст в качестве ввода и символ в качестве аргумента.

HexDump:

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

Это простая замена. Несжатый, это выглядит следующим образом

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

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

Kritixi Lithos
источник
Не работает для ввода, где cнаходится специальный символ регулярного выражения
Конор О'Брайен
1
@ ConorO'Brien Исправлено, и благодаря этому я нашел более короткое решение: D
Kritixi Lithos
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
Emigna
источник
1

PHP, 91 83 байта

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

Беги с -r. На 2 байта короче, используя split вместо взрыва, но ^ test не пройден из-за регулярного выражения.

-8 благодаря Med

Manassehkatz-Moving 2 Codidact
источник
1
Вы можете удалить {и }из цикла for, он будет обрабатывать только следующий оператор как тело условия.
Мед
1
Вы даже можете сделать эхо внутри петли:$a=explode($argv[2],$argv[1]);echo array_shift($a);foreach($a as$i)echo ucfirst($i);
Мед
0

Groovy, 43 байта, 45 байтов

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

Попробуйте онлайн . Тестовый набор включен, исключая последний элемент, так как в нем отсутствует разделитель символов c.

Матиас Бьярланд
источник
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противном случае один из тестовых случаев не пройден.

Jayce
источник
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

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 = [] - любая другая переменная
Davin Miler
@MuhammadSalman здесь
Дэвин Милер