대소 문자 구분 문자열로 더 재미있게


28

이 도전에서 영감을 얻거나보다 구체적으로 잘못 읽음으로써 다음과 같은 도전에 직면하게됩니다.

입력 문자열 S가 주어지면 모든 대문자와 모든 소문자의 순서를 반대로 바꿉니다. 문자 이외의 문자는 모두 그대로 두십시오. 예를 들어 :

Hello, World!

대문자 W(첫 번째 대문자)가 H(마지막) 으로 바뀌 었습니다 . 소문자도 마찬가지입니다. 'd'(첫 번째)가 e(마지막)으로 l바뀌고 , (second)가 l(pen-ultimate) 로 바뀝니다 . 문자가 아닌 모든 문자는 그대로 남아 있습니다.

입력

  • 입력은 32-126 범위의 ASCII 문자 만있는 문자열입니다.
  • 입력은 1 자 이상이어야하며 언어 제한을 초과하지 않습니다.

산출

  • 설명과 같이 문자가 바뀐 동일한 문자열.

추가 규칙

  • 표준 허점 은 금지되어 있습니다
  • 답변은 스 니펫이나 REPL 항목이 아닌 전체 프로그램 또는 기능이어야합니다.
  • , 바이트 단위의 최단 답변이 승리합니다.

테스트 사례

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

2 문자 테스트 사례를 포함하고 싶을 수도 있습니다. 처음에는 원래 솔루션이 실패했습니다. (로 변경 .+하여 무료로 수정 됨 .*)
ETH 프로덕션

"게으른 총독은"이 생각 나게 youtube.com/watch?v=W-d6uUSY9hk
FinW

답변:


5

MATL , 14 바이트

2:"t@Y2myy)Pw(

MATL Online에서 사용해보십시오

설명

        % Impicitly grab input as a string
