복제 및 스위치 케이스


34

목표는 문자열을 입력으로 사용하여 각 라틴 문자를 복제하고 대소 문자를 "토글"하는 것입니다 (즉, 대문자는 소문자가되고 그 반대도 마찬가지 임).

입력 및 출력 예 :

Input      Output
bad        bBaAdD
Nice       NniIcCeE
T e S t    Tt eE Ss tT
s E t      sS Ee tT
1!1!1st!   1!1!1sStT!
n00b       nN00bB     
(e.g.)     (eE.gG.)
H3l|@!     Hh3lL|@!

입력은 인쇄 가능한 ASCII 기호로 구성됩니다.

비 라틴 문자, 숫자, 특수 문자는 복제해서는 안됩니다.


17
이것은 매우 훌륭하고 단순하지만 쉽지 않은 도전입니다.
Mego

답변:



17

파이썬, 56 54 바이트

lambda s:''.join(c+c.swapcase()*c.isalpha()for c in s)

Ideone에서 테스트하십시오 .


댕! 밖으로 4 바이트로 골프를 쳤다 ...
R. Kap

문자가 아닌 문자를 어떻게 유지합니까? 나는 그들이 빈 문자열로 나타날 것이라고 생각합니다.
atlasologist

@atlasologist Ideone에서 볼 수 있듯이 그들은 그렇지 않습니다. *보다 우선 순위가 높 +으므로 c교환 된 대소 문자 에만 영향을줍니다 .
Dennis

오, 알았어요. 그렇게 생각하지 않았습니다. 좋은.
atlasologist

16

자바 스크립트 ES6, 70 68 66 64 바이트

Kenny가 아닌 @Kevin Lau 덕분에 2 바이트 절약

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ 덕분에 2 바이트 절약

s=>s.replace(/[A-Z]/gi,l=>l+l[`to${l<"a"?"Low":"Upp"}erCase`]())

설명

이것은 정말로 해키를 사용합니다 :

l[`to${l<"a"?"Low":"Upp"}erCase`]()

ungolfed는 :

l[`to${
   l < "a" ?
   "Low" : 
   "Upp"
}erCase`]()

