Encontrar a palavra mais 'única'


12

Usando o idioma de sua escolha, escreva a menor função / script / programa possível, que identificará a palavra com o maior número de letras exclusivas em um texto.

  • Letras exclusivas devem incluir qualquer caractere distinto usando a codificação UTF-8 .
    • As versões em maiúsculas e minúsculas do mesmo caractere são diferentes e distintas; 'a' != 'A'
  • As palavras são vinculadas por qualquer caractere de espaço em branco.
  • 'Letras' são qualquer símbolo que possa ser representado por um único caractere unicode.
  • O documento de texto deve ser lido pelo seu código - não é permitido pré-carregamento / codificação do texto.
  • A saída deve ser a palavra, seguida pela contagem de letras únicas.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Qualquer delimitador / espaçamento entre os dois valores é com você, desde que haja pelo menos um caractere para separá-los.
  • Caso exista mais de uma palavra com a contagem mais alta, imprima todas as palavras dessa contagem, com uma nova delimitação de linha.
    super-reconhecimento - 16
    pseudolamellibranchiate - 16
  • Isso é código de golfe, então o código mais curto vence.

Essa resposta no English.SE me inspirou a criar esse desafio. O exemplo usa apenas uma lista de palavras , mas qualquer texto deve poder ser processado.


1
Como as palavras são separadas? Você diz que letras únicas são qualquer caractere UTF-8, mas isso implica que o arquivo inteiro é apenas uma palavra.
cardboard_box

1
Como você está definindo letras aqui? Como acabei de mencionar em uma das respostas em English.SE, LlanfairPGé uma palavra em galês e contém letras do alfabeto galês - lle chsão letras únicas no idioma galês.
Gareth

1
@ Gareth Eu não estava ciente dessa distinção, meu erro. Existem representações unicode dessas duas 'letras'? Para os propósitos deste desafio, cada caractere unicode individual é uma letra.
Gaffi

1
Então, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.é uma "palavra" válida?
Shmiddty

2
Fora de tópico, mas aparentemente costumava haver letras únicas para LL e ll em galês. Pelo menos Unicode tem U + 1EFA e U + 1EFB para esses; "Galês do Meio" os chama. No entanto, não há titlecase Ll.
Sr. Lister

Respostas:


7

APL (56)

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

Essa é uma função (a pergunta diz que é permitida) que pega uma string e retorna uma matriz de palavras e comprimentos únicos.

Uso:

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

Explicação:

  • ⎕ML←3: defina o nível de migração como 3 (para que seja partição em vez de delimitar)
  • W←⍵⊂⍨⍵≠' ': armazena na Wsequência especificada, em que cada partição consiste em caracteres que não são de espaço em branco.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: obtenha a quantidade ( ) de elementos únicos ( ) em cada parte ( ¨) We armazene-os , em seguida, obtenha a ordem de classificação quando classificada abaixo ( ) e armazene-a em .
  • ∆[⍙... ]: classifique por , agora temos os comprimentos únicos em ordem.
  • ∆∘.=∆←∆: armazene os classificados novamente e veja quais elementos são iguais.
  • ↑+/: some as linhas (agora sabemos quantos elementos são iguais a cada elemento) e, em seguida, pegue o primeiro item (agora sabemos quantos elementos são iguais ao primeiro elemento, ou seja, quantas das palavras estão ligadas em primeiro lugar).
  • W[⍙]⍴⍨: classifique Wpor e pegue o primeiro N, onde N é o número que acabamos de calcular.
  • {⍵,⍴∪⍵}¨: para cada um deles, obtenha a palavra em si e a quantidade de caracteres únicos na palavra
  • : formato como matriz

4

Mathematica 96 115

Editar : o código agora encontra todas as palavras com o número máximo de caracteres. Recuso-me a tratar vírgulas como caracteres de palavras.

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

Exemplos

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

ou

f@Import["t1.txt"]

{{"incredulidade", 10}, {"superlativo", 10}}


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

ou

f@Import["t2.txt"]

