인쇄 가능한 ASCII 문자 로 구성된 문자열이 제공 되면 고유 한 문자 로 구성된 출력을 원래 순서대로 생성하십시오 . 즉, 출력은 문자가 이전에 나타난 경우 제거된다는 점을 제외하고 입력과 동일합니다.
배열에서 고유 한 요소를 찾기위한 기본 제공 기능 을 사용할 수 없습니다 (예 : MATLAB에는이를 수행하는 unique
기능이 있습니다). 아이디어는 수동으로 수행하는 것입니다.
자세한 내용은 :
- 어느 기능이나 프로그램을 사용할 수 있습니다.
- 입력 및 출력은 함수 인수, stdin / stdout (함수의 경우에도) 또는 이들의 혼합 형식 일 수 있습니다 .
- stdin 또는 stdout을 사용하는 경우 문자열은 chars 시퀀스로만 이해됩니다 . 함수 인수를 사용하는 경우, 문자의 순서가 될 필요가있다 동봉 인용 부호 또는 이에 상응하는 문자의 문자열을 정의하기위한 선택 용도의 프로그래밍 언어가.
- 출력은 입력의 고유 문자 만 포함 하는 문자열이어야합니다 . 따라서 추가 줄 바꿈, 공백 등은 없습니다. 유일한 예외는 다음과 같습니다. 출력이 표준 출력으로 표시되는 경우 대부분의 표시 함수는 후행을 추가합니다
\n
(문자열을 다음에 나오는 것과 분리). 따라서 stdout에는 하나의 후행\n
이 허용됩니다 . - 가능 하면 다른 사람들이 귀하의 코드를 시도 할 수 있도록 온라인 인터프리터 / 컴파일러에 대한 링크를 게시 하십시오.
이것은 코드 골프 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.
stdin 및 stdout을 가정하면 몇 가지 예 는 다음과 같습니다.
-
입력 문자열 :
Type unique chars!
출력 문자열 :
Type uniqchars!
-
입력 문자열
"I think it's dark and it looks like rain", you said
출력 문자열
"I think'sdarloe,yu
-
입력 문자열
3.1415926535897932384626433832795
출력 문자열
3.14592687
답변
GolfScript, 2 바이트
.&
또는 대안 적으로 :
.|
나는 이것을 GolfScript 스레드의 골프 팁에 얼마 전에 게시했습니다 . 입력 문자열 (GolfScript 인터프리터에 의해 자동으로 스택에 배치되고 문자 배열처럼 대부분의 방식으로 작동 함)을 복제 한 다음 자체적으로 설정된 교차점 ( &
) 또는 공용체 ( |
)를 가져옵니다. 배열 (또는 문자열)에 집합 연산자를 적용하면 모든 중복이 축소되지만 요소의 순서는 유지됩니다.
답변
답변
C # 6, 18 + 67 = 85 바이트
이 using
진술 이 필요 합니다 :
using System.Linq;
실제 방법 :
string U(string s)=>string.Concat(s.Where((x,i)=>s.IndexOf(x)==i));
이 방법은 함수를 lambda로 정의하여 일부 문자를 저장 합니다.이 함수 는 C # 6에서 지원됩니다. 이것은 C # pre-6 (그러나 ungolfed)에서 보이는 방식입니다.
string Unique(string input)
{
return string.Concat(input.Where((x, i) => input.IndexOf(x) == i));
}
작동 방식 : 문자열에 대해 두 개의 인수가있는 람다로 Where
메서드 를 호출합니다 x
. 현재 요소를 i
나타내며 해당 요소의 색인을 나타냅니다. IndexOf
는 항상 전달 된 char의 첫 번째 인덱스를 반환하므로의 첫 번째 인덱스와 i
같지 않으면 x
중복 char이므로 포함해서는 안됩니다.
답변
레티 나 , 14 바이트
+`((.).*)\2
$1
각 줄은 별도의 파일로 들어가거나 -s
플래그를 사용하여 한 파일에서 읽을 수 있습니다 .
이를 설명하기 위해 더 길지만 간단한 버전을 사용합니다.
+`(.)(.*)\1
$1$2
첫 번째 줄은 일치시킬 정규식입니다 ( +`
모든 교체가 이루어질 때까지 계속 실행되는 구성 문자열입니다). 정규 표현식은 문자를 찾고 (C라고 함) 임의의 문자가 0 개 이상이고 C가 뒤에옵니다. 괄호는 캡처 그룹을 나타내므로 일치를 C ( $1
)로 바꾸고 ( ) 사이의 문자를 대체합니다 $2
. C의 복제본 제거
입력 문자열이 있다면 예를 들어 unique
, 첫 번째 실행이 일치 것 uniqu
으로, u
그리고 niq
같은 $1
과 $2
각각. 그런 다음 원래 입력에서 일치하는 하위 문자열을으로 바꾸고을 uniq
제공 uniqe
합니다.
답변
Perl, 21 (20 바이트 + -p
)
s/./!$h{$&}++&&$&/eg
용법:
perl -pe 's/./!$h{$&}++&&$&/eg' <<< 'Type unique chars!'
Type uniqchars!
답변
마카로니 0.0.2 , 233 바이트
set i read set f "" print map index i k v return label k set x _ set _ slice " " length index f e 1 1 set f concat f wrap x return label e set _ slice " " add _ multiply -1 x 1 1 return label v set _ unwrap slice i _ add 1 _ 1 return
- “골프 방지”언어 만들기 : 확인
- 어쨌든 골프 : 확인
STDIN에서 입력하고 STDOUT에서 출력하는 전체 프로그램입니다.
미적 가치를위한 포장 버전 :
set i read set f "" print map index i k v return label k set x _ set _ slice "
" length index f e 1 1 set f concat f wrap x return label e set _ slice " " add
_ multiply -1 x 1 1 return label v set _ unwrap slice i _ add 1 _ 1 return
그리고 심하게 “설명”되고 ungolfed 버전 (Macaroni에는 주석이 없으므로 베어 문자열 리터럴을 사용합니다) :
set input read "read line from STDIN, store in 'input' var"
set found "" "we need this for 'keep' below"
print map index input keep val "find indeces to 'keep', map to values, print"
return
label keep
"we're trying to determine which indeces in the string to keep. the special
'_' variable is the current element in question, and it's also the value
to be 'returned' (if the '_' variable is '0' or empty array after this
label returns, the index of the element is *not* included in the output
array; otherwise, it is"
set x _ set _ slice
" "
length index found exists
1
1
"now we're using 'index' again to determine whether our '_' value exists in
the 'found' array, which is the list of letters already found. then we
have to apply a boolean NOT, because we only want to keep values that do
NOT exist in the 'found' array. we can 'invert' a boolean stored as an
integer number 'b' (hence, 'length') with 'slice(' ', b, 1, 1)'--this is
equivalent to ' '[0:1], i.e. a single-character string which is truthy, if
'b' was falsy; otherwise, it results in an empty string if 'b' was truthy,
which is falsy"
set found concat found wrap x "add the letter to the 'found' array"
return
label exists
set _ slice
" "
add _ multiply -1 x
1
1
"commentary on how this works: since 0 is falsy and every other number is
truthy, we can simply subtract two values to determine whether they are
*un*equal. then we apply a boolean NOT with the method described above"
return
label val
set _ unwrap slice input _ add 1 _ 1 "basically 'input[_]'"
return
(이것은 최초의 실제 Macaroni 프로그램입니다 (실제로 수행하는 작업입니다)! \ o /)
답변
자바 스크립트 ES7, 37 33 25 바이트
ES6 Set
및 ES7 어레이 이해 확산 연산자를 사용하는 매우 간단한 접근 방식 :
s=>[...new Set(s)].join``
indexOf
접근 방식 보다 22 바이트가 적습니다 . 소수의 테스트 사례에서 작업했습니다.