DZIEŃ BLOKADY CAPS

29

PAŹDZIERNIK 22 JEST MIĘDZYNARODOWY CZAS ZAMKNIĘTY DZIEŃ ! NIESKOŃCZONE, NIEKTÓRE NIE UZNAJĄ CHWAŁY BLOKADY Wszechmocnego CAPSA. MÓWIĄ, ŻE WYGLĄDA „NIEPRAWIDŁOWE” LUB „LUBIĄCE ODKRYWANIE” LUB NIEKTÓRE NIEUCZCIWE. W CELU ZGODNOŚCI Z NINIEJSZYMI SKARGAMI ILLOGICZNYMI I INANOWYMI NALEŻY NAPISZ PROGRAM, KTÓRY ZWRACA NORMALNY TEKST W TEKST „WRAŻLIWY” LUB „UZASADNIONY”, ABY ZACHOWAĆ LUDZI.

Opis

Dane wejściowe i wyjściowe dla twojego rozwiązania będą ciągami zawierającymi tylko drukowalne znaki ASCII.

Łańcuch wejściowy będzie zawierał zero lub więcej uruchomień Caps Lock . A Caps Lock uruchomić (lub CLR w skrócie) jest zdefiniowana jak poniżej:

  • CLR nie może zawierać małych liter ( a-z), z wyjątkiem pierwszego znaku słowa .

    • Słowo , dla celów tego wyzwania, to sekwencja nie-przestrzeni. Tak więc PPCG, correcthorsebatterystaplei jkl#@_>00()@#__f-023\f[są uważane za słowo s.
  • CLR musi również zawierać co najmniej jedną spację; stąd muszą to być co najmniej dwa słowa .

  • Każde słowo w CLR musi zawierać co najmniej dwie litery ( A-Za-z).

    • Zauważ, że odnosi się to do CLR wziętego samodzielnie, bez otaczających znaków, które mogły nie zostać uwzględnione w CLR. Na przykład, to nie CLR ponieważ ciąg sama ma słowo s z mniej niż dwóch liter.foO BarO B

CLR powinny być analizowane „zachłannie” - to znaczy, że zawsze powinieneś znaleźć najdłuższe możliwe CLR.

Po zidentyfikowaniu wszystkich CLR w ciągu wejściowym zamień wielkość liter wszystkich liter w CLR i wyślij wynikowy ciąg.

Przypadki testowe

Pierwszy wiersz jest wprowadzany, a drugi jest wyprowadzany. Pogrubione części danych wejściowych to podciągi, które są uważane za 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

Zasady

  • Możesz założyć, że dane wejściowe nigdy nie będą zawierać dwóch lub więcej spacji w wierszu i że nigdy nie będzie zawierać spacji wiodących ani końcowych.

  • Bonus 20% (pomnóż długość kodu przez .8), jeśli cały kod to CLR. ;) (głównie dla zabawy, ponieważ jest mało prawdopodobne, że zwycięskie zgłoszenie będzie miało ten bonus)

  • To jest , więc wygrywa najkrótszy kod w bajtach.

Klamka
źródło
16
Przestań krzyczeć.
TheDoctor
4
Ponadto, w przypadku testowym nr 3, czy wielkie litery PPCG również nie będą pisane małymi literami? ( PPCG. Tzawiera spację)
TheDoctor
2
@Dennis Przeczytałem to głosem Morty'ego (od Ricka i Morty'ego), b / c mówi do „Ricka”.
mbomb007,
1
„punkty bonusowe za kod będący CLR” po prostu sprawiają, że chcę to zrobić w LOLCODE ...
cat

Odpowiedzi:

4

CJam, 100 86 83 81 bajtów

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

Wypróbuj to skrzypce w interpretatorze CJam lub zweryfikuj wszystkie przypadki testowe jednocześnie .

Algorytm

  1. Zidentyfikuj najdłuższy możliwy CLR, który zaczyna się od pierwszego znaku.

  2. Jeśli istnieje, zamień jego skrzynkę, wydrukuj ją i usuń z początku łańcucha.

    W przeciwnym razie usuń pojedynczy znak z początku łańcucha i wydrukuj go bez zmian.

  3. Jeśli pozostało więcej znaków, wróć do kroku 1.

Jak to działa

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.
Dennis
źródło
5
Jak to działa: odtwarza 20 nut E # na fortepianie.
kirbyfan64sos
Dodałem jeszcze kilka szczegółów. : P
Dennis,
2

Perl, 96 82 80 bajtów

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

Przechodzi wszystkie testy. Zakłada wejście z STDIN, drukuje do STDOUT.

Jak to działa:

  • ustaw $ypasującą funkcję regex ( )

    • co najmniej dwa znaki, które nie są małymi i białymi znakami LUB
    • granica słowa, po której następuje spacja, a po niej co najmniej jeden znak, który nie jest małymi literami
  • dopasuj wiele wystąpień ciągów oddzielonych spacją, które pasują $y, użyj s///do odwrócenia wielkości liter

Jestem pewien, że jest miejsce na ulepszenia. Jeśli istnieje sposób na pozbycie się całej join-map-splitumowy, może być szansa na zakwalifikowanie się do bonusu :)

Zaid
źródło
1
Możesz zapisać kilka bajtów, używając a-zzamiast [:lower:]. Ponadto -pejest zwykle liczony jako 1 bajt, a pojedyncze cudzysłowy jako bajty zerowe.
Dennis
@Dennis: Dzięki za sugestię! To pozwoliło mi nieco uprościć kod - do 81, zgodnie z twoimi wytycznymi na temat One-linerów Perla
Zaid
Ta odpowiedź jest nieprawidłowa, ponieważ nie przechodzi ostatniego testu (ostatnio dodane dzięki uprzejmości Dennisa).
Klamka
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>

Wyjaśnienie:

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
źródło
Ta odpowiedź jest nieprawidłowa, ponieważ nie przechodzi ostatniego testu (ostatnio dodane dzięki uprzejmości Dennisa).
Klamka
Argh, poprawka dodała do tego mnóstwo bajtów. Ale zostało naprawione
DankMemes