문자열에서 반복되는 단어 제거


12

입력 된 문장에서 반복되는 단어를 모두 제거하십시오.

입력은 비슷할 cat dog cat dog bird dog Snake snake Snake것이고 출력은이어야합니다 cat dog bird Snake snake. 단어를 구분하는 단일 공백이 항상 있습니다.

출력 순서는 입력과 동일해야합니다. (예 참조)

구두점을 처리 할 필요는 없지만 대문자 처리가 필요합니다.


13
적어도 며칠 동안 답변을 기다리는 것이 좋습니다. 더 짧은 해결책이 여전히 올 수 있습니다.
Alex A.

1
중복을 제거하는 내장 기능을 금지하지 않는다는 점을 제외하고 uniqchars 와 비슷한 솔루션을 기대합니다 .
xnor

2
예보고, 특수 대문자 처리가되지 않습니다 : Snake그리고 snake단순히 다른로 취급됩니다
edc65

@AlexA .: 사실, 이미 존재합니다. codegolf.stackexchange.com/questions/62044/…
ev3commander

답변:


1

gs2 , 3 바이트

,É-

CP437로 인코딩되었습니다 .

STDIN은 프로그램 시작시 푸시됩니다. ,그것을 공간으로 나눕니다. É이다 uniq중복을 필터링한다. -공백으로 조인합니다.


10

CJam, 7 자

qS/_&S*

아마도 훨씬 짧을 수도 있지만 ... CJam을 거의 사용하지 않은 모든 것. ^. ^

q입력을 읽고, S/공백으로 분할하고, _&복제하고 세트 AND를 적용 (따라서 중복을 제거함) S*한 다음 공간에 다시 참여합니다.

온라인 통역사 링크


1
어떻게 7보다 훨씬 짧을 수 있습니까? lol
Cruncher

일부는 방금했다.
Alien G

8

하스켈, 34 바이트

import Data.List
unwords.nub.words

사용 예 : (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 바이트

{1↓∊∪(∊∘' '⊂⊢)' ',⍵}

이것은 이름없는 monadic 함수를 생성하여 오른쪽의 문자열을 받아들이고 문자열을 반환합니다.

설명:

               ' ',⍵}    ⍝ Prepend a space to the input string
     (∊∘' '⊂⊢)          ⍝ Split the string on spaces using a fork
    ∪                    ⍝ Select the unique elements
{1↓∊                     ⍝ Join into a string and drop the leading space

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

Dennis 덕분에 2 바이트를 절약했습니다!


3
난해하지 않은 비 골프 언어를 사용하는 답변을 좋아합니다.
Darth Egregious


7

자바 스크립트 (ES6) 33

( 이 답변 참조 )

EcmaScript 6 호환 브라우저에서 아래 스 니펫 실행 테스트 (Set, spread operator, 템플릿 문자열 및 화살표 기능 구현-Firefox를 사용함).

참고 : Set으로 변환하면 모든 중복이 삭제 되고 Set은 원래 순서를 유지합니다.

f=s=>[...Set(s.split` `)].join` `

function test() { O.innerHTML=f(I.value) }

test()
#I { width: 70% }
<input id=I value="cat dog cat dog bird dog Snake snake Snake"/><button onclick="test()">-></button>
<pre id=O></pre>


와우 와우 와우 .. 내가 생각하는 솔루션을 25 % 이상 줄이겠다는 당신의 능력에 계속 놀랐습니다. +1
ETHproductions

1
문제를보고 즉시 세트를 생각했습니다 ... 이미 완료 한 것을 깨닫기 위해서만 = P 아주 좋았습니다!
Mwr247

원래 주문을 어떻게 유지할 수 있습니까?
njzk2

@ njzk2는 언어 개발자에게 묻습니다. 이는 일 : 세트가 내부적으로 배열하고, 각각의 삽입에 중복을 거부 체크가있다. 어쨌든 구현 세부 사항입니다
edc65

나도 몰라 동안 @ njzk2 방법 ,이 사실은 언어에 의해 지정되어 있는지 알고 개체를 설정 값의 컬렉션은, 당신은 삽입 순서로 요소를 반복 할 수 있습니다 . 세트의 값은 한 번만 발생할 수 있습니다. 세트의 컬렉션에서 고유합니다. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/… )
edc65

