Bir metindeki kelimeleri sayın ve görüntüleyin


26

Kod bir metin girişi yapmalıdır (zorunlu olmayan herhangi bir dosya olabilir, stdin, JavaScript için string, vb.):

This is a text and a number: 31.

Çıktı, azalan sıradaki oluşum sayısına göre sıralanan, sayılarını içeren kelimeleri içermelidir:

a:2
and:1
is:1
number:1
This:1
text:1
31:1

31'in bir kelime olduğuna dikkat edin, bu nedenle bir kelime alfa sayısal bir şeydir, sayı ayırıcılar olarak işlev görmez, bu nedenle örneğin 0xAFbir kelime olarak nitelendirilir. Ayırıcılar, .(nokta) ve -(kısa çizgi) de dahil olmak üzere alfa sayısal olmayan i.e.veya pick-me-upbu nedenle sırasıyla 2 kelimeyle 2 kelimeyle sonuçlanan herhangi bir şey olacaktır. Büyük / küçük harfe duyarlı olmalı Thisve thisiki farklı kelime 'olmalı , ayrıca ayırıcı olacaktır wouldnve tbundan 2 farklı kelime olacaktır wouldn't.

Seçtiğiniz dile en kısa kodu yazın.

Şimdiye kadarki en kısa doğru cevap:


5
Mu vaka madde (yani olduğu Thisaynı thisve tHIs)?
Gareth

Alfanümerik olmayan herhangi bir şey bir ayırıcı olarak sayılıyorsa, wouldn't2 kelime ( wouldnve t) mi?
Gareth

@Gareth büyük / küçük harfe duyarlı olmalı Thisve thisgerçekten de aynı wouldnve iki farklı kelime olmalı t.
Eduard Florinescu

Eğer 2 kelime olmazsa, "Olmaz" ve "nt" olmamalı mıydı, öyle değil mi?
Teun Pronk

@TeunPronk Basit tutmaya çalışıyorum, birkaç kural koymak, dilbilgisi kurallarına göre istisnaları teşvik eder ve orada bir sürü istisna vardır i.e.. ifadelerin sonu, tırnak işaretleri veya tek tırnak işaretleri vb. ile alınacaktır.
Eduard Florinescu

Yanıtlar:


27

grep ve coreutils  44  42

grep -io '[a-z0-9]*'|sort|uniq -c|sort -nr

Ölçek:

printf "This is a text and a number: 31." |
grep -io '[a-z0-9]*'|sort|uniq -c|sort -nr

Sonuçlar:

  2 a
  1 This
  1 text
  1 number
  1 is
  1 and
  1 31

Güncelleştirme

  • Büyük / küçük harf duyarlı seçeneğini ve daha kısa regex kullanın. Teşekkürler Tomas.

2
Bu neredeyse McEllroy'un Knuth'un Literatür Programlama kitabına verdiği yanıt . Bunun tek farkı bunun headsonunda bir boru içermemesidir .
AJMansfield

Bu benim de ilk düşüncemdi.
Rob

1
'\ W +' de işe yaramaz mı?
Sylwester

1
41 karakter :grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
Tomas

1
@Tomas: Bu cevaba bunu ekledik Yıldızlardan korunmak için bıraktım, çünkü bazı kabuklarda dosya adlarını genişletiyordu.
Thor

18

Java 8: 289

Java oldukça golfçü olmayan bir dil olduğu için oldukça iyi.

