많은 언어에는 중복을 제거하거나 목록이나 문자열을 “중복 제거”하거나 “고정화”하는 기본 제공 방법이 있습니다. 덜 일반적인 작업은 문자열을 “중복 제거”하는 것입니다. 즉, 나타나는 모든 문자에 대해 처음 두 항목이 유지됩니다.
삭제해야 할 문자에 다음과 ^같이 레이블이 지정된 예는 다음과 같습니다.
aaabcbccdbabdcd
^ ^ ^^^ ^^
aabcbcdd
당신의 임무는 정확히이 작업을 구현하는 것입니다.
규칙
입력은 하나의 빈 문자열 일 수 있습니다. ASCII 범위의 소문자 만 포함한다고 가정 할 수 있습니다.
출력은 문자열에서 이미 두 번 이상 나타난 모든 문자가 제거 된 단일 문자열이어야합니다 (그래서 가장 왼쪽에있는 두 항목은 유지됨).
문자열 대신 문자 목록 (또는 싱글 톤 문자열)으로 작업 할 수 있지만 형식은 입력과 출력간에 일관되어야합니다.
당신은 쓸 수 있습니다 프로그램이나 기능을 하고, 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다.
모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.
이것은 code-golf 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.
테스트 사례
모든 라인 쌍은 하나의 테스트 케이스이며, 입력과 출력이 뒤 따릅니다.
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
답변
답변
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.