Trouver le mot le plus «unique»

12

En utilisant la langue de votre choix, écrivez la fonction / le script / le programme le plus court possible qui identifiera le mot avec le plus grand nombre de lettres uniques dans un texte.

  • Les lettres uniques doivent inclure tout caractère distinct utilisant le codage UTF-8 .
    • Les versions majuscules et minuscules du même caractère sont différentes et distinctes; 'a' != 'A'
  • Les mots sont liés par n'importe quel espace.
  • Les «lettres» sont tout symbole qui peut être représenté par un seul caractère unicode.
  • Le document texte doit être lu par votre code - aucun préchargement / codage en dur du texte autorisé.
  • La sortie doit être le mot, suivi du nombre de lettres uniques.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Tout délimiteur / espacement entre les deux valeurs dépend de vous, tant qu'il y a au moins un caractère pour les séparer.
  • Dans le cas où plusieurs mots existent avec le nombre le plus élevé, imprimez tous les mots pour ce nombre, avec une nouvelle ligne délimitant.
    super accusé de réception - 16
    pseudolamellibranchiate - 16
  • C'est le golf de code, donc le code le plus court gagne.

Cette réponse sur English.SE m'a inspiré pour créer ce défi. L'exemple utilise uniquement une liste de mots , mais tout texte doit pouvoir être traité.

Gaffi
la source
1
Comment les mots sont-ils séparés? Vous dites que les lettres uniques sont n'importe quel caractère UTF-8, mais cela impliquerait que le fichier entier n'est qu'un mot.
cardboard_box
1
Comment définissez-vous les lettres ici? Comme je viens de le faire et je l'ai souligné sur l'une des réponses English.SE LlanfairPGest un mot gallois et contient des lettres de l'alphabet gallois - llet chsont toutes les deux des lettres simples dans la langue galloise.
Gareth
1
@Gareth Je n'étais pas au courant de cette distinction, mon erreur. Existe-t-il des représentations unicodes de ces deux «lettres»? Aux fins de ce défi, chaque caractère unicode individuel est une lettre.
Gaffi
1
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.Un mot est-il donc valide?
Shmiddty
2
Hors sujet, mais apparemment il y avait des lettres simples pour LL et ll en gallois. Au moins Unicode a U + 1EFA et U + 1EFB pour ceux-ci; «Moyen-gallois», il les appelle. Il n'y a cependant pas de titlecase Ll.
M. Lister

Réponses:

7

APL (56)

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

