从字符串中删除重复的单词


12

从输入的句子中删除所有重复的单词。

输入将类似于cat dog cat dog bird dog Snake snake Snake,输出应为cat dog bird Snake snake。始终会有单个空格分隔单词。

输出顺序必须与输入相同。(请参阅示例)

您不需要处理标点符号,但需要处理大写字母。


13
我建议等待至少几天才能接受答案。可能还会有一个更短的解决方案。
Alex A.

1
我期望与uniqchars类似的解决方案,除了这不会禁止删除重复项的内置程序。
xnor 2015年

2
看示例,没有特殊的大写字母处理:Snake并且snake被简单地视为不同
edc65

Answers:


1

gs2,3个字节

,É-

CP437编码。

STDIN在程序开始时被按下。,将其拆分成多个空格。Éuniq,用于过滤重复项。-通过空格连接。


10

CJam,7个字符

qS/_&S*

可能会更短...但是无论我几乎从未使用过CJam。^。^

q读取输入,S/在空格上分割,_&重复,并应用按设定的AND(因此消除重复),然后S*在空格上重新加入。

在线口译链接


1
哪怕比7还短呢?大声笑
Cruncher

有人做。
2015年

8

Haskell,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

JavaScript(ES6)33

(请参阅此答案

测试在符合EcmaScript 6的浏览器中运行以下代码段(实现Set,spread运算符,模板字符串和箭头功能-我使用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 2015年

1
看了一下问题,立即想到了Sets……才意识到您已经做到了= P非常好!
Mwr247

如何设置可以保持原始顺序?
njzk2

@ njzk2询问语言的开发者。它可以是:一组内部是一个阵列,并且在每个插入有一个检查,以拒绝重复。无论如何,这都是一个实现细节
edc65

@ njzk2虽然我不知道如何,但我知道这种事实是由语言指定的:Set对象是值的集合,您可以按插入顺序对其元素进行迭代。集合中的值只能出现一次;它在Set的集合中是唯一的。developer.mozilla.org/it/docs/Web/JavaScript/Reference/...
edc65

6

TeaScript,12个字节

TeaScript是用于高尔夫的JavaScript。

xs` `u()j` `

这很短。它在每个空间上分割,过滤出重复项,然后重新加入。

在线尝试


tee-a script还是tee script

@MathiasFoster这将是“ tee脚本”
Downgoat 2015年

TeaScript是否为变量名保留了字母?它们中的大多数似乎是内置属性的简写。
intrepidcoder

@intrepidcoder是所有这些:cdfghijklmnopstuvw是为变量保留的,它们都已预先初始化为0。b还为变量名保留了,它们均已预先初始化为空字符串
Downgoat 2015年

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,2015年

现在很清楚efficients如何PowerShell的自己的特色。那24个真的值得赞扬。
manatwork,2015年

@timmyD,您可以将3个字节分割为uncheaty?通过使用一元拆分版本,也不需要在命令行参数中也使用“”“:\> 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 2015年

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标志运行它。

这很简单,因为它匹配一个单词,并且后面的字符串检查该字符串之前是否已出现过该单词。尾随换行符使Retina在具有空替换字符串的替换模式下工作,删除所有匹配项。




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 2015年

3
@CroCo如果您意识到本网站的重点是找到每种语言的最短解决方案,您将明白我为什么发布此答案。
Mego 2015年

对不起,我不知道。
CroCo 2015年

1
为什么不使用set?根据设计,它不允许重复。只是推入它。
edmz 2015年

1
set不保证@black A 的项目顺序与添加顺序相同。
Mego 2015年

3

K5,9个字节

" "/?" "\

仅供参考,这是一个功能。

说明

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

2

Matlab:18个字节

unique(d,'stable')

哪里dd = {'cat','dog','cat','dog','bird','dog','Snake','snake','Snake'}

结果是 'cat' 'dog' 'bird' 'Snake' 'snake'


4
欢迎来到编程难题和Code Golf!此处的提交必须是从STDIN读取并写入STDOUT的完整程序,或者是接受输入和返回输出的函数。就目前而言,这仅仅是一个片段。假设该变量d已分配。您可以使用函数handle:来纠正此问题@(d)unique(d,'stable'),其代价为4个字节。
Alex A.

2

Python 3、55

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

是的,这很长。不幸的是,Python set不能保持元素的顺序,因此我们必须自己完成工作。我们遍历输入的单词,并保留列表l中尚未包含的元素l。然后,我们打印以l空格分隔的内容。

l如果某些单词是其他单词的子字符串,则字符串版本的将不起作用。


2

C#,38个字节

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

2
我不确定您是否可以假设输入已经填充s,我认为您应该将其作为参数。
雅各布

3
欢迎来到PPCG!请查看我们的默认答案格式。答案应该是完整的程序或功能。未命名的函数(如lambda文字)很好,但是除非OP明确允许,否则通常不要使用那些期望代码已存在于某些变量中/堆栈上或要求具有REPL环境的代码段。
马丁·恩德

2

Perl 6,14位元组

整个程序的唯一写法是21字节长

say $*IN.words.unique # 21 bytes

作为lambda表达式,最短为14个字节

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

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

虽然输出是列表,但是如果将其放在字符串化上下文中,则会在元素之间放置一个空格。如果需要返回字符串,则可以~在前面添加a ~*.words.unique


如果允许使用摘要,则可以通过删除来将其缩短为13个字节*

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

say .words.unique

1

Python 3,87 80字节

原来完整的程序版本较短

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

没有正则表达式,我很高兴

在线尝试


1

Lua,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...
乔纳森·

1

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

JavaScript中,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。
雅各布


1

的PHP 64 59个字节

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

explode()split()implode()join()
manatwork

谢谢!好建议。split虽然似乎正在描述,但是猜测对于代码探查无关紧要。
耶隆2015年

1

AppleScript,162字节

有趣的是,这与非重复字符几乎相同。

将x设置为(显示对话框““默认答案”“))返回的文字
设置为“”
在x中重复我
考虑情况
如果不是,则将o设置为o&i&“
结束
结束
Ø

在此之前,我实际上并不知道正在考虑的关键字。你知道的越多...


1

滑稽,6字节

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

相当简单:拆分单词,nub(nub =删除重复项),转换回单词。


1

Gema,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

Scala,44 47字节

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

编辑:使用toSet可能不会保留顺序,所以我现在使用不同的//,这只花了我3个字节:(


0

PHP,37字节

假设$s是输入字符串。

print_r(array_flip(explode(' ',$s)));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.