En 'benzersiz' kelimeyi bulma


12

Seçtiğiniz dili kullanarak , bir metinde en fazla sayıda benzersiz harf içeren sözcüğü tanımlayacak en kısa fonksiyonu / komut dosyasını / programı yazın .

  • Benzersiz harfler UTF-8 kodlaması kullanan herhangi bir karakter içermelidir .
    • Aynı karakterin büyük ve küçük harf versiyonları farklı ve farklıdır; 'a' != 'A'
  • Kelimeler herhangi bir boşluk karakteriyle sınırlıdır.
  • 'Harfler', tek bir unicode karakterle temsil edilebilen herhangi bir semboldür.
  • Metin belgesi kodunuz tarafından okunmalıdır - metnin önceden yüklenmesine / kodlanmasına izin verilmez.
  • Çıktı sözcük olmalı ve ardından benzersiz harflerin sayısı gelmelidir.
    • llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch - 18
    • İki değer arasındaki herhangi bir sınırlayıcı / boşluk, bunları ayırmak için en az bir karakter olduğu sürece size bağlıdır.
  • En yüksek sayıya sahip birden fazla kelime olması durumunda, bu sayı için tüm kelimeleri yeni bir satır sınırlamasıyla yazdırın.
    süper bildirim - 16
    psödolamellibranchiat - 16
  • Bu kod golf, bu yüzden en kısa kod kazanır.

İngilizce'ye verilen bu cevap bana bu zorluğu yaratmam için ilham verdi. Örnekte sadece bir kelime listesi kullanılmaktadır , ancak herhangi bir metnin işlenebilmesi gerekir.


1
Kelimeler nasıl ayrılır? Benzersiz harflerin herhangi bir UTF-8 karakteri olduğunu söylüyorsunuz, ancak bu, tüm dosyanın sadece bir kelime olduğu anlamına gelir.
cardboard_box

1
Burada harfleri nasıl tanımlıyorsunuz? İngilizcelerden birine işaret ettiğim ve işaret ettiğim gibi, cevaplar LlanfairPGbir Galce kelimesidir ve Gal alfabesinden harfler içerir - llve chher ikisi de Gal dilinde tek harflerdir.
Gareth

1
@Gareth Bu ayrımın farkında değildim, hatam. Bu iki 'harfin' unicode temsili var mı? Bu zorluğun amaçları doğrultusunda, her bir tekli kod karakteri bir harftir.
Gaffi

