Нахождение самого «уникального» слова

12

Используя выбранный вами язык, напишите самую короткую функцию / скрипт / программу, которая позволит вам идентифицировать слово с наибольшим количеством уникальных букв в тексте.

  • Уникальные буквы должны содержать любой отдельный символ с использованием кодировки UTF-8 .
    • Версии одного и того же символа в верхнем и нижнем регистре отличаются и различаются; 'a' != 'A'
  • Слова связаны любым пробелом.
  • «Буквы» - это любой символ, который может быть представлен одним символом Юникода.
  • Текстовый документ должен быть прочитан вашим кодом - не допускается предварительная загрузка / жесткое кодирование текста.
  • На выходе должно быть слово, за которым следует количество уникальных букв.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Любой разделитель / интервал между этими двумя значениями зависит от вас, если есть хотя бы один символ для их разделения.
  • Если существует более одного слова с наибольшим количеством, выведите все слова для этого количества, разделив их одной новой строкой.
    Сверхдоказательство - 16
    псевдоламеллибранчатый - 16
  • Это код гольф, поэтому выигрывает самый короткий код.

Этот ответ на английском. SE вдохновил меня на создание этой задачи. В примере используется только список слов , но любой текст должен обрабатываться.

Gaffi
источник
1
Как слова разделены? Вы говорите, что уникальные буквы - это любой символ UTF-8, но это означает, что весь файл - это всего лишь одно слово.
картонная
1
Как вы здесь определяете буквы? Как я только что говорил и указал на один из английских ответов. SE LlanfairPG- это валлийское слово, содержащее буквы из валлийского алфавита, llи chобе они представляют собой отдельные буквы на валлийском языке.
Гарет
1
@ Гарет, я не знал об этом различии, моя ошибка. Есть ли Unicode-представления этих двух «букв»? Для целей этого вызова каждый отдельный символ Unicode представляет собой букву.
Гаффи
1
Так abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.является ли верным «слово»?
Шмиддты
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: получить количество ( ) элементов unique ( ) в каждой части ( ¨) Wи сохранить их , затем получить порядок сортировки при сортировке вниз по this ( ) и сохранить его в .
  • ∆[⍙... ]: сортировать по , так что теперь у нас есть уникальные длины в порядке.
  • ∆∘.=∆←∆: сохранить отсортированный обратно и посмотреть, какие элементы равны.
  • ↑+/: суммируем строки (теперь мы знаем, сколько элементов равно каждому элементу), а затем берем первый элемент (теперь мы знаем, сколько элементов равно первому элементу, то есть сколько слов связано для первого места).
  • 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"]

{{"недоверие", 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}
{"неудобно", 12}
{"regocijadamente", 12}
{"неудобно", 12}
{"Verpflichtung", 13}
{"похоронное место", 12}

DavidC
источник
это возвращает только одно самое уникальное слово? Это должно вернуть их всех. например, «превосходная, недоверчивость, 10»
Шмиддти
@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 символа)

Пунктуация считается буквой.

beary605
источник
Python 2.7.3: NameError: global name 'r' is not defined. После добавления одинарных кавычек r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
Примо
К сожалению, я не проверял это. Спасибо за это, я бы никогда этого не увидел. Что касается Python 3: не работает.
beary605
4

Это мой первый Codegolf, я так взволнован :) Также это означает, что это, вероятно, не очень хорошо.

Groovy 127 117 112 105

Редактировать: Поскольку функции, кажется, разрешены, здесь одна из 105. Я также переименовал переменные, чтобы первый столбец читал ACDC, потому что это важно в любом виде исходного кода:

A = {е = {it.toSet (). Размер ()}
С = it.text.tokenize ()
D = е (C.max {е (это)})
C.grep {e (it) == D} .each {println "$ it $ D"}}

Вы бы назвали это так:

A (новый файл ("words.txt"))

Без функции с использованием стандартного ввода в 112 :

а = {it.toSet (). Размер ()}
б = System.in.getText (). токенизировать ()
с = а (b.max {а (это)})
b.grep {a (it) == c} .each {println "$ it $ c"}

а = {it.toSet (). Размер ()}
б = System.in.getText (). токенизировать (). рода {-a (она)}
с = а (Ь [0])
b.grep {a (it) == c} .each {println "$ it $ c"}

а = {it.toSet (). Размер ()}
System.in.getText (). Tokenize (). Sort ({- a (it)}). GroupBy {a (it)}. Take (1) .each {k, v-> v.each {println "$ это $ k "}}

