가장 '고유 한'단어 찾기


12

선택한 언어를 사용 하여 텍스트에서 고유 문자 수가 가장 많은 단어를 식별 할 수있는 가장 짧은 기능 / 스크립트 / 프로그램을 작성하십시오.

  • 고유 문자는 UTF-8 인코딩을 사용하는 고유 한 문자를 포함해야합니다 .
    • 동일한 문자의 대문자와 소문자 버전은 다르고 구별됩니다. 'a' != 'A'
  • 단어는 공백 문자로 묶입니다.
  • '문자'는 단일 유니 코드 문자로 표시 될 수있는 모든 기호입니다.
  • 텍스트 문서는 코드로 읽어야하며 텍스트의 사전로드 / 하드 코딩은 허용되지 않습니다.
  • 출력은 단어와 고유 문자 수로 이루어져야합니다.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • 둘 이상의 문자를 구분하는 한 두 값 사이의 구분 기호 / 간격은 사용자에게 달려 있습니다.
  • 개수가 가장 많은 단어가 두 개 이상인 경우 한 줄 바꿈을 사용하여 해당 개수에 대한 모든 단어를 인쇄하십시오.
    최고 인정-16
    슈 도라 멜리 브란 치 에이트-16
  • 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.

English.SE에 대한이 답변은 이 과제를 만들도록 영감을주었습니다. 이 예제에서는 단어 list 만 사용 하지만 모든 텍스트를 처리 할 수 ​​있어야합니다.


1
단어는 어떻게 분리되어 있습니까? 고유 문자는 UTF-8 문자이지만 전체 파일이 한 단어임을 의미합니다.
cardboard_box

1
여기서 글자를 어떻게 정의하고 있습니까? 난 그냥왔다과 English.SE 답변 중 하나에서 지적했듯이 LlanfairPG웨일스의 단어와 웨일즈 알파벳 문자를 포함 - llch모두 하나의 웨일스 어 언어 문자.
Gareth

1
@Gareth 나는 그 구별, 내 실수를 몰랐다. 이 두 글자의 유니 코드 표현이 있습니까? 이 문제를 해결하기 위해 각 개별 유니 코드 문자는 문자입니다.
Gaffi

1
그래서 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.유효한 "단어"는 무엇입니까?
Shmiddty

2
논란의 여지가 있지만 웨일스 어에는 LL과 ll에 대한 단일 문자가 사용되었습니다. 최소한 유니 코드에는 U + 1EFA 및 U + 1EFB가 있습니다. "중간-웨일스 어"라고합니다. 타이틀 케이스 L1은 없습니다.
Mr Lister

답변:


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"]

놀람 : 독립 선언서 에서 가장 "독특한"단어 는 이상한 나라의 앨리스에서 가장 독특한 단어입니다 !

{ "예측", 11}
{ " 복구 불가 ", 13}
{ "불편", 12}
{ "regocijadamente", 12}
{ "불편", 12}
{ "Verpflichtung", 13}
{ " 매장 소 ", 12}


이것은 가장 독특한 단어 하나만 반환합니까? 모두 돌려 주어야합니다. 예 : "최고,
엄청나게

@Shmiddty 나는 당신의 비판을 해결했습니다. (19 바이트가
소요됨

4

파이썬 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 자)

문장 부호는 문자로 간주됩니다.


파이썬 2.7.3 : NameError: global name 'r' is not defined. r: 주위에 작은 따옴표를 추가 한 후 AttributeError: 'file' object has no attribute 'split'. 파이썬 3.3.0 : SyntaxError: invalid syntax 'print i,c'.
primo

죄송합니다. 테스트하지 않았습니다. 그런 말을 해주셔서 감사합니다. 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 Text

모든 스크립트 출력 :

consequat 9
ullamcorper 9
Vestibulum 9

누구나 더 멋지게 만드는 방법에 대한 아이디어가 있습니까?


3

펄 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 지점)을 감안할 때 요구 사항 인 것 같습니다.
primo February

