#!/usr/local/bin/pike// -*- mode: pike -*- // $Id: wordfreq.pike,v 1.3 2000/12/05 16:04:07 doug Exp $ // http://www.bagley.org/~doug/shootout/ // from: Fredrik Noring void main() { mapping(string:int) dictionary = ([]); string buffer = ""; array(string) f = filter(map(enumerate(128), lambda(int i) { return !('A' <= i && i <= 'Z' || 'a' <= i && i <= 'z' || i == ' ') && sprintf("%c", i); }), `!=, 0); array(string) t = allocate(sizeof(f), " "); for(;;) { string data = buffer + replace(lower_case(Stdio.stdin.read(4096)), f, t); if(!sizeof(data)) break; array(string) words = data/" "; if(1 < sizeof(words) && sizeof(words[-1])) buffer = words[-1], words = words[..sizeof(words)-2]; else buffer = ""; foreach(words, string word) dictionary[word]++; } m_delete(dictionary, ""); mapping(int:array(string)) revdictionary = ([]); array(string) words = indices(dictionary); array(int) freqs = values(dictionary); for(int i = 0; i < sizeof(dictionary); i++) revdictionary[freqs[i]] += ({ words[i] }); freqs = sort(indices(revdictionary)); for(int i = sizeof(freqs)-1; 0 <= i; i--) { int freq = freqs[i]; words = sort(revdictionary[freq]); for(int j = sizeof(words)-1; 0 <= j; j--) write("%7d\t%s\n", freq, words[j]); } }