寻找最“独特”的词


12

使用您选择的语言,编写最短的函数/脚本/程序,以识别文本中唯一字母数量最多的单词。

  • 唯一字母应使用UTF-8编码包含任何不同的字符。
    • 相同字符的大写和小写形式不同且不同; 'a' != 'A'
  • 单词受任何空白字符限制。
  • “字母”是可以用单个unicode字符表示的任何符号。
  • 文本文档必须由您的代码读取-不允许对文本进行预加载/硬编码。
  • 输出应该是单词,然后是唯一字母的计数。
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • 两个值之间的任何定界符/间距都取决于您,只要有至少一个字符将它们分隔即可。
  • 如果存在多个单词且具有最高计数,请打印该单词的所有单词,并用新行分隔。
    超级肯定-16
    伪lambranchiate-16
  • 这是代码高尔夫,所以最短的代码获胜。

这个关于English.SE的答案启发了我去挑战。该示例仅使用单词列表,但是任何文本都应能够处理。


1
单词如何分隔?您说唯一的字母是任何UTF-8字符,但这意味着整个文件只是一个字。
cardboard_box

1
您在这里如何定义字母?正如我刚才已经指出了在English.SE答案之一LlanfairPG是威尔士词,包含了来自威尔士字母- ll并且ch都是在威尔士语字母。
Gareth 2013年

1
@Gareth我不知道这种区别,这是我的错误。是否有这两个“字母”的unicode表示形式?出于此挑战的目的,每个单独的unicode字符都是一个字母。
加菲2013年

1
那么abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.有效的“单词”是吗?
2013年

2
偏离主题,但显然在威尔士语中,LL和ll以前只有一个字母。至少Unicode具有U + 1EFA和U + 1EFB;它叫“中威尔士语”。但是没有标题栏L1。
李斯特先生,2013年

Answers:


7

APL(56)

{⎕ML←3⋄⊃{⍵,⍴∪⍵}¨W[⍙]⍴⍨↑+/∆∘.=∆←∆[⍙←⍒∆←↑∘⍴∘∪¨W←⍵⊂⍨⍵≠' ']}

这是一个函数(问题是允许的),该函数采用字符串并返回单词和唯一长度的矩阵。

用法:

      {⎕ML←3⋄⊃{⍵,⍴∪⍵}¨W[⍙]⍴⍨↑+/∆∘.=∆←∆[⍙←⍒∆←↑∘⍴∘∪¨W←⍵⊂⍨⍵≠' ']}'The quick brown fox jumps over the lazy dog.'
quick 5
brown 5
jumps 5

说明:

  • ⎕ML←3:将迁移级别设置为3(因此是分区而不是封闭)
  • W←⍵⊂⍨⍵≠' ':存储在W给定的字符串中,其中每个分区均由非空格字符组成。
  • ⍙←⍒∆←↑∘⍴∘∪¨W:获得量(唯一(的)中(每个部分)元素¨的)W,并存储这些中,然后得到的排序顺序时,在此有序向下()和存储在
  • ∆[⍙... ]:排序,所以现在我们有独特的长度秩序。
  • ∆∘.=∆←∆:将排序后的内容存储在中,然后查看中的哪些元素相等。
  • ↑+/:对行求和(现在我们知道多少个元素等于每个元素),然后取第一项(现在我们知道多少个元素等于第一个元素,即,有多少个单词并列第一。)
  • W[⍙]⍴⍨:排序W,而采取的第一个N,其中N是我们刚才计算的数量。
  • {⍵,⍴∪⍵}¨:对于其中的每一个,获取单词本身以及单词中唯一字符的数量
  • :格式为矩阵

4

数学96 115

编辑:代码现在可以找到最大字符数的所有单词。我拒绝将逗号视为文字字符。

