O desafio:
Crie um gráfico ASCII das palavras mais usadas em um determinado texto.
As regras:
- Aceite apenas
a-z
eA-Z
(caracteres alfabéticos) como parte de uma palavra. - Ignore a caixa (
She
==she
para nosso propósito). - Ignore as seguintes palavras (bastante arbitrárias, eu sei):
the, and, of, to, a, i, it, in, or, is
Esclarecimento: considerando
don't
: isso seria considerado como 2 'palavras' diferentes nos intervalosa-z
eA-Z
: (don
et
).Opcionalmente (é tarde demais para alterar formalmente as especificações agora), você pode optar por descartar todas as 'palavras' de uma única letra (isso pode potencialmente reduzir também a lista de ignorados).
Analise um dado text
(leia um arquivo especificado por meio de argumentos de linha de comando ou canalizado; presuma us-ascii
) e construa-o word frequency chart
com as seguintes características:
- Exiba o gráfico (também veja o exemplo abaixo) para as 22 palavras mais comuns (ordenadas por frequência descendente).
- A barra
width
representa o número de ocorrências (frequência) da palavra (proporcionalmente). Acrescente um espaço e imprima a palavra. - Certifique-se de que essas barras (mais espaço-palavra-espaço) sempre se ajustem :
bar
+[space]
+word
+[space]
deve sempre ter <=80
caracteres (certifique-se de ter em conta possíveis comprimentos diferentes de barra e palavra: por exemplo: a segunda palavra mais comum pode demorar muito mais do que o primeiro, embora não diferindo tanto em frequência). Maximize a largura da barra dentro dessas restrições e dimensione as barras adequadamente (de acordo com as frequências que elas representam).
Um exemplo:
O texto para o exemplo pode ser encontrado aqui ( Alice no país das maravilhas, por Lewis Carroll ).
Esse texto específico produziria o seguinte gráfico:
_________________________________________________________________________ | _________________________________________________________________________ | ela | _______________________________________________________________ | vocês | ____________________________________________________________ | disse | ____________________________________________________ | Alice | ______________________________________________ | foi | __________________________________________ | aquele | ___________________________________ | Como | _______________________________ | dela | ____________________________ | com | ____________________________ | às | ___________________________ | s | ___________________________ | t | _________________________ | em | _________________________ | tudo | ______________________ | isto | ______________________ | para | ______________________ | teve | _____________________ | mas | ____________________ | estar | ____________________ | não | ___________________ | eles | __________________ | tão
Para sua informação: estas são as frequências nas quais o gráfico acima se baseia:
[('she', 553), ('you', 481), ('said', 462), ('alice', 403), ('was', 358), ('que ', 330), (' as ', 274), (' her ', 248), (' with ', 227), (' at ', 227), (' s ', 219), (' t ' , 218), ('on', 204), ('all', 200), ('this', 181), ('for', 179), ('had', 178), (' mas ', 175), (' ser ', 167), (' não ', 166), (' eles ', 155), (' so ', 152)]
Um segundo exemplo (para verificar se você implementou a especificação completa):
Substitua todas as ocorrências do arquivo Alice no país das maravilhasyou
vinculado por :superlongstringstring
________________________________________________________________ | ________________________________________________________________ | ela | _______________________________________________________ | superlongstringstring | _____________________________________________________ | disse | ______________________________________________ | Alice | ________________________________________ | foi | _____________________________________ | aquele | ______________________________ | Como | ___________________________ | dela | _________________________ | com | _________________________ | às | ________________________ | s | ________________________ | t | ______________________ | em | _____________________ | tudo | ___________________ | isto | ___________________ | para | ___________________ | teve | __________________ | mas | _________________ | estar | _________________ | não | ________________ | eles | ________________ | tão
O vencedor:
Solução mais curta (por contagem de caracteres, por idioma). Diverta-se!
Edit : Tabela resumindo os resultados até o momento (15/02/2012) (adicionado originalmente pelo usuário Nas Banov):
Idioma Relaxado Estrito ========= ======= ====== GolfScript 130 143 Perl 185 Windows PowerShell 148 199 Mathematica 199 Ruby 185 205 Ferramenta Unix 194 228 Python 183 243 Clojure 282 Scala 311 Haskell 333 Awk 336 R 298 Javascript 304 354 Groovy 321 Matlab 404 C # 422 Smalltalk 386 PHP 450 F # 452 TSQL 483 507
Os números representam o comprimento da solução mais curta em um idioma específico. "Estrito" refere-se a uma solução que implementa completamente as especificações (desenha |____|
barras, fecha a primeira barra no topo com uma ____
linha, explica a possibilidade de palavras longas com alta frequência, etc.). "Relaxado" significa que algumas liberdades foram tomadas para reduzir a solução.
Somente soluções menores que 500 caracteres estão incluídas. A lista de idiomas é classificada pelo tamanho da solução 'estrita'. 'Unix Toolchain' é usado para significar várias soluções que usam o shell * nix tradicional mais uma mistura de ferramentas (como grep, tr, sort, uniq, head, perl, awk).
s
e t
estão representadas.