Trovare la parola più "unica"


12

Usando la tua lingua preferita, scrivi la funzione / script / programma più breve che puoi per identificare la parola con il numero più alto di lettere univoche in un testo.

  • Le lettere univoche devono includere qualsiasi carattere distinto che utilizza la codifica UTF-8 .
    • Le versioni maiuscole e minuscole dello stesso carattere sono diverse e distinte; 'a' != 'A'
  • Le parole sono legate da qualsiasi carattere di spazio bianco.
  • Le "lettere" sono qualsiasi simbolo che può essere rappresentato da un singolo carattere unicode.
  • Il documento di testo deve essere letto dal tuo codice - non è consentito il precaricamento / hard-coding del testo.
  • L'output dovrebbe essere la parola, seguita dal conteggio delle lettere univoche.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Qualsiasi delimitatore / spaziatura tra i due valori dipende da te, purché vi sia almeno un carattere per separarli.
  • Nel caso in cui esista più di una parola con il conteggio più alto, stampa tutte le parole per quel conteggio, con una nuova delimitazione di righe.
    super-conoscenza - 16
    pseudolamellibranchiate - 16
  • Questo è il codice golf, quindi vince il codice più breve.

Questa risposta su English.SE mi ha ispirato a creare questa sfida. L'esempio utilizza solo un elenco di parole , ma qualsiasi testo dovrebbe essere in grado di essere elaborato.


1
Come vengono separate le parole? Dici che le lettere univoche sono qualsiasi carattere UTF-8, ma ciò implicherebbe che l'intero file è solo una parola.
cardboard_box

1
Come definisci le lettere qui? Come ho appena indicato e sottolineato in uno degli inglesi, la risposta ES LlanfairPGè una parola gallese e contiene lettere dell'alfabeto gallese - lle chsono entrambe lettere singole in lingua gallese.
Gareth,

1
@Gareth Non ero a conoscenza di quella distinzione, il mio errore. Ci sono rappresentazioni unicode di quelle due 'lettere'? Ai fini di questa sfida, ogni singolo personaggio Unicode è una lettera.
Gaffi,

1
Quindi abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.una "parola" valida?
Shmiddty,

2
Fuori tema, ma apparentemente c'erano lettere singole per LL e ll in gallese. Almeno Unicode ha U + 1EFA e U + 1EFB per quelli; "Middle-Welsh" li chiama. Non c'è nessun titolo Titlecase però.
Lister

Risposte:


7

APL (56)

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

Questa è una funzione (la domanda dice che è consentito) che accetta una stringa e restituisce una matrice di parole e lunghezze uniche.

Uso:

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

Spiegazione:

  • ⎕ML←3: imposta il livello di migrazione su 3 (in modo che sia partizione anziché racchiudere)
  • W←⍵⊂⍨⍵≠' ': memorizza nella Wstringa specificata, dove ogni partizione è composta da caratteri non bianchi.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: ottieni la quantità ( ) di elementi univoci ( ) in ciascuna parte ( ¨) di W, e memorizza questi in , quindi ottieni il criterio di ordinamento quando viene ordinato verso il basso su questo ( ) e memorizzalo in .
  • ∆[⍙... ]: ordina per , quindi ora abbiamo le lunghezze uniche in ordine.
  • ∆∘.=∆←∆: memorizza il riordinato in , e vedere quali elementi sono uguali.
  • ↑+/: somma le righe (ora sappiamo quanti elementi sono uguali a ciascun elemento) e quindi prendiamo il primo elemento (ora sappiamo quanti elementi sono uguali al primo elemento, cioè quante parole sono legate per il primo posto).
  • W[⍙]⍴⍨: ordina Wper e prendi la prima N, dove N è il numero che abbiamo appena calcolato.
  • {⍵,⍴∪⍵}¨: per ognuno di questi, ottieni la parola stessa e la quantità di caratteri unici nella parola
  • : formato come matrice

4

Mathematica 96 115

Modifica : il codice ora trova tutte le parole del numero massimo di caratteri. Mi rifiuto di trattare le virgole come caratteri di parole.

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

Esempi

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

o

f@Import["t1.txt"]

{{"incredulity", 10}, {"superlative", 10}}


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

o

f@Import["t2.txt"]

{"Vestibolo", 9}


Esempi più lunghi

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 parola più "unica" nella Dichiarazione di Indipendenza è anche la parola più unica in Alice nel Paese delle Meraviglie !

{"prognosticate", 11}
{"indistruttibile", 13}
{"scomodo", 12}
{"regocijadamente", 12}
{"scomodo", 12}
{"Verpflichtung", 13}
{"buryingplace", 12}


restituisce solo una sola parola unica? Dovrebbe restituirli tutti. ad esempio "superlativo, incredulità, 10"
Shmiddty,

@Shmiddty ho rivolto le tue critiche. (Costa 19 byte.)
DavidC

4