기본적으로 l < "a"문자의 코드 포인트가 코드 포인트 a(따라서 대문자)보다 작은 지 확인합니다. 이 경우는 다하겠습니다 to + Low + erCasebecomed있는 l['toLowerCase']()및 문자 소문자한다. `따옴표는 문자열 형식을 허용하므로 본질적으로 다음을 생각할 수 있습니다.

`to${l < "a" ?"Low" : "Upp"}erCase`

as : "to" + (l<"a" ? "Low" : "Upp") + "erCase"호출 할 함수를 생성합니다 (문자열을 대문자 또는 소문자로). 이를 대괄호로 묶어 [ ... ]이름이 문자열 인 속성에 액세스 할 수 있습니다. 이것은 적절한 함수를 반환 한 다음 호출합니다.


3
/[A-Z]/gi더 짧은 정규 표현식입니다 : 3
Value Ink

@ KevinLau-notKenny 오, 좋은 캐치 감사합니다!
Downgoat

1
to${l<"a"?"Lower":"Upper"}Caseto${l<"a"?"Low":"Upp"}erCase
코너 오브라이언

@ CᴏɴᴏʀO'Bʀɪᴇɴ 아, 감사합니다!
Downgoat

4
l[`to${l<"a"?"Low":"Upp"}erCase`]()우리는 악에 대한 새로운 정의를 가지고 있다고 생각합니다.
gcampbell

10

루비, 37 33 (30 + -p플래그) 바이트

swapcase구조에! 일종의. @Lynn에서 -4 바이트

gsub(/[a-z]/i){$&+$&.swapcase}

gsub(/[a-z]/i){$&+$&.swapcase}플러스 p플래그는 31 바이트입니다.
Lynn

1
@Lynn 컨센서스가 기본 스크립트와 필요한 편집 차이점이라고 생각하므로 p플래그는 (space)-p3 바이트입니다.
밸류 잉크

8

C, 63 60 바이트

f(char*s){for(;*s;s++)isalpha(putchar(*s))&&putchar(32^*s);}

등을 사용합니다 'a' XOR 32 == 'A'.

FryAmTheEggman 덕분에 3 바이트가 절약되었습니다.


s++마지막 바이트putchar ( &&putchar(32^*s++))를 이동하여 1 바이트
Giacomo Garabello

나는 당신이 바꿀 수 있다고 생각 &&*당신이 할 수 없습니다?
aloisdg는 Reinstate Monica

1
&&단락 동작이 어떻게 작동하는지 생각해 보면 두 가지 모두 작동하지 않는다고 확신 합니다.
Lynn

f(char*s){isalpha(putchar(*s))&&putchar(32^*s);*s&&f(1+s);}재귀?
l4m2

1
f(char*s){*s&&f(1+s,isalpha(putchar(*s))&&putchar(32^*s));}재귀?
l4m2

6

CJam, 11 바이트

l_el_eu.+.|

여기에서 테스트하십시오.

설명

l      e# Read input.
_el    e# Duplicate, convert to lower case.
_eu    e# Duplicate, convert to upper case.
.+     e# Concatenate the two characters in matching positions from those two
       e# strings. E.g. "ab!" "AB!" would give ["aA" "bB" "!!"].
       e# For each character from the original string and the corresponding 
.|     e# string from this list, take the set union (which eliminates duplicates
       e# and keeps the order the values appear in from left to right, so that
       e# the original case of each letter comes first).



5

하스켈, 73 바이트

l=['a'..'z']
u=['A'..]
(>>= \c->c:maybe""pure(lookup c$zip l u++zip u l))

5

체다 , 118 104 바이트

(s)->s.chars.map((i)->{if String.letters has i.lower{if i<"a"{i+i.lower}else{i+i.upper}}else{i}}).join()

최초의 실제 체다 답변! 이것은 내가 생각했던 것보다 훨씬 덜 기후입니다 ...; _;

경쟁이 아닌 릴리스 1.0.0-beta.9호환 됩니다.


내가 알 수 있듯이 체다가 골프가되도록 디자인하지 않았다 : /

언 골프 드 :

(str) -> str.chars.map(
    (i) -> {
        if String.letters has i {
            if i < "a" { // Check char code, meaning it's upper case if true
                i+i.lower
            }
            else {
                i+i.upper
            }
        } else {
            i
        }
    }
).join()

용법:

var doThing = <code here>;
doThing("input...");

업데이트 : 7/14/16 3 바이트를 완료하여 84 바이트로 줄였습니다.

체다, 84 바이트

(s)->s.chars.map((i)->String.letters has i.lower?i<"a"?i+i.lower:i+i.upper:i).join()

버전 v1.0.0-beta.14부터 작동


4
예이! 우리는이 순간을 오랫동안 기다리고있었습니다!
DJMcMayhem

하나 또는 두 개의 메소드 이름 변경으로도 유효합니다. Sidef
cat

@cat o_o 유사성이 불안정합니다
Downgoat

글쎄, 둘 다 Perl, Perl 6, Ruby, Python 등의 영향을 받기 때문에 놀라운 것은 아닙니다. : P
cat

1
@ cat oh no no no no, cheddar는 python의 영향을 받지 않았습니다
Downgoat

4

레티 나, 28 27 21 바이트

그것들은 공백이 아닌 탭입니다.

.
$&  $&
T`lL    p`Ll_`  .

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

제안 해 주셔서 감사합니다.


공간은 SE가 먹습니다.
코너 오브라이언

