Menemukan kata yang paling 'unik'


12

Dengan menggunakan bahasa pilihan Anda, tulislah fungsi / skrip / program terpendek yang dapat Anda identifikasi dengan kata dengan jumlah huruf unik terbanyak dalam sebuah teks.

  • Huruf unik harus menyertakan karakter berbeda menggunakan pengkodean UTF-8 .
    • Versi huruf besar dan kecil dari karakter yang sama berbeda dan berbeda; 'a' != 'A'
  • Kata-kata terikat oleh karakter spasi putih apa pun.
  • 'Letters' adalah simbol apa saja yang dapat diwakili oleh satu karakter unicode.
  • Dokumen teks harus dibaca oleh kode Anda - tidak ada preloading / hard-coding dari teks yang diizinkan.
  • Outputnya harus kata, diikuti oleh jumlah huruf unik.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • Setiap pembatas / jarak antara dua nilai terserah Anda, asalkan setidaknya ada satu karakter untuk memisahkannya.
  • Jika ada lebih dari satu kata dengan jumlah tertinggi, cetak semua kata untuk hitungan itu, dengan satu pembatas baris baru.
    ucapan terimakasih - 16
    pseudolamellibranchiate - 16
  • Ini kode golf, jadi kode terpendek menang.

Jawaban pada Bahasa Inggris ini. Saya terinspirasi untuk menciptakan tantangan ini. Contohnya hanya menggunakan daftar kata , tetapi teks apa pun harus dapat diproses.


1
Bagaimana kata-kata dipisahkan? Anda mengatakan huruf unik adalah karakter UTF-8, tetapi itu berarti bahwa seluruh file hanya satu kata.
cardboard_box

1
Bagaimana Anda mendefinisikan huruf di sini? Seperti yang saya baru saja dan tunjukkan pada salah satu bahasa Inggris. Jawaban SE LlanfairPGadalah kata Welsh dan berisi huruf-huruf dari alfabet Welsh - lldan chkeduanya merupakan huruf tunggal dalam bahasa Welsh.
Gareth

1
@ Gareth Saya tidak menyadari perbedaan itu, kesalahan saya. Apakah ada representasi unicode dari kedua 'surat' itu? Untuk keperluan tantangan ini, setiap karakter unicode individu adalah huruf.
Gaffi

1
Jadi, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.apakah "kata" yang valid?
Shmiddty

2
Di luar topik, tetapi tampaknya dulu hanya ada satu huruf untuk LL dan ll dalam bahasa Welsh. Setidaknya Unicode memiliki U + 1EFA dan U + 1EFB untuk mereka; "Middle-Welsh" itu memanggil mereka. Tidak ada titlecase Ll.
Tn. Lister

Jawaban:


7

APL (56)

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

Ini adalah fungsi (pertanyaan mengatakan itu diizinkan) yang mengambil string dan mengembalikan matriks kata dan panjang yang unik.

Pemakaian:

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

Penjelasan:

  • ⎕ML←3: setel level migrasi ke 3 (jadi itu partisi, bukan diapit)
  • W←⍵⊂⍨⍵≠' ': store di Wstring yang diberikan, di mana setiap partisi terdiri dari karakter non-spasi.
  • ⍙←⍒∆←↑∘⍴∘∪¨W: dapatkan jumlah ( ) elemen unik ( ) di setiap bagian ( ¨) dari W, dan simpan ini di , lalu dapatkan urutan sortir saat diurutkan ke bawah pada this ( ) dan simpan di .
  • ∆[⍙... ]: urutkan berdasarkan , jadi sekarang kami memiliki urutan yang unik.
  • ∆∘.=∆←∆: simpan yang disortir kembali , dan lihat elemen mana yang sama.
  • ↑+/: jumlah baris (sekarang kita tahu berapa banyak elemen yang sama dengan setiap elemen) dan kemudian mengambil item pertama (sekarang kita tahu berapa banyak elemen yang sama dengan elemen pertama, yaitu berapa banyak kata yang diikat untuk tempat pertama.)
  • W[⍙]⍴⍨: urutkan Wberdasarkan , dan ambil N pertama, di mana N adalah angka yang baru saja kita hitung.
  • {⍵,⍴∪⍵}¨: untuk masing-masing ini, dapatkan kata itu sendiri dan jumlah karakter unik dalam kata tersebut
  • : format sebagai matriks

4

Mathematica 96 115

Sunting : kode sekarang menemukan semua kata dari jumlah karakter maksimum. Saya menolak untuk memperlakukan koma sebagai karakter kata.

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

Contohnya

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

atau

