Dada una oración de entrada que consta de una o más palabras [a-z]+
y cero o más espacios , genera un histograma de arte ASCII (gráfico de barras) de la distribución de letras de la oración de entrada.
El histograma debe presentarse horizontalmente, es decir, con la tecla de letra a lo largo de la parte inferior en orden alfabético de izquierda a derecha, con un eje Y etiquetado 1-
y cada 5 unidades. El eje Y debe ser el múltiplo más pequeño de cinco que sea al menos tan alto como la barra más alta, y debe estar alineado a la derecha. El eje X está etiquetado con las letras de entrada, sin espacios entre ellas. Por ejemplo, la entrada a bb dd
debe tener etiqueta abd
y no ab d
, omitiendo c
. Las barras en sí pueden estar hechas de cualquier carácter ASCII coherente; lo usaré X
aquí en mis ejemplos.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Como hay tres e
, dos t
y uno de almsx
.
Más ejemplos:
the quick brown fox jumped over the lazy dogs
5-
X X
X X
XX X X X XX
1-XXXXXXXXXXXXXXXXXXXXXXXXXX
abcdefghijklmnopqrstuvwxyz
now is the time for all good men to come to the aid of their country
10-
X
X
X X
X X X
5- X X X
X X X X
X XX XXXX X
XXXXX XXXXXXX X
1-XXXXXXXXXXXXXXXXXX
acdefghilmnorstuwy
a bb ccc dddddddddddd
15-
X
X
10- X
X
X
X
X
5- X
X
XX
XXX
1-XXXX
abcd
a bb ccccc
5- X
X
X
XX
1-XXX
abc
E / S y reglas
- La entrada puede tomarse en cualquier formato razonable y por cualquier método conveniente . Esto también significa que puede tomar la entrada en mayúsculas, si eso tiene más sentido para su código.
- Las nuevas líneas iniciales / finales u otros espacios en blanco son opcionales, siempre que los caracteres se alineen adecuadamente.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- La salida puede ser a la consola, devuelta como una lista de cadenas, devuelta como una sola cadena, etc.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
Respuestas:
Stax , 37 bytes
Ejecutar y depurarlo
fuente
R ,
239230 bytesPruébalo en línea!
table
hace el trabajo pesado aquí, descalificando a los personajes, clasificándolos y devolviendo sus cuentas.Todo lo demás es solo garantizar que las compensaciones sean adecuadas para la impresión, que es el trabajo "real" de un desafío de arte ascii.
Gracias a @dylnan por señalar un error.
Gracias a @rturnbull por el
scan
enfoque, dejando caer 2 bytes.fuente
gnu sed -r,
516490278249 + 1 bytesPruébalo en línea!
Estoy seguro de que esto se puede mejorar
, pero por ahora, esto debería ser bueno teniendo en cuenta que está hecho en sed, donde no tienes aritmética ni clasificación nativas.Así que mentí, esto no era lo suficientemente bueno, así que lo mejoré (reescribí) en otros 212 bytes, con un consejo sobre el algoritmo de clasificación de Cows quack , que me dio la idea de hacer que la conversión de unario a decimal también sea más corta.Descripción del funcionamiento interno:
Esto ordena la entrada y separa los grupos con espacios. Esto funciona agregando primero un alfabeto en mayúscula más un espacio separado por dos puntos al final. Luego, mueve cada personaje delante del colon a un personaje coincidente detrás del colon usando una sustitución insensible a mayúsculas y minúsculas en un bucle. Las letras mayúsculas se reemplazan por espacios y la cadena se copia en el espacio de espera.
Este bucle funciona reduciendo el tamaño de cada grupo de caracteres en uno, agregando la línea original ordenada e incrementando los contadores unarios después de los dos puntos que quedaron de la clasificación. Se repite hasta que se alcanza una línea vacía con un número de 5 * n + 1 (ya que la última línea finalmente da como resultado un espacio en blanco). El espacio del patrón se ve así después del ciclo:
Luego sigue el formato:
Y finalmente, el convertidor unario a decimal permanece:
Básicamente agrega una cadena donde está el conocimiento de la conversión. Puede interpretarlo como: espacio: -> 1 y 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. La expresión de sustitución
s/(.)I(.*\1(I?.))|;.*/\3\2/
funciona de manera similar a la ordenada, reemplazando los caracteres delante de I's [(.)I
] por el carácter que está al lado del que está delante de I en la cadena de conversión [(.*\1(I?.))
] y si no queda I, se elimina la cadena adjunta [|;.*
]. La sustitución [/\nI/s/^/ /Mg
] agrega relleno si es necesario.Gracias a Cows quack por reducir el tamaño en 26 bytes y por el algoritmo de clasificación más corto.
fuente
\w
(coincide con caracteres de palabras) en varios lugares para guardar algunos bytes. También:b ... tb
puede simplemente convertirses/\B\w/X/g
. Puede eliminar la línea que le sigues/:/:,/g
, modificando las sustituciones anteriores. Puede ver goo.gl/JvD7Rs (enlace TIO acortado al programa sed) para ver a qué me refiero.zyx...cba
a la entrada.Dyalog APL ,
1099796959388 bytesPruébalo en línea!
Requiere
⎕IO←0
Camino demasiados bytes salvó gracias a Adám y vacas charlatanes !
fuente
⍵[⍋⍵]~' '
(ordena y elimina espacios antes de pasar⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
dos veces05AB1E ,
5847 bytesPruébalo en línea!
-11 bytes gracias a @Emigna
fuente
Python 2 , 192 bytes
Pruébalo en línea!
Explicación
La línea 2 calcula los valores del histograma de una manera bastante sencilla, descartando
' '
.La línea 3 usa el truco de la computación
ceil(x/5)
como-(-x/5)
: redondeamos la frecuencia máxima hasta el siguiente múltiplo de 5 usando la fórmula-x/5*-5
. Esto esh
.La línea 4 es un bucle que cuenta desde
h
abajo hasta0
inclusive, imprimiendo cada fila:Si
y%5==2>>y
imprimimos una etiqueta. Esto es cuandoy
∈ {1, 5, 10, 15, 20, ...}(Esta fórmula podría ser más corta. Solo necesitamos algo que sea 1 o Verdadero para {1, 5, 10, ...}, y 0 o Falso o incluso un entero negativo para todos los demás valores de
y
).Justificamos a la derecha la etiqueta (o espacio vacío) en
len(`-h`)
espacios: ¡este es un ahorro de un byte ordenadolen(`h`)+1
!Luego, imprimimos
X
's y espacios para esta fila (siy
≥ 1) o las letras (siy
= 0), pasando por pares clave-valord
en orden ascendente.fuente
'%d-'%y*(y%5==2>>y)
. ¿Te importa si uso eso en mi respuesta?-~-(y%5*~-y)
también funciona pero desafortunadamente es un byte más.Carbón , 62 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Crea una lista de 27 listas.
Empuje cada carácter de entrada a la lista correspondiente a su posición en el alfabeto en minúsculas. Los caracteres que no están en minúscula son empujados a la lista 27.
Deseche el elemento 27 de la lista.
Toma las longitudes de todos los elementos de la lista.
Imprima las letras minúsculas correspondientes a los elementos de la lista que no sean cero.
Imprima los elementos de la lista que no sean cero hacia arriba. Como se trata de una matriz de enteros, cada entero se imprime como una línea (ahora vertical), cada una en una columna separada.
Calcule el número de marcas en el eje Y y repítelas.
Calcule la posición de la siguiente marca de verificación.
Salta a la siguiente marca de verificación.
Imprima la marca de verificación invertida y de atrás hacia adelante, alineándola efectivamente a la derecha.
fuente
Jalea , 48 bytes
¡Qué campo de minas atravesar!
Un programa completo que imprime el resultado (como un enlace monádico devolvería una lista que contiene caracteres y enteros
[0,9]
)Pruébalo en línea! O ver el conjunto de pruebas
¿Cómo?
fuente
APL (Dyalog Classic) , 56 bytes
Pruébalo en línea!
fuente
Rubí ,
250248234188173157153 bytesPruébalo en línea!
Gracias a:
-x/5*-5
|[]
fuente
Java (JDK 10) , 296 bytes
Pruébalo en línea!
Créditos
fuente
--m%5==0
puede ser--m%5<1
, porque también tienes el&m>0
cheque. Ym<=d[a]?"x":" "
puede serm>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
a--m%5<1|m==1&&m>0
Pyth, 65 bytes
Pruébalo aquí
Explicación
fuente
JavaScript (Node.js) ,
262256 bytes* Gracias a @Shaggy por reducir en 2 bytes
Pruébalo en línea!
fuente
1.
tome la entrada como una matriz de caracteres individuales,2.
reemplacex!=" "
conx>" "
.3.
Reemplazarm=0
coni=m=0
ymap((x,i)=>
conmap(x=>
.Pitón 2 ,
249224219215205197187188182176 bytesPruébalo en línea!
Devuelve una lista de listas de caracteres que representan líneas.
map(list,yticks)
allí.y==1
reemplazado pory<2
.'%d-'%y*(y%5==2>>y)
lugar de(`y`+'-')*(not y%5or y<2)
.Ligeramente incólume:
fuente
C # (.NET Core) ,
344340338 + 18 bytesIncluye 18 bytes para
using System.Linq;
Guardado 6 bytes gracias a @KevinCruijssen.
Pruébalo en línea!
fuente
j< m;
que puede ser eliminado. Yint i=0,j
se puede colocar como,i=0,j
después de las otras entradas para -4 bytes en total.using System.Linq;
Sin embargo , tendrá que incluir los 18 bytes para el ..for(;i<t;){string p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(o);for(j=o;j<m;){...}a[i++]=q;}
afor(string p,q;i<t;)for(p=i>0&i%5<1|i==1?i+"-":"",q=p.PadLeft(j=o);j<m;a[i++]=q){...}
. Pruébalo en línea.Bash + coreutils,
332324323318312302298296293291 bytesPruébalo en línea!
Anotado:
Gracias a @IanM_Matrix por guardar 3 bytes.
fuente
cat b
podría estar<b
guardando 3 caracteresC, 201 bytes
La entrada se toma de la línea de comando (primer argumento). Utiliza signos de exclamación en lugar de X para reducir aún más el tamaño del código. El contador de la izquierda siempre tiene tres caracteres.
Probado con GCC y clang.
fuente
for(p=b[1];*p;p++)
más probable es que puede serfor(p=b[1]-1;*++p;)
,main(int a,char **b)
probablemente podría ser golfed am(a,b)char**b;
.a!=1
será booleano,a%5&&a!=1?
debería ser equivalente aa%5&a!=1?
oa%5&&~-a
.Excel VBA, 316 bytes
Una función de ventana inmediata anónima de VBE que toma la entrada de la celda
[A1]
y las salidas a la ventana inmediata de VBE.Versión sin golf
fuente
Perl 5
-n
,198168bytesPruébalo en línea!
fuente
Python 3 , 177 bytes
Pruébalo en línea!
Puede que este no sea el enfoque más eficiente en bytes en Python, pero realmente quería resolver esto con una lambda "de una sola línea".
Emite una lista de listas de caracteres. Abusa de múltiples líneas nuevas y espacios como todos los demás. En realidad, puede reducirse aún más a 174 bytes si es aceptable incluir el resultado en otra lista, de modo que podamos transferir la
[0]
indexación final al pie de página.fuente
JavaScript (ES8), 200 bytes
Toma la entrada como una matriz de caracteres. Devuelve una cadena.
Pruébalo en línea!
Comentado
fuente