ЭТО КАПС ДЕНЬ ЗАМКА


29

22 ОКТЯБРЯ ЯВЛЯЕТСЯ МЕЖДУНАРОДНЫМ ДЕНЬМ ЗАМКА КАПСОВ ! К сожалению, НЕКОТОРЫЕ НЕ ПРИЗНАЮТ СЛАВУ ВСЕМОГУЩЕЙ ЗАМКИ. Они говорят, что это выглядит "отвратительно" или "как кричать" или какая-то бессмыслица. ЧТОБЫ СООТВЕТСТВОВАТЬ ЭТИМ ЯВНЫМ ИЛЛОГИЧЕСКИМ И БЕЗУМНЫМ ЖАЛОБАМ, ПОЖАЛУЙСТА, НАПИШИТЕ МНЕ ПРОГРАММУ, КОТОРАЯ ВКЛЮЧАЕТ НОРМАЛЬНЫЙ ТЕКСТ В «ЧУВСТВИТЕЛЬНЫЙ» ИЛИ «РАЗУМНЫЙ» ТЕКСТ, ЧТОБЫ СДЕЛАТЬ ЖАЛОПУ ОСТАНОВИТЬ ЖАЛОБУ.

Описание

Входными и выходными данными для вашего решения будут строки, содержащие только печатные символы ASCII.

Входная строка будет содержать ноль или более заглавных букв . A Caps Lock запуска (или CLR , для краткости) определяется следующим образом :

  • CLR не должен содержать строчных букв ( a-z), кроме как в качестве первого символа слова .

    • Слово , для целей этой задачи, представляет собой последовательность не-пространств. Таким образом, PPCG, correcthorsebatterystapleи jkl#@_>00()@#__f-023\f[все это считается слово s.
  • CLR также должен содержать хотя бы один пробел; следовательно, это должно быть как минимум два слова s.

  • Каждое слово s в CLR должно содержать как минимум две буквы ( A-Za-z).

    • Обратите внимание, что это относится к CLR, взятому сам по себе, без каких-либо окружающих символов, которые, возможно, не были включены в CLR. Например, это не CLR , потому что строка сама по себе имеет слово s менее двух букв.foO BarO B

CLR должны анализироваться «жадно», то есть вы всегда должны находить самые длинные CLR.

Как только вы определили все CLR во входной строке, поменяйте регистр всех букв внутри CLR и выведите полученную строку.

Контрольные примеры

Первая строка является входной, а вторая - выходной. Части ввода, выделенные полужирным шрифтом, представляют собой подстроки, которые считаются CLR.

CAPS LOCK IS THE BEST!
caps lock is the best!
I really LOVE pROGRAMMING pUZZLES AND cOde Golf!
I really love Programming Puzzles and Code Golf!
This is a challenge on PPCG. This is a test CASE. TEST
This is a challenge on PPCG. This is a test case. test
LorEM iPSUM DOLoR sIT amet, conSECTETur ADIPISciNG eLIT. MAECENAS iD orci
Lorem Ipsum doloR sIT amet, conSECTETur ADIPIScing Elit. maecenas Id orci
;'>}{/[]'"A*(389971(*(#$&B#@*(% c'>#{@D#$! :,>/;[e.[{$893F
;'>}{/[]'"a*(389971(*(#$&b#@*(% C'>#{@d#$! :,>/;[e.[{$893F
iT'S cAPS lOCK DAY!!! cELebraTE THis WONDERFUL key
It's Caps Lock day!!! Celebrate this WONDERFUL key
aBcDE fGHIj KLmNO pQrST (uVwXY) ZZ___Zz__Z
aBcde Fghij KLmno PqrST (uVwxy) zz___zz__Z
#aA# aA
#aA# aA

правила

  • Вы можете предположить, что входные данные никогда не будут содержать два или более пробелов подряд и что он никогда не будет содержать начальный или конечный пробел.

  • Бонус 20% (умножьте длину кода на 0,8), если весь ваш код является CLR. ;) (в основном просто для удовольствия, так как вряд ли победитель получит этот бонус)

  • Это , поэтому выигрывает самый короткий код в байтах.


16
Пожалуйста, прекрати кричать.
TheDoctor

4
Кроме того, для контрольного примера № 3, не будет ли заглавная PPCG также в нижнем регистре? ( PPCG. Tсодержит пробел)
TheDoctor


2
@ Денис Я читал это голосом Морти (от Рика и Морти), потому что он разговаривает с "Риком".
mbomb007

1
"бонусные баллы за ваш код, являющийся CLR", просто заставляют меня хотеть сделать это в LOLCODE ...
кошка

Ответы:


4

CJam, 100 86 83 81 байт