2:      % Push the array [1, 2] to the stack
"       % For each value in this array
  t     % Duplicate the top element of the stack (S)
  @     % Get the current loop index
  Y2    % Load the predefined literal 1Y2 ('ABC...Z') on the first loop
        % and the predefined literal 2Y2 ('abc...z') on the second loop (M)
  m     % Create a logical array the length of S that is TRUE when a character is in the
        % array M and FALSE otherwise (B)
  yy    % Make a copy of both S and B
  )     % Grab just the letters of S that were in M using B as an index
  P     % Reverse this array
  w     % Flip the top two stack elements
  (     % Assign them back into the string
        % Implicit end of for loop and implicit display

1
잘 했어! 나는 한 2:"tttXk>f)5MP(Yo17 바이트
루이스 Mendo에게

11

레티 나 , 19 바이트

Retina는 문자열을 뒤집는 직접적인 방법은 없지만 정렬 단계를 활용하여 문자열을 되돌릴 수 있습니다.

O^#`[a-z]
O^#`[A-Z]

정렬 ( O)을 숫자 ( #) 로 읽은 다음 ^주어진 정규 표현식과 일치하는 모든 문자열 (첫 번째 줄은 소문자, 두 번째 줄은 대문자) 의 순서 ( ) 를 반대로 바꿉니다.

숫자가없는 문자열을 숫자로 처리하려고하면 숫자로 취급 0되므로 모든 문자의 정렬 값이 동일하기 때문에 작동합니다. 정렬은 안정적이므로 동일한 순서로 유지되며 반대로 바꾸면 원래 문자열이 반대로 반환됩니다.

온라인으로 사용해보십시오!


10

, 45 바이트

44 바이트의 코드 + -p플래그

for$c(u,l){@T=/\p{L$c}/g;s/\p{L$c}/pop@T/ge}

온라인으로 사용해보십시오!

유니 코드 문자 클래스 \p{Lu}\p{Ll}각각 대문자와 소문자를 찾습니다.
따라서 /\p{L$c}/모든 대문자 (또는 소문자) 목록을 반환하고 안에 저장합니다 @T.
그런 다음 정규 표현식 s/\p{$c}/pop@T/ge은에서 각 문자 (대문자, 소문자)를 마지막 문자로 @T바꿉니다 @T.


7

자바 스크립트 (ES6), 74 73 71 70 바이트

f=
s=>(g=r=>s=s.replace(r,_=>a.pop(),a=s.match(r)))(/[A-Z]/g,g(/[a-z]/g))
<input oninput=o.textContent=f(this.value)><pre id=o>

편집 : @ Arnauld 덕분에 1 바이트가 절약되었습니다.


4
내가 알고 ... 더 좋은 방법이 있었다
ETHproductions

5

자바 스크립트 (ES6), 92 바이트

s=>(F=(r,s)=>s.replace(r,([x],a,y)=>y+F(r,a)+x))(/[a-z](.*)([a-z])/,F(/[A-Z](.*)([A-Z])/,s))

이있다 얻었다 정규 표현식에 사이의 유사성을 활용하는 방법이 ...

테스트 스 니펫


이것은 함수가 f? 라는 변수에 할당되었다고 가정합니까 ? 바이트 수에 있어야합니까?
steenbergh

@steenbergh이 함수는 익명입니다. 원하는대로 호출 할 수 있습니다.
Kritixi Lithos

1
@ steenbergh 아니, 다른 함수를 만드는 익명의 함수 F 만든 다음 재귀 적으로 두 번 호출 . 외부 함수는 실제로 어떤 시점에서도 자신을 호출하지 않습니다.
ETHproductions

.*정규 표현식에서 괄호를 사용 합니까?
누가

@Luke가 그 캐릭터들을 포착하기 위해 ( a에서 ([x],a,y)=>)
ETHproductions

4

펄 6 , 75 69 바이트

{my @a=.comb;@(grep $_,@a).&{@$_=[R,] $_} for /<:Lu>/,/<:Ll>/;[~] @a}

작동 원리

  1. my @a=.comb;
    문자열을 문자로 나누고 배열에 저장하십시오.

  2. for /<:Lu>/,/<:Ll>/
    대문자와 소문자가 각각 일치하는 두 정규 표현식의 경우 ...

    • @(grep $_,@a)
      정규식과 일치하는 모든 배열 항목을 가져옵니다.

    • .&{@$_=[R,] $_}
      슬라이스의 뒷면을 자신에게 할당하십시오.

  3. [~] @a
    수정 된 배열을 연결하여 문자열을 다시 형성하고 반환합니다.


@Dada의 솔루션에서 문자 범위 대신 유니 코드 클래스를 사용하는 아이디어를 훔쳐 -6 바이트.


3

젤리 , 14 바이트

nŒlT,Ṛ$yJịŒsµ⁺

온라인으로 사용해보십시오!

작동 원리

nŒlT,Ṛ$yJịŒsµ⁺  Main link. Argument: s (string)

 Œl             Convert to lowercase.
n               Test for inequality.
   T            Truth; yield all indices of 1's.
    ,Ṛ$         Pair with its reverse. Yields [A, B] (pair of lists).
        J       Indices; yield I := [1, ..., len(s)].
       y        Translate; replace the integers of I that occur in A with the
                corresponding integers in B.
          Œs    Swapcase; yield s with swapped case.
         ị      Use the translated index list to index into s with swapped case.
            µ   Combine all links to the left into a chain.
             ⁺   Duplicate the chain, executing it twice.

nitpicky 아니지만 .... 14 문자! = 23 바이트 :) mothereff.in/
기즈모

@Gizmo Jelly는 코드 페이지를 사용합니다 . 자세한 내용은 이 메타 포스트 를 참조하십시오.
Suever

@Suever 오, 깔끔한 오늘 오늘 배웠어요 ^. ^
Gizmo

3

배시 + 유닉스 유틸리티 122 121 바이트

f()(p=[^$1*
v="\)\([$1\)\("
for((n=99;n;n--)){
q="$q;s/^\($p$v.*$v$p\)$/\1\4\3\2\5/"
p=[^$1*[$1$p
}
sed $q)
f a-z]|f A-Z]

온라인으로 사용해보십시오!

정말 짧지는 않습니다. 어쩌면 누군가가 더 골프를 칠 수 있습니다.

stdin에 입력하고 stdout에 출력

이것은 200 자 미만의 입력에서 올바르게 작동합니다.

(실제로 200 자 미만 및 200 자 미만의 문자열을 올바르게 처리합니다.)

코드에서 99를 102로 늘리면 (1 바이트 추가 비용) 문자열을 최대 205 자까지 처리합니다.

그러나 sed의 최대 인수 길이를 초과하므로 코드에서 99를 102 이상으로 늘릴 수 없습니다.

여기에 특별한 입력 크기 제한이없는 버전이 있지만 카운트는 조금 더 길지만 137 바이트입니다. (이 더 긴 버전은 t라는 보조 파일에 씁니다.)

f()(p=[^$1*
v="\)\([$1\)\("
for((n=`wc -c<t`;n;n--)){
sed -i "s/^\($p$v.*$v$p\)$/\1\4\3\2\5/" t
p=[^$1*[$1$p
})
cat>t
f a-z]
f A-Z]
cat t

시운전 :

for x in A Ok OK 'Hello, World!' 0123456789 'The quick brown Fox jumps over the lazy doge' odd racecar 'EtOn Em OsN R AaToNsIsIhT!!1!'
  do
    echo "$x"
    ./swapping3 <<<"$x"
    echo
  done

A
A

Ok
Ok

OK
KO

Hello, World!
Wdlro, Holle!

0123456789
0123456789

The quick brown Fox jumps over the lazy doge
Feg odyza lehtr Tev ospmu jxon wor bkci uqeh

odd
ddo

racecar
racecar

EtOn Em OsN R AaToNsIsIhT!!1!
ThIs Is NoT A RaNsOmEnOtE!!1!

TIO에서 실패한 것이 흥미 롭습니다. sedsystem 시스템에 설치된 구현 에 따라 다를 sed수 있지만 GNU 에 -r옵션 을 추가 하고 \모든 괄호 에서 이스케이프를 제거 할 수 있습니다 .
manatwork


2

자바 (OpenJDK 8) , 271 바이트

s->new String(new Error(){char[]o=s.toCharArray();char c;int b;{while(b++<2)for(int l=0,r=o.length;l<r;l++){for(--r;r>l&&f(r);r--);for(;l<r&&f(l);l++);if(l<r){o[l]=o[r];o[r]=c;}}}boolean f(int i){c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);}}.o)

온라인으로 사용해보십시오!


이것을 람다로 만들어 바이트를 절약 할 수 있습니다. s->new String...
NonlinearFruit

1
감사합니다! 294-> 272, 또한 초기화없이 r a l이 재사용 될 때의 실수를 수정했습니다.
DmitrySamoylenko 2012

PPCG에 오신 것을 환영합니다! 당신이 여전히 골프를 할 수있는 것들 : char[]o=s.toCharArray();char c;int b;to char o[]=s.toCharArray(),c,b;; 모두 &&&'; 과 c=o[i];return b>1?!Character.isUpperCase(c):!Character.isLowerCase(c);c=o[i];Character x=c;return b>1?!x.isUpperCase(c):!x.isLowerCase(c);( 총 259 바이트 ). 그리고 아마 골프를 더 할만한 것들을 놓쳤을 것입니다. 또한 아직 보지 못했다면 Java에서의 골프 팁 이 흥미로울 것입니다.
케빈 크루이 센

1

R , 107 바이트

u=utf8ToInt(scan(,''));for(i in c(65,97)){l=which(u%in%i:(i+25));u[l]=u[rev(l)]};cat(intToUtf8(u,T),sep="")

연결된 도전에 대한 나의 반응으로부터 적응했다. 이것은 단순히 쌍을 바꾸는 것보다 훨씬 쉽습니다. 골프로 100 이하를 얻을 수 있는지 궁금합니다 ...

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.