ЗАКЛЮЧЕН ДЕНЬ КАПА


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% бонус (помножте довжину коду на .8), якщо весь ваш код є CLR. ;) (здебільшого просто для розваги, оскільки навряд чи подання, що виграє, матиме цей бонус)

  • Це , тому виграє найкоротший код у байтах.


16
Будь ласка, перестань кричати.
— TheDoctor

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


2
@Dennis Я читав, що в голосі Морті (від Ріка і Морті), б / с він розмовляє з "Ріком".
— 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 байт, а одиничні лапки як нульові байти.
— Денніс

@Dennis: Дякую за пропозицію! Це дозволило мені дещо спростити код - до 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.