Das "einzigartigste" Wort finden

12

Schreiben Sie in der Sprache Ihrer Wahl die kürzeste Funktion / das kürzeste Skript / Programm, mit dem Sie das Wort mit der höchsten Anzahl eindeutiger Buchstaben in einem Text identifizieren können .

  • Eindeutige Buchstaben sollten ein unterschiedliches Zeichen mit UTF-8-Codierung enthalten .
    • Groß- und Kleinbuchstaben desselben Zeichens sind unterschiedlich und unterschiedlich. 'a' != 'A'
  • Wörter sind an Leerzeichen gebunden.
  • "Buchstaben" sind Symbole, die durch ein einzelnes Unicode-Zeichen dargestellt werden können.
  • Das Textdokument muss von Ihrem Code eingelesen werden - kein Vorladen / Hardcodieren des Texts erlaubt.
  • Die Ausgabe sollte das Wort sein, gefolgt von der Anzahl der eindeutigen Buchstaben.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Jedes Trennzeichen zwischen den beiden Werten liegt bei Ihnen, solange es mindestens ein Zeichen gibt, um sie zu trennen.
  • Falls mehr als ein Wort mit der höchsten Anzahl vorhanden ist, drucken Sie alle Wörter für diese Anzahl mit einer neuen Zeilenbegrenzung.
    Überbestätigung - 16
    Pseudolamellibranchiat - 16
  • Dies ist Codegolf, also gewinnt der kürzeste Code.

Diese Antwort auf Englisch.SE hat mich dazu inspiriert, diese Herausforderung zu schaffen. Das Beispiel verwendet nur eine Wortliste , aber jeder Text sollte verarbeitet werden können.

Gaffi
quelle
1
Wie werden Wörter getrennt? Sie sagen, eindeutige Buchstaben sind beliebige UTF-8-Zeichen. Dies würde jedoch bedeuten, dass die gesamte Datei nur ein Wort enthält.
cardboard_box
1
Wie definierst du hier Buchstaben? Wie ich gerade waren und deutete auf einen der English.SE Antworten aus LlanfairPGist ein Wort , Welsh und enthält Briefe aus dem walisischen Alphabet - llund chsind beide Einzelbuchstaben in der walisischen Sprache.
Gareth
1
@Gareth Mir war dieser Unterschied nicht bewusst, mein Fehler. Gibt es Unicode-Darstellungen dieser beiden "Buchstaben"? Für diese Herausforderung ist jedes einzelne Unicode-Zeichen ein Buchstabe.
Gaffi
1
Also abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.ist ein gültiges "Wort"?
Shmiddty
2
Off-Topic, aber anscheinend gab es auf Walisisch einzelne Buchstaben für LL und ll. Zumindest Unicode hat U + 1EFA und U + 1EFB für diese; "Mittelwalisisch" nennt man sie. Es gibt jedoch keine Titelzeile Ll.
Mr Lister

Antworten:

7

APL (56)

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

Dies ist eine Funktion (Frage besagt, dass dies zulässig ist), die eine Zeichenfolge akzeptiert und eine Matrix aus Wörtern und eindeutigen Längen zurückgibt.

Verwendung:

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

Erläuterung:

  • ⎕ML←3: Migrationsstufe auf 3 setzen (also Partition statt einschließen)
  • W←⍵⊂⍨⍵≠' ': In Wder angegebenen Zeichenfolge speichern , wobei jede Partition aus Nicht-Leerzeichen besteht.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: Ermitteln Sie die Anzahl ( ) der unique ( ) -Elemente in jedem Teil ( ¨) von Wund speichern Sie diese in . Ermitteln Sie dann die Sortierreihenfolge, wenn Sie nach this ( ) abwärts sortieren, und speichern Sie diese in .
  • ∆[⍙... ]: sortiere nach , also haben wir jetzt die eindeutigen Längen in der Reihenfolge.
  • ∆∘.=∆←∆: Speichern Sie die sortierten zurück in , und sehen Sie, welche Elemente gleich sind.
  • ↑+/: summiere die Zeilen (jetzt wissen wir, wie viele Elemente jedem Element entsprechen) und nimm dann das erste Element (jetzt wissen wir, wie viele Elemente dem ersten Element entsprechen, dh wie viele der Wörter für den ersten Platz gebunden sind).
  • W[⍙]⍴⍨: sortiere Wnach und nimm das erste N, wobei N die Zahl ist, die wir gerade berechnet haben.
  • {⍵,⍴∪⍵}¨: Für jedes dieser Wörter müssen Sie das Wort selbst und die Anzahl der eindeutigen Zeichen im Wort ermitteln
  • : Format als Matrix
Marinus
quelle
4

Mathematica 96 115

Bearbeiten : Der Code findet jetzt alle Wörter mit der maximalen Anzahl von Zeichen. Ich lehne es ab, Kommas als Wortzeichen zu behandeln.

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

Beispiele

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

oder

f@Import["t1.txt"]

{{"Unglaube", 10}, {"Superlative", 10}}


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