[A-Za-z]->i`[A-Z]
Downgoat

Martin과 나는 대화중에 대화를 나 with 다 : retina.tryitonline.net/…
FryAmTheEggman

@FryAmTheEggman 아, 나는 잊어 버렸습니다 _. 탭을 사용하여 모든 테스트 사례를 한 번에 테스트 할 수 있습니다.
mbomb007

1
그러나 테스트 스위트는 골프를 밟을 필요가 없습니다. 여기에서는 탭 문자의 열풍을 저장합니다.
FryAmTheEggman

4

C, 87 80

문자열을 입력으로 전달 f()하면 출력이 STDOUT에 기록됩니다. 문자열은 수정되지 않습니다.

f(char*v){for(;*v;++v)putchar(*v),isalpha(*v)?putchar(*v-32+64*!islower(*v)):0;}

온라인으로 사용해 볼 수있는 방법을 제공 할 수 있습니까?
aloisdg는 Reinstate Monica

시도 @aloisdg ideone.com
고양이

4

sed, 30 바이트

29 바이트 코드 + 1 바이트 매개 변수 -r

s/([a-z])|([A-Z])/&\u\1\l\2/g

용법:

echo -e 'bad\nNice\nT e S t\ns E t\n1!1!1st!\nn00b\n(e.g.)\nH3l|@!' |\
sed -r 's/([a-z])|([A-Z])/&\u\1\l\2/g'

4

J, 31 29 바이트

[:;]<@~."1@,.tolower,.toupper

설명

[:;]<@~."1@,.tolower,.toupper  Input: s
                      toupper  Convert s to all uppercase
             tolower           Convert s to all lowercase
                    ,.         Join them as columns in a 2d array
   ]                           Identity function, get s
           ,.                  Prepend s as a column to the 2d array
      ~."1@                    Take the unique chars on each row
    <@                         Box them
[:;                            Unbox the list of boxes and join their contents and return

4

하스켈, 121, 101, 85, 82

import Data.Char
g n|isLower n=toUpper n|1<2=toLower n
(>>= \x->x:[g x|isAlpha x])

3
가드로 if-then-else를 교체하면 15 바이트 정도를 절약 할 수 있습니다. 그리고 5 바이트 이상을 사용 isLower하는 구문보다 짧습니다 elem.
arjanen

1
>>=는 인수가 뒤집힌 상태에서 concatMap(또는 concat.map)입니다 f n = n >>= (\x->if isAlpha x then[x,r x]else[x]). pointfree로 이동하여 함수 이름을 생략하고의 정의를 f로 바꿀 수 있습니다 (>>= \x->if isAlpha x then[x,r x]else[x]).
nimi

1
대신에 otherwise당신이 어떤 표현을 사용할 수있다는 평가됩니다에 True, 예를 들면 1<2. 를 if .. then .. else목록 이해 :로 대체 할 수 있습니다 \x->[x]++[g x|isAlpha x]. 아, 그리고 버그가 있습니다 : 두 번째 toUpperg이어야합니다 toLower.
nimi

1
아, 하나 더 : [x]++입니다 x:.
nimi

4

펄, 36 바이트 (35 + -n플래그)

s/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige

( -p태그 필요)

(@Dom Hasting 덕분에 2 바이트)

간단한 설명 :
ord문자의 숫자 값을 반환합니다. ord(any lower case) >= 97, ord(any upper case) <= 90).

로 실행 :

perl -pe 's/[a-z]/$&.(ord$&<97?lc$&:uc$&)/ige'

여전히 사용해야 /i하거나 정규 표현식이 문자 사이의 여러 코드 포인트와 일치합니다.
Oleg V. Volkov

@ OlegV.Volkov 아, 고마워요, 답변 편집되었습니다.
Dada

방법을 사용하여 한 바이트 더 줄였습니다. 온라인으로 사용해보십시오!
Xcali

4

루비, 31 + 1 = 32 30 + 1 = 31 바이트

-p플래그, 실행

gsub(/(?<=(.))/){$1.swapcase!}

블록에서 반환 될 때 빈 문자열로 변환되는 ASCII 문자 이외의 다른 문자를 swapcase!반환 한다는 사실을 이용 nil합니다 gsub. @Jordan은 이전 문자를 뒤에서 캡처하여 바이트를 절약했습니다.


일치 //하고 사용하는 $`[-1]것이 영리합니다.
Jordan

1
lookbehind :로 6 바이트를 깎을 수있었습니다 gsub(/(?<=(.))/){$1.swapcase!}. 그러나 동일한 기본 개념이므로 자유롭게 사용하십시오.
Jordan

시원한! 그것은 1 바이트 더 짧아 보입니다.
histocrat

네, 1 바이트입니다. 실수로 계산 한 테스트를 위해 추가 코드가 있다고 생각합니다.
Jordan

의 자체 수정 버전을 사용할 필요가 없습니다 .swapcase!. (내 말은,. 제거 !)
manatwork

4

R, 191 187 168 156 98 99 바이트

GiuseppeMickyT의 개선으로 인한 99 바이트 .

paste0(x<-unlist(strsplit(readline(),"")),gsub("[^A-Za-z]","",chartr("a-zA-Z","A-Za-z",x)),collapse="")

98 바이트 -아마도 내년 쯤에 또 다른 골프 인 하하하를 찾을 수있을 것입니다.
주세페

1
나는 나쁜 새로운 사람을 낳는 것을 싫어하지만 공백이있는 테스트 케이스에서는 실패합니다. readline()사용할 수 있지만 바이트 비용이 발생합니다
MickyT

@MickyT 감사합니다, 지금 수정되었습니다.
rturnbull

@MickyT scan는 따옴표로 묶인 입력에 대해 작동합니다 (다른 언어의 명령 행 인수와 마찬가지로)
Giuseppe

@Giuseppe 미안하지만 나는 그것을 몰랐다. 공백이 아닌 문자를 지정하지 않으면 공백으로 자동 분할되는 것으로 생각했습니다. 죄송합니다 rturnbull
MickyT

3

05AB1E , 7 바이트

암호:

vyyš«Ù?

설명:

v       # For each in input.
 yyš    # Push y and y swapcased.
    «Ù  # Concatentate and uniquify.
      ? # Print without a newline.

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


