텍스트로 단어를 세어 표시


26

코드는 텍스트를 입력해야합니다 (필수는 아니지만 파일, stdin, 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단어로 정규화됩니다. 구분 기호는 .(점)과 -(하이픈)을 포함하여 영숫자가 아닌 것이 i.e.거나 pick-me-up각각 2 개의 단어를 생성합니다. 대소 문자이어야 This하고 this두 개의 다른 단어 것, '또한 이렇게 구분 것 wouldnt2 개 가지 단어 것이다 wouldn't.

선택한 언어로 가장 짧은 코드를 작성하십시오.

지금까지 가장 짧은 정답 :


5
합니까 케이스 물질 (즉,은 This과 동일 this하고 tHIs)?
Gareth

영숫자가 아닌 문자가 구분 기호로 간주되는 경우 wouldn't2 워드 ( wouldnt)입니까?
Gareth

@Gareth는 대소 문자를 구분해야 This하고 this실제로 두 개의 서로 다른 같은 단어 것 wouldn하고 t.
Eduard Florinescu

2 단어가 아니라면, "Would"와 "nt"가 짧아야합니까? 그렇지 않습니까?
Teun Pronk

@TeunPronk 나는 그것을 간단하게 유지하려고 노력하고 몇 가지 규칙을 적용하면 예외가 문법과 순서가 맞도록 장려 할 수 있으며 많은 예외가 있습니다. 예를 들어 영어 i.e.로 된 단어는 단어이지만 따옴표 또는 작은 따옴표 등과 같은 문구의 끝이 취해집니다.
Eduard 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

이것도 저의 첫 생각이었습니다.
Rob

1
'\ w +'도 작동하지 않습니까?
Sylwester

1
41 자 :grep -io \[A-Z0-9]*|sort|uniq -c|sort -nr
토마스

1
@Tomas : 답변에 이것을 추가했습니다. 감사합니다. 별표를 보호하기 위해 남겨 두었습니다. 일부 쉘에서 파일 이름이 확장 되었기 때문입니다.
Thor

18

자바 8 : 289

자바는 골퍼가 아닌 언어이기 때문에 꽤 좋습니다.

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̷̰ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳,이 String.split(String regex)메소드는 구분 기호 와 일치하는 패턴을 사용 하여 분할합니다. 예를 들어, "aababba".split("b")배열을 산출합니다 {"aa", "a", "", "a"}. 내 정규 표현식 [^\\w\\d]은 '단어 문자 또는 숫자 문자 클래스가 아닌 문자'를 의미합니다. [^\\W_]대신 '밑줄이 아니거나 단어가 아닌 문자 클래스에 있지 않은 문자'이며 밑줄을 제외한 모든 단어 문자와 일치합니다.
AJMansfield

죄송합니다. 이전 의견이 잘못되었습니다. \w포함 \d하므로 \d중복됩니다. \w밑줄을 포함하며 질문에 따라 구분 기호로 간주해야합니다. 따라서 분할에 대한 올바른 정규식은이어야합니다 "[\\W_]+".
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 그래, 고마워; 문제를 해결했습니다.
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은 수학과 마찬가지로 간결한 표기법을 사용하면 명확하게 생각할 수 있도록하는 표기법으로 설계되었습니다. 다시 한번 수학처럼, 그 표기법을 처음 볼 때, 그것은 전혀 명확하지 않다고 생각하는 경향이 있지만, 언어는 항상 처음부터 복잡해 보입니다. 그래도 한 줄에 있지 않으면 더 쉬울 것입니다 ...
Phil H

당신이 APL에서 생각해 낸 것은 유니 코드 쓰레기, 방향을 가리키는 화살표 및 거꾸로 된 소나무 만 보입니다. J보다 나쁘다
bebe

⎕s( help.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

결과 :

결과

버전 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의 경우 ungolfed 버전이 골프 버전과 일치하지 않습니다. 리터럴 문자열을 사용하므로 다음과 같이 작성할 수 있습니다.@"[^_\W]"
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳-오타를 수정하고 여분의 문자를 제거하여 1 문자 절약-감사합니다 !!
jimbobmcgee

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+조합하고 결과 단어 목록을에 넣고 Bag쌍을 요청한 다음 음수 값으로 정렬하십시오. (는 *A는 무엇이든을 , 여기 곱셈 스타 아니다)

산출:

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

3
펄 6은 나를 두려워한다.
primo

1
나는 멋진 언어 기능을 생각할 때마다 그것을 찾고 어딘가에 Perl6에 있습니다. 오랜 시간이 걸리는 이유입니다.
Phil H

:) .words대신 .comb(/\w+/)
Mou

@Mouq : 불행히도 .words을 제거하지 않고 :또는 .:( 입력으로부터 필요한
Ayiko

-1. _문제 설명 아래 단어에 포함되지 않아야합니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

6

파이썬 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

@ klingt.net이 수정되었습니다.
daniero

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

@Einacio 좋은 전화.
primo

-1. 밑줄 _은 단어에 포함해서는 안됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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

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}당신을 더 가까이
데려다 줄 것

죄송합니다 정렬 부분이 없습니다. 곧 답변을 고칠 것입니다.
microbian

다른 방법 :$s -split"\W+"|group -ca |sort count -des
Nacimota

4
-split"\W+"문자열의 마지막 .과 끝 사이의 빈 문자열 과 일치 합니다. 또한 기술적으로 허용되지 않는 \W+경기_
jimbobmcgee

4

펄 69

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

@primo 및 @protist의 추천 사항 추가


1
정렬은 어떻습니까?
daniero jan

@daniero, 훌륭한 포인트! 이제 정렬합니다!
Dom Hastings

1
나는 그것이 얻을 수있는만큼 간결하다고 생각합니다. 사용 중단 경고가 마음에 들지 않으면 ge및 사이에 공간이 필요하지 않습니다 for. 또한 <=>연산자를로 교체 할 수 있습니다 -.
primo

2
@primo Ahhh -대신 <=>천재이지만 Perl 스레드의 골프 팁에 대해서는 확실하지 않습니다. 나중에 업데이트하겠습니다. 감사합니다.
Dom Hastings

1
안녕하세요 @protist \w에는 숫자도 포함되어 있지만 ( perl -e 'print for"a 1 2 3 4 b"=~/\w/g'prints a1234b) 단어를 반복하는 메커니즘은 다른 문자를 저장하므로 업데이트 할 것입니다. 고맙습니다!
Dom Hastings

4

파워 쉘 : 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.
칫솔

아, 맞습니다-주문이 유지되지 않습니다. 에 계속 :)
eithed