oder

f@Import["t2.txt"]

{"Vestibulum", 9}


Längere Beispiele

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

Überraschung: Das "einzigartigste" Wort in der Unabhängigkeitserklärung ist auch das einzigartigste Wort in Alice im Wunderland !

{"prognosticate", 11}
{"undiscoverable", 13}
{"uncomfortable", 12}
{"regocijadamente", 12}
{"uncomfortable", 12}
{"Verpflichtung", 13}
{"buryingplace", 12}

DavidC
quelle
Gibt dies nur ein einziges einzigartiges Wort zurück? Es sollte sie alle zurückgeben. zB "Superlativ, Unglaube, 10"
Shmiddty
@Shmiddty Ich habe Ihre Kritik angesprochen. (Es kostet 19 Bytes.)
DavidC
4

Python 2 (110 (98 mit Dateieingabe))

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

Zu verbessern: Drucken (33 Zeichen)

Interpunktion gilt als Buchstaben.

beary605
quelle
Python 2.7.3: NameError: global name 'r' is not defined. Nach dem Hinzufügen einfache Anführungszeichen um die r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
Primo
Hoppla, ich habe es nicht getestet. Danke, dass Sie das gesagt haben, ich hätte das nie gesehen. Was Python 3 betrifft: Funktioniert nicht.
beary605
4

Dies ist mein erster Codegolf, ich bin so aufgeregt :) Auch das bedeutet, dass es wahrscheinlich nicht gut ist.

Groovy 127 117 112 105

Bearbeiten: Da hier offenbar nur eine von 105 Funktionen zulässig sind, habe ich die Variablen umbenannt, damit die erste Spalte ACDC liest, da dies in jeder Art von Quellcode wichtig ist:

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

Sie würden es so nennen:

A (neue Datei ("words.txt"))

Ohne Funktion über Standardeingabe 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 "$ es ist $ k "}}

Eingabe: Lorem Ipsum Text aus primo

Alle Skripte werden ausgegeben:

consequat 9
ullamcorper 9
Vestibulum 9

Hat jemand eine Idee, wie man sie grooviger macht?

Fels
quelle
3

Perl 78 Bytes

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

Interpretieren Sie die Einschränkung "Das Textdokument muss von Ihrem Code eingelesen werden" so, dass Befehlszeilenoptionen, die die Eingabe lesen und analysieren, nicht zulässig sind. Wie bei der folgenden PHP-Lösung werden nur die Zeichen 10 und 32 als Worttrennzeichen betrachtet. Die Eingabe und Ausgabe erfolgt ebenfalls auf die gleiche Weise.


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;

Die einzigen Zeichen, die als Wortbegrenzer betrachtet werden, sind das Zeichen 10 und das Zeichen 32. Der Rest, einschließlich der Satzzeichen, wird als Teil des Wortes betrachtet.

Dieser enthält einige Binärzeichen, in denen Anführungszeichen gespeichert werden. Daher muss er mit einer ANSI-Codierung gespeichert werden, damit er ordnungsgemäß funktioniert. Alternativ kann diese Version verwendet werden, die 3 Byte schwerer ist:

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

Beispiel I / O:

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

Ausgang 1:

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

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

Ausgang 2:

$ php most-unique.php < input2.dat
consequat 9
ullamcorper 9
Vestibulum 9
primo
quelle
incredulityhat 10 eindeutige Buchstaben, nicht 11.
DavidC
@DavidCarraher sein Code enthält das Komma, das theoretisch über die Regeln erlaubt ist.
Shmiddty
Die Erklärung ist absolut ungläubig.
DavidC
2
Dies ist nicht nur „theoretisch zulässig“, sondern scheint angesichts des Wortlauts der Frage (insbesondere Punkt 2 und 3) eine Anforderung zu sein.
Primo
@DavidCarraher Ja, Interpunktion sind gültige Zeichen. Alles andere als Leerzeichen ist gültig.
Gaffi
3

GoRuby 2.0.0 - 66 Zeichen

Die folgenden Lösungen haben nicht alle Übereinstimmungen gefunden, sondern nur eine. Hier ist meine endgültige Version:

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

Beispiele:

Lorem ipsum dolor sitzt amet, consectetur adipiscing elit. Donec mollis, nisl sit amet folge fringilla, justo risus iaculis justo, vel ullamcorper dui tellus ut enim. Suspendisse lectus risus, Molestie sed volutpat, eleifend vitae ligula. Nulla porttitor elit vel augue pretium cursus. Donec in Turpis Lectus. Vestibulum ante ipsum primis in Faucibus orci luctus und ultrices posuere cubilia Curae; Quisque a lorem eu turpis viverra sodales. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

produziert:

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

GoRuby 2.0.0 - 29 Zeichen (nicht exaktes Ausgabeformat)

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

Erwartet Eingaben von stdin. Das Ausgabeformat ist jedoch etwas anders. Beispielsweise:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 - 42 40 Zeichen

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

erwartet eine Eingabe von stdin