통역사와의 링크를 제공 할 수 있습니까?
nicael

2
@nicael It is linked ... 그것은 바로 github에 있습니다.
mbomb007

온라인 통역사가 없습니까? :(
nicael

@nicael 그런 다음 다운로드하여 실행하십시오. 온라인 통역사 가 필요하지 않으며 통역사 만 있으면됩니다.
mbomb007

1
@nicael 네, 아직 온라인 통역사가 없습니다 :(. 오프라인 버전은 작동합니다.
Adnan



3

실제로 8 바이트

`;Öo╔`MΣ

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

설명:

`;Öo╔`MΣ
`;Öo╔`M   for each character in input:
 ;          duplicate the character
  Ö         swap case
   o        append to original character
    ╔       remove duplicated characters
       Σ  concatenate

3

MATL, 11 9 바이트

tYov"@uv!

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

설명

        % Implicitly grab input as string
t       % Duplicate the input
Yo      % Swap case of all characters
v       % Vertically concatenate the original and swap-cased versions
"       % For each column (letter in the original)
  @u    % Compute the unique values (without sorting)
  v!    % Vertically concatenate with the existing output and transpose
        % Implicit end of for loop and implicit display

3

Perl, 28 22 21 바이트 (20 + -p플래그)

s/[a-z]/$&.$&^$"/ige

$"대신을 사용하여 바이트를 절약 할 수 있다고 생각 ' '하지만 테스트하지는 않았습니다.
msh210

@ msh210, 좋아! 기본 문자열에 대해 perlvar를 확인하는 것을 어떻게 잊을 수 있습니까? 감사!
올렉 V. 볼코프

3

Stax , 7 6 바이트

바이트를 저장 한 @recursive 덕분에!

┤§ÆP♦■

staxlang.xyz에서 실행하고 디버그하십시오! (링크는 압축 해제 버전입니다)

압축 해제 (7 바이트) :

c:~\{um

설명:

c:~\{um
c          Copy the top element of the stack (the input, in this case).
 :~        Switch case of each letter in the copy.
   \       Zip. This produces an array of two-character strings.
    { m    Map a block over this array of two-character strings.
     u       Get all unique elements.
           Implicit concatenate and print.

stax를 사용해 주셔서 감사합니다. 한 가지 쉬운 개선 방법은 u대신에 사용하는 것입니다 :g. 배열의 모든 고유 요소를 가져옵니다.이 경우 정확히 원하는 것입니다. 그 외에는 골프를 잘하는 것 같습니다.
재귀

@ 재귀 감사합니다! 그 중 하나를 잊어 버렸습니다 : / 곧 수정됩니다.
Khuldraeseth na'Barya

작동하지 않습니다 123. 모든 입력 형식을 변경해야 할 수도 있습니다 (예 : 인용). 링크도 끊어졌습니다. 당신은 교체해야 m=11와 함께 m=2. staxlang.xyz에는 PPCG 포스트 생성 버튼이 있으므로 해당 버튼을 사용할 수 있습니다.
Weijun Zhou

@WeijunZhou 감사합니다!
Khuldraeseth na'Barya

2

파이썬, 59 바이트

lambda s:''.join((x,x+x.swapcase())[x.isalpha()]for x in s)

알파벳이 아닌 문자를 반복 수정하도록 편집



2

PHP 4.1, 57 바이트

이 코드는 기본 구성을 사용하여 웹 서버 (예 : Apache)를 통한 액세스를 가정합니다.

당신은 키를 전송하여 문자열을 전달할 수 S있는 수단으로 ( POST, GET, COOKIE, SESSION...).

<?for($i=0;$c=$S[$i++];)echo$c,ctype_alpha($c)?$c^' ':'';


2

공통 Lisp (Lispworks), 262 바이트

(defun f(s)(let((b""))(dotimes(i(length s))(if(lower-case-p(elt s i))(progn #1=(setf b(concatenate 'string b(string #2=(elt s i))))(setf b(concatenate 'string b(string(char-upcase #2#)))))(progn #1#(setf b(concatenate 'string b(string(char-downcase #2#)))))))b))

언 골프 :

(defun f (s)
  (let ((b ""))
    (dotimes (i (length s))
      (if (lower-case-p (elt s i))
          (progn
           #1=(setf b (concatenate 'string b (string #2=(elt s i))))
           (setf b (concatenate 'string b (string (char-upcase #2#)))))
        (progn
          #1#
          (setf b (concatenate 'string b (string (char-downcase #2#)))))))
    b))

용법:

CL-USER 1 > (f "abc")
"aAbBcC"

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