Xóa các từ lặp đi lặp lại từ một chuỗi


12

Loại bỏ tất cả các từ lặp lại từ một câu nhập.

Đầu vào sẽ là một cái gì đó như cat dog cat dog bird dog Snake snake Snakevà đầu ra nên được cat dog bird Snake snake. Sẽ luôn có một không gian ngăn cách các từ.

Thứ tự đầu ra phải giống như đầu vào. (Tham khảo ví dụ)

Bạn không cần xử lý dấu câu nhưng xử lý chữ in hoa là bắt buộc.


13
Tôi khuyên bạn nên chờ đợi để chấp nhận câu trả lời trong ít nhất vài ngày. Một giải pháp ngắn hơn vẫn có thể đến.
Alex A.

1
Tôi mong đợi các giải pháp tương tự cho uniqchars , ngoại trừ việc điều này không cấm các phần mềm dựng sẵn loại bỏ trùng lặp.
xnor

2
Xem ví dụ, không có xử lý chữ in hoa đặc biệt: Snakesnakeđược đối xử đơn giản là khác nhau
edc65

@AlexA.: Trong thực tế, đã có một. codegolf.stackexchange.com/questions/62044/ từ
ev3commander

Câu trả lời:


1

gs2 , 3 byte

,É-

Được mã hóa trong CP437 .

STDIN được đẩy khi bắt đầu chương trình. ,chia nó trên không gian. Éuniq, bộ lọc trùng lặp. -tham gia bởi không gian.


10

CJam, 7 ký tự

qS/_&S*

Có thể ngắn hơn nhiều ... nhưng bất cứ điều gì tôi gần như chưa bao giờ sử dụng CJam. ^. ^

qđọc đầu vào, S/phân tách trên các khoảng trắng, _&sao chép và áp dụng một setwise AND (do đó loại bỏ các bản sao) và S*nối lại trên không gian.

Liên kết phiên dịch trực tuyến


1
Làm thế nào bạn thậm chí có thể nhận được ngắn hơn nhiều so với 7? lol
Cruncher

Một số người chỉ làm.
Người ngoài hành tinh G

8

Haskell, 34 byte

import Data.List
unwords.nub.words

Ví dụ sử dụng: (unwords.nub.words) "cat dog cat dog bird dog Snake snake Snake"-> "cat dog bird Snake snake".


8

APL, 22 20 byte

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

Điều này tạo ra một hàm đơn âm không tên, chấp nhận một chuỗi bên phải và trả về một chuỗi.

Giải trình:

               ' ',⍵}    ⍝ 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

Dùng thử trực tuyến

Đã lưu 2 byte nhờ Dennis!


3
Tôi thích bất kỳ câu trả lời sử dụng ngôn ngữ phi bí truyền, không golf.
Darth Egregious


7

JavaScript (ES6) 33

(xem câu trả lời này )

Kiểm tra chạy đoạn mã dưới đây trong trình duyệt tuân thủ EcmaScript 6 (triển khai Set, toán tử trải rộng, chuỗi mẫu và các hàm mũi tên - Tôi sử dụng Firefox).

Lưu ý: chuyển đổi thành Đặt thả tất cả các bản sao Đặt duy trì thứ tự ban đầu.

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>


Wow wow wow ... Tôi liên tục ngạc nhiên bởi khả năng của bạn để cắt bất kỳ giải pháp nào tôi nghĩ tăng từ 25% trở lên. +1
Sản phẩm ETH

1
Nhìn vào vấn đề và nghĩ ngay đến Bộ ... chỉ để nhận ra rằng bạn đã hoàn thành nó = P rất tuyệt!
Mwr247

Làm thế nào có thể thiết lập duy trì thứ tự ban đầu?
njzk2

@ njzk2 hỏi các nhà phát triển ngôn ngữ. Nó có thể là: một tập hợp bên trong là một mảng và tại mỗi lần chèn có một kiểm tra để từ chối các bản sao. Dù sao đó cũng là một chi tiết triển khai
edc65

@ njzk2 trong khi tôi không biết làm thế nào , tôi biết rằng thực tế này được chỉ định bởi ngôn ngữ: Đặt đối tượng là tập hợp các giá trị, bạn có thể lặp lại các phần tử của nó theo thứ tự chèn . Giá trị trong Tập hợp chỉ có thể xảy ra một lần; nó là duy nhất trong bộ sưu tập của Set. ( developer.mozilla.org/it/docs/Web/JavaScript/Reference/, )
edc65

6

TeaScript , 12 byte

TeaScript là JavaScript để chơi gôn.

xs` `u()j` `

Điều này là khá ngắn. Nó phân tách trên mỗi không gian, lọc ra các bản sao, sau đó nối lại.