6

TeaScript , 12 바이트

TeaScript는 골프를위한 JavaScript입니다.

xs` `u()j` `

꽤 짧습니다. 각 공간에서 분할되고 중복을 필터링 한 다음 다시 참여합니다.

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


그것은인가 tee-a script또는 tee script?

@MathiasFoster "티 스크립트"
Downgoat

TeaScript에 변수 이름으로 예약 된 문자가 있습니까? 대부분 빌트인 속성의 약어 인 것으로 보입니다.
intrepidcoder

이 모든 예 @intrepidcoder : cdfghijklmnopstuvw이전의 모든 초기화 0으로 변수 위해 예약되어, 그들이 b또한 변수 이름이 예약되어, 그것은 빈 문자열로 초기화 사전입니다
Downgoat

6

PowerShell, 15 바이트

$args|select -u

우와, PowerShell이 ​​다소 경쟁적인 실제 항목? 그건 불가능 해!

문자열을 입력 인수로 Select-Object사용하고 -Unique플래그 와 함께 파이프합니다 . 요청에 따라 순서와 대문자를 유지하면서 문자열 배열을 뱉어냅니다.

용법:

PS C:\Tools\Scripts\golfing> .\remove-repeated-words-from-string.ps1 cat dog cat dog bird dog Snake snake Snake
cat
dog
bird
Snake
snake

입력이 명령 행 인수로 가정 할 수 있다고 가정 할 때 이것이 너무 "치명적"인 경우 24 21 바이트 ( blabb 덕분에 일부 바이트 절약) 에서 다음 수행 하십시오 . 흥미롭게도, 방향으로 단항 연산자를 사용하면 입력 문자열이 따옴표로 구분 되거나 개별 인수로 작동하는 경우에도 작동 -split합니다. 기본값 은 공백입니다. 보너스.

-split$args|select -u

쉽게 분리 된 입력으로 코드를 숟가락으로 먹이는 환경의 행동에 의존 하는가?
manatwork

@manatwork 첫 번째 사용법이 너무 "견고한"것으로 간주되면 설명을 추가했습니다. 입력이 어떻게 지정되었는지 정확히 알 수 없으므로 OP에 맡깁니다.
AdmBorkBork

그리고 지금 efficients PowerShell을 자신의 기능이 얼마나 분명하다. 그 24는 실제로 공감할 가치가 있습니다.
manatwork

@timmyD 당신은 3 바이트 바이트를 잘라낼 수 있습니까 ?? 단항 분할을 사용하고 명령 행 args에서도 ""을 필요로하지 않는 버전 : \> ls -l split.ps1 & split.ps1 & echo. & powershell -nologo -f split.ps1 cat dog cat dog bird dog 뱀 뱀 뱀 -rw-rw-rw- 1 관리자 0 21 2015-11-02 19:06 split.ps1 -split $ args | select -u 고양이 개 새 뱀 뱀
blabb

4

줄리아, 29 바이트

s->join(unique(split(s))," ")

이렇게하면 이름없는 함수가 만들어져 문자열을 공백의 벡터로 나누고 고유 한 요소 만 유지하고 (순서를 유지) 배열을 공백이있는 문자열로 다시 결합합니다.


4

R, 22 바이트

cat(unique(scan(,"")))

STDIN에서 문자열을 읽고를 사용하여 공백의 벡터로 분할하고 scan(,"")고유 한 요소 만 선택한 다음 문자열로 연결 한 후를 사용하여 STDOUT에 인쇄합니다 cat.


4

망막 , 22 바이트

 (\w+)\b(?<=\b\1\b.+)

후행 줄 바꿈으로 파일을 저장하고 -s플래그 와 함께 실행하십시오 .

이것은 한 단어와 일치한다는 점에서 상당히 직설적이며, lookbehind는 동일한 단어가 이전에 문자열에 나타 났는지 확인합니다. 후행 줄 바꿈으로 인해 Retina는 교체 문자열에서 빈 대체 문자열을 사용하여 모든 일치 항목을 제거합니다.