{"Vestíbulo", 9}


Exemplos mais longos

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

Surpresa: A palavra mais "única" da Declaração de Independência também é a palavra mais única de Alice no País das Maravilhas !

{"prognóstico", 11}
{"não detectável", 13}
{"desconfortável", 12}
{"regocijadamente", 12}
{"desconfortável", 12}
{"Verpflichtung", 13}
{"local de sepultamento", 12}


isso retorna apenas uma palavra única e única? Deve devolvê-los todos. por exemplo "superlativo, incredulidade, 10"
Shmiddty 06/02

@ Shmiddty Dirigi-me às suas críticas. (Custou 19 bytes.) #
187

4

Python 2 (110 (98 usando a entrada de arquivo))

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

O que há para melhorar: impressão (33 caracteres)

A pontuação é considerada letras.


Python 2.7.3: NameError: global name 'r' is not defined. Depois de adicionar aspas simples em torno do r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo

Opa, eu não testei. Obrigado por dizer isso, eu nunca teria visto isso. Quanto ao Python 3: não funciona.
227136

4

Este é o meu primeiro codegolf, estou muito empolgado :) Também significa que provavelmente não é bom.

Groovy 127 117 112 105

Edit: Como as funções parecem permitidas aqui, é uma em 105. Também renomei as variáveis ​​para fazer a primeira coluna ler ACDC, porque isso é importante em qualquer tipo de código-fonte:

A = {e = {it.toSet (). Size ()}
C = it.text.tokenize ()
D = e (C.max {e (it)})
C.grep {e (it) == D} .each {println "$ it $ D"}}

Você poderia chamar assim:

A (novo arquivo ("words.txt"))

Sem função usando a entrada padrão no 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 "}}

Entrada: Lorem Ipsum Text from primo

Todos os scripts são gerados:

consequat 9
ullamcorper 9
Vestibulum 9

Alguém tem uma idéia de como torná-los mais sensuais?


3

Perl 78 bytes

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

Interpretação da restrição "O documento de texto deve ser lido pelo seu código" para significar que opções de linha de comando que lêem e analisam a entrada não são permitidas. Como na solução PHP abaixo, apenas os caracteres 10 e 32 são considerados delimitadores de palavras. Entrada e saída também são obtidas da mesma maneira.


PHP 128 bytes

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

Os únicos caracteres considerados delimitadores de palavras são o caractere 10 e o caractere 32. Os demais, incluindo a pontuação, são considerados parte da palavra.

Ele contém alguns caracteres binários, o que salva aspas, mas, como resultado, precisa ser salvo com uma codificação ANSI para funcionar corretamente. Como alternativa, esta versão pode ser usada, que é 3 bytes mais pesada:

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

E / S de amostra:

entrada 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.

saída 1:

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

entrada 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.

saída 2:

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

incredulitytem 10 letras únicas, não 11.
DavidC

@DavidCarraher, seu código inclui a vírgula, que é teoricamente permitida pelas regras.
Shmiddty

A explicação é absolutamente incrédula.
6133 DavidC

2
Não é apenas "teoricamente permitido", mas dado o teor da pergunta (especificamente os pontos 2 e 3), parece ser um requisito.
primo

@DavidCarraher Sim, pontuação são caracteres válidos. Qualquer coisa que não seja espaço em branco é válido.
Gaffi

3

GoRuby 2.0.0 - 66 caracteres

As soluções abaixo não encontraram todas as correspondências, mas apenas uma. Aqui está a minha versão final:

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

Exemplos:

Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Donec mollis, também está no meio da franquia, justo risus iaculis justo, vel ullamcorper dui tellus ut enim. Suspendisse lectus risus, molestie sed volutpat ne, eleifend vitae ligula. Nulla porttitor elit vel augue pretium cursus. Donec em turpis lectus. Vestibulum ante ipsum primis in faucibus oruct luctus and ultrices posuere cubilia Curae; Quisque a lorem eu turpis viverra sodales. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

produz:

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

GoRuby 2.0.0 - 29 caracteres (formato de saída não exato)

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