f@Import["t1.txt"]

{{"keraguan", 10}, {"superlatif", 10}}


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

atau

f@Import["t2.txt"]

{"Vestibulum", 9}


Contoh yang lebih panjang

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

Kejutan: Kata paling "unik" dalam Deklarasi Kemerdekaan juga kata paling unik di Alice in Wonderland !

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


apakah ini hanya mengembalikan satu kata yang paling unik? Itu harus mengembalikan mereka semua. mis. "superlatif,
skeptulity

@Shmiddty Saya membahas kritik Anda. (Harganya 19 byte.)
DavidC

4

Python 2 (110 (98 menggunakan input 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

Hal-hal yang perlu ditingkatkan: pencetakan (33 karakter)

Tanda baca dianggap huruf.


Python 2.7.3: NameError: global name 'r' is not defined. Setelah menambahkan tanda kutip tunggal sekitar r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo

Ups, saya tidak mengujinya. Terima kasih telah mengatakan itu, saya tidak akan pernah melihatnya. Adapun Python 3: tidak berfungsi.
beary605

4

Ini codegolf pertama saya, saya sangat bersemangat :) Juga itu berarti mungkin tidak ada gunanya.

Groovy 127 117 112 112 105

Sunting: Karena fungsi tampaknya diizinkan di sini adalah satu dari 105. Saya juga mengganti nama variabel untuk membuat kolom pertama membaca ACDC, karena itu penting dalam segala jenis kode sumber:

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

Anda akan menyebutnya seperti itu:

A (File baru ("words.txt"))

Tanpa fungsi menggunakan input standar di 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 "$ itu $ k "}}

Input: Lorem Ipsum Teks dari primo

Semua hasil skrip:

consequat 9
ullamcorper 9
Vestibulum 9

Adakah yang punya ide bagaimana membuatnya lebih asyik?


3

Perl 78 byte

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

Menafsirkan batasan "Dokumen teks harus dibaca oleh kode Anda" untuk berarti bahwa opsi baris perintah yang membaca dan mengurai input tidak diperbolehkan. Seperti halnya solusi PHP di bawah ini, hanya karakter 10 dan 32 yang dianggap sebagai pembatas kata. Input dan output juga diambil dengan cara yang sama.


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;

Satu-satunya karakter yang dianggap pembatas kata adalah characer 10, dan karakter 32. Selebihnya, termasuk tanda baca, dianggap sebagai bagian dari kata.

Ini berisi beberapa karakter biner, yang menyimpan tanda kutip, tetapi sebagai hasilnya perlu disimpan dengan pengkodean ANSI agar berfungsi dengan benar. Atau, versi ini dapat digunakan, yang lebih berat 3 byte:

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

Sampel I / O:

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

output 1:

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

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

output 2:

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

incredulitymemiliki 10 huruf unik, bukan 11.
DavidC

@DavidCarraher kodenya termasuk koma, yang secara teoritis diizinkan melalui aturan.
Shmiddty

Penjelasannya benar-benar tidak pasti.
DavidC

2
Tidak hanya 'diizinkan secara teoritis', tetapi mengingat kata-kata dari pertanyaan (khususnya poin 2 dan 3), tampaknya menjadi persyaratan.
primo

@ Davidvidarr Ya, tanda baca adalah karakter yang valid. Apa pun selain spasi putih valid.
Gaffi

3

GoRuby 2.0.0 - 66 karakter

Solusi di bawah ini sebenarnya tidak menemukan semua kecocokan tetapi hanya satu. Ini versi terakhir saya:

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

Contoh:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec Mollis, dan kemudian duduk di Fringilla, Justo Risus iaculis Justo, atau di mana Anda tahu. Anda dapat membaca lebih lanjut, lebih lanjut tentang apa yang Anda butuhkan, dan suka ligula. Nulla porttitor elit atau augure pretium cursus. Donec dalam turpis lectus. Vestibulum ante ipsum primis dalam faucibus orci luctus et ultrices posuere cubilia Curae; Cari tahu apa yang Anda inginkan dengan cara ini. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

menghasilkan:

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

GoRuby 2.0.0 - 29 karakter (format output tidak tepat)

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

Harapkan input dari stdin. Format outputnya sedikit berbeda. Sebagai contoh:

$ ruby golf.rb < british.1
14
manoeuvrability

GoRuby 2.0.0 - 42 40 karakter

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

mengharapkan input dari stdin

Ruby 1.9.3 - 69 65 karakter

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

mengharapkan input dari stdin (sama seperti di atas, tetapi tanpa singkatan GoRuby)


2

Javascript 163 155 152 162 byte

