많은 언어에는 중복을 제거하거나 목록이나 문자열을 “중복 제거”하거나 “고정화”하는 기본 제공 방법이 있습니다. 덜 일반적인 작업은 문자열을 “중복 제거”하는 것입니다. 즉, 나타나는 모든 문자에 대해 처음 두 항목이 유지됩니다.
삭제해야 할 문자에 다음과 ^
같이 레이블이 지정된 예는 다음과 같습니다.
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.