Encontrar la palabra más 'única'

12

Usando el idioma de su elección, escriba la función / script / programa más corto que pueda que identifique la palabra con el mayor número de letras únicas en un texto.

  • Las letras únicas deben incluir cualquier carácter distinto que use codificación UTF-8 .
    • Las versiones en mayúsculas y minúsculas del mismo personaje son diferentes y distintas; 'a' != 'A'
  • Las palabras están unidas por cualquier carácter de espacio en blanco.
  • Las 'letras' son cualquier símbolo que puede ser representado por un solo carácter unicode.
  • Su código debe leer el documento de texto, no se permite la precarga / codificación del texto.
  • La salida debe ser la palabra, seguida del recuento de letras únicas.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Cualquier delimitador / espacio entre los dos valores depende de usted, siempre que haya al menos un carácter para separarlos.
  • En el caso de que exista más de una palabra con el conteo más alto, imprima todas las palabras para ese conteo, con una nueva línea delimitadora.
    superacknowledgement - 16
    pseudolamellibranchiate - 16
  • Este es el código de golf, por lo que gana el código más corto.

Esta respuesta en inglés. SE me inspiró para crear este desafío. El ejemplo usa solo una lista de palabras , pero cualquier texto debe poder procesarse.

Gaffi
fuente
1
¿Cómo se separan las palabras? Usted dice que las letras únicas son cualquier carácter UTF-8, pero eso implicaría que todo el archivo es solo una palabra.
caja de cartón
1
¿Cómo estás definiendo letras aquí? Como acabo de decir y señalé en uno de los ingleses, SE responde LlanfairPGes una palabra galesa y contiene letras del alfabeto galés, lly chambas son letras individuales en el idioma galés.
Gareth
1
@Gareth No estaba al tanto de esa distinción, mi error. ¿Hay representaciones unicode de esas dos 'letras'? Para los propósitos de este desafío, cada carácter unicode individual es una letra.
Gaffi
1
Entonces, ¿ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.es una "palabra" válida?
Shmiddty
2
Fuera de tema, pero aparentemente solía haber letras sueltas para LL y ll en galés. Al menos Unicode tiene U + 1EFA y U + 1EFB para aquellos; "Medio galés" los llama. Sin embargo, no hay títulocase Ll.
Sr. Lister

Respuestas:

7

APL (56)

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

Esta es una función (la pregunta dice que está permitida) que toma una cadena y devuelve una matriz de palabras y longitudes únicas.

Uso:

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

Explicación:

  • ⎕ML←3: establece el nivel de migración en 3 (de modo que es una partición en lugar de encerrar)
  • W←⍵⊂⍨⍵≠' ': almacenar en Wla cadena dada, donde cada partición consiste en caracteres que no son espacios en blanco.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: obtenga la cantidad ( ) de elementos únicos ( ) en cada parte ( ¨) de W, y almacénelos , luego obtenga el orden de clasificación cuando se ordene hacia abajo en this ( ) y guárdelo en .
  • ∆[⍙... ]: ordenar por , así que ahora tenemos las longitudes únicas en orden.
  • ∆∘.=∆←∆: almacene el ordenado nuevamente y vea qué elementos son iguales.
  • ↑+/: suma las filas (ahora sabemos cuántos elementos son iguales a cada elemento) y luego toma el primer elemento (ahora sabemos cuántos elementos son iguales al primer elemento, es decir, cuántas de las palabras están vinculadas para el primer lugar).
  • W[⍙]⍴⍨: ordena Wpor y toma la primera N, donde N es el número que acabamos de calcular.
  • {⍵,⍴∪⍵}¨: para cada uno de estos, obtenga la palabra en sí y la cantidad de caracteres únicos en la palabra
  • : formato como matriz
marinus
fuente
4

Mathematica 96 115

Editar : el código ahora encuentra todas las palabras del número máximo de caracteres. Me niego a tratar las comas como caracteres de palabras.

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

