Пошук найбільш «унікального» слова


12

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

  • Унікальні букви повинні містити будь-який окремий символ, що використовує кодування UTF-8 .
    • Верхні та малі версії одного символу різні та виразні; 'a' != 'A'
  • Слова пов'язані будь-яким символом пробілу.
  • "Букви" - це будь-який символ, який може бути представлений одним символом унікоду.
  • Текстовий документ повинен бути прочитаний у вашому коді - не допускається попереднє завантаження / жорстке кодування тексту.
  • На виході повинно бути слово, а потім - кількість унікальних літер.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Будь-який роздільник / пробіл між двома значеннями залежить від вас, якщо існує принаймні один символ для їх розділення.
  • У випадку, якщо існує найбільше одне слово з найбільшою кількістю, надрукуйте всі слова для цього рахунку з одним новим рядком.
    суперапідтвердження - 16
    псевдоламелібранхіат - 16
  • Це код гольфу, тому найкоротший код виграє.

Ця відповідь на English.SE надихнула мене на створення цього виклику. У прикладі використовується лише список слів , але будь-який текст повинен бути оброблений.


1
Як розділяються слова? Ви говорите, що унікальні букви мають будь-який символ UTF-8, але це означає, що весь файл - це лише одне слово.
cardboard_box

1
Як ви тут визначаєте літери? Як я тільки що був , і вказав на один з відповідей English.SE LlanfairPGслово Welsh і містить букви з алфавіту Welsh - llі chобидва одиночних букв в мові Welsh.
Гарет

1
@Gareth Я не знав про цю відмінність, мою помилку. Чи є унікодні зображення цих двох "букв"? Для цілей цього виклику кожен окремий символ унікоду - це літера.
Гаффі

1
Так abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.чи дійсне "слово"?
Шміддті

2
Поза темою, але, мабуть, у валійській мові були одні літери для LL та Lll. Принаймні 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

Математика 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"]

Сюрприз: Найбільш «унікальне» слово в Декларації незалежності - це також найунікальне слово Аліси в країні чудес !

{"прогноз", 11}
{"нерозкривний", 13}
{"незручний", 12}
{"регоціядаменте", 12}
{"незручний", 12}
{"Верпфліхтунг", 13}
{" похоронний дім ", 12}


це повертає лише одне найунікальне слово? Це має повернути їх усіх. напр., "чудова, недовірливість, 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 символи)

Знаками пунктуації вважаються літери.


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

Це мій перший кодогольф, я так схвильований :) Також це означає, що це, мабуть, не користь.

Groovy 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 "}}

Введення: Текст 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;

Зразок вводу / виводу:

вхід 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, consectetur adipiscing elit. Donec mollis, nisl sit amet posleat 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.

виробляє:

$ 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

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-loops замість forEaches.

I / O:

Це були найкращі часи, це були найгірші часи, це був вік мудрості, це був період дурості, це була епоха віри, це була епоха недовірливості, це був сезон Світла, це був сезон Темряви, це була весна надії, це була зима відчаю, у нас було все перед собою, перед нами нічого не було, ми всі прямували до Неба, всі прямими рухалися іншим шляхом - в Коротше кажучи, період був настільки схожий на цей період, що деякі його найшучніші авторитети наполягали на тому, щоб він був отриманий для добра чи для зла лише у найвищому ступені порівняння.

11:incredulity,

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis, nisl sit amet posleat 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.

9:consequat
ullamcorper
Vestibulum

Трохи втомився, мабуть. Але я відчуваю себе спокійно. Ваш успіх на рингу сьогодні вранці, в деякій мірі, був моїм успіхом. Ваше майбутнє впевнене Ви будете жити, надійно і безпечно, Вільбуре. Зараз вам нічого не може нашкодити. Ці осінні дні вкоротяться і застудяться. Листя розхитаються від дерев і опадають. Прийде Різдво, а зима сніги. Ви будете жити, щоб насолоджуватися красою замерзлого світу, бо ви дуже значите для Цукермана, і він не завдасть вам шкоди ніколи. Мине зима, подовжуються дні, на пасовищному ставку розтане лід. Пісенний горобець повернеться і заспіває, жаби прокинуться, знову тепне теплий вітер. Всі ці видовища, звуки і запахи будуть вашими, щоб насолоджуватися, Вільбур - цей прекрасний світ, ці дорогоцінні дні ...

10:Wilbur—this

Майже всі діти нині були жахливими. Найгірше за все було те, що за допомогою таких організацій, як шпигуни, вони систематично перетворювалися на маленьких дикунів, що не піддаються управлінню, і все ж це не створювало в них жодної тенденції до повстання проти дисципліни партії. Навпаки, вони обожнювали Партію і все, що з нею пов’язано ... Вся їхня зарозумілість була обернена назовні, проти ворогів держави, проти іноземців, зрадників, диверсантів, мислителів-злочинців. Людям старше тридцяти було практично нормально лякатися власних дітей.

15:thought-criminals.

Існує потенційна незграбність з результатом: якщо у виведенні є кілька слів, і одне зі слів закінчується комою, це може відображати дві коми в ряд, що було б заплутано.
Шміддті

Від специфікації,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 байт>. <
Шміддти


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 це виправлено.
планнапус

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.