Ml{_,),{1$<_S/(4$!>\1f>s+_eu=*S%_{'[,_el^:Af&s,2<},!*1>},_{W=/(AA26m>er}{;(}?\s}h

Попробуйте эту скрипку в интерпретаторе CJam или проверьте все тестовые случаи одновременно .

Алгоритм

  1. Определите максимально длинный CLR, который начинается с первого символа.

  2. Если он существует, поменяйте его регистр, распечатайте его и удалите из начала строки.

    Иначе, удалите один символ из начала строки и напечатайте его без изменений.

  3. Если осталось больше символов, вернитесь к шагу 1.

Как это работает

Ml         e# Push an empty string and a line from STDIN.
{          e# Do:
  _,       e#   Copy the string on the stack and compute its length (L).
  ),       e#   Push [0 ... L].
  {        e#   Filter; for each integer I in that array:
    1$<    e#     Copy the string and keep its first I characters.
    _S/    e#     Push a copy and split at spaces.
    (      e#     Shift out the first word.
    4$!    e#     Push the logical NOT of the fifth topmost item of the stack.
           e#     This pushes 1 for the empty string on the bottom, and 0
           e#     for non-empty strings and printable characters.
    >      e#     Remove that many characters from the beginning of the first word.
           e#     This will remove the first character iff the string on the
           e#     stack is the entire input. This is to account for the fact that
           e#     the first word is not preceded by a space.
    \1f>   e#     Remove the first character of all remaining words.
    s+     e#     Concatenate all of them.
    _eu=   e#     Convert a copy to uppercase and check for equality.
    *      e#     Repeat the I characters 1 or 0 times.
    S%_    e#     Split at runs of spaces, and push a copy.
    {      e#     Filter; for each non-empty word:
      '[,  e#       Push the string of all ASCII characters up to 'Z'.
      _el  e#       Push a copy and convert to lowercase.
      ^    e#       Perform symmetric difference, pushing all letters (both cases).
      :A   e#       Store the result in A.
      f&s  e#       Intersect A with each character of the word. Cast to string.
      s    e#       This removes all non-letters from the word.
      ,2<  e#       Count the letters, and compare the result to 2.
    },     e#     If there are less than 2 letters, keep the word.
    !      e#     Push the logical NOT of the result.
           e#     This pushes 1 iff all words contain enough letters.
    *      e#     Repeat the array of words that many times.
    1>     e#     Remove the first word.
  },       e#   Keep I if there are still words left.
  _{       e#   If at least one I was kept:
    W=     e#     Select the last (highest) one.
    /      e#     Split the string on the stack into chunks of that length.
    (      e#     Shift out the first chunk.
    AA26m> e#     Push "A...Za...z" and "a...zA...Z".
    er     e#     Perform transliteration to swap cases.
  }{       e#   Else:
    ;      e#     Discard the filtered array.
    (      e#     Shift out the first character of the string on the stack.
  }?       e#
  \s       e#   Swap the shifted out chunk/character with the rest of the string.
}h         e# If the remainder of the string is non-empty, repeat.

5
Как это работает: играет 20 нот E # на фортепиано.
kirbyfan64sos

Я добавил еще несколько деталей. : P
Деннис

2

Perl 96 82 80 байт

-pe'$y=qr/[^a-z ]{2,}|\b\S[^a-z ]+/;s#$y( $y)+#join$,,map{uc eq$_?lc:uc}$&=~/./g#eg'

Проходит все тесты. Предполагается ввод с STDIN, печать на STDOUT.

Как это работает:

  • установить регулярное выражение ( $y), которое соответствует

    • по крайней мере два нестрочных, непробельных символа ИЛИ
    • граница слова, за которой следует непробельный символ, за которым следует один или несколько непрописных непробельных символов
  • сопоставлять несколько экземпляров строк, разделенных пробелами, которые соответствуют $y, использовать s///для инвертирования регистра

Я уверен, что есть место для улучшения. Если есть способ избавиться от всей join-map-splitсделки, у вас все еще может быть шанс получить бонус :)


1
Вы можете сохранить несколько байтов, используя a-zвместо [:lower:]. Кроме того, -peобычно считается как 1 байт, а одинарные кавычки - как нулевые байты.
Деннис

@ Денис: Спасибо за предложение! Это позволило мне несколько упростить код - до 81 в соответствии с вашими рекомендациями об однострочниках Perl
Zaid

Этот ответ недопустим, поскольку он не проходит последний тестовый пример (недавно добавлено любезно предоставлено Деннисом).
Дверная ручка

2

Javascript, 193

decapslock =

a=>a.replace(/(^[a-z][^a-z ]+|[^a-z ]{2,})( [a-z][^a-z ]+| [^a-z ]{2,})+/g,b=>b.split` `.some(f=>f.split(/[a-z]/i).length<3)?b:b.split``.map(e=>e==(E=e.toUpperCase())?e.toLowerCase():E).join``)
<!-- Snippet UI -->
<input placeholder='sAMPLE tEXT' oninput="document.getElementsByTagName('p')[0].innerText=decapslock(this.value)" />
<p></p>

Объяснение:

a=>a.replace(/* giant regex */,
  b=>
    b.split` `.some(
      f=>
        f.split(/[a-z]/i).length < 3   // check for 2+ letters
    )
      ? b                              // .some() immediately returns true if it's invalid
      : b.split``.map(                 // otherwise it's valid, so flip case
          e=>
            e == (E = e.toUpperCase()) // is it uppercase?
              ? e.toLowerCase()        // change it to LC
              : E                      // change it to UC, which was already done for
                                       // the case check
            ).join``
        )
(
^[a-z][^a-z ]+ // check for a CLR starting at the beginning with LC
|
[^a-z ]{2,}    // check for a CLR that begins in the middle of a word or starts at the
               // beginning with UC
               // in both cases, 2+ letters are required
)
(
 [a-z][^a-z ]+ // check for the next word of the CLR, starting with LC
|
 [^a-z ]{2,}   // check for the next word of the CLR, starting with UC
)+             // check for 1 or more next words

Этот ответ недопустим, поскольку он не проходит последний тестовый пример (недавно добавлено любезно предоставлено Деннисом).
Дверная ручка

Ага, исправление добавило к этому тонны байтов. Но это исправлено
DankMemes
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.