Il s'agit d'une fonction (la question dit que c'est autorisé) qui prend une chaîne et renvoie une matrice de mots et des longueurs uniques.

Usage:

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

Explication:

  • ⎕ML←3: définissez le niveau de migration sur 3 (de sorte que la partition soit la place de la fermeture)
  • W←⍵⊂⍨⍵≠' ': stocker dans Wla chaîne donnée, où chaque partition se compose de caractères non blancs.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: obtenir la quantité ( ) d' éléments uniques ( ) dans chaque partie ( ¨) de W, et les stocker dans , puis obtenir l'ordre de tri lors du tri vers le bas sur ce ( ) et le stocker dans .
  • ∆[⍙... ]: trier par , donc maintenant nous avons les longueurs uniques dans l'ordre.
  • ∆∘.=∆←∆: stockez le tri dans et voyez quels éléments sont égaux.
  • ↑+/: additionner les lignes (maintenant nous savons combien d'éléments sont égaux à chaque élément) puis prendre le premier élément (maintenant nous savons combien d'éléments sont égaux au premier élément, c'est-à-dire combien de mots sont liés pour la première place.)
  • W[⍙]⍴⍨: trier Wpar et prendre le premier N, où N est le nombre que nous venons de calculer.
  • {⍵,⍴∪⍵}¨: pour chacun d'eux, obtenez le mot lui-même et la quantité de caractères uniques dans le mot
  • : format comme matrice
marinus
la source
4

Mathematica 96 115

Edit : le code trouve maintenant tous les mots du nombre maximum de caractères. Je refuse de traiter les virgules comme des mots.

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

Exemples

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

ou

f@Import["t1.txt"]

{{"incrédulité", 10}, {"superlatif", 10}}


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

ou

f@Import["t2.txt"]

{"Vestibulum", 9}


Exemples plus longs

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

Surprise: Le mot le plus "unique" dans la Déclaration d'Indépendance est aussi le mot le plus unique dans Alice au pays des merveilles !

{"pronostic", 11}
{"indiscernable", 13}
{"inconfortable", 12}
{"regocijadamente", 12}
{"inconfortable", 12}
{"Verpflichtung", 13}
{"buryingplace", 12}

DavidC
la source
cela ne renvoie-t-il qu'un seul mot unique? Il devrait les renvoyer tous. par exemple "superlatif, incrédulité, 10"
Shmiddty
@Shmiddty, j'ai adressé vos critiques. (Cela a coûté 19 octets.)
DavidC
4

Python 2 (110 (98 utilisant une entrée de fichier))

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

Choses à améliorer: impression (33 caractères)

La ponctuation est considérée comme une lettre.

beary605
la source
Python 2.7.3: NameError: global name 'r' is not defined. Après avoir ajouté des guillemets simples autour de la r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo
Oups, je ne l'ai pas testé. Merci d'avoir dit ça, je n'aurais jamais vu ça. Quant à Python 3: ne fonctionne pas.
beary605
4

Ceci est mon premier codegolf, je suis tellement excité :) Cela signifie également que ce n'est probablement pas bon.

Groovy 127 117 112 105

Edit: Puisque les fonctions semblent être autorisées ici, c'est une sur 105. J'ai également renommé les variables pour que la première colonne lise ACDC, car cela est important dans tout type de code source:

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

Vous appelleriez ça comme ça:

A (nouveau fichier ("words.txt"))

Sans fonction avec entrée standard en 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 "}}

Entrée: Lorem Ipsum Text de primo

Sortie de tous les scripts:

consequat 9
ullamcorper 9
Vestibulum 9

Quelqu'un a une idée de comment les rendre plus groovy?

Fels
la source
3

Perl 78 octets

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

L'interprétation de la restriction «Le document texte doit être lu par votre code» signifie que les options de ligne de commande qui lisent et analysent l'entrée ne sont pas autorisées. Comme avec la solution PHP ci-dessous, seuls les caractères 10 et 32 ​​sont considérés comme des délimiteurs de mots. L'entrée et la sortie sont également prises de la même manière.


PHP 128 octets

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

Les seuls caractères considérés comme délimiteurs de mots sont le caractère 10 et le caractère 32. Les autres, y compris la ponctuation, sont considérés comme faisant partie du mot.

Celui-ci contient quelques caractères binaires, ce qui permet d'économiser des guillemets, mais doit par conséquent être enregistré avec un codage ANSI pour fonctionner correctement. Alternativement, cette version peut être utilisée, qui est plus lourde de 3 octets:

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

Exemple d'E / S:

entrée 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.

sortie 1:

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

entrée 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.

sortie 2:

$ php most-unique.php < input2.dat
consequat 9
ullamcorper 9
Vestibulum 9
primo
la source
incredulitya 10 lettres uniques, pas 11.
DavidC
@DavidCarraher son code inclut la virgule, ce qui est théoriquement autorisé via les règles.
Shmiddty
L'explication est absolument incrédule.
DavidC
2
Non seulement elle est «théoriquement autorisée», mais compte tenu du libellé de la question (en particulier les points 2 et 3), elle semble être une exigence.
primo
@DavidCarraher Oui, les signes de ponctuation sont des caractères valides. Tout ce qui n'est pas un espace est valide.
Gaffi
3

GoRuby 2.0.0 - 66 caractères

Les solutions ci-dessous n'ont pas trouvé toutes les correspondances, mais une seule. Voici ma version finale:

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

Exemples:

Lorem ipsum dolor sit amet, elect adipiscing consectetur. Donec mollis, nisl sit amet conséquat 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 en 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.

produit:

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

GoRuby 2.0.0 - 29 caractères (format de sortie non exact)

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

Attend l'entrée de stdin. Le format de sortie est cependant un peu différent. Par exemple:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 - 42 40 caractères

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

attend l'entrée de stdin

Ruby 1.9.3 - 69 65 caractères

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

attend l'entrée de stdin (comme ci-dessus, mais sans abréviations GoRuby)

Patrick Oscity
la source
2

Javascript 163155152162 octets

C'est à peu près aussi court que possible:

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

Dans cette version, les /\s/mots sont séparés en fonction des espaces, ce qui inclut la ponctuation, les virgules, les points, etc. dans les mots. Ceci est facilement changé /\b/pour ne pas les inclure.

Je verrai ce que je peux faire avec les boucles for au lieu de forEaches dans un instant.

E / S:

C'était le meilleur des temps, c'était le pire des temps, c'était l'âge de la sagesse, c'était l'âge de la folie, c'était l'époque de la croyance, c'était l'époque de l'incrédulité, c'était la saison de la Lumière, c'était était la saison des Ténèbres, c'était le printemps de l'espoir, c'était l'hiver du désespoir, nous avions tout devant nous, nous n'avions rien devant nous, nous allions tous directement au Paradis, nous allions tous directement dans l'autre sens - dans Bref, la période était si proche de la période actuelle, que certaines de ses autorités les plus bruyantes ont insisté pour qu'elle soit reçue, pour le bien ou pour le mal, dans le degré de comparaison superlatif seulement.

11:incredulity,

Lorem ipsum dolor sit amet, elect adipiscing consectetur. Donec mollis, nisl sit amet conséquat 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 en 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

Un peu fatigué, peut-être. Mais je me sens en paix. Votre succès sur le ring ce matin a été, dans une faible mesure, mon succès. Votre avenir est assuré. Vous vivrez, en sécurité et en sécurité, Wilbur. Rien ne peut vous nuire maintenant. Ces journées d'automne raccourciront et deviendront froides. Les feuilles se détachent des arbres et tombent. Noël viendra, et les neiges de l'hiver. Vous vivrez pour profiter de la beauté du monde gelé, car vous comptez beaucoup pour Zuckerman et il ne vous fera jamais de mal. L'hiver passera, les jours s'allongeront, la glace fondra dans l'étang de pâturage. Le moineau chanteur reviendra et chantera, les grenouilles se réveilleront, le vent chaud soufflera à nouveau. Toutes ces images, ces sons et ces odeurs seront à votre disposition, Wilbur - ce monde charmant, ces jours précieux…

10:Wilbur—this

De nos jours, presque tous les enfants étaient horribles. Le pire de tout, c'est qu'au moyen d'organisations telles que les Espions, ils étaient systématiquement transformés en petits sauvages ingouvernables, et pourtant cela ne produisait en eux aucune tendance à se rebeller contre la discipline du Parti. Au contraire, ils adoraient le Parti et tout ce qui s'y rapportait ... Toute leur férocité était tournée vers l'extérieur, contre les ennemis de l'État, contre les étrangers, les traîtres, les saboteurs, les criminels. Il était presque normal que les personnes de plus de trente ans aient peur de leurs propres enfants.

15:thought-criminals.
Shmiddty
la source
Il y a une gêne potentielle avec la sortie: s'il y a plusieurs mots dans la sortie et que l'un des mots se termine par une virgule, cela pourrait afficher deux virgules d'affilée, ce qui serait déroutant.
Shmiddty
D'après les spécifications,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 devrait être corrigé maintenant. 10 octets>. <
Shmiddty
2

Scala 129 caractères:

def f{
val l=readLine.split(" ").map(s=>(s,s.distinct.length)).sortBy(_._2)
println(l.filter(x=>x._2==l.last._2).mkString)}
Utilisateur inconnu
la source
2

R - 106 caractères
En fonction du texte saisi comme paramètre:

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

Et quelques exemples:

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 caractères
En fonction du chemin d'accès au fichier texte en paramètre:

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

Usage:

f("t1.txt")
Read 120 items
     [,1]           [,2]
[1,] "incredulity," "11"
plannapus
la source
Je pense que cela manque "Le document texte doit être lu par votre code".
Steven Rumbalski
@StevenRumbalski ceci est corrigé.
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
la source
1

Python3 119

Lit à partir d'un fichier appelé 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())))

Testé avec les textes d'entrée de @primo:

Input 1:
    ('incredulity,', 11)

Input 2:
    ('Vestibulum', 9)
    ('consequat', 9)
    ('ullamcorper', 9)
gcq
la source
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
la source