@DavidCarraher 예, 문장 부호는 유효한 문자입니다. 공백 이외의 것은 유효합니다.
Gaffi

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는 amet, conditetur adipiscing elit에 앉아 있습니다. Donec mollis, nisl 앉아 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는 augue pretium cursus를 제거합니다. Turpis lectus에있는 Donec. 파우 시우스 오르시 luctus (Fucius orci luctus) 및 ultrices posuere cubilia Curae의 배추 및 전립선; lorem eu turpis viverra sodales를 Quisque하십시오. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae 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의 입력을 예상합니다

루비 1.9.3-69 65 자

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

stdin의 입력을 예상합니다 (위와 동일하지만 GoRuby 약어는 없음)


2

자바 스크립트 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/포함되지 않도록 쉽게 변경됩니다 .

forEaches 대신 for-loops로 할 수있는 작업을 조금 살펴 보겠습니다.

I / O :

그것은 최고의 시간이었고, 최악의 시간이었고, 지혜의 시대였습니다. 어리 석음의 시대였습니다. 그것은 믿음의 신기원이었습니다. 어둠의 계절이었습니다. 희망의 봄이었습니다. 절망의 겨울이었습니다. 우리 앞에는 모든 것이 있었으며, 우리 앞에는 아무것도 없었습니다. 우리 모두는 천국에 직접 가고있었습니다. 요컨대, 그 시대는 현재 시대와 매우 흡사하여, 가장 시끄러운 권위자들 중 일부는 최상급의 비교만으로도 선악을 받겠다 고 주장했다.

11:incredulity,

Lorem ipsum의 dolor는 amet, conditetur adipiscing elit에 앉아 있습니다. Donec mollis, nisl 앉아 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는 augue pretium cursus를 제거합니다. Turpis lectus에있는 Donec. 파우 시우스 오르시 luctus (Fucius orci luctus) 및 ultrices posuere cubilia Curae의 배추 및 전립선; lorem eu turpis viverra sodales를 Quisque하십시오. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

9:consequat
ullamcorper
Vestibulum

아마 조금 피곤할 것입니다. 그러나 나는 평화 롭다. 오늘 아침 링에서 성공한 것은 나의 성공이었습니다. 당신의 미래는 보장됩니다. 윌버는 안전하고 안전하게 살 것입니다. 지금은 아무것도 당신을 해칠 수 없습니다. 이 가을은 짧아지고 차가워집니다. 나뭇잎이 나무에서 풀려 떨어집니다. 크리스마스와 겨울의 눈이 올 것이다. 당신은 얼어 붙은 세계의 아름다움을 즐기기 위해 살 것입니다. 왜냐하면 당신은 주커만에게 많은 것을 의미하기 때문에 그는 당신에게 해를 끼치 지 않을 것입니다. 겨울이 지나고 날이 길어지고 얼음이 목초지 연못에서 녹아 나옵니다. 노래 참새가 돌아와서 노래하고 개구리가 깨어나고 따뜻한 바람이 다시 불 것이다. 이 모든 광경과 소리와 냄새는 당신이 즐길 수있는 것입니다, Wilbur –이 아름다운 세상,이 소중한 날…

10:Wilbur—this

오늘날 거의 모든 어린이들이 끔찍했습니다. 가장 나쁜 것은 스파이와 같은 조직을 통해 체계적으로 통제 할 수없는 작은 야만인으로 변했지만, 그로 인해 당의 징계에 반항하는 경향이 없었습니다. 반대로, 그들은 당과 그와 관련된 모든 것을 숭배했습니다 ... 그들의 모든 잔인 함은 국가의 적들과 외국인, 반역자, 파괴자, 사상가에 대항하여 바깥쪽으로 향했습니다. 30 세 이상의 사람들이 자신의 아이들을 두려워하는 것은 거의 정상입니다.

15:thought-criminals.

출력에 어색함이있을 수 있습니다. 출력에 여러 단어가 있고 단어 중 하나가 쉼표로 끝나는 경우 두 개의 쉼표가 연속으로 표시되어 혼동 될 수 있습니다.
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

@Gaffi는 이제 수정되어야합니다. 10 바이트>. <
Shmiddty

2

스칼라 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"

"텍스트 문서를 코드로 읽어야합니다"가 누락 된 것 같습니다.
Steven Rumbalski

@StevenRumbalski이 수정되었습니다.
plannapus

1

파이썬 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

파이썬 3 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.