f@t := With[{r = {#, Length@Union@Characters@#} & /@ 
StringSplit[t,RegularExpression@"\\W+"]},  Cases[r, {_, Max[r[[All, 2]]]}]]

例子

f@"It was the best of times,...of comparison only."

要么

f@Import["t1.txt"]

{{“ incredulity”,10},{“最高级”,10}}


f@"Lorem ipsum... vitae augue."

要么

f@Import["t2.txt"]

{“前庭”,9}


更长的例子

f@Import["ShakespearesSonnets.txt"]
f@Import["OriginOfSpecies.txt"]
f@Import["DeclarationOfIndependence.txt"]
f@Import["DonQuixoteISpanish.txt"]
f@Import["AliceInWonderland.txt"]
f@Import["UNHumanRightsGerman.txt"]
f@Import["GenesisKJV.txt"]

惊喜:《独立宣言》中最“独特”的词也是《爱丽丝梦游仙境》中最独特的词!

{“ prognosticate”,11}
{“ uniscoverable”,13}
{“ uncomfortable”,12}
{“ regocijadamente”,12}
{“ uncomfortable”,12}
{“ Verpflichtung”,13}
{“ buryingplace ”,12}


这仅返回一个最独特的单词吗?它应该将它们全部归还。例如“最高级,令人怀疑,10”
Shmiddty

@Shmiddty我解决了您的批评。(费用为19个字节。)
DavidC

4

Python 2(110(98使用文件输入))

import sys
f=lambda x:len(set(x))
a=sys.stdin.read().split()
c=max(map(f,a))
for i in a:
 if f(i)==c:print i,c

f=lambda x:len(set(x))
a=file('a').read().split()
c=max(map(f,a))
for i in a:
 if f(i)==c:print i,c

改进之处:打印(33个字符)

标点符号被认为是字母。


Python 2.7.3 :NameError: global name 'r' is not defined。在周围加上单引号后rAttributeError: 'file' object has no attribute 'split'。Python 3.3.0 :SyntaxError: invalid syntax 'print i,c'
2013年

糟糕,我没有测试。谢谢你这么说,我永远都不会见过。至于Python 3:不起作用。
beary605

4

这是我的第一个代码高尔夫,我很激动:)另外这意味着它可能没有任何好处。

常规127 117 112 105

编辑:由于似乎允许使用的函数是105中的一个。我还重命名了变量,以使第一列读取ACDC,因为这在任何类型的源代码中都很重要:

A = {e = {it.toSet()。size()}
C = it.text.tokenize()
D = e(C.max {e(it)})
C.grep {e(it)== D} .each {println“ $ it $ D”}}

您可以这样称呼它:

A(新文件(“ words.txt”))

112中没有使用标准输入的功能:

a = {it.toSet()。size()}
b = System.in.getText()。tokenize()
c = a(b.max {a(it)})
b.grep {a(it)== c} .each {println“ $ it $ c”}

a = {it.toSet()。size()}
b = System.in.getText()。tokenize()。sort {-a(it)}
c = a(b [0])
b.grep {a(it)== c} .each {println“ $ it $ c”}

a = {it.toSet()。size()}
System.in.getText()。tokenize()。sort({-a(it)})。groupBy {a(it)}。take(1).each {k,v-> v.each {println“ $它$ k“}}

输入:primo的Lorem Ipsum文本

所有脚本输出:

consequat 9
ullamcorper 9
Vestibulum 9

有人知道如何使它们更时髦吗?


3

Perl 78字节

map{push$_[keys{map{$_,1}/./g}]||=[],$_}split for<>;print"$_ $#_
"for@{$_[-1]}

解释此限制“文本文档必须由您的代码读取”,表示不允许读取和解析输入的命令行选项。与下面的PHP解决方案一样,仅将字符10和32视为单词定界符。输入和输出也以相同的方式进行。


PHP 128字节

<?foreach(split(~߃õ,fread(STDIN,1e6))as$s){$w[count(count_chars($s,1))][]=$s;}krsort($w)?><?=join($f=~ß.key($w).~õ,pos($w)),$f;

