Escriba el programa más corto que genere un histograma (una representación gráfica de la distribución de datos).
Reglas:
- Debe generar un histograma basado en la longitud del carácter de las palabras (puntuación incluida) ingresadas en el programa. (Si una palabra tiene 4 letras, la barra que representa el número 4 aumenta en 1)
- Debe mostrar etiquetas de barra que se correlacionen con la longitud de caracteres que representan las barras.
- Todos los personajes deben ser aceptados.
- Si las barras deben ser escaladas, debe haber alguna forma que se muestre en el histograma.
Ejemplos:
$ ./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 |##
Respuestas:
K, 35
.
.
Un ejemplo mas largo
fuente
R,
5547 caracteresAfortunadamente, R viene con una función de trazado
hist
para histogramas, aquí provista con unbreaks
argumento donde los saltos son 0.5, 1.5, ... hasta max (input) +0.5.sapply(scan(,""),nchar)
toma una entrada (como stdin), la separa siguiendo los espacios y cuenta el número de caracteres de cada elemento.Ejemplos:
Editar:
Una variación de 71 caracteres con una etiqueta de eje en cada valor posible:fuente
Python - 83 caracteres
Parece que podemos tomar información desde cualquier lugar, por lo que esto toma información durante la ejecución, en lugar de desde la línea de comando, y utiliza la sugerencia de Ejrb para acortarla en 8.
Python - 91 caracteres
Esto caerá con comillas.
Entrada:
Salida:
fuente
exec
y concatenación de cadenas:c=0;exec'c+=1;print"%3d|"%c+"#"*s.count(c);'*max(s)
Haskell - 126 caracteres
Esto toma la entrada de
stdin
, no la línea de comando:fuente
Python 3.3 (93)
Salida:
(la primera línea es la cadena de entrada)
No justifica los números como la solución Python de Lego Stormtroopr (que también es más corta que la mía), pero es mi primera entrada en un concurso de golf, por lo que podría dejarlo aquí, supongo :)
fuente
Perl, 56
Se agregó la reescritura de @ manatwork y la sugerencia literal de nueva línea, ¡muchas gracias! Se agregaron las actualizaciones de @ chinese_perl_goth.
Uso: guardar como hist.pl y ejecutar
perl hist.pl This is a test
Salida de ejemplo:
fuente
printf
? Podría ahorrar algunos caracteres en el formateo. Y un poco más por el cambio de hash para matriz:$d[y///c]++for@ARGV;shift@d;printf"%2d|%s\n",++$i,"#"x$_ for@d
.printf
no se me ocurrió en absoluto y por alguna razón no pensé que podría obtener el efecto que quería con una variedad, ¡increíble! @ syb0rg agregando ahora$d[y///c].='#'for@ARGV;printf"%2d|$d[$_]\n",$_ for+1..$#d
\n
ahorrar 1 personaje más. Quiero decir así: pastebin.com/496z2a0nJ,
4847464543 caracteresUso:
fuente
[:((](;#&'#')"0[:+/=/)1+[:i.>./)#@>@;:
: ¡ Pruébelo en línea!Ruby,
9885No jugaba mucho al golf. Jugará más golf más tarde.
fuente
b ?(?#*b[1].size):''
conb&&?#*b[1].size
.Powershell,
9793Ejemplo:
fuente
$a=@{};-split$args|%{$a[$_.length]++};1..($a.Keys|sort)[-1]|%{"{0,-2}|"-f$_+"#"*$a[$_]}
APL (42)
Podría ser más corto si pudiera omitir líneas donde el valor es 0.
Explicación:
⎕ML←3
: establece el nivel de migración en 3 (esto hace que⊂
(partición) sea más útil).I⊂⍨' '≠I←⍞
: entrada de lectura, dividida en espaciosM←↑∘⍴¨
: obtenga el tamaño de la primera dimensión de cada elemento (longitud de palabras) y almacene enM
K←⍳⌈/M
: obtenga los números del 1 al valor más alto enM
, almacene enK
+⌿K∘.=M
: para cada valor enM
, vea cuántas veces está contenido enK
.⊃⍴∘'▓'¨
: para cada valor en eso, obtenga una lista de tantos▓
s, y formatee como una matriz.K,
: antepone cada valorK
a cada fila de la matriz, dando las etiquetas.Salida:
fuente
Mathematica 97
Cuando ingresé el texto de la Declaración de Independencia como una sola cadena (a través de cortar y pegar, por supuesto), el resultado generado fue:
fuente
Adelante, 201
Esto fue divertido, pero mi presentación de Ruby es más competitiva. ;-)
Ejecución de muestra:
La longitud máxima de palabra es 99.
fuente
Rubí, 79
Ejemplo de ejecución:
Por favor, mira mi presentación de Forth para reírse.
fuente
Rubí 1.8.7, 74
Una toma ligeramente diferente a las otras soluciones de rubí:
salida:
fuente
JavaScript (
159133)Definitivamente no es competitivo, pero hasta ahora es la única solución de JavaScript. Gracias a @manatwork por el consejo sobre el uso
String.replace
.Entrada
Salida
fuente
replace()
lugar desplit()
+for
yArray
en lugar deObject
+ longitud variable independiente puede ser reducido con unos pocos 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++]||""))
. (Y aún más corto en Harmony:.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
allí.Puro bash 120
Muestra:
Ahorre 8 caracteres utilizando un tenedor para
tr
: 112Dar el mismo resultado:
render (en mi host :)
fuente
PHP, 162
Uso:
fuente
8o , 162 bytes
Código
Uso
Salida
Código no protegido ( SED es el diagrama de efecto de pila)
fuente