Python 2 (110 (98 usando l'input di file))

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

Cose da migliorare: stampa (33 caratteri)

La punteggiatura è considerata lettere.


Python 2.7.3: NameError: global name 'r' is not defined. Dopo l'aggiunta di virgolette singole intorno al r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo

Oops, non l'ho provato. Grazie per averlo detto, non l'avrei mai visto. Per quanto riguarda Python 3: non funziona.
beary605,

4

Questo è il mio primo codegolf, sono così eccitato :) Anche questo significa che probabilmente non va bene.

Groovy 127 117 112 105

Modifica: poiché le funzioni sembrano essere consentite qui è una su 105. Ho anche rinominato le variabili per fare in modo che la prima colonna leggesse ACDC, perché questo è importante in qualsiasi tipo di codice sorgente:

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

Lo chiameresti così:

A (nuovo file ("words.txt"))

Senza funzione utilizzando l'ingresso standard in 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 "}}

Input: Lorem Ipsum Testo dal primo

Tutti gli script di output:

consequat 9
ullamcorper 9
Vestibulum 9

Qualcuno ha idea di come renderli più groovy?


3

Perl 78 byte

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

Interpretazione della restrizione "Il documento di testo deve essere letto dal codice" per indicare che le opzioni della riga di comando che leggono e analizzano l'input non sono consentite. Come per la soluzione PHP di seguito, solo i caratteri 10 e 32 sono considerati delimitatori di parole. Anche input e output sono presi allo stesso modo.


PHP 128 byte

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

Gli unici caratteri considerati delimitatori di parole sono il carattere 10 e il carattere 32. Gli altri, inclusa la punteggiatura, sono considerati parte della parola.

Questo contiene alcuni caratteri binari, che salva le virgolette, ma di conseguenza deve essere salvato con una codifica ANSI per funzionare correttamente. In alternativa, è possibile utilizzare questa versione, che è di 3 byte più pesante:

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

I / O di esempio:

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

uscita 1:

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

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

uscita 2:

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

incredulityha 10 lettere uniche, non 11.
DavidC

@DavidCarraher il suo codice include la virgola, che è teoricamente consentita tramite le regole.
Shmiddty,

La spiegazione è assolutamente incredula.
DavidC,

2
Non solo è "teoricamente consentito", ma data la formulazione della domanda (in particolare i punti 2 e 3), sembra essere un requisito.
primo

@DavidCarraher Sì, la punteggiatura è un carattere valido. Qualunque cosa diversa dagli spazi bianchi è valida.
Gaffi,

3

GoRuby 2.0.0 - 66 caratteri

Le soluzioni seguenti non hanno effettivamente trovato tutte le corrispondenze, ma solo una. Ecco la mia versione finale:

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

Esempi:

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

produce:

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

GoRuby 2.0.0 - 29 caratteri (formato di output non esatto)

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

Si aspetta input da stdin. Tuttavia, il formato di output è leggermente diverso. Per esempio:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 - 42 40 caratteri

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

si aspetta input da stdin

Ruby 1.9.3 - 69 65 caratteri

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

si aspetta input da stdin (come sopra, ma senza abbreviazioni GoRuby)


2

Javascript 163 155 152 162 byte

Questo è il più breve possibile:

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

In questa versione /\s/separa le parole in base agli spazi bianchi, quindi include punteggiatura, virgole, punti, ecc. Come parte delle parole. Questo può essere facilmente modificato /\b/per non includerli.

Vedrò cosa posso fare con for-loops invece che forEaches tra poco.

I / O:

Era il migliore dei tempi, era il peggiore dei tempi, era l'era della saggezza, era l'era della follia, era l'epoca della credenza, era l'epoca dell'incredulità, era la stagione della Luce, era era la stagione delle tenebre, era la primavera della speranza, era l'inverno della disperazione, avevamo tutto prima di noi, non avevamo niente prima di noi, andavamo tutti direttamente in Paradiso, andavamo tutti diretti nell'altro modo - in Insomma, il periodo era così simile al periodo attuale, che alcune delle sue autorità più rumorose insistettero sul fatto di essere ricevute, nel bene e nel male, solo nel superlativo grado di confronto.

11:incredulity,

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mollis, nisl sit amet consequing 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. Vestibolo 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 po 'stanco, forse. Ma mi sento tranquillo. Il tuo successo sul ring questa mattina è stato, in piccola parte, il mio successo. Il tuo futuro è assicurato. Vivrai, sicuro e protetto, Wilbur. Niente può farti del male ora. Questi giorni autunnali si accorciano e diventano freddi. Le foglie si libereranno dagli alberi e cadranno. Arriverà il Natale e le nevicate dell'inverno. Vivrai per goderti la bellezza del mondo ghiacciato, perché significhi molto per Zuckerman e lui non ti farà mai del male. L'inverno passerà, i giorni si allungheranno, il ghiaccio si scioglierà nello stagno dei pascoli. Il passero canoro ritornerà e canterà, le rane si sveglieranno, il vento caldo soffierà di nuovo. Tutti questi panorami, suoni e odori saranno i tuoi da godere, Wilbur: questo bel mondo, questi giorni preziosi ...

10:Wilbur—this

Quasi tutti i bambini al giorno d'oggi erano orribili. La cosa peggiore di tutte fu che tramite organizzazioni come le Spie si trasformarono sistematicamente in piccoli selvaggi ingovernabili, e tuttavia ciò non produsse in essi alcuna tendenza a ribellarsi contro la disciplina del Partito. Al contrario, adoravano il Partito e tutto ciò che lo collegava ... Tutta la loro ferocia era rivolta verso l'esterno, contro i nemici dello Stato, contro gli stranieri, i traditori, i sabotatori, i criminali pensanti. Era quasi normale per le persone oltre i trenta di avere paura dei propri figli.

15:thought-criminals.

C'è un potenziale imbarazzo nell'output: se ci sono più parole nell'output e una delle parole termina con una virgola, potrebbe mostrare due virgole di fila che potrebbero creare confusione.
Shmiddty,

Dalle specifiche,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 dovrebbe essere risolto ora. 10 byte>. <
Shmiddty

2

Scala 129 caratteri:

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 caratteri
In funzione del testo di input come parametro:

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 alcuni esempi:

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"

Oppure R - 100 caratteri
In funzione del percorso del file di testo come parametro:

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"

Penso che manchi "Il documento di testo deve essere letto dal tuo codice".
Steven Rumbalski,

@StevenRumbalski questo è corretto.
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

Legge da un file chiamato 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())))

Testato con i testi di input di @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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.