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).
fonte
s
et
estão representadas.Respostas:
LabVIEW 51 nós, 5 estruturas, 10 diagramas
Ensinar o elefante a sapatear nunca é bonito. Ah, vou pular a contagem de caracteres.
O programa flui da esquerda para a direita:
fonte
Ruby 1.9, 185 caracteres
(fortemente baseado nas outras soluções Ruby)
Em vez de usar qualquer opção de linha de comando como as outras soluções, você pode simplesmente passar o nome do arquivo como argumento. (ie
ruby1.9 wordfrequency.rb Alice.txt
)Como estou usando caracteres literais aqui, esta solução funciona apenas no Ruby 1.9.
Editar: ponto-e-vírgula substituído por quebras de linha para "legibilidade". : P
Edit 2: Shtééf apontou que eu esqueci o espaço à direita - consertei isso.
Edit 3: Removido o espaço à direita novamente;)
fonte
GolfScript,
177175173167164163144131130 caracteresLento - 3 minutos para o texto de amostra (130)
Explicação:
"Correto" (espero). (143)
Menos lento - meio minuto. (162)
Saída visível nos logs de revisão.
fonte
206
shell, grep, tr, grep, tipo, uniq, tipo, cabeça, perl
hm, apenas visto acima:sort -nr
->sort -n
e depoishead
->tail
=> 208 :)update2: erm, é claro que o acima é bobo, pois será revertido então. Então, 209.
update3: otimizou o regexp de exclusão -> 206
por diversão, aqui está uma versão somente para perl (muito mais rápida):
fonte
Transacionar a solução baseada em conjunto SQL (SQL Server 2005)
1063892873853827820783683647644630 caracteresObrigado a Gabe por algumas sugestões úteis para reduzir a contagem de caracteres.
Nota: Quebras de linha adicionadas para evitar barras de rolagem, somente a última quebra de linha é necessária.
Versão legível
Resultado
E com a longa corda
fonte
0.000
para just0
e usando em-C
vez de1.0/C
. E transformarFLOAT
emREAL
salvará um derrame também. O mais importante, porém, é que parece que você tem váriasAS
instâncias que devem ser opcionais.SELECT [ ] FROM (SELECT $0 O, ' '+REPLICATE('_', MAX(C)*@F)+' ' [ ] FROM # UNION SELECT $1/C, '|'+REPLICATE('_',C*@F)+'| '+W FROM #)X ORDER BY O
?Ruby
207213211210207203201200 caracteresUma melhoria no Anurag, incorporando sugestões da rfusca. Também remove argumento para classificar e alguns outros pequenos golfe.
Executar como:
Edit: colocar 'puts' de volta, precisa estar lá para evitar cotações na saída.
Edit2: Arquivo Alterado-> IO
Edit3: removido / i
Edit4: Removido parênteses em torno de (f * 1.0), recontado
Edit5: Use adição de string para a primeira linha; expandir
s
no local.Edit6: Feito m flutuar, removido 1.0. EDIT: Não funciona, muda comprimentos. EDIT: Não é pior do que antes
Edit7: Use
STDIN.read
.fonte
Mathematica (
297284248244242199 caracteres) puro Funcionale Teste de Direito da Zipf
Olha mamãe ... sem vars, sem mãos, .. sem cabeça
Editar 1> algumas taquigrafia definidas (284 caracteres)
Algumas explicações
Resultado
texto alternativo http://i49.tinypic.com/2n8mrer.jpg
O Mathematica não é adequado para jogar golfe, e isso é devido aos nomes longos e descritivos das funções. Funções como "RegularExpression []" ou "StringSplit []" me fazem soluçar :(.
Teste da Lei de Zipf
A lei de Zipf prevê que, para um texto em linguagem natural, o gráfico Log (Classificação) vs Log (ocorrências) segue uma relação linear .
A lei é usada no desenvolvimento de algoritmos para criptografia e compactação de dados. (Mas NÃO é o "Z" no algoritmo LZW).
Em nosso texto, podemos testá-lo com o seguinte
O resultado é (bastante linear)
texto alternativo http://i46.tinypic.com/33fcmdk.jpg
Editar 6> (242 caracteres)
Refatorando o Regex (sem função Selecionar mais)
Eliminando 1 char char
Definição mais eficiente para a função "f"
Editar 7 → 199 caracteres
f
porTranspose
eSlot
(#1
/#2
) argumentos.f@x
vez de sempref[x]
que possível)fonte
|i|
é redundante no seu regex porque você já possui.|
.C # -
510451436446434426422 caracteres (minificado)Não é tão curto, mas agora provavelmente correto! Observe que a versão anterior não mostrava a primeira linha das barras, não as dimensionava corretamente, baixou o arquivo em vez de obtê-lo do stdin e não incluiu toda a verbosidade C # necessária. Você poderia facilmente raspar muitos traços se o C # não precisasse de tanta porcaria extra. Talvez o Powershell pudesse fazer melhor.
422 caracteres com lendivisor embutido (o que o torna 22 vezes mais lento) no formulário abaixo (novas linhas usadas para selecionar espaços):
fonte
Perl,
237229209 caracteres(Atualizado novamente para vencer a versão Ruby com mais truques sujos de golfe, substituindo
split/[^a-z/,lc
-oslc=~/[a-z]+/g
e eliminando um cheque de string vazio em outro local. Eles foram inspirados na versão Ruby, portanto, credite onde é devido o crédito.)Atualização: agora com Perl 5.10! Substitua
print
porsay
e use~~
para evitar amap
. Isso deve ser chamado na linha de comando comoperl -E '<one-liner>' alice.txt
. Como o script inteiro está em uma linha, escrevê-lo como uma linha não deve apresentar nenhuma dificuldade :).Observe que esta versão é normalizada para maiúsculas e minúsculas. Isso não reduz a solução, já que a remoção
,lc
(para caixa inferior) exige que você adicioneA-Z
ao regex dividido, portanto é uma lavagem.Se você estiver em um sistema em que uma nova linha seja um caractere e não dois, você poderá reduzi-lo em mais dois caracteres usando uma nova linha literal no lugar de
\n
. No entanto, não escrevi o exemplo acima dessa maneira, pois é "mais claro" (ha!) Dessa maneira.Aqui está uma solução perl mais correta, mas não remotamente curta o suficiente:
A seguir, é o mais curto possível, permanecendo relativamente legível. (392 caracteres).
fonte
foreach
s podem ser escritos comofor
s. Isso é 8 caracteres abaixo. Então você tem ogrep{!($_~~@s)}map{lc=~/[a-z]+/g}<>
, que eu acredito que poderia ser escritogrep{!(/$_/i~~@s)}<>=~/[a-z]+/g
para diminuir mais 4. Substitua o" "
com$"
e você está para baixo 1 mais ...sort{$c{$b}-$c{$a}}...
para economizar mais dois. Você também pode simplesmente passar%c
em vez dekeys %c
para asort
função e salvar mais quatro.Windows PowerShell, 199 caracteres
(A última quebra de linha não é necessária, mas incluída aqui para facilitar a leitura.)
(Código atual e meus arquivos de teste disponíveis no meu repositório SVN . Espero que meus casos de teste detectem os erros mais comuns (comprimento da barra, problemas com a correspondência de expressões regulares e mais alguns))
Premissas:
História
Versão relaxada (137), já que é contada separadamente até agora, aparentemente:
Variações dos comprimentos de barra de um caractere em comparação com outras soluções são devidas ao PowerShell usar arredondamento em vez de truncamento ao converter números de ponto flutuante em números inteiros. Como a tarefa exigia apenas o comprimento proporcional da barra, isso deveria ser bom.
Comparado a outras soluções, adotei uma abordagem um pouco diferente para determinar o comprimento mais longo da barra, simplesmente testando e obtendo o maior comprimento, onde nenhuma linha tem mais de 80 caracteres.
Uma versão mais antiga explicada pode ser encontrada aqui .
fonte
-split("\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z]")
? Funciona para mim."|$('_'*($w*$_.count/$x[0].count))| $($_.name) "
(ou eliminar o último espaço, pois é meio automático). E você pode usar-split("(?:\b(?:the|and|of|to|a|i[tns]?|or)\b|[^a-z])+")
para economizar um pouco mais, não incluindo espaços em branco (ou use[-2..-23]
).Ruby, 215,
216,218,221,224,236,237caracteresatualização 1: Hurrah ! É um empate com JS Bangs ' solução de . Não consigo pensar em uma maneira de reduzir mais :)
atualização 2: jogou um truque sujo de golfe. Alterado
each
paramap
salvar 1 caractere :)atualização 3: alterada
File.read
paraIO.read
+2.Array.group_by
não foi muito proveitoso, mudou parareduce
+6. A verificação sem distinção entre maiúsculas e minúsculas não é necessária após o revestimento inferiordowncase
no regex +1. A classificação em ordem decrescente é feita facilmente, negando o valor +6. Economia total +15atualização 4: em
[0]
vez de.first
+3. (@ Shtééf)atualização 5: expanda a variável
l
no local, +1. Expandir variávels
no local, +2. (@ Shtééf)atualização 6: use adição de string em vez de interpolação para a primeira linha, +2. (@ Shtééf)
atualização 7: passei por muita confusão para detectar a primeira iteração dentro do loop, usando variáveis de instância. Tudo o que recebi é +1, embora talvez haja potencial. Preservando a versão anterior, porque acredito que essa é magia negra. (@ Shtééf)
Versão legível
Usar:
Resultado:
fonte
scan
, no entanto, me deu uma idéia melhor, então eu fui à frente novamente :).Python 2.x, abordagem latitudinariana =
227183 caracteresPermitindo liberdade na implementação, construí uma concatenação de strings que contém todas as palavras solicitadas para exclusão (
the, and, of, to, a, i, it, in, or, is
) - além de também excluir as duas "palavras" infamess
et
do exemplo - e introduzi gratuitamente a exclusão dean, for, he
. Tentei todas as concatenações dessas palavras contra o corpus das palavras de Alice, a Bíblia do rei James e o arquivo do jargão para ver se há alguma palavra que será excluída incorretamente pela sequência. E foi assim que terminei com duas cadeias de exclusão:itheandtoforinis
eandithetoforinis
.PS. emprestado de outras soluções para encurtar o código.
Rant
Com relação às palavras a serem ignoradas, alguém poderia pensar que essas palavras seriam retiradas da lista das palavras mais usadas em inglês. Essa lista depende do corpus de texto usado. Por uma das listas mais populares ( http://en.wikipedia.org/wiki/Most_common_words_in_English , http://www.english-for-students.com/Frequently-Used-Words.html , http: // www. sporcle.com/games/common_english_words.php ), as 10 principais palavras são:
the be(am/are/is/was/were) to of and a in that have I
As 10 principais palavras do texto Alice no País das Maravilhas são
the and to a of it she i you said
As 10 principais palavras do Arquivo de Jargões (v4.4.7) são
the a of to and in is that or for
Então, a pergunta é por que
or
foi incluída na lista de ignorados do problema, onde é ~ 30 em popularidade quando a palavrathat
(8ª mais usada) não é. etc, etc. Portanto, acredito que a lista de ignorados deve ser fornecida dinamicamente (ou pode ser omitida).A idéia alternativa seria simplesmente pular as 10 principais palavras do resultado - o que realmente reduziria a solução (elementar - deve mostrar apenas as entradas de 11 a 32).
Python 2.x, abordagem meticulosa =
277243 caracteresO gráfico desenhado no código acima é simplificado (usando apenas um caractere para as barras). Se alguém quiser reproduzir exatamente o gráfico a partir da descrição do problema (o que não era necessário), este código fará isso:
Aceito um problema com a escolha um tanto aleatória das 10 palavras para excluir
the, and, of, to, a, i, it, in, or, is
para que elas sejam passadas como parâmetros de linha de comando, assim:python WordFrequencyChart.py the and of to a i it in or is <"Alice's Adventures in Wonderland.txt"
São 213 caracteres + 30 se considerarmos a lista de ignorados "original" passada na linha de comando = 243
PS. O segundo código também faz "ajuste" para os comprimentos de todas as palavras principais, para que nenhuma delas transborde em caso de degeneração.
fonte
\W
ou\b
em uma regex, porque essas provavelmente não estão de acordo com as especificações, o que significa que não serão divididas em dígitos ou_
podem também não remover palavras de parada das strings tais comothe_foo_or123bar
. Eles podem não aparecer no texto de teste, mas a especificação é bastante clara nesse caso.sys.argv
hack and usando:re.findall(r'\b(?!(?:the|and|.|of|to|i[tns]|or)\b)\w+',sys.stdin.read().lower())
Haskell -
366351344337333 caráteres(Uma quebra de linha foi
main
adicionada para facilitar a leitura e nenhuma quebra de linha é necessária no final da última linha.)Como funciona é melhor visto lendo o argumento para
interact
trás:map f
em minúsculas, substitui todo o resto por espaços.words
produz uma lista de palavras, eliminando o espaço em branco de separação.filter (
notElemwords "the and of to a i it in or is")
descarta todas as entradas com palavras proibidas.group . sort
classifica as palavras e agrupa as idênticas em listas.map h
mapeia cada lista de palavras idênticas a uma tupla do formulário(-frequency, word)
.take 22 . sort
classifica as tuplas por frequência decrescente (a primeira entrada da tupla) e mantém apenas as 22 primeiras.b
mapeia tuplas para barras (veja abaixo).a
precede a primeira linha de sublinhados para completar a barra superior.unlines
une todas essas linhas com novas linhas.A parte complicada é acertar o comprimento da barra. Eu assumi que apenas os sublinhados
||
eram contados no comprimento da barra; portanto, seria uma barra de comprimento zero. A funçãob
mapeiac x
maisx
, ondex
a lista de histogramas. A lista inteira é passada parac
, para que cada chamada dec
possa calcular o fator de escala para si mesma chamandou
. Dessa maneira, evito usar matemática ou racional de ponto flutuante, cujas funções de conversão e importações consumiriam muitos caracteres.Observe o truque de usar
-frequency
. Isso elimina a necessidade dereverse
asort
classificação (crescente)-frequency
colocar as palavras com a maior frequência primeiro. Posteriormente, na funçãou
, dois-frequency
valores são multiplicados, o que cancelará a negação.fonte
div
, na verdade! Experimente - a saída está errada. A razão é que fazer odiv
antes do*
perde precisão.JavaScript 1.8 (SpiderMonkey) - 354
Infelizmente, a
for([k,v]in z)
versão da Rhino não parece funcionar no SpiderMonkey, ereadFile()
é um pouco mais fácil do que usar,readline()
mas subir para 1.8 nos permite usar o fechamento de funções para cortar mais algumas linhas ....Adicionando espaço em branco para facilitar a leitura:
Uso:
js golf.js < input.txt
Resultado:
(versão base - não suporta larguras de barra corretamente)
JavaScript (rinoceronte) -
405395387377368343304 caracteresEu acho que minha lógica de classificação está errada, mas .. eu duno.Brainfart fixo.Minificado (o abuso
\n
é interpretado como;
algumas vezes):fonte
i[tns]?
pouco. Muito sorrateira..replace(/[^\w ]/g, e).split(/\s+/).map(
pode ser substituído.replace(/\w+/g,
e usar a mesma função que você.map
executou ... Também não tenho certeza se o Rhino suporta emfunction(a,b)b.c-a.c
vez da sua função de classificação (o spidermonkey suporta), mas isso barbear{return }
...b.c-a.c
é um melhor tipo quea.c<b.c
btw ... Edição de uma versão Aranha na parte inferior com essas mudanças?:
excelente base para trabalhar!Versão da CLI do PHP (450 caracteres)
Essa solução leva em consideração o último requisito que a maioria dos puristas escolheu convinientemente ignorar. Isso custou 170 caracteres!
Uso:
php.exe <this.php> <file.txt>
Minificado:
Legível por humanos:
Resultado:
Quando há uma palavra longa, as barras são ajustadas corretamente:
fonte
Python 3.1 -
245229 caracteresEu acho que usar o Counter é meio trapaceiro :) Acabei de ler sobre isso cerca de uma semana atrás, então essa foi a chance perfeita de ver como ele funciona.
Imprime:
Parte do código foi "emprestada" da solução da AKX.
fonte
open('!')
ler do stdin - em qual versão / sistema operacional está? ou você precisa nomear o arquivo '!'?perl,
205191189 caracteres / 205 caracteres (totalmente implementado)Algumas partes foram inspiradas pelos envios anteriores de perl / ruby, algumas idéias semelhantes foram recebidas independentemente, outras são originais. A versão mais curta também incorpora algumas coisas que eu vi / aprendi de outras apresentações.
Original:
Versão mais recente até191 caracteres:Versão mais recente até 189 caracteres:
Esta versão (205 caracteres) responde pelas linhas com palavras maiores que as encontradas posteriormente.
fonte
Perl:
203202201198195208203/231 caracteresImplementação completa e alternativa, incluindo comportamento indicado (squishing de barras global) para o caso patológico em que a palavra secundária é popular e longa o suficiente para combinar com mais de 80 caracteres ( essa implementação é 231 caracteres ):
A especificação não dizia em nenhum lugar que isso tinha que ir para STDOUT, então usei o aviso do perl () em vez da impressão - quatro caracteres salvos lá. Mapa usado em vez de foreach, mas sinto que ainda pode haver mais economia na divisão (join ()). Ainda assim, reduzi-o para 203 - pode dormir nele. Pelo menos o Perl agora está na contagem de caracteres "shell, grep, tr, grep, sort, uniq, sort, head, perl" por enquanto;)
PS: O Reddit diz "Oi";)
Atualização: join () removido em favor da atribuição e da associação implícita de conversão escalar. Até 202. Observe também que aproveitei a regra opcional "ignorar palavras de 1 letra" para cortar 2 caracteres, portanto, lembre-se de que a contagem de frequências refletirá isso.
Atualização 2: Troca de atribuição e junção implícita por matar $ / para obter o arquivo de uma só vez usando <> em primeiro lugar. Mesmo tamanho, mas mais desagradável. Trocado se (! $ Y) {} por $ y || {} &&, salvou mais 1 caractere => 201.
Atualização 3: Assumiu o controle de minúsculas antecipadamente (lc <>) movendo lc para fora do bloco do mapa - Trocou as duas expressões regulares para não usar mais a opção / i, pois não é mais necessário. Construção x? Y: z condicional explícita trocada para perlgolf tradicional || construção condicional implícita - /^...$/i?1:$x{$ } ++ para /^...$/||$x{$ } ++ Salva três caracteres! => 198, rompeu a barreira dos 200. Pode dormir em breve ... talvez.
Atualização 4: A privação do sono me deixou louco. Bem. Mais louco. Percebendo que isso só precisa analisar arquivos de texto felizes normais, desisti se atingir um nulo. Salvou dois caracteres. Substituído "length" pelo 1-char mais curto (e muito mais golfish) y /// c - você me ouviu, GolfScript ?? Estou indo para você !!! soluço
Atualização 5: Sleep dep me fez esquecer o limite de 22 linhas e o limite de linhas subseqüentes. Faça backup de 208 com aqueles manipulados. Não é tão ruim, 13 personagens para lidar com isso não é o fim do mundo. Brincou com o regex inline eval do perl, mas tendo problemas para fazê-lo funcionar e salvar caracteres ... lol. Atualizado o exemplo para corresponder à saída atual.
Atualização 6: chaves desnecessárias removidas que protegem (...), pois o doce sintático ++ permite empurrá-lo contra o felizmente. Graças à entrada de Chas. Owens (lembrando meu cérebro cansado), conseguiu a solução da classe de personagem aqui. Volte para 203.
Atualização 7: segunda parte do trabalho adicionada, implementação completa das especificações (incluindo o comportamento completo de squishing de barras para palavras longas secundárias, em vez do truncamento que a maioria das pessoas está fazendo, com base na especificação original sem o caso de exemplo patológico)
Exemplos:
Implementação alternativa no exemplo de caso patológico:
fonte
is|in|it|i
noi[snt]?
- e então não há nenhuma diferença com a regra opcional mais. (Hum, eu nunca teria pensado em dizer a um cara do Perl como fazer o Regex: D) - único problema agora: tenho que ver como posso remover três bytes da minha própria solução para ser melhor do que o Perl novamente: - |F #, 452 caracteres
Simples: obtenha uma sequência
a
de pares de contagem de palavras, encontre o melhor multiplicador de contagem de palavras por colunak
e imprima os resultados.Exemplo (tenho contagens de frequência diferentes das suas, não sei por que):
fonte
float
s.|>
?Python 2.6, 347 caracteres
Resultado:
fonte
bm=(76.-len(W[0][0]))/W[0][1]
desde que você está usando apenas bm uma vez (fazer a próxima linhaU=lambda n:"_"*int(n*(76.-len(W[0][0]))/W[0][1])
, raspa 5 caracteres também: por que você usar um nome de variável de 2 caracteres no golfe código ;-).?* sh (+ ondulação), solução parcial
Isso está incompleto, mas, para o inferno, aqui está a frequência de palavras que conta metade do problema em 192 bytes:
fonte
Gawk - 336 (originalmente 507) caracteres
(depois de corrigir a formatação da saída; corrigindo a coisa das contrações; aprimorando; aprimorando novamente; removendo uma etapa de classificação totalmente desnecessária; aprimorando mais uma vez; e novamente (oops, essa interrompeu a formatação); aprimore um pouco mais; aceitando o desafio de Matt, eu desesperadamente modifico muito mais; encontrei outro lugar para economizar alguns, mas devolvi dois para corrigir o erro no comprimento da barra)
Heh heh! Estou momentaneamente à frente do [Matt's JavaScript] [1] contra-desafio da solução ! ;) e [python do AKX] [2].
O problema parece exigir uma linguagem que implemente matrizes associativas nativas; portanto, é claro que eu escolhi uma com um conjunto de operadores terrivelmente deficiente. Em particular, você não pode controlar a ordem na qual o awk oferece os elementos de um mapa de hash; portanto, varro repetidamente o mapa inteiro para encontrar o item mais numeroso atualmente, imprimi-lo e excluí-lo da matriz.
É tudo terrivelmente ineficiente, com todas as golfificações que fiz, também ficaram horríveis.
Minificado:
quebras de linha apenas para maior clareza: elas não são necessárias e não devem ser contadas.
Resultado:
Legível; 633 caracteres (originalmente 949):
fonte
LISP comum, 670 caracteres
Eu sou um novato no LISP, e esta é uma tentativa de usar uma tabela de hash para contar (portanto, provavelmente não é o método mais compacto).
pode ser executado, por exemplo, com
cat alice.txt | clisp -C golf.lisp
.Na forma legível é
fonte
C (828)
Parece um código ofuscado e usa glib para string, list e hash. Contagem de caracteres com
wc -m
diz 828 . Não considera palavras de caractere único. Para calcular o comprimento máximo da barra, considere a palavra mais longa possível entre todas, não apenas as primeiras 22. Isso é um desvio da especificação?Ele não lida com falhas e não libera a memória usada.
fonte
*v=*v*(77-lw)/m
, dará 929. .. mas eu acho que pode ser ok se eu não encontrar uma maneira de fazê-lo muito mais curto)int c
namain
declaração emain
é implicitamenteint
(como são quaisquer argumentos sem tipo, afaik):main(c){...}
. Você provavelmente também poderia apenas escrever em0
vez deNULL
.-Wall
ou-std=c99
... mas suponho que isso não faz sentido para um código-golfe, certo?Without freeing memory stuff, it reaches 866 (removed some other unuseful space)
para outra coisa para não pensar nas pessoas que a diferença com a versão de memória livre é tudo isso: agora a versão sem memória livre tem muito mais "melhorias".Perl, 185 caracteres
200 (ligeiramente quebrados)199197195193187185 caracteres. As últimas duas novas linhas são significativas. Em conformidade com as especificações.A primeira linha carrega a contagem de palavras válidas
%X
.A segunda linha calcula o fator de escala mínimo para que todas as linhas de saída tenham <= 80 caracteres.
A terceira linha (contém dois caracteres de nova linha) produz a saída.
fonte
Java -
886865756744742744752742714680 caracteresAtualizações antes do primeiro 742 : regex aprimorado, tipos parametrizados supérfluos removidos, espaço em branco supérfluo removido.
Atualização 742> 744 chars : corrigido o hack de comprimento fixo. Depende apenas da 1ª palavra, não de outras palavras (ainda). Foram encontrados vários locais para encurtar o código (
e
\\s
no regex substituído porArrayList
substituído porVector
). Agora estou procurando uma maneira curta de remover a dependência e leitura do Commons IO do stdin.Atualização 744> 752 caracteres : removi a dependência de bens comuns. Agora ele lê de stdin. Cole o texto em stdin e pressione
Ctrl+Z
para obter o resultado.Atualize 752> 742 caracteres : removi
public
e um espaço, tornei o nome da classe 1 char em vez de 2 e agora está ignorando palavras de uma letra.Atualização 742> 714 caracteres : atualizado de acordo com os comentários de Carl: a atribuição redundante removida (742> 730), substituída
m.containsKey(k)
porm.get(k)!=null
(730> 728), introduziu a subcadeia de caracteres da linha (728> 714).Atualização 714> 680 caracteres : atualizado de acordo com os comentários do Rotsor: cálculo do tamanho da barra aprimorado para remover vazamentos desnecessários e aprimorado
split()
para remover desnecessáriosreplaceAll()
.Versão mais legível:
Resultado:
É péssimo que o Java não tenha
String#join()
e fechamentos (ainda).Editar por Rotsor:
Fiz várias alterações na sua solução:
O código condensado tem
688711684 caracteres:A versão rápida (
720693 caracteres)Versão mais legível:
A versão sem melhorias de comportamento tem 615 caracteres:
fonte
IOUtils
vez de importá-lo? Tanto quanto posso ver, você está usando apenas uma vez.b
uma String em vez de um StringBuffer. Mas não quero pensar em qual seria o desempenho (especialmente porque você está adicionando um personagem de cada vez).Scala 2.8, 311
314320330332336341375caracteresincluindo ajuste de palavras longas. Idéias emprestadas de outras soluções.
Agora como um script (
a.scala
):Correr com
Aliás, a edição de 314 a 311 caracteres na verdade remove apenas 1 caractere. Alguém entendeu errado a contagem antes (Windows CRs?).
fonte
Clojure 282 strict
Um pouco mais legível:
fonte
Scala, 368 caracteres
Primeiro, uma versão legível em 592 caracteres:
A saída do console fica assim:
Podemos fazer uma redução agressiva e reduzi-la a 415 caracteres:
A sessão do console fica assim:
Tenho certeza de que um especialista em Scala poderia se sair ainda melhor.
Atualização: Nos comentários, Thomas deu uma versão ainda mais curta, com 368 caracteres:
De maneira legível, com 375 caracteres:
fonte
object A{def main(a:Array[String]){val t=(Map[String, Int]()/:(for(x<-io.Source.fromFile(a(0)).getLines;y<-"(?i)\\w+\\b(?<!\\bthe|and|of|to|a|i|it|in|or|is)".r findAllIn x) yield y.toLowerCase).toList)((c,x)=>c+(x->(c.getOrElse(x,0)+1))).toList.sortBy(_._2).reverse.take(22);val w=76-t.head._1.length;print(" "+"_"*w);t map (s=>"\n|"+"_"*(s._2*w/t.head._2)+"| "+s._1) foreach print}}
Java - 896 caracteres
931 caracteres1233 caracteres tornados ilegíveisChars de 1977 "não compactados"Atualização: Reduzi agressivamente a contagem de caracteres. Omite palavras de uma letra por especificação atualizada.
Eu invejo muito C # e LINQ.
"Legível":
Saída de Alice:
Produção de Dom Quixote (também de Gutenberg):
fonte