Ejemplos

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

o

f@Import["t1.txt"]

{{"incredulidad", 10}, {"superlativo", 10}}


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

o

f@Import["t2.txt"]

{"Vestibulum", 9}


Ejemplos más largos

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

Sorpresa: ¡La palabra más "única" en la Declaración de Independencia es también la palabra más singular en Alicia en el país de las maravillas !

{"pronosticar", 11}
{"no detectable", 13}
{"incómodo", 12}
{"regocijadamente", 12}
{"incómodo", 12}
{"Verpflichtung", 13}
{"lugar de enterramiento", 12}

DavidC
fuente
¿esto solo devuelve una sola palabra más singular? Debería devolverlos a todos. por ejemplo, "superlativo, incredulidad, 10"
Shmiddty
@Shmiddty Abordé tu crítica. (Costó 19 bytes.)
DavidC
4

Python 2 (110 (98 usando entrada de archivo))

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

Cosas para mejorar: impresión (33 caracteres)

La puntuación se considera letras.

beary605
fuente
Python 2.7.3: NameError: global name 'r' is not defined. Después de añadir comillas simples alrededor del r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo
Vaya, no lo probé. Gracias por decir eso, nunca lo habría visto. En cuanto a Python 3: no funciona.
beary605
4

Este es mi primer codegolf, estoy muy emocionado :) También eso significa que probablemente no sea bueno.

Groovy 127 117 112 105

Editar: dado que las funciones parecen estar permitidas aquí, hay una en 105. También cambié el nombre de las variables para hacer que la primera columna lea ACDC, porque eso es importante en cualquier tipo de código fuente:

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

Lo llamarías así:

A (nuevo archivo ("words.txt"))

Sin función con entrada estándar en 112 :

a = {it.toSet (). size ()}
b = System.in.getText (). tokenize ()
c = a (b.max {a (it)})
b.grep {a (it) == c}. cada {println "$ it $ c"}

