最も「ユニークな」単語を見つける


12

選択した言語を使用して、テキスト内で一意の文字の数が最も多い単語を識別することができる最短の機能/スクリプト/プログラムを作成します。

  • 一意の文字には、UTF-8エンコーディングを使用した任意の個別の文字を含める必要があります。
    • 同じ文字の大文字と小文字のバージョンは異なり、区別されます。 'a' != 'A'
  • 単語は空白文字で区切られます。
  • 「文字」は、単一のユニコード文字で表すことができる記号です。
  • テキストドキュメントはコードで読み込む必要があります。テキストのプリロード/ハードコーディングは許可されていません。
  • 出力は単語であり、その後に一意の文字の数が続きます。
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • 2つの値を区切る文字が少なくとも1つある限り、2つの値の間の区切り文字/間隔は任意です。
  • 最高のカウントを持つ複数の単語が存在する場合、そのカウントのすべての単語を1行の改行で区切って出力します。
    超謝辞-16
    偽板状枝-16
  • これはコードゴルフなので、最短のコードが勝ちます。

English.SEに関するこの回答は、私にこの挑戦を生み出すきっかけとなりました。この例では単語リストのみを使用していますが、テキストはすべて処理できる必要があります。


1
単語はどのように分離されますか?一意の文字は任意のUTF-8文字であると言いますが、これはファイル全体が1つの単語であることを意味します。
cardboard_box

1
ここで文字をどのように定義していますか?English.SEの答えLlanfairPGはウェールズ語であり、ウェールズ語のアルファベットの文字を含んでllおりch、どちらもウェールズ語の1文字です。
ガレス

1
@Garethその違い、私の間違いを私は知らなかった。これら2つの「文字」のUnicode表現はありますか?この課題のために、個々のユニコード文字は文字です。
ガフィ

1
それではabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.、有効な「単語」ですか?
Shmiddty

2
トピック外ですが、明らかにウェールズ語ではLLとllに単一の文字が使用されていたようです。少なくともUnicodeには、それらに対してU + 1EFAとU + 1EFBがあります。「ミドルウェールズ」と呼びます。ただし、タイトルケースLlはありません。
ミスターリスター

回答:


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

Mathematica 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}、{"superlative"、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"]

驚き:独立宣言で最も「ユニークな」単語は、不思議の国のアリスでも最もユニークな単語です!

{「予後」、11}
{「発見 不可能」、13}
{「不快」、12}
{「regocijadamente」、12}
{「不快」、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 definedr:の周りにシングルクォートを追加した後AttributeError: 'file' object has no attribute 'split'。Pythonの3.3.0: SyntaxError: invalid syntax 'print i,c'
primo

おっと、私はそれをテストしませんでした。それを言ってくれてありがとう、私はそれを見たことがないだろう。Python 3に関しては機能しません。
beary605

4

これは私の最初のcodegolfです、私はとても興奮しています:)また、それはおそらくそれが良くないことを意味します。

グルービー127 117 112 105

編集:ここで関数が許可されているように見えるのは105に1つです。また、変数の名前を変更して、最初の列が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 "$ it $ 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

incredulity11ではなく10の一意の文字があります。
DavidC

@DavidCarraherのコードにはカンマが含まれていますが、これは理論的には規則で許可されています。
Shmiddty

説明は絶対に信じられません。
DavidC

2
「理論的に許容される」だけでなく、質問の文言(具体的にはポイント2と3)を考えると、それは要件のようです。
プリモ

@DavidCarraherはい、句読点は有効な文字です。空白以外は有効です。
ガフィ

3

GoRuby 2.0.0 – 66文字

以下の解決策は実際にはすべての一致を見つけたわけではなく、1つだけを見つけました。これが私の最終バージョンです。

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 sit amet、consectetur adipiscing elit。ドネック・モリス、NISLシット・アメット・コンシード・フリンジラ、ジャスト・リサス・アヤリス・ジャスト、ベル・ウラムコーパー・デュイ・テルス・ユー・エニム。Suspendisse lectus risus、痴漢sed volutpat nec、eleifend vitae ligula。Nulla porttitor elit vel augue pretium cursus。turpis lectusのDonec。faucibus orci luctus et ultrices posuere cubilia Curaeの前庭前乳頭; Lorem eu turpis viverra sodalesをクイズします。ペレンテスク・フスト・アルク、ベネナティス・ネク・ヘンドレリット、モレスティ・ヴィタ・オーガス。

生成するもの:

$ 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

ジャバスクリプト163 155 152 162バイト

これは私が手に入れることができるほど短いです:

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/それらを含めないように簡単に変更できます。

forEachesではなくfor-loopsでできることを少し説明します。

I / O:

それは最高の時代であり、最悪の時代であり、知恵の時代であり、それは愚かさの時代であり、それは信念の時代であり、それは信じられない時代であり、それは光の季節でした暗闇の季節、希望の春、絶望の冬、私たちの前にはすべてがあり、私たちの前には何もありませんでした、私たちはすべて天国に直行していました要するに、この期間は現在の期間に非常に近いため、最も騒々しい当局の一部は、比較のために最上級の程度でのみ、善悪のために受け取られることを主張しました。

11:incredulity,

Lorem ipsum dolor sit amet、consectetur adipiscing elit。ドネック・モリス、NISLシット・アメット・コンシード・フリンジラ、ジャスト・リサス・アヤリス・ジャスト、ベル・ウラムコーパー・デュイ・テルス・ユー・エニム。Suspendisse lectus risus、痴漢sed volutpat nec、eleifend vitae ligula。Nulla porttitor elit vel augue pretium cursus。turpis lectusのDonec。faucibus orci luctus et ultrices posuere cubilia Curaeの前庭前乳頭; Lorem eu turpis viverra sodalesをクイズします。ペレンテスク・フスト・アルク、ベネナティス・ネク・ヘンドレリット、モレスティ・ヴィタ・オーガス。

9:consequat
ullamcorper
Vestibulum

おそらく少し疲れています。しかし、私は平和を感じます。今朝のリングでのあなたの成功は、私の成功でした。あなたの未来は保証されます。ウィルバー、あなたは安全で安全に生きます。今、何もあなたに害を及ぼすことはありません。これらの秋の日は短くなり、寒くなります。葉は木からゆるんで揺れ落ちます。クリスマスが来て、冬の雪が降るでしょう。あなたは凍った世界の美しさを楽しむために生きるでしょう、なぜならあなたはザッカーマンにとって大きな意味を持ち、彼はあなたを傷つけないでしょう。冬が過ぎ、日が長くなり、氷が牧草地の池で溶けます。歌のすずめが戻って歌い、カエルが目を覚まし、暖かい風が再び吹きます。これらの光景、音、匂いはすべてあなたのものです、ウィルバー-この素敵な世界、これらの貴重な日々…

10:Wilbur—this

今日、ほとんどすべての子供たちは恐ろしいものでした。何よりも最悪なのは、スパイなどの組織によって、彼らが組織的に統治できない小さな野av人になったということでしたが、党の規律に反する傾向は何もありませんでした。それどころか、彼らは党とそれに関連するすべてのものを崇拝していました...彼らの残虐行為はすべて、国家の敵、外国人、裏切り者、妨害者、思想犯罪者に対して外に向けられました。30歳以上の人が自分の子供を怖がるのはほとんど普通のことでした。

15:thought-criminals.

出力に潜在的な厄介さがあります。出力に複数の単語があり、単語の1つがコンマで終わる場合、2つのコンマが連続して表示されて混乱する可能性があります。
-Shmiddty

仕様から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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.