문자열을 제거 일 수 있습니다.

많은 언어에는 중복을 제거하거나 목록이나 문자열을 “중복 제거”하거나 “고정화”하는 기본 제공 방법이 있습니다. 덜 일반적인 작업은 문자열을 “중복 제거”하는 것입니다. 즉, 나타나는 모든 문자에 대해 처음 항목이 유지됩니다.

삭제해야 할 문자에 다음과 ^같이 레이블이 지정된 예는 다음과 같습니다.

aaabcbccdbabdcd
  ^    ^ ^^^ ^^
aabcbcdd

당신의 임무는 정확히이 작업을 구현하는 것입니다.

규칙

입력은 하나의 빈 문자열 일 수 있습니다. ASCII 범위의 소문자 만 포함한다고 가정 할 수 있습니다.

출력은 문자열에서 이미 두 번 이상 나타난 모든 문자가 제거 된 단일 문자열이어야합니다 (그래서 가장 왼쪽에있는 두 항목은 유지됨).

문자열 대신 문자 목록 (또는 싱글 톤 문자열)으로 작업 할 수 있지만 형식은 입력과 출력간에 일관되어야합니다.

당신은 쓸 수 있습니다 프로그램이나 기능을 하고, 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다.

모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

모든 라인 쌍은 하나의 테스트 케이스이며, 입력과 출력이 뒤 따릅니다.



xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd

리더 보드

이 게시물의 하단에있는 스택 스 니펫은 답변 a) 언어별로 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 답변에서 리더 보드를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

## Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

## Perl, 43 + 3 (-p flag) = 45 bytes

언어 이름을 링크로 만들면 스 니펫에 표시됩니다.

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



답변

젤리 , 6 바이트

Qx2œ&@

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

Qx2œ&@  Main link. Argument: s (string)

Q       Unique; deduplicate s.
 x2     Repeat each character.
   œ&@  Take the multiset intersection of s and the previous result.


답변

자바 스크립트 (ES6), 42 48

편집 6 바이트 저장 들으 무려 @Neil

s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

설명 : 객체의 속성 ‘a’… ‘z’ k를 사용하여 각 문자에 대한 정보를 저장합니다 (이 경우 객체 k는 바이트를 절약하기 위해 정규 표현식입니다). 이러한 속성은 처음에 undefined있습니다. 자바 스크립트에서 숫자를 undefined제공하면 NaN(꽤), 문자열 ‘X’를 추가하면 "undefinedX"길이가 10 (실리) 인 문자열이 나타납니다. 더 많은 문자를 추가하면 더 긴 문자열이 나타납니다. 주어진 문자에 대해 얻은 문자열이 11보다 길면 해당 문자가 출력으로 복사되지 않습니다.

테스트

F=
s=>s.replace(k=/./g,c=>(k[c]+=c)[11]?'':c)

test=`

xxxxx
xx
abcabc
abcabc
abcdabcaba
abcdabc
abacbadcba
abacbdc
aaabcbccdbabdcd
aabcbcdd`.split`\n`
for(i=0;i<test.length;)
  a=test[i++],b=test[i++],r=F(a),
  console.log(r==b?'OK':'KO',a,'->',r,b)


답변

파이썬 2, 48 바이트

lambda s:reduce(lambda r,c:r+c*(r.count(c)<2),s)

c[r.count(c)/2:]의 길이가 같은 대안 c*(r.count(c)<2)입니다.


49 바이트 :

r=''
for c in input():r+=c*(r.count(c)<2)
print r


답변

레티 나 , 17 바이트

(.)(?<=\1.*\1.+)

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

간단한 정규식 바꾸기-문자가 이미 두 번 나타나면 일치하고 제거하십시오.


답변

Brachylog , 25 바이트

.v|s.g:.z:1a
:2fl<3
he~t?

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

s - Subset더 큰 하위 집합을 먼저 통합하므로 예를 들어 이전에 "aaa"시도 "aa"하기 때문에 작동합니다 "a".

  • 주요 술어 :

      .v         input = Output = ""
    |          Or
      s.         Output is an ordered subset of the input
      g:.z       Zip each character of the output with the output itself
      :1a        Apply predicate 1 on each element of the zip
    
  • 술어 1 : 모든 문자가 최대 두 번만 나타나는지 확인하십시오. 입력 =[String:Char]

    :2f        Find all valid outputs of predicate 2 (i.e. one output per occurence
                   of the char)
    l<3        There are less than 3 occurences
    
  • 술어 2 : 캐릭터의 등장. 입력 =[String:Char]

    he         Take a character of the string in the input
      ~t?      That character is the char of the input
    

답변

> <> , 22 바이트

i:0(?;::9g:}2(?o{1+$9p

온라인으로 사용해보십시오! 코드 박스를 사용하여 지금까지 카운트를 추적합니다.

i                       Read a char c of input
 :0(?;                  Halt if EOF
      :                 Make a copy - stack has [c c] at the top
       :9g              Get count stored at (c, 9)
          :}            Copy the count and move to bottom of stack
            2(?o        If the count is less than 2, output c
                {1+     Move the count back to the top of the stack and increment
                   $9p  Update cell at (c, 9)
                        [Instruction pointer moves to start as ><> is toroidal]


답변

J, 20 15 바이트

#~(3>[+/@:={:)\

문자열을 받아서 리턴하는 모나드 함수를 정의합니다. 여기서 사용해보십시오 . 용법:

   f =: #~(3>[+/@:={:)\
   f 'abaacbb'
abacb

설명

더 짧은 것으로 판명 되었기 때문에 다른 솔루션에서 사용하는 것과 동일한 알고리즘으로 전환했습니다 …

#~(3>[+/@:={:)\  Input is y.
  (          )\  For each prefix of y:
          =        compute the equality vector
     [     {:      of the prefix and its last element, and
      +/@:         take its sum. Now we have a vector r such that y[i] has its
                   r[i]'th occurrence at position i.
   3>              Mark those coordinates where r[i] < 3.
#~               Remove the non-marked characters from y.