a = {it.toSet (). size ()}
b = System.in.getText (). tokenize (). sort {-a (it)}
c = a (b [0])
b.grep {a (it) == c}. cada {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 Texto de primo

Todos los scripts de salida:

consequat 9
ullamcorper 9
Vestibulum 9

¿Alguien tiene una idea de cómo hacerlos más maravillosos?

Fels
fuente
3

Perl 78 bytes

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

Interpretación de la restricción "El código debe leer el documento de texto" para indicar que las opciones de la línea de comandos que leen y analizan la entrada no están permitidas. Al igual que con la solución PHP a continuación, solo los caracteres 10 y 32 se consideran delimitadores de palabras. La entrada y la salida también se toman de la misma manera.


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;

Los únicos caracteres que se consideran delimitadores de palabras son el carácter 10 y el carácter 32. El resto, incluida la puntuación, se considera parte de la palabra.

Contiene algunos caracteres binarios, lo que ahorra comillas, pero como resultado debe guardarse con una codificación ANSI para que funcione correctamente. Alternativamente, se puede usar esta versión, que es 3 bytes más pesada:

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

Muestra de E / S:

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.

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

salida 2:

$ php most-unique.php < input2.dat
consequat 9
ullamcorper 9
Vestibulum 9
primo
fuente
incredulitytiene 10 letras únicas, no 11.
DavidC
@DavidCarraher su código incluye la coma, que teóricamente se permite a través de las reglas.
Shmiddty
La explicación es absolutamente incrédula.
DavidC
2
No solo está "teóricamente permitido", sino que dada la redacción de la pregunta (específicamente los puntos 2 y 3), parece ser un requisito.
primo
@DavidCarraher Sí, los signos de puntuación son caracteres válidos. Cualquier otra cosa que no sea espacio en blanco es válida.
Gaffi
3

GoRuby 2.0.0 - 66 caracteres

Las soluciones a continuación en realidad no encontraron todas las coincidencias, sino solo una. Aquí está mi versión final:

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

Ejemplos:

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 en turpis lectus. Vestibulum ante ipsum primis en 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.

produce:

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

GoRuby 2.0.0 - 29 caracteres (formato de salida no exacto)

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

Espera entrada de stdin. Sin embargo, el formato de salida es un poco diferente. Por ejemplo:

$ 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 (igual que el anterior, pero sin abreviaturas de GoRuby)

Patrick Oscity
fuente
2

Javascript 163 155 152 162 bytes

Esto es lo más corto que puedo obtener:

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

En esta versión, /\s/separa las palabras según el espacio en blanco, por lo que incluye signos de puntuación, comas, puntos, etc., como parte de las palabras. Esto se cambia fácilmente /\b/a no incluido.

Veré qué puedo hacer con for-loops en lugar de forEaches en un momento.

E / S:

Fue el mejor de los tiempos, fue el peor de los tiempos, fue la era de la sabiduría, fue la era de la necedad, fue la época de la creencia, fue la época de la incredulidad, fue la estación de la Luz, fue Era la temporada de la Oscuridad, era la primavera de la esperanza, era el invierno de la desesperación, teníamos todo delante de nosotros, no teníamos nada delante, todos íbamos directamente al Cielo, todos íbamos directamente al otro lado - en En resumen, el período fue tan similar al período actual, que algunas de sus autoridades más ruidosas insistieron en que fuera recibido, para bien o para mal, solo en el grado de comparación superlativo.

11:incredulity,

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 en turpis lectus. Vestibulum ante ipsum primis en 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 poco cansado, tal vez. Pero me siento en paz. Tu éxito en el ring esta mañana fue, en pequeña medida, mi éxito. Tu futuro está asegurado. Vivirás, seguro y protegido, Wilbur. Nada puede hacerte daño ahora. Estos días de otoño se acortarán y se enfriarán. Las hojas se sacudirán de los árboles y caerán. Llegará la Navidad y las nieves del invierno. Vivirás para disfrutar de la belleza del mundo helado, porque significas mucho para Zuckerman y él nunca te hará daño. El invierno pasará, los días se alargarán, el hielo se derretirá en el estanque de pasto. El gorrión de la canción regresará y cantará, las ranas se despertarán, el viento cálido soplará nuevamente. Todos estos paisajes, sonidos y olores serán tuyos para disfrutar, Wilbur, este mundo encantador, estos días preciosos ...

10:Wilbur—this

Casi todos los niños de hoy en día eran horribles. Lo peor de todo fue que, por medio de organizaciones como los Espías, se convirtieron sistemáticamente en pequeños salvajes ingobernables y, sin embargo, esto no produjo en ellos ninguna tendencia a rebelarse contra la disciplina del Partido. Por el contrario, adoraban al Partido y todo lo relacionado con él ... Toda su ferocidad se volcó hacia afuera, contra los enemigos del Estado, contra extranjeros, traidores, saboteadores, criminales del pensamiento. Era casi normal que las personas mayores de treinta años tuvieran miedo de sus propios hijos.

15:thought-criminals.
Shmiddty
fuente
Hay una posible incomodidad con la salida: si hay varias palabras en la salida y una de las palabras termina con una coma, podría mostrar dos comas seguidas, lo que sería confuso.
Shmiddty
A partir de la especificación,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 debería arreglarse ahora. 10 bytes>. <
Shmiddty
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)}
usuario desconocido
fuente
2

R - 106 caracteres
Como una función con el 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])
}

Y algunos ejemplos:

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"

O R - 100 caracteres
Como una función con la ruta al archivo 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"
plannapus
fuente
Creo que esto falta "El documento de texto debe ser leído por su código".
Steven Rumbalski
@StevenRumbalski esto se corrige.
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
fuente
1

Python3 119

Lee de un archivo llamado 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())))

Probado con los textos de entrada de @primo:

Input 1:
    ('incredulity,', 11)

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