Dùng thử trực tuyến


Là nó tee-a scripthay tee script?

@MathiasFoster nó sẽ là "tee-script"
Downgoat

TeaScript có các chữ cái dành riêng cho tên biến không? Hầu hết trong số chúng dường như là tốc ký cho các thuộc tính tích hợp.
intrepidcoder

@intrepidcoder có tất cả những điều này: cdfghijklmnopstuvwđược dành riêng cho các biến, tất cả chúng đều được khởi tạo trước thành 0. bcũng được dành riêng cho một tên biến, nó được khởi tạo trước thành một chuỗi trống
Downgoat

6

PowerShell, 15 byte

$args|select -u

Whoa, một mục thực tế nơi PowerShell có phần cạnh tranh? Điều đó là không thể!

Lấy chuỗi làm đối số đầu vào, đường ống đến Select-Objectvới -Uniquecờ. Nhổ ra một chuỗi các chuỗi, giữ trật tự và viết hoa theo yêu cầu.

Sử dụng:

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

Nếu điều này quá "gian lận" khi giả sử đầu vào có thể là đối số dòng lệnh, thì hãy thực hiện theo cách sau, ở mức 24 21 Byte (đã lưu một số byte nhờ blabb ) . Thật thú vị, việc sử dụng toán tử đơn nguyên theo hướng này cũng xảy ra nếu chuỗi đầu vào được phân định bằng dấu ngoặc kép hoặc dưới dạng đối số riêng lẻ, vì mặc định -splitlà bởi khoảng trắng. Tặng kem.

-split$args|select -u

Dựa vào hành vi của môi trường đối với việc cho ăn mã với việc dễ dàng phân tách đầu vào?
manatwork

@manatwork Tôi đã thêm một thông tin làm rõ nếu việc sử dụng đầu tiên được coi là quá "gian lận" - vì không rõ chính xác cách thức đầu vào được chỉ định, chúng tôi sẽ để lại cho OP.
admBorkBork

bây giờ thì rõ ràng tính hiệu quả của các tính năng của PowerShell. Đó là 24 thực sự xứng đáng một upvote.
manatwork

@timmyD bạn có thể cắt 3 byte để không bị hư không ?? phiên bản bằng cách sử dụng phân chia đơn nguyên và không cần "" '' trong dòng lệnh cũng vậy: \> ls -l split.ps1 & gõ split.ps1 & echo. & powershell -nologo -f split.ps1 cat dog dog dog dog dog Rắn rắn Rắn -rw-rw-rw- 1 Quản trị viên 0 21 2015-11 / 02 19:06 split.ps1 -split $ args | select -u cat dog dog Snake Snake
blabb 2/11/2015

4

Julia, 29 byte

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

Điều này tạo ra một hàm không tên, tách chuỗi thành một vectơ trên các khoảng trắng, chỉ giữ lại các phần tử duy nhất (giữ trật tự) và nối lại mảng thành một chuỗi có khoảng trắng.


4

R, 22 byte

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

Điều này đọc một chuỗi từ STDIN và chia nó thành một vectơ trên các khoảng trắng bằng cách sử dụng scan(,""), chỉ chọn các phần tử duy nhất, sau đó ghép chúng thành một chuỗi và in nó thành STDOUT bằng cách sử dụng cat.


4

Võng mạc , 22 byte

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

Lưu tệp với một linefeed trailing và chạy nó với -scờ.

Điều này khá đơn giản ở chỗ nó khớp với một từ duy nhất và giao diện kiểm tra xem liệu từ đó có xuất hiện trong chuỗi trước đó hay không. Nguồn cấp dữ liệu theo dõi khiến Retina hoạt động ở chế độ Thay thế bằng chuỗi thay thế trống, loại bỏ tất cả các kết quả khớp.


4

Toán học, 43 39 byte

StringRiffle@*Keys@*Counts@*StringSplit

Kudos để sử dụng StringRiffle[].
Michael Stern

có thể sử dụng Keys@Countsthay vìDeleteDuplicates
branislav

@branislav Có Keys@Countsgiữ gìn trật tự không?
LegionMammal978

@ LegionMammal978 Counts[list]cung cấp cho một hiệp hội có các khóa theo thứ tự như lần đầu tiên chúng xuất hiện dưới dạng các thành phần của danh sách.
branislav


3

C ++ 11, 291 byte

#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;}