1
Yani abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+~`<>/\\?'";:{}[],.geçerli bir "kelime" nedir?
Shmiddty

2
Konu dışı, ama görünüşe göre Galce'de LL ve ll için tek harfler vardı. En azından Unicode bunlar için U + 1EFA ve U + 1EFB'ye sahiptir; "Orta Galce" diyor. Yine de titlecase Ll yoktur.
Bay Lister

Yanıtlar:


7

APL (56)

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

Bu, bir dize alan ve bir kelime matrisi ve benzersiz uzunluklar döndüren bir işlevdir (soru buna izin verildiğini söyler).

Kullanımı:

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

Açıklama:

  • ⎕ML←3: taşıma düzeyini 3 olarak ayarlayın (bu , içine alma yerine bölümdür)
  • W←⍵⊂⍨⍵≠' ': Wher bir bölümün boşluk olmayan karakterlerden oluştuğu belirtilen dizede saklanır .
  • ⍙←⍒∆←↑∘⍴∘∪¨W: her bir parçasındaki ( ) benzersiz ( ) öğenin miktarını ( ) alın ve bunları depolayın , ardından bu ( ) üzerinde aşağı doğru sıralandığında sıralama düzenini alın ve bunu depolayın .¨W
  • ∆[⍙... ]: sort tarafından , şimdi biz sırayla eşsiz uzunluklara sahiptir.
  • ∆∘.=∆←∆: sıralananları geri saklayın ve hangi öğelerinin eşit olduğunu görün.
  • ↑+/: satırları toplayın (şimdi her bir öğeye kaç öğenin eşit olduğunu biliyoruz) ve sonra ilk öğeyi alın (şimdi ilk öğeye kaç öğenin eşit olduğunu, yani ilk olarak kaç kelimenin bağlandığını biliyoruz.)
  • W[⍙]⍴⍨: Sıralama Wtarafından , ve N biz sadece hesaplanan sayıdır ilk N, al.
  • {⍵,⍴∪⍵}¨: bunların her biri için, kelimenin kendisini ve kelimedeki benzersiz karakter miktarını öğrenin
  • : matris biçiminde

4

Mathematica 96 115

Düzenle : kod artık maksimum karakter sayısının tüm kelimelerini bulur. Virgüllere kelime karakteri olarak davranmayı reddediyorum.

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

Örnekler

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

veya

f@Import["t1.txt"]

{{"inanılmazlık", 10}, {"üstünlük verici", 10}}


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

veya

f@Import["t2.txt"]

{"Vestibulum", 9}


Daha Uzun Örnekler

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

Sürpriz: Bağımsızlık Bildirgesi'ndeki en "benzersiz" kelime aynı zamanda Alice Harikalar Diyarında'nın en eşsiz kelimesidir !

{"prognostik", 11}
{"keşfedilemez", 13}
{"rahatsız edici", 12}
{"regocijadamente", 12}
{"rahatsız edici", 12}
{"Verpflichtung", 13}
{"gömme yeri", 12}


bu sadece en benzersiz tek kelimeyi mi döndürüyor? Hepsini iade etmeli. ör. "üstünlük, inanılmazlık, 10"
Shmiddty

@Shmiddty Eleştirilerine değindim. (19 bayt maliyeti.)
DavidC

4

Python 2 (110 (98 dosya girişini kullanarak))

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

Geliştirilecek şeyler: baskı (33 karakter)

Noktalama işaretleri harf olarak kabul edilir.


Python 2.7.3: NameError: global name 'r' is not defined. Tek tırnak ekledikten sonra r: AttributeError: 'file' object has no attribute 'split'. Python 3.3.0: SyntaxError: invalid syntax 'print i,c'.
primo

Hata! Test etmedim. Bunu söylediğin için teşekkürler, bunu asla göremezdim. Python 3'e gelince: çalışmıyor.
beary605

4

Bu benim ilk codegolf, çok heyecanlıyım :) Ayrıca bu muhtemelen herhangi bir iyi değil demektir.

Groovy 127 117 112 105

Düzenleme: fonksiyonları burada izin verilmiş gibi görünüyor bir 105. Ben de ilk sütun ACDC okumak yapmak için değişkenleri yeniden adlandırdı, çünkü bu kaynak kodu her türlü önemlidir:

A = {e = {it.toSet (). Boyutu ()}
C = it.text.tokenize ()
D = E (C.max {e (o)})
C.grep {e (it) == D}. Her {println "$ it $ D"}}

Buna şöyle derdiniz:

A (yeni Dosya ("words.txt"))

112'de standart giriş kullanan fonksiyon olmadan :

a = {it.toSet (). boyutu ()}
b = System.in.getText (). simgeleştirir ()
c = a (b.max {a (o)})
b.grep {a (it) == c}. her {println "$ it $ c"}

a = {it.toSet (). boyutu ()}
b = System.in.getText (). tokenize (). sıralama {-a (o)}
C = A (b [0])
b.grep {a (it) == c}. her {println "$ it $ c"}

a = {it.toSet (). boyutu ()}
System.in.getText (). Tokenize (). Sort ({- a (it)}). GroupBy {a (it)}. Take (1) .each {k, v-> v.each {println "$ it $ k "}}

Girdi: Primo'dan Lorem Ipsum Metni

Tüm komut dosyaları çıktı:

consequat 9
ullamcorper 9
Vestibulum 9

Onları nasıl daha güzel hale getirecek bir fikriniz var mı?


3

Perl 78 bayt

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

Kısıtlamayı yorumlama " Girdi okuyan ve ayrıştıran komut satırı seçeneklerine izin verilmeyen " metin belgesi kodunuz tarafından okunmalıdır " anlamına gelir. Aşağıdaki PHP çözümünde olduğu gibi, yalnızca 10 ve 32 karakterleri sözcük sınırlayıcı olarak kabul edilir. Giriş ve çıkış da aynı şekilde alınır.


PHP 128 bayt

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

Sözcük sınırlayıcı olarak kabul edilen tek karakter karakter 10 ve karakter 32'dir. Noktalama da dahil olmak üzere geri kalanı sözcüğün bir parçası olarak kabul edilir.

Bu, tırnak işaretlerini kaydeden birkaç ikili karakter içerir, ancak sonuç olarak düzgün çalışması için bir ANSI kodlamasıyla kaydedilmesi gerekir. Alternatif olarak, 3 bayt daha ağır olan bu sürüm kullanılabilir:

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

Örnek G / Ç:

giriş 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.

çıkış 1:

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

giriş 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.

çıkış 2:

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

incredulity11 değil, 10 benzersiz harfi vardır.
DavidC

@DavidCarraher kodu teorik olarak kurallara izin verilen virgül içeriyor.
Shmiddty

Açıklama kesinlikle inanılmaz.
DavidC

2
Sadece 'teorik olarak' izin verilmez, aynı zamanda sorunun ifadesi (özellikle 2 ve 3. noktalar) göz önüne alındığında, bir gereklilik gibi görünmektedir.
primo

@DavidCarraher Evet, noktalama işaretleri geçerli karakterlerdir. Boşluk dışında herhangi bir şey geçerlidir.
Gaffi

3

GoRuby 2.0.0 - 66 karakter

Aşağıdaki çözümler aslında tüm maçları bulamadı, sadece bir tane buldu. İşte son versiyonum:

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

Örnekler:

Lorem ipsum dolor sit amet, seçkin adipiscing elit. Donec mollis, nisl sit amet sonucu 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. Turpis lectus içinde donec. Vestibulum ante ipsum primis faucibus orci luctus ve ultrisler pozuere cubilia Curae; Quisque bir lorem eu turpis viverra sodales. Pellentesque justo arcu, başka yerde sınıflandırılmamış a, molestie vitae augue.

üretir:

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

GoRuby 2.0.0 - 29 karakter (tam çıktı biçimi değil)

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

Stdin'den girdi bekliyor. Yine de çıktı biçimi biraz farklı. Örneğin:

$ 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*' - '

stdin'den girdi bekliyor

Yakut 1.9.3 - 69 65 karakter

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

stdin'den girdi bekliyor (yukarıdakiyle aynı, ancak GoRuby kısaltmaları olmadan)


2

Javascript 163155152162 bayt

Bu yaklaşık olarak alabilirim kısa:

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

Bu sürümde, /\s/kelimeleri boşluklara göre ayırır, böylece kelimelerin bir parçası olarak noktalama işaretleri, virgül, nokta vb. İçerir. Bu, kolayca/\b/ dahil edilmeyecek .

Biraz forEaches yerine for-loop'larla neler yapabileceğimi göreceğim.

I / O:

En iyi zamanlardı, en kötü zamanlardı, bilgelik çağıydı, aptallık çağıydı, inanç çağıydı, inanılmazlık çağıydı, Işık mevsimi, Karanlık mevsimiydi, umut baharıydı, umutsuzluğun kışıydı, önümüzde her şey vardı, bizden önce hiçbir şeyimiz yoktu, hepimiz Cennete direkt gidiyorduk, hepimiz başka yöne doğru gidiyorduk - içinde kısacası, dönem şimdiki döneme benziyordu, en gürültülü makamlarından bazıları iyi ya da kötü için sadece üstün karşılaştırma derecesinde alınmasında ısrar etti.

11:incredulity,

Lorem ipsum dolor sit amet, seçkin adipiscing elit. Donec mollis, nisl sit amet sonucu 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. Turpis lectus içinde donec. Vestibulum ante ipsum primis faucibus orci luctus ve ultrisler pozuere cubilia Curae; Quisque bir lorem eu turpis viverra sodales. Pellentesque justo arcu, başka yerde sınıflandırılmamış a, molestie vitae augue.

9:consequat
ullamcorper
Vestibulum

Belki biraz yorgunum. Ama huzurlu hissediyorum. Bu sabah halkadaki başarınız, bir dereceye kadar benim başarımdı. Geleceğiniz güvence altında. Yaşayacak, güvenli ve emniyetli olacaksın, Wilbur. Artık hiçbir şey size zarar veremez. Bu sonbahar günleri kısalır ve soğur. Yapraklar ağaçlardan sallanacak ve düşecektir. Noel gelecek ve kışın kar yağacak. Donmuş dünyanın güzelliğinin tadını çıkarmak için yaşayacaksınız, çünkü Zuckerman için çok şey var ve o size asla zarar vermeyecek. Kış geçecek, günler uzayacak, buz mera havuzunda eriyecek. Şarkı serçesi geri dönecek ve şarkı söyleyecek, kurbağalar uyanacak, sıcak rüzgar tekrar esecek. Tüm bu manzaralar, sesler ve kokuların tadını çıkarmak sizindir, Wilbur — bu sevimli dünya, bu değerli günler…

10:Wilbur—this

Günümüzde neredeyse tüm çocuklar korkunçtu. En kötüsü, Casuslar gibi örgütler aracılığıyla sistematik olarak yönetilemez küçük vahşilere dönüşmüş olmalarıydı ve yine de bu, partinin disiplinine isyan edecek hiçbir eğilim yaratmadı. Aksine, Partiye hayran oldular ve onunla bağlantılı her şey ... Bütün gaddarlıkları Devletin düşmanlarına, yabancılara, hainlere, sabotajcılara, düşünce suçlularına karşı dışa doğru çevrildi. Otuz yaşın üzerindeki insanların kendi çocuklarından korkması neredeyse normaldi.

15:thought-criminals.

Çıktıda potansiyel bir gariplik vardır: çıktıda birden fazla kelime varsa ve kelimelerden biri virgülle biterse, arka arkaya kafa karıştırıcı olan iki virgül gösterebilir.
Shmiddty

Spec itibarenIn the event more than one word exists with the highest count, print all words for that count, **with one new line delimiting**.
Gaffi

@Gaffi şimdi düzeltilmelidir. 10 bayt>. <
Shmiddty

2

Scala 129 karakter:

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
Girdi metnini parametre olarak kullanan bir işlev olarak:

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

Ve birkaç örnek:

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"

Veya R - 100 karakter
Metin dosyasının yolunu parametre olarak içeren bir işlev olarak:

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

Kullanımı:

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

Bunun eksik olduğunu düşünüyorum "Metin belgesi kodunuz tarafından okunmalıdır".
Steven Rumbalski

@StevenRumbalski bu düzeltildi.
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

Adlı bir dosyadan okur 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())))

@Primo'nun giriş metinleriyle test edildi:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.