4

매스 매 티카, 43 39 바이트

StringRiffle@*Keys@*Counts@*StringSplit

를 사용하기위한 전문가 StringRiffle[].
Michael Stern

Keys@CountsDeleteDuplicates
branislav

@branislav Keys@Counts질서를 유지 합니까 ?
LegionMammal978

@ LegionMammal978 Counts[list]은 키가 목록의 요소로 처음 나타나는 순서와 동일한 순서로 연결을 제공합니다.
branislav


3

C ++ 11, 291 바이트

#include<iostream>
#include<string>
#include<list>
#include<sstream>
#include<algorithm>
using namespace std;main(){string s;getline(cin,s);list<string>m;stringstream b(s);while(getline(b,s,' '))if(find(m.begin(),m.end(),s)==m.end())m.push_back(s);for(auto a:m)cout<<a<<' ';cout<<endl;}

골프 언어에 비해 많은 C ++ 답변이 보이지 않으므로 왜 그렇지 않습니까? 이것은 C ++ 11 기능을 사용하므로 컴파일러가 충분히 오래된 연령대에 갇혀 있으면 C ++ 11 표준을 사용하도록 특수 컴파일 스위치를 전달해야 할 수도 있습니다. 를 들어 g++, 그것은 것 -std=c++11(전용 버전 <5.2 필요). 온라인으로 사용해보십시오


바이트 수를 다른 언어와 비교하면 아무도 C ++을 사용하지 않는 이유를 알 수 있습니다.
CroCo

3
@CroCo이 사이트의 요점이 각 언어로 가장 짧은 솔루션을 찾는 것임을 알게되면이 답변을 게시 한 이유를 알 수 있습니다.
Mego

죄송합니다. 잘 모르겠습니다.
CroCo

1
왜 사용하지 set않습니까? 의도적으로 복제 할 수 없습니다. 그냥 밀어 넣으십시오.
edmz 2016 년

1
@black A set는 추가 된 순서와 동일한 순서로 항목을 가질 수 없습니다.
Mego

3

K5, 9 바이트

" "/?" "\

참고로, 이것은 기능입니다.

설명

     " "\    Split the input on spaces
    ?        Find all the unique elements
" "/         Join them back together

2

MATLAB : 18 바이트

unique(d,'stable')

d이다 d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

결과는 'cat' 'dog' 'bird' 'Snake' 'snake'


4
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 여기서 제출은 STDIN에서 읽고 STDOUT에 쓰는 전체 프로그램이거나 입력 및 리턴 출력을 허용하는 기능이어야합니다. 그대로, 이것은 단지 스 니펫입니다. 변수 d가 이미 할당 된 것으로 가정합니다 . @(d)unique(d,'stable')4 바이트의 비용으로 함수 핸들 :을 사용하여이를 수정할 수 있습니다 .
Alex A.

2

파이썬 3, 55

l=[]
for x in input().split():l+=[x][x in l:]
print(*l)

Yeesh, 이것은 길다. 불행히도 파이썬 set은 요소의 순서를 유지하지 않으므로 직접 작업해야합니다. l아직 입력 되지 않은 요소 목록 을 유지하면서 입력 단어를 반복합니다 l. 그런 다음 l공백으로 구분 된 내용을 인쇄합니다 .

l일부 단어가 다른 단어의 하위 문자열이면 문자열 버전이 작동하지 않습니다.


2

C #, 38 바이트

String.Join(" ",s.Split().Distinct());

2
입력이 이미 채워져 있다고 가정 할 수는 없지만 s인수로 가져와야한다고 생각합니다.
Jacob

3
PPCG에 오신 것을 환영합니다! 기본 답변 형식을 살펴보십시오 . 답은 완전한 프로그램 또는 기능이어야합니다. 람다 리터럴과 같은 이름이없는 함수는 훌륭하지만 코드가 이미 일부 변수 / 스택 등에 존재하거나 REPL 환경이 필요한 스 니펫은 OP가 명시 적으로 허용하지 않는 한 일반적으로 허용되지 않습니다.
Martin Ender

2

펄 6, 14 바이트