Tôi không thấy rất nhiều câu trả lời C ++ so với ngôn ngữ chơi gôn, vậy tại sao không. Lưu ý rằng điều này sử dụng các tính năng của C ++ 11, và vì vậy nếu trình biên dịch của bạn bị kẹt trong thời kỳ tối đủ đủ tuổi, bạn có thể cần phải chuyển một công cụ biên dịch đặc biệt để làm cho nó sử dụng tiêu chuẩn C ++ 11. Đối với g++, nó -std=c++11(chỉ cần cho các phiên bản <5.2). Dùng thử trực tuyến


Nếu bạn so sánh số lượng byte với các ngôn ngữ khác, bạn sẽ thấy tại sao không ai sử dụng C ++.
CroCo

3
@CroCo Nếu bạn nhận ra quan điểm của trang web này là tìm giải pháp ngắn nhất trong mỗi ngôn ngữ, bạn sẽ thấy lý do tại sao tôi đăng câu trả lời này.
Mego

xin lỗi tôi không biết điều đó
CroCo

1
Tại sao không sử dụng a set? Nó cho phép không trùng lặp theo thiết kế. Chỉ cần đẩy vào đó.
edmz

1
@black A set is not guaranteed to have the items in the same order they were added.
Mego

3

K5, 9 bytes

" "/?" "\

FYI, this is a function.

Explanation

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

2

Matlab: 18 Bytes

unique(d,'stable')

where d is d = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}.

The result is 'cat' 'dog' 'bird' 'Snake' 'snake'


4
Welcome to Programming Puzzles and Code Golf! Submissions here need to either be full programs that read from STDIN and write to STDOUT, or functions which accept input and return output. As it stands, this is merely a snippet; it assumes the variable d is already assigned. You can rectify this by using a function handle: @(d)unique(d,'stable'), at the cost of 4 bytes.
Alex A.

2

Python 3, 55

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

Yeesh, this is long. Unfortunately, Python's set doesn't keep the order of the elements, so we have to do the work ourselves. We iterate through the input words, keeping a list l of elements that aren't yet in l. Then, we print the contents of l space-separated.

A string version of l would not work if some words are substrings of other words.


2

C#, 38 bytes

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

2
I'm not sure you can assume input is already populated in s, I think you should get it as an argument.
Jacob

3
Welcome to PPCG! Please have a look at our default answer formats. Answers should either be full programs or functions. Unnamed functions (like lambda literals) are fine, but snippets which expect the code to already exist in some variable/on the stack etc. or require a REPL environment are generally disallowed unless the OP explicitly permits them.
Martin Ender

2

Perl 6, 14 bytes

As a whole program the only way you would write it is 21 bytes long

say $*IN.words.unique # 21 bytes

As a lambda expression the shortest is 14 bytes

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

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

While the output is a List, if you put it in a stringifying context it will put a space between the elements. If it was a requirement to return a string you could just add a ~ to the front ~*.words.unique.


If snippets were allowed, you could shorten it to 13 bytes by removing the *.

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

say .words.unique

1

Python 3, 87 80 bytes

turns out the full program version is shorter

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

Did it without regex, I am happy

Try it online


1

Lua, 94 bytes

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

An anonymous user suggested to replace ... return""else l[b]=true end end... with ...return""end l[b]=""end....
Jonathan Frech

1

awk, 25

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

Output:

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

1

JavaScript, 106 102 100 bytes

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

// way too long for JS :(


Try using JS (aka ECMAScript) 6 arrow functions, which should save 6 bytes. Also, I can already see porting this to CoffeeScript will save at least 30 bytes.
kirbyfan64sos

This answer is in native JavaScript (ECMA5), there is edc65's one for es6.
Jacob

1

Hassium, 91 bytes

func main(){d=[]foreach(w in input().split(' '))if(!(d.contains(w))){d.add(w)print(w+" ")}}

Run online and see expanded here


1

PHP 64 59 bytes

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

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

Thanks! Good suggestions. Seems split is being depricated though, but guess that does not matter for codegolving.
Jeroen

1

AppleScript, 162 bytes

Interestingly, this is almost identical to the non-repeating characters thing.

set x to(display dialog""default answer"")'s text returned's words
set o to""
repeat with i in x
considering case
if not i is in o then set o to o&i&" "
end
end
o

I didn't actually know the considering keyword before this. the more you know...


1

Burlesque, 6 bytes

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

Rather simple: split words, nub (nub = remove duplicates), convert back to words.


1

Gema, 21 characters

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

(Very similar to the unique character solution, as there are no arrays in Gema, so allowing built-in unique functions not helps us much.)

Sample run:

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

1

Scala, 44 47 bytes

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

EDIT: using toSet might not preserve order, so I'm now using distinct // that just cost me 3 bytes :(


0

PHP, 37 Bytes

Assuming $s is the input string.

print_r(array_flip(explode(' ',$s)));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.