IT는 CAP LOCK DAY


29

10 월 22 일은 국제 CAP LOCK DAY입니다 ! 안타깝게도 어떤 사람들은 거대 캡 자물쇠의 영광을 인식하지 못합니다. 그들은 "명백한"또는 "소리와 같은"또는 일부 엄숙한 것으로 간주합니다. 이러한 명백하고 비합리적인 불만에 부응하기 위해 일반 텍스트를 "합리적"또는 "합리적인"텍스트로 변환하여 사람들의 불만을 중지시키는 프로그램을 작성해주십시오.

기술

솔루션의 입력 및 출력은 모두 인쇄 가능한 ASCII 문자 만 포함하는 문자열입니다.

입력 문자열에는 0 개 이상의 caps lock 실행 이 포함 됩니다 . 캡 실행 잠금 (또는 줄여서 CLR)은 다음과 같이 정의한다 :

  • CLR은 단어 의 첫 문자를 제외하고 소문자 ( a-z)를 포함하지 않아야합니다 .

    • 말은 , 이러한 과제의 목적을 위해, 비 - 공간의 서열이다. 그래서 PPCG, correcthorsebatterystaple그리고 jkl#@_>00()@#__f-023\f[모든 고려 단어 들.
  • CLR에는 하나 이상의 공간이 있어야합니다. 따라서 적어도 두 단어 이상이어야합니다 .

  • CLR의 각 단어 는 적어도 두 글자 ( A-Za-z)를 포함해야합니다 .

    • 이는 CLR에 포함되지 않은 주변 문자없이 CLR 자체를 나타냅니다. 예를 들어, 문자열 자체에는 두 글자 미만의 단어 s 가 있으므로 CLR 이 아닙니다 .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

규칙

  • 입력에 행에 둘 이상의 공백이 포함되지 않으며 선행 또는 후행 공백이 포함되지 않는다고 가정 할 수 있습니다.

  • 전체 코드가 CLR 인 경우 20 % 보너스 (코드 길이에 0.8을 곱함). ;) (주로이기는 제출에이 보너스가 없을 가능성이 높기 때문에 대부분 재미를 위해)

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


16
소리지르세요.
TheDoctor

4
또한 테스트 사례 # 3의 경우 대문자 PPCG도 소문자로 표시되지 않습니까? ( PPCG. T공백 포함)
TheDoctor


2
@Dennis 저는 Morty의 목소리 (Rick and Morty)가 "Rick"과 대화하고 있다는 것을 읽었습니다.
mbomb007

1
"코드가 CLR 인 보너스 포인트"는 LOLCODE에서이 작업을 수행하고 싶습니다 ...
cat

답변:


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
Dennis

2

펄, 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 바이트로 계산되고 작은 따옴표는 0 바이트로 계산됩니다.
Dennis

@Dennis : 제안 해 주셔서 감사합니다! 펄 원 라이너에 대한 지침에 따라 코드를 81 개까지 약간 단순화 할 수있었습니다.
Zaid

이 답변은 마지막 테스트 사례를 통과하지 못하기 때문에 유효하지 않습니다 (최근 데니스가 제공 한 예).
Doorknob

2

자바 스크립트, 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

이 답변은 마지막 테스트 사례를 통과하지 못하기 때문에 유효하지 않습니다 (최근 데니스가 제공 한 예).
Doorknob

Argh, 수정은 이것에 많은 바이트를 추가했습니다. 그러나 그것은 수정되었습니다
DankMemes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.