오, 나는 당신의 대답을 알아 차리지 못했습니다. 하지만 Object.keysES6에서 글로벌화되고 있습니까? 당신의 대답은 이것을 가정하는 것 같지만 ES6에 예정된 것을 본 기억이 없습니다.
FireFly

@FireFly 문서를 찾을 수 없지만 Firefox에서는 제대로 작동합니다. Chrome / Opera / IE에서 테스트하지 않았습니다.
칫솔

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 단어
Cruncher

nu_ber대신에 사용 number합니까?
Kevin Fegan

나는 다른 게시물로 오도했다;) 이제 입력에서 "_"를 제거했지만 정규식을 처리하도록 수정했습니다.
Kamil 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

내가 주위를 파고 시작할 때까지 @dmckee TBH 나는 PROCINFO에 대해 알고하지 않았다 - 내가 거기 확신했다 있었다 정렬 기본적으로 할 수있는 방법이 - 식별자가 너무 오래 단지 유감)
steeldriver

예전에는 나쁜 길은 없었습니다. 이것은 나의 오래된 대답 과 같은 것들로 이어집니다 .
dmckee

-1. 밑줄 _은 단어에 포함해서는 안됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

3

자바 스크립트 - (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

ECMA 스크립트 (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={}내부 로 이동할 수 있습니다 . 또한 놓을 수 변경 에promptprompt(a={})Object.w=>a[w]=a[w]+1||1w=>a[w]=-~a[w]
eithed

아주 좋아요 작업 파이썬 하나를 뛰는 지금 :)
teh_senaus

@toothbrush의 대답과 동일 a합니다. 프롬프트에서 regexp로 선언을 이동하면 두 문자가 더 필요합니다.
eithed

멋지고 깨끗합니다. 잘 했어!
칫솔

-1. 밑줄 _은 단어에 포함해서는 안됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

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?
Howard

@Howard 감사합니다. \W제외 _해야하므로 제외 되었지만 여전히 2 문자를 저장했습니다 (그런 다음 무시한 정렬을 수정하기 위해 20을 추가했습니다).
daniero jan

에 정렬해서는 안됩니다reverse (a=gets.split(/[_\W]+/)).uniq.map{|w|[w,a.count(w)]}.sort_by(&:last).reverse.map{|x|p x}
Eduard Florinescu

@EduardFlorinescu Nah. reverse너무 장황하다;) Btw, 질문을 바꾸는 것은 공평하지 않습니다.
daniero jan