Входные данные: Lorem Ipsum Текст от primo

Вывод всех скриптов:

consequat 9
ullamcorper 9
Vestibulum 9

У кого-нибудь есть идеи, как сделать их более заводными?

Fels
источник
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;

Пример ввода / вывода:

вход 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 его код включает запятую, что теоретически разрешено через правила.
Шмиддти
Объяснение абсолютно невероятно.
DavidC
2
Мало того, что это «теоретически разрешено», но, учитывая формулировку вопроса (в частности, пункты 2 и 3), это кажется требованием.
Примо
@DavidCarraher Да, знаки препинания являются действительными символами. Все, кроме пробелов, является действительным.
Гаффи
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 Sit Amet, Concetetur Adipiscing Elit. Donec Mollis, Nisl Sit Amet Concequat Fringilla, Justo Risus Iaculis Justo, Vel Ullamcorper Dui Tellus Ut Enim. Suspendisse lectus risus, molestie sed volutpat nec, eleifend vige ligula. Nulla porttitor elit vel augue pretium cursus. Donec in turpis lectus. Vestibulum ante ipsum primis у faucibus orci luctus et ultrices posuere cubilia Curae; Quisque Lorem ЕС Turpis Viverra содовой. 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

Ожидает ввода от стандартного ввода. Формат вывода немного другой, хотя. Например:

$ 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*' - '

ожидает ввода от стандартного ввода

Ruby 1.9.3 - 69 65 символов

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

ожидает ввода от стандартного ввода (то же, что и выше, но без сокращений GoRuby)

Патрик Осцити
источник
2

Javascript 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/чтобы не включать их.

Я посмотрю, что я могу сделать с циклами for вместо forEaches, чуть позже.

I / O:

Это были лучшие времена, это были худшие времена, это был век мудрости, это был век глупости, это была эпоха веры, это была эпоха недоверия, это было время Света, это это было время Тьмы, это была весна надежды, это была зима отчаяния, у нас было все до нас, у нас ничего не было до нас, мы все шли прямо в небеса, мы все шли прямо в другую сторону - в Короче говоря, этот период был настолько похож на нынешний, что некоторые из его самых шумных авторитетов настаивали на том, чтобы его получали, во благо или во зло, только в превосходной степени сравнения.

11:incredulity,

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit. Donec Mollis, Nisl Sit Amet Concequat Fringilla, Justo Risus Iaculis Justo, Vel Ullamcorper Dui Tellus Ut Enim. Suspendisse lectus risus, molestie sed volutpat nec, eleifend vige ligula. Nulla porttitor elit vel augue pretium cursus. Donec in turpis lectus. Vestibulum ante ipsum primis у faucibus orci luctus et ultrices posuere cubilia Curae; Quisque Lorem ЕС Turpis Viverra содовой. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

9:consequat
ullamcorper
Vestibulum

Возможно, немного уставший. Но я чувствую себя мирно. Ваш успех на ринге этим утром был, в некоторой степени, моим успехом. Ваше будущее гарантировано. Ты будешь жить в безопасности, Уилбур. Ничто не может навредить вам сейчас. Эти осенние дни сократятся и станут холодными. Листья оторвутся от деревьев и упадут. Придет Рождество, а зимой - снег. Вы будете жить, чтобы наслаждаться красотой замерзшего мира, потому что вы много значите для Цукермана, и он никогда не причинит вам вреда. Зима пройдет, дни удлинятся, лед растает в пастбищном пруду. Воробей песни вернется и будет петь, лягушки проснутся, снова подует теплый ветер. Все эти достопримечательности, звуки и запахи будут твоими, Уилбур - этот прекрасный мир, эти драгоценные дни ...

10:Wilbur—this

В наше время почти все дети были ужасны. Хуже всего было то, что с помощью таких организаций, как шпионы, они систематически превращались в неуправляемых маленьких дикарей, и все же это не вызывало у них никакой тенденции восстать против дисциплины партии. Наоборот, они обожали партию и все, что с ней связано ... Вся их свирепость была обращена наружу, против врагов государства, против иностранцев, предателей, диверсантов, преступников. Для людей старше тридцати было почти нормально бояться собственных детей.

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 должен быть исправлен сейчас. 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"
plannapus
источник
Я думаю, что этого не хватает «Текстовый документ должен быть прочитан вашим кодом».
Стивен Румбальски
@ 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]])
Raufio
источник
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)
GCQ
источник
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
Gaffi
источник