テキスト内の単語を数えて表示する


26

コードはテキストを入力する必要があります(ファイル、標準入力、JavaScriptの文字列などは必須ではありません):

This is a text and a number: 31.

出力には、出現回数で降順でソートされた単語が含まれている必要があります。

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

31は単語であるため、単語は英数字であり、数値は区切り文字として機能しないため、たとえば0xAF、単語として修飾されます。区切り文字は.-(ドット)や(ハイフン)を含む英数字ではないもの、つまり2語i.e.またはpick-me-up3語になります。大文字と小文字を区別しなければならない、Thisそしてthis二つの異なる単語であろう、 'またようにセパレータであろうwouldntの2つの異なる単語であろうwouldn't

選択した言語で最短のコードを記述します。

これまでの最短正解:


5
大文字と小文字は区別されますか(つまりandとThis同じですか)?thistHIs
ガレス14年

英数字以外のものが区切り文字としてカウントされる場合、wouldn't2ワード(wouldnおよびt)ですか?
ガレス14年

@Garethは、大文字と小文字が区別されるべきであり、Thisそしてthis実際に二つの異なる同じ言葉、だろうwouldnt
エデュアルドフロリネスク14年

2単語でなければ、「Would」と「nt」ではないでしょうか?
テウンプロンク14

@TeunPronk私は文法を持つためにあるように、例外を奨励するいくつかのルールを入れて、それをシンプルに維持しようと、英語でthere.Exアウト例外がたくさんありますi.e.単語であるが、我々が許可すれば、全くドットをドットフレーズの終わりには、など引用符または単一引用符と同じ取られる
エドゥアルトFlorinescu

回答:


27

grepおよびcoreutils  44  42

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

テスト:

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

結果:

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

更新

  • 大文字と小文字を区別しないオプションと短い正規表現を使用します。ありがとうトーマス。

2
これは、Knuthの本Literate Programmingに対するMcEllroyの反応とほぼ同じです。唯一の違いは、これにはhead最後にパイプが含まれないことです。
AJMansfield

これもほとんど私の最初の考えでした。
ロブ14年

1
「\ w +」も機能しませんか?
シルウェスター14年

1
41文字grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
トマス14

1
@Tomas:これを回答に追加しました、ありがとう。アスタリスクはいくつかのシェルでファイル名を拡張しているため、保護しました。
トール14

18

Java 8:289

javaは非常に非ゴルフ言語なので、これはかなり良いことです。

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()));}

ゴルフをしていない:

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()));
    }
}

コマンドラインから実行します。

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

分割の間違った正規表現。それは"[^\\W_]"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳、String.split(String regex)メソッドは分割する区切り文字に一致するパターンを取ります。したがって、たとえば、"aababba".split("b")配列を生成します{"aa", "a", "", "a"}。私の正規表現[^\\w\\d]は、「単語の文字クラスでも数字の文字クラスでもない文字」を意味します。[^\\W_]代わりに、「アンダースコアでも非単語文字クラスでもない文字」であり、アンダースコアを除く任意の単語文字と一致します。
AJMansfield 14年

申し訳ありませんが、以前のコメントは間違っていました。\wを含む\dため\d、冗長です。\wアンダースコアが含まれます。アンダースコアは、質問に応じて区切り文字と見なされる必要があります。したがって、分割の正しい正規表現はである必要があります"[\\W_]+"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ OK、ありがとう。問題を修正しました。
AJMansfield

17

APL(57)

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

例えば

      ⎕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

説明:

  • ⎕D,⎕A,⎕UCS 96+⍳26:数字、大文字、小文字
  • (I←⍞)∊:入力を読み取り、保存しI、どれが英数字であるかを確認します
  • Z←I⊂⍨I英数字のグループに分割して保存Z
  • +⌿∘.≡⍨Z:の各要素についてZ、発生頻度を確認します
  • Z,⍪:各要素をZペアで、それが発生する回数と一致させます
  • G←⊃∪↓:一意のペアのみを選択して保存 G
  • ⍒,1↓⍉G:オカレンスのソートされたインデックスを取得します
  • G[... ;]:行を指定Gされたインデックスで並べ替えます

6
何... ... F ...
OZH

6
これが私に悪夢がある理由です。
Thebluefish

3
@Thebluefish:APLは、数学によく似た簡潔な表記法により、明確に考えることができるように、表記法から設計されました。再び数学のように、その表記法を最初に見たとき、それはまったく明確ではないと思う傾向がありますが、言語は最初は常に複雑に見えます。それはすべて1行ではなかった場合は...かかわらず、容易になるだろう
フィル・H

APLで思いついたものは何でも、Unicodeのごみ、方向を指す矢印、逆さまの松の木しか見えません。それはJよりも悪いです
bebe