import java.util.stream.*;class C{static void main(String[]a){Stream.of(a).flatMap(s->of(s.split("[\\W_]+"))).collect(Collectors.groupingBy(x->x,Collectors.counting())).entrySet().stream().sorted(x,y->x.getValue()-y.getValue()).forEach(e->System.out.println(e.getKey()+":"+e.getValue()));}

Ungolfed:

import java.util.stream.*;
class C {
    static void main(String [] args){
        Stream.of(args).flatMap(arg->Stream.of(arg.split("[\\W_]+")))
            .collect(Collectors.groupingBy(word->word,Collectors.counting()))
            .entrySet().stream().sorted(x,y->x.getValue()-y.getValue())
            .forEach(entry->System.out.println(entry.getKey()+":"+entry.getValue()));
    }
}

Komut satırından çalıştır:

java -jar wordCounter.jar This is a text and a number: 31.

Bölünmek için yanlış regex. Olması gereken"[^\\W_]"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, String.split(String regex)yöntem ayırmak için sınırlayıcıyla eşleşen bir kalıp alır . Yani, örneğin, "aababba".split("b")dizi verim {"aa", "a", "", "a"}. Regex'im [^\\w\\d]'ne karakter karakterinde ne de rakam karakter sınıflarında bir karakter' anlamına gelir. [^\\W_]bunun yerine 'ne alt çizgi ne de karakter olmayan sınıfta olan bir karakter' dir ve alt çizgi dışında herhangi bir sözcük karakteriyle eşleşir.
AJMansfield

Üzgünüm, önceki yorumum yanlıştı. \wiçerir \d, böylece \dgereksiz. \wsoruya göre ayırıcı olarak görülmesi gereken alt çizgi içerir. Bu yüzden bölünme için doğru regex olmalıdır "[\\W_]+".
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ tamam, teşekkürler; Sorunu çözdüm.
AJMansfield

17

APL (57)

⎕ML←3⋄G[⍒,1↓⍉G←⊃∪↓Z,⍪+⌿∘.≡⍨Z←I⊂⍨(I←⍞)∊⎕D,⎕A,⎕UCS 96+⍳26;]

Örneğin

      ⎕ML←3⋄G[⍒,1↓⍉G←⊃∪↓Z,⍪+⌿∘.≡⍨Z←I⊂⍨(I←⍞)∊⎕D,⎕A,⎕UCS 96+⍳26;]
This is a text and a number: 31.
 a       2
 This    1
 is      1
 text    1
 and     1
 number  1
 31      1

Açıklama:

  • ⎕D,⎕A,⎕UCS 96+⍳26: sayılar, büyük harfler, küçük harfler
  • (I←⍞)∊: girişi okumak, depolamak I , hangilerinin alfanümerik olduğuna bak
  • Z←I⊂⍨: Bölünmüş I alfanümerik karakter gruplarına , saklaZ
  • +⌿∘.≡⍨Z: içindeki her öğe için Z için ne sıklıkta gerçekleştiğini görün
  • Z,⍪: içindeki her öğeyle eşleş Z kaç kez meydana geldiğiyle
  • G←⊃∪↓: sadece benzersiz çiftleri seç, sakla G
  • ⍒,1↓⍉G: olaylar için sıralanan dizinleri al
  • G[... ;]: Gverilen endekslere göre satırları yeniden sırala

6
what ... the ... f .....
Ozh

6
Bu yüzden kabuslarım var.
TheBluefish

3
@Bluefish: APL, matematik gibi, özlü bir gösterimin sizi açıkça düşünmenizi serbest bırakması amacıyla bir notasyondan tasarlanmıştır. Yine matematikte olduğu gibi, bu gösterimi ilk gördüğünüzde, bunun hiç net olmadığını düşünmeye meylediniz, ancak diller her zaman başlangıçta karmaşık görünüyor. Her şey bir satırda olmasaydı daha kolay olurdu ...
Phil H

APL'de ne elde ederseniz edin, sadece bazı unicode çöpler, yön gösteren oklar ve baş aşağı çam ağacı görüyorum. bu J'den daha kötü
bebe

⎕s( Help.dyalog.com/latest/Content/Language/System%20Functions/… ) ve yeni ana işletmen ( help.dyalog.com/latest/Content/Language/Primitive%20Operators/… ) ile daha kısa olabilir :g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
ngn

8

C #: 153C 144C 142C 111C 115c 118c 114c 113C

(giriş dizesi dahil değil, "C # İfadeleri" modunda LINQPad aracılığıyla)

Sürüm 1: 142c

var s = "This is a text and a number: 31."; // <- line not included in count
s.Split(s.Where(c=>!Char.IsLetterOrDigit(c)).ToArray(),(StringSplitOptions)1).GroupBy(x=>x,(k,e)=>new{s,c=e.Count()}).OrderBy(x=>-x.c).Dump();

Ungolfed:

var s = "This is a text and a number: 31.";
s.Split(                                                     // split string on multiple separators
    s.Where(c => !Char.IsLetterOrDigit(c))                   // get list of non-alphanumeric characters in string
     .ToArray(),                                             // (would love to get rid of this but needed to match the correct Split signature)
    (StringSplitOptions)1                                    // integer equivalent of StringSplitOptions.RemoveEmptyEntries
).GroupBy(x => x, (k, e) => new{ s = k, c = e.Count() })     // count by word
 .OrderBy(x => -x.c)                                         // order ascending by negative count (i.e. OrderByDescending)
 .Dump();                                                    // output to LINQPad results panel

Sonuçlar:

Results

Sürüm 2: 114c

( [\w]İçerir _!; doğru olan [A-z]içerir [ \ ] ^ _ `; yerleşmeden [^_\W]+)

var s = "This is a text and a number: 31."; // <- line not included in count
Regex.Matches(s, @"[^_\W]+").Cast<Match>().GroupBy(m=>m.Value,(m,e)=>new{m,c=e.Count()}).OrderBy(g=>-g.c).Dump();

Ungolfed:

Regex.Matches(s, @"[^_\W]+")                                   // get all matches for one-or-more alphanumeric characters
     .Cast<Match>()                                            // why weren't .NET 1 collections retrofitted with IEnumerable<T>??
     .GroupBy(m => m.Value, (m,e) => new{ m, c = e.Count() })  // count by word
     .OrderBy(g => -g.c)                                       // order ascending by negative count (i.e. OrderByDescending)
     .Dump();                                                  // output to LINQPad results panel

Sonuçlar: (Sürüm 1 olarak)


Bu arada, sürüm 2 için, sürüm sürümünüz golf sürümünüzle eşleşmiyor. Ve hazır bilgi dizgisini kullandığınız için yazabilirsiniz@"[^_\W]"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ - yazım hatası düzeltildi ve 1 karakterlik bir tasarruf için fazladan `` kaldırıldı - teşekkürler !!
jimbobmcgee

7

R, 58 karakter

sort(table(unlist(strsplit(scan(,""),"[[:punct:]]"))),d=T)

Kullanımı:

sort(table(unlist(strsplit(scan(,""),"[[:punct:]]"))),d=T)
1: This is a text and a number: 31.
9: 
Read 8 items

     a     31    and     is number   text   This 
     2      1      1      1      1      1      1 

Bu daha kısa (49 karakter) sort(table(gsub("[[:punct:]]","",scan(,""))),d=T). Maalesef her iki çözüm de doğru şekilde çalışmıyor wouldn't.
djhurio

6

perl6: 49 karakter

.say for get.comb(/\w+/).Bag.pairs.sort(-*.value)

Eşleşen şeyler için taramalı girdi, a'daki \w+kelimelerin listesini koyun Bag, çiftlerini isteyin ve bunları negatif değere göre sıralayın. (Bu *bir herneyse , burada çarpma yıldız değil)

çıktı:

"a" => 2
"This" => 1
"is" => 1
"text" => 1
"and" => 1
"number" => 1
"31" => 1

3
Perl 6 beni korkutuyor.
primo

1
Her zaman harika bir dil özelliği düşündüğümde, onu arıyorum ve Perl6'da bir yerlerde. Bu yüzden uzun zaman alıyor ...
Phil H

6 karakterini .words, .comb(/\w+/):) yerine kullanarak değiştirebilirsiniz .
Mouq

@Mouq: ne yazık ki .wordsşerit yoktur :veya .:( girişten gerektiği gibi
Ayiko

-1. _sorun ifadesi altındaki bir kelimeye dahil edilmemelidir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

6

Python 101 97

import re
a=re.split('[_\W]+',input())
f=a.count
for w in sorted(set(a),key=f)[::-1]:print w,f(w)

Şimdi newline ile çalışıyor:

$ python countword.py <<< '"This is    a text and a number: 31, and a\nnewline"'
a 3
and 2
31 1
number 1
newline 1
is 1
text 1
This 1

Bu, yeni satırlar veya metinde arka arkaya birden fazla boşluk olduğunda işe yaramaz.
klingt.net

@ klingt.net düzeltildi.
daniero

6

PHP - 84 bayt

<?$a=array_count_values(preg_split('/[_\W]+/',$argv[1],0,1));arsort($a);print_r($a);

Girdi, komut satırı argümanı olarak kabul edilir, örneğin:

$ php count-words.php "This is a text and a number: 31."

Örnek dizge için çıktı:

Array
(
    [a] => 2
    [number] => 1
    [31] => 1
    [and] => 1
    [text] => 1
    [is] => 1
    [This] => 1
)

1
girdi istediğin şey diyor. bu $argv[1]
sayede

@Einacio iyi çağrı.
primo

-1. Alt çizgi _bir kelimeye dahil edilmemelidir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ sabit.
primo

5

PowerShell (40)

$s -split"\W+"|group -ca|sort count -des

$ s, giriş dizesini içeren bir değişkendir.


2
[\W]yeterince iyi değil - testimdeki boşluğa uyuyor. Ve azalan sayıma göre sıralı değil ...
jimbobmcgee

$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}seni yakına
getirir

Hata! Sıralama bölümünü özledim. Cevabımı kısa sürede düzeltir.
microbian

alternatif olarak:$s -split"\W+"|group -ca |sort count -des
Nacimota

4
-split"\W+"dize ile dizinin sonu arasında boş bir dize ile eşleşiyor .; ayrıca teknik olarak izin verilmeyen \W+maçları da _içerir
jimbobmcgee

4

Perl 69

$h{$_}++for<>=~/\w+/g;print"$_: $h{$_}
"for sort{$h{$b}-$h{$a}}keys%h

@Primo ve @protist tarafından eklenen tavsiyeler


1
Peki ya sıralama?
daniero,

@daniero, mükemmel nokta! Bu şimdi sıralar!
Dom Hastings,

1
Bence bu alabildiğin kadar titiz. Bir kullanımdan kaldırma uyarısı sakıncası yoksa, geve arasında boşluk gerekmez for. Ayrıca <=>operatör tarafından değiştirilebilir -.
primo

2
@primo Ahhh -yerine <=>dahi, Perl ipliğinin golf ipuçlarında olduğundan emin değil. Bunu daha sonra güncelleyeceğim, teşekkürler!
Dom Hastings,

1
Hey @protist, \wsayıları da içerir ( perl -e 'print for"a 1 2 3 4 b"=~/\w/g'yazdırır a1234b), ancak sözcükleri yineleme mekanizmanız başka bir karakter kaydeder, bu yüzden güncelleyeceğim. Teşekkür ederim!
Dom Hastings

4

Powershell: 57 55 53 62 57

(giriş dizesi dahil değil)

$s = "This is a text and a number: 31."    # <-- not counting this line...
[Regex]::Matches($s,"[^_\W]+")|group -ca|sort{-$_.Count}

döner:

Count Name                      Group
----- ----                      -----
    2 a                         {a, a}
    1 and                       {and}
    1 31                        {31}
    1 number                    {number}
    1 This                      {This}
    1 is                        {is}
    1 text                      {text}

(-ca grubu için @microbian'den aksesuarlar)


3

EcmaScript 6

Sürüm 1 (108 karakter)

s.split(_=/[^a-z\d]/i).map(x=>_[x]=-~_[x]);keys(_).sort((a,b)=>_[a]<_[b]).map(x=>x&&console.log(x+':'+_[x]))

Sürüm 2 (102 karakter)

s.split(_=/[^a-z\d]/i).map(x=>_[x]=-~_[x]);keys(_).sort((a,b)=>_[a]<_[b]).map(x=>x&&alert(x+':'+_[x]))

Sürüm 3 (105 karakter)

s.match(_=/\w+/g).map(x=>_[x]=-~_[x]);alert(keys(_).sort((a,b)=>_[a]<_[b]).map(x=>x+':'+_[x]).join('\n'))

Sürüm 4 (94 karakter)

s.match(_=/\w+/g).map(x=>_[x]=-~_[x]);keys(_).sort((a,b)=>_[a]<_[b]).map(x=>alert(x+':'+_[x]))

Sürüm 5 (alarm vermeden; 87 karakter)

s.match(_=/\w+/g).map(x=>_[x]=-~_[x]);keys(_).sort((a,b)=>_[a]<_[b]).map(x=>x+':'+_[x])

Sürüm 6 (100 karakter)

keys(_,s.match(_=/\w+/g).map(x=>_[x]=-~_[x])).sort((a,b)=>_[a]<_[b]).map(x=>console.log(x+':'+_[x]))

Çıktı:

a:2
31:1
This:1
is:1
text:1
and:1
number:1

_[a]Ve _[b]ile _.ave değiştirebilirsiniz _.b. Ayrıca değişen /\w+/g,_={}için _=/\w+/gaynı sonucu üretecektir.
Ocak'ta

@eithedog Teşekkürler! Ancak, ben değiştiremem _[a]olmak _.ao özelliği erişmeye çalışması nedeniyle "a"bir _değil, mülkiyet a.
Diş fırçası

ah, doğru - sipariş tutulmayacak. :) üzerinde Carry
eithed

Oh, cevabını fark etmedim .. güzel. Fakat .. Object.keysES6'da küreselleşiyor? Cevabınız bunu varsayıyor gibi görünüyor, ancak bunu ES6 için planlandığı gibi gördüğümü hatırlamıyorum.
FireFly,

@FireFly Herhangi bir belge bulamıyorum, ancak Firefox'ta iyi çalışıyor. Chrome / Opera / IE’de test etmedim.
Diş fırçası

3

Harika 77 82

Alt çizgi ile ilgili sorunu çözmek [^\w]+için regex değiştirildi[^\d\p{L}]+

String s = 'This is a text and a number: 31'

def a=s.split(/[^\d\p{L}]+/) 
a.collectEntries{[it, a.count(it)]}.sort{-it.value}

ilk satırsız, 82 karakter

çıktı:

[a:2, This:1, is:1, text:1, and:1, number:1, 31:1]

nu_beralfanümerik değil. Bu shouls 2 kelime olmalı
Cruncher

Neden kullanmak nu_beryerine number?
Kevin Fegan,

Diğer bazı yazılar tarafından yanıltıldım;) şimdi girdiden "_" harfini çıkardım, ancak
regex'i

3

GNU awk + coreutils: 71 69

gawk 'BEGIN{RS="\\W+"}{c[$0]++}END{for(w in c)print c[w],w}'|sort -nr

gawk asortİlişkisel diziler üzerinde çalışsa da , görünüşte, harici değerleri gerektiren endeks değerlerini korumaz.sort

printf "This is a text and a number: 31." | 
gawk 'BEGIN{RS="\\W+"}{c[$0]++}END{for(w in c)print c[w],w}'|sort -nr
2 a
1 This
1 text
1 number
1 is
1 and
1 31

GNU awk 4.x: 100 93

PROCINFOİlişkilendirilmiş dizi için varsayılan sıralama düzenini ayarlamak için kullanılan biraz daha büyük ama saf bir çözüm (görece yeni bir gawk -> 4.x? Gerektiriyor gibi görünüyor)

BEGIN{RS="\\W+";PROCINFO["sorted_in"]="@val_num_desc"}
{c[$0]++}
END{for(w in c)print c[w],w}

Oooooh. PROCINFO'yu bilmiyordum. Sanki hayatımda awk kullanmak için başka bir bahaneye ihtiyacım vardı. Lanet olsun sana!
dmckee

Ben kurcalama başlayana kadar @dmckee TBH ben PROCINFO hakkında bilmiyordum - Ben orada ikna oldu vardı sıralama doğal yapmak için bir yol olarak - tanımlayıcıları kadar uzun olan sadece yazık;)
steeldriver

Kötü eski günlerde basitçe bir yol yoktu. Bu benim eski cevabım gibi şeyler yol açar .
dmckee

-1. Alt çizgi _bir kelimeye dahil edilmemelidir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

3

Javascript - 132 126 karakter!

(En kısa JS kodu)

o={},a=[]
for(i in s=s.split(/[\W_]+/))o[z=s[i]]=o[z]+1||1
for(j in o)a.push([j,o[j]])
a.sort(function(b,c){return c[1]-b[1]})

Düzenli düzenleme ve bazı düzenlemeler iyileştirildi.


Ungolfed

s = s.split(/[\W_]+/), o={}, a=[]; // split along non-char letters, declare object and array

for (i in s) { n = s[i]; o[n] = o[n] + 1 || 1 } // go through each char and store it's occurence

for (j in o) a.push( [j, o[j]] ); // store in array for sorting

a.sort(function (b, c){ return c[1] - b[1]; }); // sort !

<= // make s = "Bu gün ne kadar parlak?"

=> [['', 3],
['Nasıl', 1],
['parlak', 1],
['bu', 1],
['gün', 1],
['isn', 1] ,
['t', 1]]


Eski - 156 143 141 140 132 karakter

s=s.split(/[^\w]+/g),o={}
for(i in s){n=s[i];o[n]=o[n]+1||1}a=[]
for(j in o)a.push([j,o[j]])
a.sort(function(b,c){return c[1]-b[1]})

İlk golf oynamayı denedi. Geribildirim takdir etti.


2

EcmaScript 6, 115 100 87 (hızlı ve alarm olmadan)

@Eithedog 'a teşekkürler:

s.match(/\w+/g,a={}).map(w=>a[w]=-~a[w]),keys(a).map(w=>[w,a[w]]).sort((a,b)=>b[1]-a[1])

İstemi ve uyarısı ile (100):

prompt(a={}).match(/\w+/g).map(w=>a[w]=-~a[w]);alert(keys(a).map(w=>[w,a[w]]).sort((a,b)=>b[1]-a[1]))

Firefox'ta çalıştırın.


1
İhtiyacın yok var . Ayrıca, a={}içinde hareket edebilirsiniz prompt- prompt(a={}). Ayrıca bırakın Object.ve değişim w=>a[w]=a[w]+1||1içinw=>a[w]=-~a[w]
eithed

Çok hoş. Çalışan Python'u bir kez daha
yendi

@ Diş fırçasının cevabındaki gibi - bildirimini aistemden regexp'e taşımak iki karakter daha bırakacaktır.
Ocak'ta

Güzel ve temiz. Aferin!
Diş fırçası

-1. Alt çizgi _bir kelimeye dahil edilmemelidir.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

2

Ruby 58 82 65

h=Hash.new 0
gets.scan(/[\d\w]+/){h[$&]+=1}
p *h.sort_by{|k,v|-v}

Test sürüşü:

$ ruby counttext.rb <<< "This is a text and a number: 31."
["a", 2]
["text", 1]
["This", 1]
["is", 1]
["and", 1]
["number", 1]
["31", 1]

Düzenleme 58-> 80: Tamam, yolumu kapattım. Kelimeleri olaylara göre sıralamayı unuttum. Ayrıca, Array#uniqbir numaralandırıcı değildir, ancak öğeleri karşılaştırmak için verilen bir bloğu kullanır, bu nedenle putsona geçmek yinelemeleri filtrelememiştir (söylemeliyiz).


1
Belki (test edilmemiş) split(/\W+/)yerine scan?
Howard

@Hardard Teşekkürler. \Whariç _tutularak düzeltilmesi gerekiyordu, ancak yine de 2 karakter kaydetti (sonra ihmal ettiğim sıralamayı düzeltmek için 20 ekledim).
daniero,

Sıralanmamalıreverse (a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
Eduard Florinescu

@EduardFlorinescu Nah. reverseyol çok ayrıntılı;) Btw, soruyu değiştirmek adil değil.
daniero,

Çıktı örneğinde görüyorsanız, yalnızca belirtmeyi unuttuğum azalan düzenlenmiştir.
Eduard Florinescu

2

F # - 169

let f s=(s+"").Split(set s-set(['a'..'z']@['A'..'Z']@['0'..'9'])|>Set.toArray)|>Seq.where((<>)"")|>Seq.countBy id|>Seq.sortBy((~-)<<snd)|>Seq.iter((<||)(printfn"%s:%d"))

Degolfed:

let count (s : string) =
    s.Split (set s - set (['a'..'z']@['A'..'Z']@['0'..'9']) |> Set.toArray)
 |> Seq.where ((<>) "")
 |> Seq.countBy id
 |> Seq.sortBy ((~-) << snd)
 |> Seq.iter ((<||) (printfn "%s:%d"))

Fsi denilen çıktı:

> "This is a text and a number: 31." |> f
a:2
This:1
is:1
text:1
and:1
number:1
31:1
val it : unit = ()

Güncelleme: Yorumlarda istendiği gibi bazı açıklamalar.

Girdide String.Split'e iletilecek alfanümerik olmayan karakterlerden oluşan bir dizi üretmek için set işlevlerini kullanır, daha sonra boş dizeleri filtrelemek, kelime sayıları oluşturmak ve sonucu yazdırmak için dizi işlevlerini kullanır.

Bazı golf oynama püf noktaları: Argümanın tip çıkarımını açıkça belirtmek yerine bir dize olarak zorlamak için s işlev argümanına boş bir dize ekler. Birkaç karakter kaydetmek için Seq.filter yerine Seq.where kullanır (eşanlamlıdırlar). Karakterleri minimize etmek için ileri boru ve sıradan fonksiyon uygulamasını karıştırır. <> ~ - ve <|| işlemlerini yapmak için currying ve (op) sözdizimini kullanır operatörler, boş dizeleri filtrelemek için lambdalar bildirmekten kaçınmak, azalan sayıya göre sıralamak ve baskıları yazdırmak için düzenli işlevler yapar.


Kesinlikle bir tür açıklama eklemelisin; bu şekilde kodunuzu anlayabiliriz.
Justin

Yıpranmış bir sürüm ve bazı açıklamalar eklendi.
mattnewport

2

Python - 95 (şimdi 87 @primo sayesinde)

d=__import__('re').findall(r'\w+',raw_input())
print sorted(map(lambda y:(y,d.count(y)),d))

Örnek giriş:

'This is a text and a number: 31'

Örnek çıktı:

[('This', 1),('is', 1), ('a', 2),('text', 1),('and', 1),('a', 2),('number', 1),('31', 1)]

Herhangi bir iyileştirme önerisi takdir edilecektir


1
Çözüm güzel ama çıktı sıralanmadı.
Eduard Florinescu

Sıralama ile ne demek istiyorsunuz? Yorumunuz için teşekkürler.
Azwr

1
\weşleşir [a-zA-Z0-9_]. Tüm regex'iniz değiştirilebilir r'\w+'. Ayrıca, xdeğişken gerekli değildir, sadece raw_input()için ikinci parametre olarak kullanın findall.
primo

Sıralandığında, OP, en sık görünen kelimelerin önce listelenmesi gerektiği anlamına gelir. Ayrıca, programınız bir printifade (yani print map(...) içermelidir , aksi halde tam bir program değildir.
primo

Bunu hemen sıralamak zaman yok :( Ben acelem var, öneri ve yorumlar için teşekkürler.
Azwr

2

JavaScript 160 144 (Düzenlendi: gereksinimleri karşılamak için)

f=Function;o={};s.replace(/\w+/g,f('a','o[a]=++o[a]||1'));Object.keys(o).sort(f('b,c','return o[c]-o[b]')).map(f('k','console.log(k+" "+o[k])'))

Unminified:

f=Function;
o = {};
s.replace(/\w+/g, f('a','o[a]=++o[a]||1'));
Object.keys(o).sort(f('b,c', 'return o[c]-o[b]')).map(f('k','console.log(k+" "+o[k])'))

Her bir kelimeyi konsola sırayla kaydederek aşağıdaki dizgiyi geçirir:

s="This is sam}}ple text 31to test the effectiveness of this code, you can clearly see that this is working-as-intended, but you didn't doubt it did you?.";

Çıktılar:

you 3
this 2
is 2
can 1
text 1
31to 1
test 1
the 1
effectiveness 1
of 1
This 1
code 1
sam 1
ple 1
clearly 1
see 1
that 1
working 1
as 1
intended 1
but 1
didn 1
t 1
doubt 1
it 1
did 1 

Kullanacak kalbim yok alert().


1
Sıralama numarasına göre olmalıdır. olayların youilk yani .
Eduard Florinescu

@EduardFlorinescu Silly me... I'll fix it later.
George Reith

@EduardFlorinescu fixed
George Reith

-1. Underscore _ should not be included in a word.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

++o[a]||1 => -~o[a]
l4m2

2

k [71 chars]

f:{s:" ",x;`_k!m@k:|(!m)@<.:m:#:'=`$1_'(&~((),/:s)like"[a-zA-Z0-9]")_s}

Any other character except alphanumeric chars will be considered as delimiter.

example

f "This is a text and a number: 31."
a     | 2
31    | 1
number| 1
and   | 1
text  | 1
is    | 1
This  | 1

example

f "won't won won-won"
won| 4
t  | 1

2

Javascript (135)

u=/\w+/g
for(i=s.length;i--;)for(w in a=s.match(u))u[w=a[w]]=u[w]||a.reduce(function(p,c){return p+=w==c},0)==i&&!console.log(w+":"+i)

Unminified:

u=/\w+/g;for (i=s.length;i--;)
    for(w in a=s.match(u))
        u[w=a[w]] = u[w] || 
           a.reduce(function(p,c){return p+=w==c},0)==i && !console.log(w+":"+i)

Loops over every possible number of matches in descending order, and outputs words with that number of occurrences. Just to be horrible.

Notes: Alert would have reduced the length some. Strictly speaking alphanumeric should be [^\W_]


2

Haskell (153 = 104 code + 49 import)

Pretty straight-forward, totally composed function... no argument even necessary! This is my first golf, so go easy, maybe? :)

import Data.Char
import Data.List
import Data.Ord
so=reverse.(sortBy$comparing snd).(map(\t@(x:_)->(x,length t))).group.sort.(map$filter isAlphaNum).words

Output:

*Main> so "This is a text and a number: 31."
[("a",2),("text",1),("number",1),("is",1),("and",1),("This",1),("31",1)]

2

q (50)

desc count each group" "vs ssr[;"[^0-9A-Za-z]";" "]
  • ssr replaces non alphanumeric
  • " "vs splits the result into a symbol list
  • count each group counts creates a dict matching distinct elements of the list with the number of occurances
  • desc sorts the dict by descending values

edit: fixed accidentally matching ascii 58-64 and 91-96


1
I've no knowledge of q but is the regex [0-z] ASCII-based? If it is, wouldn't it also include ASCII chars 58-64? Because those are : ; < = > ? @.
jimbobmcgee

Great catch jimbob, thanks
nightTrevors

You're welcome; only spotted because I found the same in C#. Sadly, same with [A-z], which matches ASCII 91-96, which are `[ \ ] ^ _ ``
jimbobmcgee

ah right you are, nice little ascii lesson right there!
nightTrevors

I just discovered [^_\W]+ for mine, which should be "exclude non-word characters and underscore", if your syntax supports the \W class...
jimbobmcgee

2

Pure Bash (no external programs), 164

This is longer than I'd hoped, but I wanted to see if the necessary counting and sorting (in the right direction) could be done purely with bash arrays (associative and non-associative):

declare -A c
for w in ${@//[[:punct:]]/ };{ ((c[$w]++));}
for w in ${!c[@]};{ i=${c[$w]};((m=i>m?i:m));s[$i]+=$w:;}
for((i=m;i>0;i--));{ printf "${s[i]//:/:$i
}";}

Save as a script file, chmod +x, and run:

$ ./countoccur This is a text and a number: 31.
a:2
and:1
number:1
text:1
31:1
is:1
This:1
$ 

2

AWK

awk -vRS='[^A-Za-z0-9]' '$0{c[$0]++}END{for(i in c)print c[i]"\t"i": "c[i]|"sort -nr|cut -f2-"}'

Does the job without gawkish extensions:

$ echo 'This is a text and a number: 31.' | awk -vRS='[^A-Za-z0-9]' '$0{c[$0]++}END{for(i in c)print c[i]"\t"i": "c[i]|"sort -nr|cut -f2-"}'
a: 2
This: 1
text: 1
number: 1
is: 1
and: 1
31: 1

If printing "count: word" instead, it would be a bit shorter but I wanted to mimic the given example output...



1

Python 2.X (108 - Characters)

print'\n'.join('{}:{}'.format(a,b)for a,b in __import__("collections").Counter(raw_input().split()).items())

Python 3.X (106 - Characters)

print('\n'.join('{}:{}'.format(a,b)for a,b in __import__("collections").Counter(input().split()).items())

Separators will be anything that is not alpha-numeric - You only split on whitespace.
daniero


1

Python 3 - 76

The requirement of splitting on non-alphanumeric chars unfortunately extends the code by 19 chars. The output of the following is shown correctly. If you are not sure, add a .most_common() after the .Counter(...).

i=__import__
print(i('collections').Counter(i('re').findall('\w+',input())))

In/Output

Given the input of This is a text and a number: 31. you get following output:

Counter({'a': 2, 'is': 1, 'This': 1, 'and': 1, '31': 1, 'number': 1, 'text': 1})

I tried it with other values like

1 2 3 4 5 6 7 8 2 1 5 3 4 6 8 1 3 2 4 6 1 2 8 4 3 1 3 2 5 6 5 4  2 2 4 2 1 3 6

to ensure, the output-order does not rely on the key's value/hash. This example produces:

Counter({'2': 8, '3': 6, '1': 6, '4': 6, '6': 5, '5': 4, '8': 3, '7': 1})

But as I said, print(i('collections').Counter(i('re').findall('\w+',input())).most_common()) would return the results as an definitly ordered list of tuples.


Python 3 - 57 (if a space would be enough for splitting :P)

print(__import__('collections').Counter(input().split()))

If you assumed the string was in some variable s, as some other answers do, you could lose 6 characters by replacing input().
Phil H

@PhilH well. you are right, but I would never read that out of the requirements. sure the "string for JavaScript"-part might suggest it, but I cannot, with a clear conscience, interpret a string-variable as a valid "input". But you are right. that would shorten it even more. :P
Dave J

-1. Underscore _ should not be included in a word.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Well this depends on the definition of alpha-numeric. In Python, "\w" is defined for accepting alpha-numeric chars. You might be correct but a with this kind of interpretation of the rules, my solution keeps being correct. :)
Dave J
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.