Ruby 1.9.3 - 69 65 Zeichen

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

erwartet die Eingabe von stdin (wie oben, jedoch ohne GoRuby-Abkürzungen)

Patrick Oscity
quelle
2

Javascript 163 155 152 162 Bytes

Dies ist ungefähr so ​​kurz wie ich es bekommen kann:

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 dieser Version /\s/werden Wörter nach Leerzeichen getrennt, sodass Satzzeichen, Kommas, Punkte usw. als Teil der Wörter verwendet werden. Dies kann leicht geändert werden, /\b/um sie nicht einzuschließen.

Ich werde gleich sehen, was ich mit for-Schleifen anstelle von forEaches machen kann.

I / O:

Es war die beste Zeit, es war die schlimmste Zeit, es war das Zeitalter der Weisheit, es war das Zeitalter der Torheit, es war die Epoche des Glaubens, es war die Epoche des Unglaubens, es war die Jahreszeit des Lichts, es Es war die Zeit der Finsternis, es war der Frühling der Hoffnung, es war der Winter der Verzweiflung, wir hatten alles vor uns, wir hatten nichts vor uns, wir gingen alle direkt in den Himmel, wir gingen alle direkt in die andere Richtung kurz, die Periode war so weit wie die gegenwärtige Periode, dass einige ihrer lautesten Autoritäten darauf bestanden, dass sie nur im höchsten Grad des Vergleichs zum Guten oder zum Bösen aufgenommen wurden.

11:incredulity,

Lorem ipsum dolor sitzt amet, consectetur adipiscing elit. Donec mollis, nisl sit amet folge fringilla, justo risus iaculis justo, vel ullamcorper dui tellus ut enim. Suspendisse lectus risus, Molestie sed volutpat, eleifend vitae ligula. Nulla porttitor elit vel augue pretium cursus. Donec in Turpis Lectus. Vestibulum ante ipsum primis in Faucibus orci luctus und 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

Vielleicht ein bisschen müde. Aber ich fühle mich friedlich. Ihr Erfolg im Ring heute Morgen war in geringem Maße mein Erfolg. Ihre Zukunft ist gesichert. Du wirst leben, sicher und geborgen, Wilbur. Nichts kann dir jetzt schaden. Diese Herbsttage werden sich verkürzen und kalt werden. Die Blätter werden sich von den Bäumen lösen und fallen. Weihnachten wird kommen und der Schnee des Winters. Sie werden leben, um die Schönheit der gefrorenen Welt zu genießen, denn Sie bedeuten Zuckerman sehr viel, und er wird Ihnen niemals Schaden zufügen. Der Winter vergeht, die Tage werden länger, das Eis schmilzt im Weideteich. Der Liederspatz wird zurückkehren und singen, die Frösche werden erwachen, der warme Wind wird wieder wehen. All diese Sehenswürdigkeiten, Geräusche und Gerüche werden Ihnen gehören, Wilbur - diese schöne Welt, diese kostbaren Tage ...

10:Wilbur—this

Fast alle Kinder waren heutzutage schrecklich. Was am schlimmsten war, war, dass sie durch Organisationen wie die Spione systematisch in unregierbare kleine Wilde verwandelt wurden, und dies erzeugte in ihnen keinerlei Tendenz, gegen die Disziplin der Partei zu rebellieren. Im Gegenteil, sie verehrten die Partei und alles, was damit zu tun hatte ... Ihre ganze Wildheit war nach außen gerichtet, gegen die Feinde des Staates, gegen Ausländer, Verräter, Saboteure, Gedankenverbrecher. Es war fast normal, dass Menschen über dreißig vor ihren eigenen Kindern Angst hatten.

15:thought-criminals.
Shmiddty
quelle
Die Ausgabe ist möglicherweise umständlich: Wenn die Ausgabe mehrere Wörter enthält und eines der Wörter mit einem Komma endet, können zwei Kommas hintereinander angezeigt werden, was verwirrend wäre.
Shmiddty
Aus der SpezifikationIn the event more than one word exists with the highest count, print all words for that count, **with one new line delimiting**.
Gaffi
@Gaffi sollte jetzt behoben sein. 10 Bytes>. <
Shmiddty
2

Scala 129 Zeichen:

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

R - 106 Zeichen
Als Funktion mit dem eingegebenen Text als Parameter:

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

Und ein paar Beispiele:

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"

Oder R - 100 Zeichen
Als Funktion mit dem Pfad zur Textdatei als Parameter:

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

Verwendung:

f("t1.txt")
Read 120 items
     [,1]           [,2]
[1,] "incredulity," "11"
Plannapus
quelle
Ich denke, das fehlt "Das Textdokument muss von Ihrem Code eingelesen werden".
Steven Rumbalski
@StevenRumbalski das ist korrigiert.
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
quelle
1

Python3 119

Liest aus einer aufgerufenen Datei 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())))

Getestet mit den Eingabetexten von @primo:

Input 1:
    ('incredulity,', 11)

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