Ini adalah tentang sesingkat yang saya bisa mendapatkannya:

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

Dalam versi ini /\s/memisahkan kata-kata berdasarkan spasi, jadi itu termasuk tanda baca, koma, titik, dll sebagai bagian dari kata. Ini mudah diubah /\b/menjadi tidak termasuk mereka.

Saya akan melihat apa yang bisa saya lakukan dengan for-loop bukan forEaches sedikit.

I / O:

Itu adalah saat terbaik, itu adalah saat terburuk, itu adalah zaman kebijaksanaan, itu adalah zaman kebodohan, itu adalah zaman kepercayaan, itu adalah zaman ketidakpercayaan, itu adalah zaman Cahaya, itu adalah musim Cahaya, itu adalah musim Kegelapan, itu adalah musim semi harapan, itu adalah musim dingin keputusasaan, kami memiliki segalanya sebelum kami, kami tidak memiliki apa-apa sebelum kami, kami semua akan langsung ke Surga, kami semua akan langsung ke arah lain - di singkatnya, periode itu sangat jauh seperti periode sekarang, sehingga beberapa otoritasnya yang paling berisik bersikeras bahwa itu diterima, untuk kebaikan atau untuk kejahatan, dalam tingkat perbandingan yang superlatif saja.

11:incredulity,

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec Mollis, dan kemudian duduk di Fringilla, Justo Risus iaculis Justo, atau di mana Anda tahu. Anda dapat membaca lebih lanjut, lebih lanjut tentang apa yang Anda butuhkan, dan suka ligula. Nulla porttitor elit atau augure pretium cursus. Donec dalam turpis lectus. Vestibulum ante ipsum primis dalam faucibus orci luctus et ultrices posuere cubilia Curae; Cari tahu apa yang Anda inginkan dengan cara ini. Pellentesque justo arcu, venenatis nec hendrerit a, molestie vitae augue.

9:consequat
ullamcorper
Vestibulum

Sedikit lelah, mungkin. Tapi saya merasa damai. Keberhasilan Anda di atas ring pagi ini, sebagian kecil, kesuksesan saya. Masa depan Anda terjamin. Anda akan hidup, aman dan aman, Wilbur. Tidak ada yang bisa membahayakan Anda sekarang. Musim gugur ini akan memendek dan menjadi dingin. Daunnya akan terlepas dari pohon dan jatuh. Natal akan datang, dan salju musim dingin. Anda akan hidup untuk menikmati keindahan dunia beku, karena Anda sangat berarti bagi Zuckerman dan dia tidak akan pernah menyakiti Anda. Musim dingin akan berlalu, hari-hari akan memanjang, es akan mencair di kolam padang rumput. Sparrow lagu akan kembali dan bernyanyi, katak akan bangun, angin hangat akan bertiup lagi. Semua pemandangan, suara, dan aroma ini akan menjadi milik Anda untuk dinikmati, Wilbur — dunia yang indah ini, hari-hari yang berharga ini ...

10:Wilbur—this

Hampir semua anak saat ini mengerikan. Yang paling buruk dari semua itu adalah bahwa melalui organisasi-organisasi seperti Mata-mata mereka secara sistematis berubah menjadi orang-orang liar yang tidak dapat diatur, dan ini membuat mereka tidak punya kecenderungan apa pun untuk memberontak melawan disiplin Partai. Sebaliknya, mereka memuja Partai dan segala sesuatu yang berhubungan dengannya ... Semua keganasan mereka berbalik, melawan musuh-musuh Negara, melawan orang asing, pengkhianat, penyabot, penjahat pemikiran. Hampir normal bagi orang berusia di atas tiga puluh untuk takut pada anak-anak mereka sendiri.

15:thought-criminals.

Ada kemungkinan kecanggungan dengan output: jika ada beberapa kata dalam output dan salah satu kata berakhir dengan koma, itu bisa menunjukkan dua koma berturut-turut yang akan membingungkan.
Shmiddty

Dari spec,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 harus diperbaiki sekarang. 10 byte>. <
Shmiddty

2

Scala 129 chars:

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 karakter
Sebagai fungsi dengan teks input sebagai 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])
}

Dan beberapa contoh:

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"

Atau R - 100 karakter
Sebagai fungsi dengan jalur ke file teks sebagai 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])
}

Pemakaian:

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

Saya pikir ini tidak ada "Dokumen teks harus dibaca oleh kode Anda".
Steven Rumbalski

@StevenRumbalski ini diperbaiki.
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

Membaca dari sebuah file yang bernama 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())))

Diuji dengan teks input dari @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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.