문자열에서 고유 한 문자를 찾는 것이 매우 일반적인 유스 케이스 인 것처럼 보이기 때문에이 질문에 왔습니다. 그러나 우리가 그들을 제거하려면 어떻게해야합니까?
입력은 소문자 알파벳 만 포함합니다. a에서 z까지의 문자 만 사용됩니다. 입력 길이는 1-1000 자입니다.
예 :
입력 : helloworld
출력 : llool
목표 : 코드가 가장 짧은
언어입니다. 언어 : TIOBE 언어 중 상위 20 개 언어
문자열에서 고유 한 문자를 찾는 것이 매우 일반적인 유스 케이스 인 것처럼 보이기 때문에이 질문에 왔습니다. 그러나 우리가 그들을 제거하려면 어떻게해야합니까?
입력은 소문자 알파벳 만 포함합니다. a에서 z까지의 문자 만 사용됩니다. 입력 길이는 1-1000 자입니다.
예 :
입력 : helloworld
출력 : llool
목표 : 코드가 가장 짧은
언어입니다. 언어 : TIOBE 언어 중 상위 20 개 언어
답변:
s/./$&x(s!$&!$&!g>1)/eg
용법:
> perl -pe 's/./$&x(s!$&!$&!g>1)/eg'
helloworld
llool
처음에 나는 부정적인 미리보기와 부정적인 표정으로 이것을 할 수 있다고 생각했지만, 부정적인 표정은 고정 길이를 가져야한다는 것이 밝혀졌습니다. 그래서 대신 중첩 정규 표현식을 사용했습니다. 팁에 대한 폭도 덕분 $&입니다.
-CDS옵션으로 perl을 실행하십시오
$1와 함께 $&당신은 괄호 몇 쌍을 잃을 수 있습니다.
:;{.;?);>?)},
GolfScript은 상위 20 중 하나지만, GolfScript없이 codegolf (없는 자신을 실행 )
이전 버전 : ( 스크립트 실행 )
1/:;{;\-,;,(<},
:;? 당신은 일부러 초보자를 혼동 시키려고 노력하고 있습니까? ;)
)그것을 선택 했어야했다 – 그것은 그것을 웃는 것으로 만들 것이다 :). 불행히도, 나는 숫자 1을 제거하는 방법을 찾지 못했습니다. (GolfScript 초보자를위한 참고 사항 : ;코드의 x어떤 문자도 (또는 다른 문자 또는 숫자-그렇지 않으면 스크립트에서 사용되지 않는 문자)로 바꿀 수 있습니다 .) 이 특수한 경우 ;에는 변수 이름 일 뿐이며 "pop and waste"라는 의미가 없습니다. GolfScript에서는 거의 모든 토큰이 변수이므로 미리 정의 된 기호를 사용하면 외부인이 스크립트를 읽을 수 없도록 만드는 좋은 방법입니다.
:a{]a.@--,(},
gets.chars{|c|$><<c if$_.count(c)>1}
s을 사용 $_하고 두 번째 모양 (이전의 공간이 없어야 할 공간)에 사용할 경우 4 개의 문자를 저장할 수 있습니다 .
나는 그것이 그렇게 짧을 것이라고 기대하지 않았다.
2.7 : a=raw_input();print filter(lambda x:a.count(x)>1,a)
3.0 : a=input();print''.join(i for i in a if a.count(x)>1)
raw_input(): 입력을 문자열로 저장 ( input()= eval(raw_input()))
(Python 3.0 : input()로 바뀌 었습니다 raw_input())
filter(lambda x:a.count(x)>1,a): 한 번 이상 a발견 된 경우 안에 있는 모든 문자를 필터링합니다 a( a.count(x)>1).
input()보다는 raw_input(). 닫는 대괄호에 문자 하나를 추가해야하지만 print파이썬 3의 함수 이므로
''.join(...)
이것이 TIOBE 목록의 일부는 아니지만 재미 있습니다 (-:
<<<$s sed 's/./&\n/g'|head -c -1|sort|uniq -c|sed -n 's/^ *1 (.*)/\1/p'|tr -d '\n'|sed 's:^:s/[:; s:$:]//g\n:'|sed -f - <(<<<$s)
골프 골드 버전 :
s=helloworld
<<< $s sed 's/./&\n/g' \
| head -c -1 \
| sort \
| uniq -c \
| sed -n 's/^ *1 (.*)/\1/p' \
| tr -d '\n' \
| sed 's:^:s/[:; s:$:]//g\n:' \
| sed -f - <(<<< $s)
첫 번째 sed는 입력을 한 줄에 하나의 문자로 변환합니다. 두 번째 sed는 한 번만 나타나는 문자를 찾습니다. 세 번째 sed는 고유 문자를 삭제하는 sed 스크립트를 작성합니다. 마지막 sed는 생성 된 스크립트를 실행합니다.
⊇.oḅlⁿ1∧
기능 제출. 질문에 경쟁 할 수있는 언어에 대한 제한이 있기 때문에 기술적으로 비 경쟁적입니다 (단, 다른 답변은 이미 제한을 무시했습니다).
⊇.oḅlⁿ1∧
⊇ Find {the longest possible} subset of the input
o {for which after} sorting it,
ḅ and dividing the sorted input into blocks of identical elements,
lⁿ1 the length of a resulting block is never 1
. ∧ Output the subset in question.
파이썬의 또 다른 대안은 다음과 같습니다.
a=raw_input();print''.join(c for c in a if a.count(c)>1)
출력을 목록으로 수락하면 (예 ['l', 'l', 'o', 'o', 'l']:) 49 자로 줄이십시오.
a=raw_input();print[c for c in a if a.count(c)>1]
>1좋은 생각이야! 이를 솔루션에 통합 할 수 있습니까?
ExtLib의 ExtString.String을 사용합니다.
open ExtString.String
let f s=let g c=fold_left(fun a d->a+Obj.magic(d=c))0 s in replace_chars(fun c->if g c=1 then""else of_char c)s
골퍼가 아닌 버전
open ExtString.String
let f s =
let g c =
fold_left
(fun a c' -> a + Obj.magic (c' = c))
0
s
in replace_chars
(fun c ->
if g c = 1
then ""
else of_char c)
s
이 함수 g는 문자열 s에서 c의 발생 횟수를 리턴합니다. 이 함수 f는 모든 문자를 빈 문자열 또는 발생 횟수에 따라 문자를 포함하는 문자열로 바꿉니다. 편집 : bools의 내부 표현을 남용하여 코드를 6 자 단축했습니다 :-)
아, ocaml은 TIOBE 인덱스에서 0입니다. ;-)
while($x<strlen($s)){$c=$s[$x];echo substr_count($s,$c)>1?$c:'';$x++;}
가정 $ s = 'helloworld'.
s->{for(char c=96;++c<123;s=s.matches(".*"+c+".*"+c+".*")?s:s.replace(c+"",""));return s;}
설명:
s->{ // Method with String as both parameter and return-type
for(char c=96;++c<123; // Loop over the lowercase alphabet
s=s.matches(".*"+c+".*"+c+".*")?
// If the String contains the character more than once
s // Keep the String as is
: // Else (only contains it once):
s.replace(c+"","")); // Remove this character from the String
return s;} // Return the modified String
"$args"-replace"[^$($args|% t*y|group|?{$_.Count-1}|% n*)]"
덜 골프 :
$repeatedСhars=$args|% toCharArray|group|?{$_.Count-1}|% name
"$args"-replace"[^$repeatedСhars]"
참고 : $repeatedChars배열입니다. 기본적으로 Powershell은 배열 문자를 공백 문자로 배열하면서 배열을 문자열로 변환합니다. 따라서 정규 표현식에는 공백이 포함됩니다 (이 예에서는 [^l o]). 입력 문자열에 문자 만 포함되므로 공백은 결과에 영향을 미치지 않습니다.
익명의 암묵적 접두사 기능.
∊⊢⊆⍨1<⍧⍨
⍧⍨ 셀카 셀카 (인수 자체에서 인자 요소의 발생 횟수)
1< 하나보다 작은 부울 마스크
⊢⊆⍨ 해당 마스크로 인수를 분할하십시오 (1에서 새 파티션을 시작하고 0에서 제거)
∊ ε NLIST (편평한)
a=utf8ToInt(scan(,''));intToUtf8(a[!a%in%names(table(a)[table(a)<2])])
TIOBE 상위 20 개 언어에서도 시도가 잘못되었습니다. 나는 하반기에 무언가를 할 수 있다는 것을 알고 있지만, 현재 어떤 골프도 나를 피할 수 있습니다.
p=>[...p].map((v,i,a)=>a.filter(f=>f==v).length).reduce((a,c,i)=>c>1?a+=p[i]:a,[])
.join``대신 사용할 수 있습니다 .join("").
암호
implode('',array_intersect(str_split($text),array_flip(array_filter(array_count_values(str_split($text)),function($x){return $x>=2;}))));
일반 코드
$text = 'helloworld';
$filter = array_filter(array_count_values(str_split($text)), function($x){return $x>=2;});
$output = implode('',array_intersect(str_split($text),array_flip($filter)));
echo $output;
string s;cin>>s;string w{s}; auto l=remove_if(begin(s),end(s),[&w](auto&s){return count(begin(w),end(w),s)==1;});s.erase(l,end(s));cout<<s;
언 골프 :
#include <algorithm>
#include <string>
#include <iostream>
int main() {
using namespace std;
string s;
cin >> s;
const string w{s};
auto l = remove_if(begin(s), end(s), [&w](auto& s) {
return count(begin(w), end(w), s) == 1;
});
s.erase(l, end(s));
cout << s;
return 0;
}