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.


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.

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 :)


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.