⎕shelp.dyalog.com/latest/Content/Language/System%20Functions/…)と新しいキー演算子(help.dyalog.com/latest/Content/Language/Primitive%20Operators/…)で短くすることができます:g⌷⍨⊂⍒2⌷⍉g←{⍺,≢⍵}⌸('\w+'⎕s'\0')⍞
ngn

8

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

(入力文字列を含まない「C#ステートメント」モードのLINQPad経由)

バージョン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();

ゴルフをしていない:

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

結果:

Results

バージョン2:114c

(が[\w]含まれていますが_、これは誤りです!;が[A-z]含まれてい[ \ ] ^ _ `ます;落ち着きます[^_\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();

ゴルフをしていない:

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

結果:(バージョン1として)


ちなみに、バージョン2の場合、ゴルフのバージョンはゴルフのバージョンと一致しません。リテラル文字列を使用しているので、次のように書くことができます@"[^_\W]"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳-タイプミスを修正し、1文字の節約のために余分な ``を削除しました-ありがとう!!
ジンボブムジー14年

7

R、58文字

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

使用法:

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 

これは短くなります(49文字)sort(table(gsub("[[:punct:]]","",scan(,""))),d=T)。残念ながら、両方のソリューションはのために正しく動作しませんwouldn't
djhurio

6

perl6:49文字

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

一致するものを入力し\w+、結果の単語のリストをaに入れBag、それらのペアを求め、それらを負の値でソートします。(これ*どんな星でも、ここでは乗算ではありません)

出力:

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

3
Perl 6は私を怖がらせます。
プリモ

1
クールな言語機能について考えるたびに、私はそれを探し、それはどこかのPerl6にあります。それは...長い時間を取っている理由です
フィルH

あなたは使って6つの文字をトリミングすることができ.words代わりに.comb(/\w+/):)
Mouq

@Mouq:残念ながら.words剥離しない:か、.必要に応じて入力からの:(
Ayiko

-1。_問題文の下の単語に含めるべきではありません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

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)

改行で動作するようになりました:

$ 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

テキストに改行または連続した複数のスペースがある場合、これは機能しません。
klingt.net 14年

@ klingt.netが修正されました。
ダニエロ14年

6

PHP-84バイト

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

入力はコマンドライン引数として受け入れられます。例:

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

サンプル文字列の出力:

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

1
入力はあなたが望むものだと言っています。を使用してコマンドラインパラメーターとして取得できます$argv[1]
Einacio 14年

@Einacio良い電話。
プリモ14年

-1。_単語にアンダースコアを含めるべきではありません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳修正済み。
primo 14年

5

PowerShell(40)

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

$ sは、入力文字列を含む変数です。


2
[\W]十分ではありません-私のテストではスペースと一致しています。そして、それは...数を降順で順序付けされていません
jimbobmcgee

$s -split"[\W]"|group -ca|where{$_.Name -ne ""}|sort{-$_.Count}(もちろん、コストとの)近くにあなたを取得
jimbobmcgee

おっと、ソートの部分が見逃されました。まもなく私の答えを修正します。
ミクロ

または:$s -split"\W+"|group -ca |sort count -des
ナシモタ14年

4
-split"\W+"文字列の最後.から最後までの空の文字列と一致しています。また、\W+一致して_技術的に許可されていない
jimbobmcgee

4

Perl 69

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

@primoおよび@protistからの推奨事項を追加しました


1
ソートはどうですか?
ダニエロ14年

@daniero、素晴らしい点!これでソートされました!
ドムヘイスティングス14年

1
私はそれが得ることができるほど簡潔だと思います。あなたは非推奨の警告を気にしない場合は、スペースが間に必要とされないgefor。また、<=>演算子はに置き換えることができます-
primo 14年

2
@primo Ahhhの-代わりに<=>天才です。Perl スレッドのゴルフのヒントについてはわかりません。後で更新します、ありがとう!
ドムヘイスティングス

1
@protistねえ、\wあまりにも数字(含まperl -e 'print for"a 1 2 3 4 b"=~/\w/g'プリントをa1234b)、私は更新されますので単語を反復処理するためのあなたのメカニズムは、別の文字が保存されます。ありがとうございました!
ドムヘイスティングス14年

4

Powershell:57 55 53 62 57

(入力文字列を含まない)

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

戻り値:

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の@microbianの小道具付き)


3

EcmaScript 6

バージョン1(108文字)

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

バージョン2(102文字)

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

バージョン3(105文字)

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

バージョン4(94文字)

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

バージョン5(アラートなし、87文字)

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

バージョン6(100文字)

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

出力:

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

あなたは変えることができる_[a]_[b]する_.a_.b。に変更/\w+/g,_={}_=/\w+/gても同じ結果が得られます。
eithed

@eithedogありがとうございます!しかし、私は変更することができない_[a]ように_.a、それはプロパティにアクセスしようとするため"a"_、ない性質をa
歯ブラシ14年

ああ、正しい-順序は維持されません。
続け

ああ、あなたの答えに気づかなかった。しかしObject.keys..ES6でグローバルになりつつありますか?あなたの答えはこれを仮定しているように見えますが、ES6で予定されているようにそれを見たことを覚えていません。
ホタル14年

@FireFlyドキュメントは見つかりませんが、Firefoxでは問題なく動作します。Chrome / Opera / IEでテストしていません。
歯ブラシ14年

3

グルービー77 82

アンダースコアの問題を解決するために正規表現をから[^\w]+に変更しまし[^\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}

最初の行なし、82文字

出力:

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

nu_ber英数字ではありません。このshoulsは2つの言葉も
たけた

nu_ber代わりに使用するのはなぜnumberですか?
ケビンフェガン14年

私はいくつかの他の記事による誤解だった;)今、私は入力から「_」を削除し、それを処理するための正規表現を修正
カミルMikolajczyk

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連想配列上で動作し、それは明らかに外部を必要と、インデックス値が保持されません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連想配列のデフォルトのソート順を設定するために使用する、少し大きいが純粋なgawkソリューション(比較的最近のgawk-> 4.xが必要なようです)

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

ああ。PROCINFOについて知りませんでした。私の人生でawkを使用する別の言い訳が必要であるかのように。あなたを呪います!
dmckee 14

@dmckee TBH PROCINFOについて知りませんでした- ネイティブにソートを行う方法が必要だと確信しまし -識別子が非常に残念なだけです;)
steeldriver

悪い昔には、単に道がありませんでした。これは私のこの古い答えのようなものにつながります。
dmckee 14

-1。_単語にアンダースコアを含めるべきではありません。
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

3

Javascript- 132 126文字!

(最短のJSコード)

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

正規表現といくつかの編集を改善しました。


非ゴルフ

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 =「この日はどれだけ輝くのか」

=> [['is'、3]、
['How'、1]、
['shiny'、1]、
['this'、1]、
['day'、1]、
['isn'、1] 、
['t'、1]]


古い- 156 143 141 140 132の文字

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

ゴルフに挑戦してみてください。フィードバックに感謝します。


2

ECMAScriptの6、115 100(プロンプト&警告なし)87

@eithedogに感謝します。

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

プロンプトと警告あり(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で実行します。


1
必要ありませんvar 。また、a={}内部に移動できますprompt- prompt(a={})。また、ドロップすることができObject.、変更w=>a[w]=a[w]+1||1w=>a[w]=-~a[w]
eithed

非常に素晴らしい。動作中のPythonの1つを今すぐ
倒し

@toothbrushの答えと同じ- aプロンプトの宣言を正規表現に移動すると、さらに2つの文字を節約できます。
14年

きれいです。よくやった!
歯ブラシ14年

-1。_単語にアンダースコアを含めるべきではありません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

2

ルビー58 82 65

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

試運転:

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

編集58-> 80:わかりました。単語を発生順にソートするのを忘れていました。また、Array#uniqは列挙子ではありませんが、指定されたブロックを使用して要素を比較するため、それに渡すputsことで重複を除外しませんでした(そうすべきだと言っているわけではありません)。


1
たぶん(未テスト)のsplit(/\W+/)代わりにscan
ハワード14年

@Howardありがとう。\W除外する_ため、修正する必要がありましたが、それでも2文字が保存されました(その後、無視したソートを修正するために20を追加しました)。
daniero 14年

ソートされるべきではないreverse (a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
エデュアルドフロリネスク14年

@EduardFlorinescuナ。reverseあまりにも冗長です;)ところで、質問を公平に変更することはできません。
ダニエル14年

出力サンプルに表示されている場合、指定し忘れたのは降順でソートされただけです。
エデュアルドフロリネスク14年

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

デゴルフド:

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から呼び出された場合の出力:

> "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 = ()

更新:コメントで要求されたいくつかの説明。

set関数を使用して、入力に英数字以外の文字の配列を生成してString.Splitに渡し、シーケンス関数を使用して空の文字列をフィルターで除外し、単語数を生成して結果を出力します。

ゴルフのコツ:関数の引数sに空の文字列を追加して、明示的に型を宣言するのではなく、文字列として引数の型推論を強制します。Seq.filterではなくSeq.whereを使用して、いくつかの文字を保存します(同義語です)。文字を最小限に抑えるために、フォワードパイプと通常の関数アプリケーションを混合します。カリー化と(op)構文を使用して、<>〜-および<||を処理します ラムダを宣言して空の文字列をフィルタリングしたり、カウントを降順に並べ替えたり、タプルを出力したりすることを避けるための通常の関数としての演算子


何らかの説明を必ず挿入する必要があります。そうすればあなたのコードを理解できます。
ジャスティン14年

デゴルフ版と説明を追加しました。
mattnewport 14年

2

Python-95( @primoのおかげで87になりました)

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

サンプル入力:

'This is a text and a number: 31'

サンプル出力:

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

改善の提案は高く評価されます


1
解決策は素晴らしいですが、出力はソートされていません。
エドゥアルド・フロリネスク

ソートとはどういう意味ですか?コメントありがとう。
Azwr 14年

1
\w一致し[a-zA-Z0-9_]ます。正規表現全体をに置き換えることができますr'\w+'。また、x変数は必要ありません。のraw_input()2番目のパラメーターとして使用するだけfindallです。
primo

ソートすることにより、OPは、最も頻繁に現れる単語を最初にリストする必要があることを意味します。また、プログラムにprintステートメント(つまりprint map(...)を含める必要があります。そうでない場合、完全なプログラムではありません。
primo

私は今それをソートする時間がない:(私は急いでいる、提案とコメントをありがとう。
Azwr

2

JavaScript 160 144(編集:要件を満たすため)

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

未縮小:

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

各単語を順番にコンソールに記録し、次の文字列を渡します。

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?.";

出力:

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 

使う心がないalert()


1
ソートは番号順にする必要があります。発生のでyou、最初にする必要があります。
エデュアルドフロリネスク14年

@EduardFlorinescuばかげた...後で修正します。
ジョージリース14年

@EduardFlorinescu修正
ジョージリース14年

-1。_単語にアンダースコアを含めるべきではありません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

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

2

k [71文字]

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

英数字以外の文字はすべて区切り文字と見なされます。

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

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)

未縮小:

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)

一致するすべての可能な数を降順でループし、その出現回数で単語を出力します。ただ恐ろしいことです。

注:アラートにより、長さが多少短縮されます。厳密に言えば英数字は[^\W_]


2

Haskell(153 = 104コード+ 49インポート)

とても簡単で、完全に構成された関数です...引数さえ必要ありません!これは私の最初のゴルフなので、たぶん簡単ですか?:)

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

出力:

*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は非英数字を置き換えます
  • "" vsは結果をシンボルリストに分割します
  • 各グループをカウントすると、リストの個別の要素と出現回数が一致する辞書が作成されます
  • descは、値を降順で辞書を並べ替えます

編集:誤って一致するascii 58-64および91-96を修正


1
知識はありませんqが、正規表現は[0-z]ASCIIベースですか?そうであれば、ASCII文字58-64も含まれていませんか?なぜならそれらは: ; < = > ? @
jimbobmcgee

グレートキャッチjimbob、感謝
nightTrevors

どういたしまして; 私はC#で同じものを見つけたので発見しただけです。悲しいことに、と同じ[A-z]、ASCII 91-96と一致する、 `[\] ^ _` `である
jimbobmcgee

ああ、あなたはそこにいる、素敵な小さなアスキーのレッスンです!
nightTrevors 14

私はちょうど発見[^_\W]+されるべきである、私のために「非単語文字とアンダースコアを除外する」あなたの構文がサポートされている場合、\W...クラスを
jimbobmcgee

2

Pure Bash(外部プログラムなし)、164

これは私が思っていたよりも長いですが、必要なカウントとソート(正しい方向)が純粋にbash配列(連想および非連想)で実行できるかどうかを見たかったのです。

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
}";}

スクリプトファイルとして保存し、chmod +x実行します:

$ ./countoccurこれはテキストと数字です:31。
a:2
および:1
番号:1
テキスト:1
31:1
is:1
これ: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-"}'

gawkish拡張なしで仕事をします:

$ 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

代わりに「count:word」を印刷する場合、少し短くなりますが、指定された出力例を模倣したいと思います...



1

Python 2.X(108-キャラクター)

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

Python 3.X(106-キャラクター)

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-空白でのみ分割します。
ダニエロ14年


1

Python 3〜76

残念ながら、英数字以外の文字で分割する必要があるため、コードが19文字拡張されます。次の出力は正しく表示されます。わからない場合は、の.most_common()後にを追加してください.Counter(...)

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

入出力

This is a text and a number: 31.あなたの入力を考えると、次の出力が得られます:

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

私は次のような他の値で試しました

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

確実にするために、出力順序はキーの値/ハッシュに依存しません。この例では以下を生成します。

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

しかし、私が言ったようにprint(i('collections').Counter(i('re').findall('\w+',input())).most_common())、結果を明確に順序付けられたタプルのリストとして返します。


Python 3-57 (スペースが分割に十分な場合:P)

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

他の回答のように、文字列がいくつかの変数にあると仮定した場合、input()を置き換えることで6文字を失う可能性があります。
フィルH 14年

@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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.