Espera entrada de stdin. O formato de saída é um pouco diferente, no entanto. Por exemplo:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 - 42 40 caracteres

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

espera entrada de stdin

Ruby 1.9.3 - 69 65 caracteres

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

espera entrada de stdin (o mesmo que acima, mas sem abreviações do GoRuby)


2

Javascript 163 155 152 162 bytes

Isso é o mais curto possível:

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'))

Nesta versão, /\s/as palavras são separadas por espaços em branco, incluindo pontuação, vírgulas, pontos etc. como parte das palavras. Isso é facilmente alterado para /\b/para não incluí-los.

Vou ver o que posso fazer com for-loops em vez de forEaches daqui a pouco.

E / S:

Era o melhor dos tempos, era o pior dos tempos, era a era da sabedoria, era a era da tolice, era a época da crença, era a época da crença, era a época da incredulidade, era a estação da Luz, era era a estação das trevas, era a primavera da esperança, era o inverno do desespero, tínhamos tudo à nossa frente, nada tínhamos diante de nós, todos estávamos indo diretamente para o céu, todos indo direto para o outro lado - Em resumo, o período era tão parecido com o atual, que algumas de suas autoridades mais barulhentas insistiam em ser recebidas, para o bem ou para o mal, apenas no grau superlativo de comparação.

11:incredulity,

Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Donec mollis, também está no meio da franquia, justo risus iaculis justo, vel ullamcorper dui tellus ut enim. Suspendisse lectus risus, molestie sed volutpat ne, eleifend vitae ligula. Nulla porttitor elit vel augue pretium cursus. Donec em turpis lectus. Vestibulum ante ipsum primis in faucibus oruct luctus and 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

Um pouco cansado, talvez. Mas me sinto em paz. O seu sucesso no ringue esta manhã foi, até certo ponto, o meu sucesso. Seu futuro está garantido. Você viverá seguro e protegido, Wilbur. Nada pode prejudicá-lo agora. Estes dias de outono encurtarão e esfriarão. As folhas se soltam das árvores e caem. O Natal chegará e as neves do inverno. Você viverá para apreciar a beleza do mundo congelado, pois significa muito para Zuckerman e ele nunca irá prejudicá-lo. O inverno passará, os dias se prolongarão, o gelo derreterá no lago do pasto. O pardal irá retornar e cantar, os sapos acordarão, o vento quente soprará novamente. Todas essas vistas, sons e cheiros serão seus, Wilbur - este mundo adorável, esses dias preciosos ...

10:Wilbur—this

Quase todas as crianças hoje em dia eram horríveis. O pior de tudo foi que, por meio de organizações como os Spies, eles foram sistematicamente transformados em pequenos selvagens ingovernáveis, e, no entanto, isso não produziu neles nenhuma tendência de se rebelar contra a disciplina do Partido. Pelo contrário, eles adoravam o Partido e tudo relacionado a ele ... Toda a sua ferocidade era voltada para fora, contra os inimigos do Estado, contra estrangeiros, traidores, sabotadores, criminosos. Era quase normal que pessoas com mais de trinta anos tivessem medo de seus próprios filhos.

15:thought-criminals.

Existe um potencial constrangimento na saída: se houver várias palavras na saída e uma delas terminar com vírgula, ela poderá mostrar duas vírgulas seguidas, o que seria confuso.
Shmiddty 06/02

A partir da especificação,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 deve ser corrigido agora. 10 bytes>. <
Shmiddty 06/02

2

Scala 129 caracteres:

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 caracteres
Como uma função com o texto de entrada como parâmetro:

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])
}

E alguns exemplos:

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"

Ou R - 100 caracteres
Como uma função com o caminho para o arquivo de texto como parâmetro:

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

Uso:

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

Acho que está faltando "O documento de texto deve ser lido pelo seu código".
Steven Rumbalski

@StevenRumbalski isso é corrigido.
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

Lê de um arquivo chamado 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())))

Testado com os textos de entrada do @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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.