전체 프로그램으로 작성하는 유일한 방법은 21 바이트입니다.

say $*IN.words.unique # 21 bytes

람다 식으로 가장 짧은 것은 14 바이트입니다.

*.words.unique # 14 bytes
say ( *.words.unique ).('cat dog cat dog bird dog Snake snake Snake')

my &foo = *.words.unique;
say foo $*IN;

출력이 List 인 반면, 문자열 화 컨텍스트에 넣으면 요소 사이에 공백이 생깁니다. 문자열을 반환해야하는 ~경우 앞에 a 를 추가 할 수 있습니다 ~*.words.unique.


스 니펫이 허용 된 경우을 제거하여 스 니펫을 13 바이트로 줄일 수 있습니다 *.

$_ = 'cat dog cat dog bird dog Snake snake Snake';

say .words.unique

1

파이썬 3, 87 80 바이트

전체 프로그램 버전이 더 짧습니다

s=input().split(' ')
print(' '.join(e for i,e in enumerate(s)if e not in s[:i]))

정규 표현식없이 그것을 했습니까, 나는 행복합니다

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


1

루아, 94 바이트

function c(a)l={}return a:gsub("%S+",function(b)if l[b]then return""else l[b]=true end end)end

익명 사용자가 교체 제안 ... return""else l[b]=true end end...으로 ...return""end l[b]=""end....
Jonathan Frech

1

awk, 25

BEGIN{RS=ORS=" "}!c[$0]++

산출:

$ printf "cat dog cat dog bird dog Snake snake Snake" | awk 'BEGIN{RS=ORS=" "}!c[$0]++'
cat dog bird Snake snake $ 
$ 

1

자바 스크립트, 106 (102) 100 바이트

function(s){o={};s.split(' ').map(function(w){o[w]=1});a=[];for(w in o)a.push(w);return a.join(' ')}

// JS가 너무 길다 :(


JS (일명 ECMAScript) 6 화살표 기능을 사용해보십시오 . 6 바이트가 절약됩니다. 또한 이미 CoffeeScript로 이식하면 최소 30 바이트가 절약됩니다.
kirbyfan64sos

이 답변은 기본 JavaScript (ECMA5)에 있으며 es6 용 edc65가 있습니다.
Jacob


1

PHP 64 59 바이트

function r($i){echo join(" ",array_unique(split(" ",$i)));}

explode()split(), implode()join()?
manatwork

감사! 좋은 제안. 보인다는 split하지만 depricated하지만이 codegolving을 위해 중요하지 않습니다 추측되고있다.
Jeroen

1

AppleScript, 162 바이트

흥미롭게도 이것은 반복되지 않는 문자와 거의 동일합니다.

x를 (디스플레이 대화 상자 ""기본 답변 "")의 텍스트 반환 단어로 설정
o를 ""로 설정
x에서 i로 반복
사건을 고려
내가 o에 있지 않으면 o를 o & i & ""로 설정하십시오.
종료
종료
영형

실제로이 전에 고려 키워드를 몰랐습니다. 더 많이 알수록 ...


1

해 학적 인, 6 바이트

blsq ) "cat dog cat dog bird dog Snake snake Snake"wdNBwD
cat dog bird Snake snake

오히려 간단한 단어 분리, nub (nub = 중복 제거), 단어로 다시 변환합니다.


1

21 자

*\S=${$0;$0}@set{$0;}

( Gema에는 배열이 없으므로 고유 한 문자 솔루션 과 매우 유사 하므로 내장 고유 함수를 허용해도 큰 도움이되지 않습니다.)

샘플 실행 :

bash-4.3$ gema '*\S=${$0;$0}@set{$0;}' <<< 'cat dog cat dog bird dog Snake snake Snake'
cat dog bird Snake snake 

1

스칼라, 44 47 바이트

(s:String)=>s.split(" ").distinct.mkString(" ")

편집 :를 사용하면 toSet순서가 유지되지 않을 수 있으므로 이제는 3 바이트의 비용이 드는 고유 한 //를 사용하고 있습니다.


0

PHP, 37 바이트

$s입력 문자열 이라고 가정 합니다.

print_r(array_flip(explode(' ',$s)));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.