출력 샘플에서 볼 수 있으면 내림차순으로 정렬하지 않은 것입니다.
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"))

디고 프드 :

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에 전달한 다음 시퀀스 함수를 사용하여 빈 문자열을 필터링하고 단어 수를 생성하고 결과를 인쇄합니다.

일부 골프 트릭 : 함수 인수에 빈 문자열을 추가하여 명시 적으로 형식을 선언하지 않고 인수의 형식 유추를 문자열로 강제합니다. Seq.filter 대신 Seq.where를 사용하여 몇 개의 문자를 저장합니다 (동의어 임). 문자를 최소화하기 위해 앞으로 파이프와 일반 기능 응용 프로그램을 혼합합니다. 커링 및 (op) 구문을 사용하여 <> ~-및 <|| 빈 문자열을 필터링하고 내림차순으로 정렬하고 튜플을 인쇄하도록 람다를 선언하지 않도록하는 연산자를 일반 함수로 사용하십시오.


어떤 종류의 설명을 확실히 삽입해야합니다. 그렇게하면 코드를 이해할 수 있습니다.
Justin

degolfed 버전과 설명이 추가되었습니다.
mattnewport

2

파이썬-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
해결책은 훌륭하지만 출력이 정렬되지 않습니다.
Eduard Florinescu

정렬이란 무엇입니까? 의견 주셔서 감사합니다.
Azwr

1
\w일치 [a-zA-Z0-9_]합니다. 전체 정규 표현식은로 대체 될 수 있습니다 r'\w+'. 또한x 변수가 필요하지 않습니다 .에 raw_input()대한 두 번째 매개 변수로 사용하십시오 findall.
primo

정렬을 통해 OP는 가장 자주 나타나는 단어가 먼저 나열되어야 함을 의미합니다. 또한 프로그램에는print 명령문 (예 :) . print map(...그렇지 않으면 완전한 프로그램이 아닙니다.
primo

지금은 그것을 정렬 할 시간이 없어 :( 나는 서둘러 해요, 제안과 의견을 주셔서 감사합니다.
Azwr

2

자바 스크립트 (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가장 먼저 발생 해야합니다.
Eduard Florinescu

@EduardFlorinescu Silly me ... 나중에 고칠 게요.
George Reith

@EduardFlorinescu 수정
조지 Reith

-1. 밑줄 _은 단어에 포함해서는 안됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

++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

자바 스크립트 (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

하스켈 (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 결과를 기호 목록으로 분할
  • 각 그룹 수를 세어 목록의 고유 한 요소를 발생 수와 일치시키는 dict를 만듭니다.
  • desc는 값을 내림차순으로 받아쓰기를 정렬합니다.

편집 : 실수로 일치하는 ASCII 58-64 및 91-96 수정


1
나는 알지 q못하지만 정규식 [0-z]ASCII 기반입니까? 그렇다면 ASCII 문자 58-64도 포함되어 있지 않습니까? 왜냐하면 : ; < = > ? @.
jimbobmcgee 2013

Great catch jimbob, 고마워
nightTrevors

천만에요; C #에서 동일한 것을 발견했기 때문에 발견되었습니다. 슬프게도와 동일 [A-z]하다 ASCII 91-96을, 일치하는`[\] ^ _``
jimbobmcgee

아 맞아, 거기에 좋은 작은 ascii 수업이 있습니다!
nightTrevors 22

당신의 문법이 클래스를 지원한다면 나는 "단어가 아닌 문자와 밑줄을 배제"[^_\W]+ 해야한다는 것을 발견 했습니다 .\W
jimbobmcgee

2

퓨어 배쉬 (외부 프로그램 없음), 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
이다 : 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-"}'

괴상한 확장명이없는 작업 :

$ 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-공백으로 만 나눕니다.
daniero jan


1

파이썬 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자를 잃을 수 있습니다.
Phil H

@PhilH 잘. 네 말이 맞지만 요구 사항을 읽지 않을 것입니다. "JavaScript의 문자열"-부분이 그것을 제안 할 수도 있지만, 명확한 양심으로 문자열 변수를 유효한 "입력"으로 해석 할 수는 없습니다. 하지만 네 말이 맞아 그것은 더 짧아 질 것입니다. : P
Dave J

-1. 밑줄 _은 단어에 포함해서는 안됩니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

자, 이것은 영숫자의 정의에 달려 있습니다. 파이썬에서 "\ w"는 영숫자 문자를 받아들이 기 위해 정의됩니다. 당신은 정확하지만 규칙에 대한 이런 종류의 해석으로 내 솔루션은 계속 정확합니다. :)
Dave J
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.