Escreva o programa mais curto que gera um histograma (uma representação gráfica da distribuição dos dados).
Regras:
- É necessário gerar um histograma com base no tamanho dos caracteres das palavras (pontuação incluída) inseridas no programa. (Se uma palavra tiver 4 letras, a barra que representa o número 4 aumenta 1)
- É necessário exibir rótulos de barra que estejam correlacionados com o comprimento dos caracteres que as barras representam.
- Todos os caracteres devem ser aceitos.
- Se as barras precisarem ser dimensionadas, é necessário que exista alguma maneira mostrada no histograma.
Exemplos:
$ ./histogram This is a hole in one!
1 |#
2 |##
3 |
4 |###
$./histogram Extensive word length should not be very problematic.
1 |
2 |#
3 |#
4 |##
5 |
6 |##
7 |
8 |
9 |#
10|
11|
12|#
./histogram Very long strings of words should be just as easy to generate a histogram just as short strings of words are easy to generate a histogram for.
1 |##
2 |#######
3 |#
4 |#######
5 |###
6 |#
7 |##
8 |##
9 |##
code-golf
graphical-output
generation
syb0rg
fonte
fonte
Respostas:
K, 35
.
.
Um exemplo mais longo
fonte
R,
5547 caracteresFelizmente, R vem com uma função de plotagem
hist
para histogramas, fornecida aqui com umbreaks
argumento em que as quebras são de 0,5, 1,5, ... até max (entrada) +0,5.sapply(scan(,""),nchar)
pega uma entrada (como stdin), separa-a após os espaços e conta o número de caracteres de cada elemento.Exemplos:
Editar:
Uma variação de 71 caracteres com um rótulo de eixo em cada valor possível:fonte
Python - 83 caracteres
Parece que podemos receber informações de qualquer lugar, portanto, essas informações são recebidas durante a execução, e não na linha de comando, e usam a sugestão de Ejrb para encurtá-la em 8.
Python - 91 caracteres
Isso vai cair entre aspas.
Entrada:
Resultado:
fonte
exec
e concatenação de strings:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
Haskell - 126 caracteres
Isso pega a entrada
stdin
, não a linha de comando:fonte
Python 3,3 (93)
Saída:
(a primeira linha é a sequência de entrada)
Não justifica números como a solução Python do Lego Stormtroopr (que também é mais curta que a minha), mas é a minha primeira participação em um concurso de golfe, então é melhor deixá-la aqui, eu acho :)
fonte
Perl, 56
Adicionada a reescrita de @ manatwork e a sugestão literal de nova linha, muito obrigado! Adicionadas atualizações de @ chinese_perl_goth.
Uso: salve como hist.pl e execute
perl hist.pl This is a test
Exemplo de saída:
fonte
printf
? Você pode poupar alguns caracteres na formatação. E um pouco mais ao passar de hash para array:$d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d
.printf
não me ocorreu e, por algum motivo, não achei que poderia obter o efeito desejado com uma variedade, incrível! @ syb0rg adicionando agora$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
\n
poupar mais 1 caractere. Quero dizer assim: pastebin.com/496z2a0nJ,
4847464543 caracteresUso:
fonte
[:((](;#&'#')"0[:+/=/)1+[:i.>./)#@>@;:
: Experimente online!Ruby,
9885Não jogou muito. Golf mais tarde.
fonte
b ?(?#*b[1].size):''
comb&&?#*b[1].size
.Powershell,
9793Exemplo:
fonte
$a=@{};-split$args|%{$a[$_.length]++};1..($a.Keys|sort)[-1]|%{"{0,-2}|"-f$_+"#"*$a[$_]}
APL (42)
Poderia ser mais curto se eu pudesse omitir linhas em que o valor é 0.
Explicação:
⎕ML←3
: defina o nível de migração como 3 (isso torna⊂
(partição) mais útil).I⊂⍨' '≠I←⍞
: entrada de leitura, dividida em espaçosM←↑∘⍴¨
: obtenha o tamanho da primeira dimensão de cada item (tamanho da palavra) e armazene emM
K←⍳⌈/M
: obtenha os números de 1 ao valor mais alto emM
, armazene emK
+⌿K∘.=M
: para cada valor emM
, veja quantas vezes ele está contidoK
.⊃⍴∘'▓'¨
: para cada valor nesse valor, obtenha uma lista dos muitos se▓
formate-o como uma matriz.K,
: acrescente cada valorK
a cada linha da matriz, fornecendo os rótulos.Resultado:
fonte
Mathematica 97
Quando inseri o texto da Declaração de Independência como uma única sequência (através de recortar e colar, é claro), a saída gerada foi:
fonte
Quarto, 201
Foi divertido, mas minha submissão ao Ruby é mais competitiva. ;-)
Exemplo de execução:
O comprimento máximo da palavra é 99.
fonte
Ruby, 79
Exemplo de execução:
Por favor, veja minha quarta submissão para rir.
fonte
Ruby 1.8.7, 74
Uma abordagem ligeiramente diferente das outras soluções ruby:
resultado:
fonte
JavaScript (
159133)Definitivamente não é competitivo, mas até agora a única solução JavaScript. Obrigado a @manatwork pela dica de uso
String.replace
.Entrada
Resultado
fonte
replace()
em vez desplit()
+for
eArray
em vez deObject
+ variável comprimento separado pode ser reduzido com alguns caracteres:prompt(o=[]).replace(/\S+/g,function(p){o[l=p.length]=(o[l]||"")+"#"});for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||""))
. (E ainda mais curto em Harmonia:prompt(o=[]).replace(/\S+/g,p=>o[l=p.length]=(o[l]||"")+"#");for(i=1;i<o.length;)console.log(i+(i>9?"|":" |")+(o[i++]||""))
.).length
lá.Pure bash 120
Amostra:
Economize 8 caracteres usando um garfo para
tr
: 112Dê o mesmo resultado:
render (no meu host :)
fonte
PHP, 162
Uso:
fonte
8o , 162 bytes
Código
Uso
Resultado
Código não destruído ( SED é diagrama de efeito de pilha)
fonte