唯一被认为是单词定界符的字符是字符10和字符32。其余的字符(包括标点符号)被认为是单词的一部分。

它包含一些二进制字符,这些字符保存引号,但是结果需要使用ANSI编码保存才能正常运行。或者,可以使用此版本,该版本重3个字节:

<?foreach(split(' |
',fread(STDIN,1e6))as$s){$w[count(count_chars($s,1))][]=$s;}krsort($w)?><?=join($f=' '.key($w).'
',pos($w)),$f;

样本I / O:

输入1:

It was the best of times, it was the worst of times, it was the age of wisdom,
it was the age of foolishness, it was the epoch of belief, it was the epoch of
incredulity, it was the season of Light, it was the season of Darkness, it was
the spring of hope, it was the winter of despair, we had everything before us,
we had nothing before us, we were all going direct to Heaven, we were all going
direct the other way - in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received, for good
or for evil, in the superlative degree of comparison only.

输出1:

$ php most-unique.php < input1.dat
incredulity, 11

输入2:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis, nisl sit
amet consequat fringilla, justo risus iaculis justo, vel ullamcorper dui tellus
ut enim. Suspendisse lectus risus, molestie sed volutpat nec, eleifend vitae
ligula. Nulla porttitor elit vel augue pretium cursus. Donec in turpis lectus.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia
Curae; Quisque a lorem eu turpis viverra sodales. Pellentesque justo arcu,
venenatis nec hendrerit a, molestie vitae augue.

输出2:

$ php most-unique.php < input2.dat
consequat 9
ullamcorper 9
Vestibulum 9

incredulity有10个唯一的字母,而不是11个
。– DavidC

@DavidCarraher,他的代码包括逗号,理论上是通过规则允许的。
2013年

这种解释是绝对不可思议的。
DavidC

2
不仅“理论上是允许的”,而且考虑到问题的措辞(特别是第2点和第3点),这似乎是一个必要条件。
primo

@DavidCarraher是的,标点符号是有效字符。除空格以外的任何其他内容均有效。
加菲2013年

3

GoRuby 2.0.0 – 66个字符

下面的解决方案实际上并没有找到所有匹配项,只有一个。这是我的最终版本:

a=$<.r.sp.m{|x|[x,x.ch.u.sz]};a.m{|x|s x*' - 'if x.l==a.m_(&:l).l}

例子:

Lorem ipsum dolor坐下来,一直保持着良好的状态。多内克·莫利斯(Donec mollis),尼斯(Nisl)坐着,结果是贝母(fringilla),伊索拉·尤库里斯(Justo risus iaculis justo),维拉·乌拉姆卡佩尔·杜勒斯(us ull encorp)。Suspendisse lectus risus,痣sed volutpat nec,eleifend vitale ligula。Nulla porttitor elit vel augue pretium cursus。Donec在Turpis lectus。紫茎泽兰和乌贼菌中的初生的Vestibulum ante ipsum primis;Quisque a lorem eu turpis viverra sodales。Pellentesque justo arcu,venenatis nec hendrerit a,葡萄干的augue。

产生:

$ ruby golf.rb < input.txt
consequat - 9
ullamcorper - 9
Vestibulum - 9

GoRuby 2.0.0 – 29个字符(不完全是输出格式)

s$<.sp.m{|x|[x.ch.u.sz,x]}.mx

期望从stdin输入。但是,输出格式略有不同。例如:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 – 42 40个字符

s$<.r.sp.m{|x|[x.ch.u.sz,x]}.mx.rv*' - '

期望从stdin输入

Ruby 1.9.3-69 65个字符

puts$<.read.split.map{|x|[x.chars.uniq.size,x]}.max.reverse*' - '

期望从stdin输入(与上面相同,但没有GoRuby缩写)


2

Javascript 163155152162字节

这大约是我能得到的:

prompt(x=[]).split(/\s/).forEach(function(a){b={};c=0;a.split('').forEach(function(d){b[d]?1:b[d]=++c});x[c]?x[c].push(a):x[c]=[a]});alert((l=x.length-1)+':'+x[l])
prompt(x=[]).split(/\b/).map(function(a){b={};c=0;a.split('').map(function(d){b[d]?1:b[d]=++c});x[c]?x[c].push(a):x[c]=[a]});alert((l=x.length-1)+':'+x[l])
prompt(x=[]).split(/\s/).map(function(a){b=[c=0];a.split('').map(function(d){b[d]?1:b[d]=++c});x[c]=(x[c]||[]).concat(a)});alert((l=x.length-1)+':'+x[l])

prompt(x=[]).split(/\s/).map(function(a){b=[c=0];a.split('').map(function(d){b[d]?1:b[d]=++c});x[c]=(x[c]||[]).concat(a)});alert((l=x.length-1)+':'+x[l].join('\n'))

在此版本中,/\s/单词是根据空格分隔的,因此它包括标点符号,逗号,句点等作为单词的一部分。这很容易更改/\b/为不包含它们。

我将看到我可以用for循环而不是forEaches做些什么。

输入/输出:

那是最美好的时光,那是最糟糕的时光,那是智慧的时代,那是愚昧的时代,那是信仰的时代,那是怀疑的时代,那是光明的时代,是黑暗的季节,是希望的春天,是绝望的冬天,我们眼前的一切,眼前的一切,我们都直接去天堂,我们都直接去天堂-简而言之,这一时期与目前的时期如此遥远,以至于它的一些最吵闹的当局坚持以最高的比较程度来接受它是好是坏。

11:incredulity,

Lorem ipsum dolor坐下来,一直保持着良好的状态。多内克·莫利斯(Donec mollis),尼斯(Nisl)坐着,结果是贝母(fringilla),伊索拉·尤库里斯(Justo risus iaculis justo),维拉·乌拉姆卡佩尔·杜勒斯(us ull encorp)。Suspendisse lectus risus,痣sed volutpat nec,eleifend vitale ligula。Nulla porttitor elit vel augue pretium cursus。Donec在Turpis lectus。紫茎泽兰和乌贼菌中的初生的Vestibulum ante ipsum primis;Quisque a lorem eu turpis viverra sodales。Pellentesque justo arcu,venenatis nec hendrerit a,葡萄干的augue。

9:consequat
ullamcorper
Vestibulum

也许有点累。但我感到安宁。您今天早上在圆环上的成功在某种程度上是我的成功。保证您的未来。威尔伯,您将生活,稳固和安全。现在什么都不会伤害你。这些秋天的日子会缩短并变冷。叶子将从树上抖落而掉下来。圣诞节就要来了,冬天下雪了。您将活着享受冰封世界的美丽,因为这对扎克曼而言意义重大,他永远不会伤害您。冬天会过去,日子会延长,牧场池塘里的冰会融化。麻雀会唱歌唱歌,青蛙会醒来,暖风会再次吹来。所有这些景点,声音和气味,将成为您的享受,威尔伯-这个可爱的世界,这些珍贵的日子……

10:Wilbur—this

如今,几乎所有的孩子都很恐怖。最糟糕的是,通过像间谍这样的组织,他们被系统地变成了不可管治的小野蛮人,但是这并没有使他们产生任何反抗党纪的倾​​向。相反,他们崇拜该党及其与之相关的一切……他们的一切残酷性都外向了,反对国家的敌人,反对外国人,叛徒,破坏分子,思想犯罪分子。三十多岁的人害怕自己的孩子几乎是正常的。

15:thought-criminals.

输出中可能会出现尴尬:如果输出中有多个单词,并且其中一个单词以逗号结尾,则可能会连续显示两个逗号,这会造成混淆。
2013年

从规范,In the event more than one word exists with the highest count, print all words for that count, **with one new line delimiting**.
加菲

@Gaffi现在应该修复。10个字节>。<
Shmiddty

2

Scala 129个字符:

def f{
val l=readLine.split(" ").map(s=>(s,s.distinct.length)).sortBy(_._2)
println(l.filter(x=>x._2==l.last._2).mkString)}

2

R-106个字符
作为输入文本作为参数的功能:

f=function(t){
s=strsplit
a=sapply
t=s(t," ")[[1]]
w=a(a(s(t,""),unique),length)
n=(w==max(w))
cbind(t[n],w[n])
}

还有一些例子:

f("It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way - in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.")
     [,1]           [,2]
[1,] "incredulity," "11"

f("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis, nisl sit amet consequat fringilla, justo risus iaculis justo, vel ullamcorper dui tellus ut enim. Suspendisse lectus risus, molestie sed volutpat nec, eleifend vitae ligula. Nulla porttitor elit vel augue pretium cursus. Donec in turpis lectus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque a lorem eu turpis viverra sodales. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.")
     [,1]          [,2]
[1,] "consequat"   "9" 
[2,] "ullamcorper" "9" 
[3,] "Vestibulum"  "9"

R-100个字符
作为函数,以文本文件的路径作为参数:

f=function(t){
t=scan(t,"")
a=sapply
w=a(a(strsplit(t,""),unique),length)
n=(w==max(w))
cbind(t[n],w[n])
}

用法:

f("t1.txt")
Read 120 items
     [,1]           [,2]
[1,] "incredulity," "11"

我认为这丢失了“您的代码必须读入文本文档”。
史蒂芬·鲁姆巴尔斯基

@StevenRumbalski,这已得到纠正。
plannapus

1

Python的176 168

w = "".join((open('c')).readlines()).replace("\n", " ").split(" ")
l = sorted(zip([len(set(w[i])) for i in range(len(w))],w,))
print([x for x in l if l[-1][0] == x[0]])

1

Python3 119

从名为的文件中读取a

r={w:len(set(w))for w in open("a").read().split()};print("\n".join(str((k,v))for k,v in r.items()if v==max(r.values())))

使用@primo的输入文本进行了测试:

Input 1:
    ('incredulity,', 11)

Input 2:
    ('Vestibulum', 9)
    ('consequat', 9)
    ('ullamcorper', 9)

0

VBScript-430 / VBA-420

VBScript:

Function r(t)
d="Scripting.Dictionary"
Set w=CreateObject(d)
c=1
Do Until c>Len(t)
p=InStr(c,t," ")
i=InStr(c,t,vbCr)
If p<i Then s=i Else s=p
If s=0 Then s=Len(t)+1
f=Mid(t,c,s-c)  
If Not w.Exists(f) Then 
Set x=CreateObject(d)
For l=1 To Len(f)
n=Mid(f,l,1)
If Not x.Exists(n) Then x.Add n,n
Next
w.Add f,f
y=x.Count
If m=y Then z=f &vbCr &z
If m<y Then m=y:z=f
End If
c=s+1
Loop
r=z &" " &m
End Function

VBA:

Function r(t)
d="Scripting.Dictionary"
Set w=CreateObject(d)
c=1
Do Until c>Len(t)
p=InStr(c,t," ")
i=InStr(c,t,vbCr)
s=IIf(p<i,i,p)
If s=0 Then s=Len(t)+1
f=Mid(t,c,s-c)  
If Not w.Exists(f) Then 
Set x=CreateObject(d)
For l=1 To Len(f)
n=Mid(f,l,1)
If Not x.Exists(n) Then x.Add n,n
Next
w.Add f,f
y=x.Count
If m=y Then z=f &vbCr &z
If m<y Then m=y:z=f
End If
c=s+1
Loop
r=z &" " &m
End Function
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.