Avec une phrase d'entrée composée d'un ou plusieurs mots [a-z]+
et de zéro ou plusieurs espaces , générez un histogramme (graphique à barres) à la technique ASCII de la distribution des lettres de la phrase d'entrée.
L’histogramme doit être disposé horizontalement, c’est-à-dire avec la lettre en bas à gauche dans l’ordre alphabétique, de gauche à droite, avec un axe des Y libellé 1-
et toutes les 5 unités. L'axe des ordonnées doit être le plus petit multiple de cinq qui soit au moins aussi grand que la barre la plus haute et doit être aligné à droite. L'axe des abscisses est étiqueté avec les lettres saisies, sans espace entre eux. Par exemple, l'entrée a bb dd
doit avoir un libellé abd
et non pas ab d
, en sautant le c
. Les barres elles-mêmes peuvent être constituées de n'importe quel caractère ASCII cohérent - je vais utiliser X
ici dans mes exemples.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Puisqu'il y en a trois e
, deux t
et un de almsx
.
Plus d'exemples:
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
I / O et règles
- La saisie peut être effectuée dans n’importe quel format raisonnable et par n’importe quelle méthode convenable . Cela signifie également que vous pouvez prendre des entrées en majuscules, si cela est plus logique pour votre code.
- Les nouvelles lignes et les autres espaces sont facultatifs, à condition que les caractères s'alignent correctement.
- Un programme complet ou une fonction sont acceptables. Si une fonction est utilisée, vous pouvez renvoyer la sortie plutôt que de l’imprimer.
- La sortie peut être vers la console, renvoyée sous forme de liste de chaînes, sous forme de chaîne unique, etc.
- Les échappatoires standard sont interdites.
- Il s’agit du code-golf, donc toutes les règles de golf habituelles s’appliquent et le code le plus court (en octets) gagne.
Réponses:
Stax , 37 octets
Exécuter et déboguer
la source
R ,
239230 octetsEssayez-le en ligne!
table
fait le gros du travail ici, en identifiant les personnages, en les triant et en retournant leurs comptes.Tout le reste consiste simplement à s'assurer que les compensations sont correctes pour l'impression, ce qui constitue le "vrai" travail d'un défi artistique ascii.
Merci à @dylnan pour avoir signalé un bug.
Grâce à @rturnbull pour l’
scan
approche, supprimant 2 octets.la source
gnu sed -r,
516490278249 + 1 octetsEssayez-le en ligne!
Je suis sûr que cela peut être amélioré
, mais pour le moment, cela devrait être bon, étant donné qu’il est fait en sed, où vous n’avez pas d’arithmétique ou de tri natif.Alors j'ai menti, cela ne suffisait pas, alors je l'ai amélioré (réécrit) de 212 octets supplémentaires, avec une astuce concernant l'algorithme de tri de Cows quack , ce qui m'a donné l'idée de raccourcir également la conversion unaire en décimale.Description du fonctionnement interne:
Ceci trie les entrées et sépare les groupes avec des espaces. Cela fonctionne en ajoutant d’abord un alphabet majuscule et un espace séparé par deux points à la fin. Ensuite, il déplace chaque caractère devant les deux points vers un caractère correspondant derrière les deux points en utilisant une substitution insensible à la casse dans une boucle. Les lettres majuscules sont ensuite remplacées par des espaces et la chaîne est copiée dans l'espace de stockage.
Cette boucle fonctionne en réduisant chaque groupe de caractères d'une taille, en ajoutant la ligne d'origine triée et en incrémentant les compteurs unaires après les deux points restants après le tri. Il boucle jusqu'à ce qu'une ligne vide portant le nombre 5 * n + 1 soit atteinte (puisque la dernière ligne génère des espaces). L'espace motif ressemble à ceci après la boucle:
Ensuite, le formatage suit:
Et enfin, le convertisseur unaire à décimal reste:
Il ajoute en gros une chaîne où se trouve la connaissance de la conversion. Vous pouvez l'interpréter comme suit: espace: -> 1 et 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. L’expression de substitution
s/(.)I(.*\1(I?.))|;.*/\3\2/
fonctionne de la même manière que celle de tri, en remplaçant les caractères situés devant les [(.)I
] par le caractère situé à côté de celui situé à l’avant du I dans la chaîne de conversion [(.*\1(I?.))
]; la chaîne ajoutée [|;.*
]. La substitution [/\nI/s/^/ /Mg
] ajoute un remplissage si nécessaire.Merci à Cows Quack pour avoir réduit la taille de 26 octets et pour l’algorithme de tri plus court.
la source
\w
(correspond aux caractères d'un mot) à plusieurs endroits pour enregistrer des octets. Aussi:b ... tb
peut simplement devenirs/\B\w/X/g
. Vous pouvez supprimer la ligne qui la suits/:/:,/g
en modifiant les substitutions précédentes. Vous pouvez consulter goo.gl/JvD7Rs (lien TIO raccourci vers sed programme) pour voir ce que je veux dire.zyx...cba
à l’entrée.Dyalog APL ,
1099796959388 octetsEssayez-le en ligne!
A besoin
⎕IO←0
Way trop d'octets sauvés grâce à Adám et vaches charlatan !
la source
⍵[⍋⍵]~' '
(trie et supprime les espaces avant de passer⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
deux fois05AB1E ,
5847 octetsEssayez-le en ligne!
-11 octets grâce à @Emigna
la source
Python 2 , 192 octets
Essayez-le en ligne!
Explication
La ligne 2 calcule les valeurs de l’histogramme de manière assez simple, en ignorant
' '
.Ligne 3 utilise l'astuce de calcul
ceil(x/5)
comme-(-x/5)
: nous arrondissons la fréquence maximale jusqu'à multiple de 5 en utilisant la formule-x/5*-5
. C'esth
.La ligne 4 est une boucle comptant de
h
bas en haut0
, en imprimant chaque ligne:Si
y%5==2>>y
nous imprimons une étiquette. Lorsque cela esty
{1, 5, 10, 15, 20,…}(Cette formule pourrait peut-être être plus courte. Nous avons simplement besoin de quelque chose qui vaut 1 ou Vrai pour {1, 5, 10,…}, et 0 ou Faux ou même un entier négatif pour toutes les autres valeurs de
y
.)Nous justifions à juste titre l’étiquette (ou l’espace vide) en
len(`-h`)
espaces: c’est une sauvegarde nette d’un octetlen(`h`)+1
!Ensuite, nous imprimons
X
les espaces et les espaces pour cette ligne (siy
≥ 1) ou les lettres (siy
= 0), en passant par les paires clé-valeurd
dans l'ordre croissant.la source
'%d-'%y*(y%5==2>>y)
. Cela vous dérange-t-il si j'utilise cela dans ma réponse?-~-(y%5*~-y)
fonctionne aussi mais malheureusement, c'est un octet de plus.Charbon de bois , 62 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Créez une liste de 27 listes.
Poussez chaque caractère saisi dans la liste correspondant à sa position dans l’alphabet minuscule. Les caractères non minuscules sont poussés vers la 27e liste.
Jeter le 27ème élément de la liste.
Prendre la longueur de tous les éléments de la liste.
Imprimez les lettres minuscules correspondant aux éléments de la liste non nuls.
Imprimer les éléments de la liste non nuls vers le haut. Puisqu'il s'agit d'un tableau d'entiers, chaque entier s'imprime sous la forme d'une ligne (maintenant verticale), chacune dans une colonne séparée.
Calculez le nombre de graduations sur l’axe Y et passez-les en boucle.
Calculez la position du prochain tick.
Passez au prochain tick.
Imprimez la coche inversée et de face à face, en l'alignant correctement à droite.
la source
Gelée , 48 octets
Quel champ de mines à parcourir!
Un programme complet imprimant le résultat (sous forme de lien monadique, il renverrait une liste contenant des caractères et des entiers
[0,9]
)Essayez-le en ligne! Ou voir la suite de tests
Comment?
la source
APL (Dyalog Classic) , 56 octets
Essayez-le en ligne!
la source
Ruby ,
250248234188173157 157153 octetsEssayez-le en ligne!
Grâce à:
-x/5*-5
|[]
la source
Java (JDK 10) , 296 octets
Essayez-le en ligne!
Crédits
la source
--m%5==0
peut être--m%5<1
, parce que vous avez aussi le&m>0
chèque. Etm<=d[a]?"x":" "
peut êtrem>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
à--m%5<1|m==1&&m>0
Pyth, 65 octets
Essayez-le ici
Explication
la source
JavaScript (Node.js) ,
262256 octets* Merci à @Shaggy pour la réduction de 2 octets
Essayez-le en ligne!
la source
1.
Prenez les entrées comme un ensemble de caractères individuels,2.
Remplacerx!=" "
parx>" "
.3.
Remplacerm=0
pari=m=0
etmap((x,i)=>
avecmap(x=>
.Python 2 ,
249224219215205197 197187188182176 octetsEssayez-le en ligne!
Renvoie une liste de listes de caractères représentant des lignes.
map(list,yticks)
in there.y==1
replaced byy<2
.'%d-'%y*(y%5==2>>y)
instead of(`y`+'-')*(not y%5or y<2)
.Slightly ungolfed:
la source
C# (.NET Core),
344340338 + 18 bytesIncludes 18 bytes for
using System.Linq;
Saved 6 bytes thanks to @KevinCruijssen.
Try it online!
la source
j< m;
that can be removed. Andint i=0,j
can be placed as,i=0,j
after the other ints for -4 bytes in total. You'll have to including the 18 bytes for theusing System.Linq;
however..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;}
tofor(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){...}
. Try it online.Bash + coreutils,
332324323318312302298296293291 bytesTry it online!
Annotated:
Thanks to @IanM_Matrix for saving 3 bytes.
la source
cat b
could be<b
saving 3 charactersC, 201 bytes
Input is taken from the command line (first argument). Uses exclamation marks instead of X's to further reduce code size. Counter on the left is always three characters long.
Tested with GCC and clang.
la source
for(p=b[1];*p;p++)
can most likely befor(p=b[1]-1;*++p;)
,main(int a,char **b)
could probably be golfed tom(a,b)char**b;
.a!=1
will be boolean,a%5&&a!=1?
should be equivalent toa%5&a!=1?
ora%5&&~-a
.Excel VBA, 316 bytes
An Anonymous VBE immediate window function that takes input from cell
[A1]
and outputs to the VBE immediate window.Ungolfed Version
la source
Perl 5
-n
,198168 bytesTry it online!
la source
Python 3, 177 bytes
Try it online!
This may not be the most byte-efficient approach in Python, but I really wanted to solve this with a "true one-liner" lambda.
Outputs a list of character lists. Abuses multiple leading newlines and spaces just like everybody else. It may actually be further reduced to 174 bytes if it is acceptable to wrap the result in another list, so that we could transfer the final
[0]
indexing to the footer.la source
JavaScript (ES8), 200 bytes
Takes input as an array of characters. Returns a string.
Try it online!
Commented
la source