Bei einem Eingabesatz, der aus einem oder mehreren Wörtern [a-z]+
und null oder mehreren Leerzeichen besteht , wird ein ASCII-Histogramm (Balkendiagramm) der Buchstabenverteilung des Eingabesatzes ausgegeben.
Das Histogramm muss horizontal angeordnet sein, dh mit der Buchstabentaste am unteren Rand in alphabetischer Reihenfolge von links nach rechts, mit einer Y-Achse beschriftet 1-
und alle 5 Einheiten. Die Y-Achse muss das kleinste Vielfache von fünf sein, das mindestens so hoch wie der höchste Balken ist, und muss rechtsbündig ausgerichtet sein. Die X-Achse ist mit den eingegebenen Buchstaben beschriftet, ohne Lücken dazwischen. Zum Beispiel a bb dd
sollte die Eingabe eine Bezeichnung haben abd
und nicht ab d
die c
. Die Balken selbst können aus einem beliebigen konsistenten ASCII-Zeichen bestehen - ich werde dies X
hier in meinen Beispielen verwenden.
test example
5-
X
X X
1-XXXXXXXX
aelmpstx
Da gibt es drei e
, zwei t
und eins von almsx
.
Mehr Beispiele:
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 und Regeln
- Die Eingabe kann in jedem vernünftigen Format und mit jeder geeigneten Methode erfolgen . Dies bedeutet auch, dass Sie Eingaben in Großbuchstaben vornehmen können, wenn dies für Ihren Code sinnvoller ist.
- Führende / nachfolgende Zeilenumbrüche oder andere Leerzeichen sind optional, sofern die Zeichen richtig ausgerichtet sind.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Die Ausgabe kann an die Konsole erfolgen, als Liste von Zeichenfolgen zurückgegeben werden, als einzelne Zeichenfolge zurückgegeben werden usw.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Antworten:
Stax , 37 Bytes
Führen Sie es aus und debuggen Sie es
quelle
R ,
239230 BytesProbieren Sie es online!
table
erledigt das schwere Heben hier, macht die Charaktere einzigartig, sortiert sie und gibt ihre Zählungen zurück.Alles andere dient nur dazu, sicherzustellen, dass die Offsets für den Druck geeignet sind.
Vielen Dank an @dylnan für den Hinweis auf einen Fehler.
Vielen Dank an @rturnbull für den
scan
Ansatz, 2 Bytes zu löschen .quelle
gnu sed -r,
516490278249 + 1 ByteProbieren Sie es online!
Ich bin mir sicher, dass dies verbessert werden kann
, aber im Moment sollte dies gut sein, wenn man bedenkt, dass es in sed erstellt wurde, wo Sie keine native Arithmetik oder Sortierung haben.Also habe ich gelogen, das war nicht gut genug, also habe ich es um weitere 212 Bytes verbessert (umgeschrieben), mit einem Tipp zum Sortieralgorithmus von Cows quack , der mir die Idee gab, die Umrechnung von Einzahl auf Dezimalzahl zu verkürzen.Beschreibung des Innenlebens:
Dadurch werden die Eingaben sortiert und die Gruppen durch Leerzeichen getrennt. Dies funktioniert, indem zuerst ein Großbuchstabe und ein durch einen Doppelpunkt getrenntes Leerzeichen an das Ende angehängt werden. Anschließend wird jedes Zeichen vor dem Doppelpunkt zu einem übereinstimmenden Zeichen hinter dem Doppelpunkt verschoben, wobei die Groß- / Kleinschreibung in einer Schleife nicht berücksichtigt wird. Die Großbuchstaben werden dann durch Leerzeichen ersetzt, und die Zeichenfolge wird in das Haltezeichen kopiert.
In dieser Schleife wird jede Zeichengruppengröße um eins verringert, die sortierte ursprüngliche Zeile angehängt und die unären Zähler nach dem von der Sortierung verbleibenden Doppelpunkt erhöht. Es wird eine Schleife ausgeführt, bis eine leere Zeile mit der Zahl 5 * n + 1 erreicht ist (da die letzte Zeile letztendlich Leerzeichen enthält). Der Musterraum sieht nach der Schleife ungefähr so aus:
Dann folgt die Formatierung:
Und schließlich bleibt der Konverter von Unär zu Dezimal:
Grundsätzlich wird eine Zeichenfolge angehängt, in der das Wissen über die Konvertierung vorhanden ist. Sie können es interpretieren als: Leerzeichen: -> 1 und 0-> 1-> 2-> 3-> 4-> 5-> 6-> 7-> 8-> 9-> I0. Der Ersetzungsausdruck
s/(.)I(.*\1(I?.))|;.*/\3\2/
funktioniert ähnlich wie der Sortierungsausdruck. Er ersetzt die Zeichen vor I [(.)I
] durch das Zeichen, das in der Konversionszeichenfolge [(.*\1(I?.))
] neben dem Zeichen vor I steht. Wenn kein I mehr vorhanden ist, wird es entfernt die angehängte Zeichenfolge [|;.*
]. Die Ersetzung [/\nI/s/^/ /Mg
] fügt bei Bedarf eine Auffüllung hinzu.Dank Cows quack für die Reduzierung der Größe um 26 Bytes und für den kürzeren Sortieralgorithmus.
quelle
\w
(entspricht Wortzeichen) an mehreren Stellen verwenden, um einige Bytes zu speichern. Auch:b ... tb
kann einfach werdens/\B\w/X/g
. Sie können die darauf folgende Zeile entfernens/:/:,/g
, indem Sie die früheren Ersetzungen ändern. Sie können goo.gl/JvD7Rs (verkürzter TIO-Link zum sed-Programm) ansehen, um zu sehen, was ich meine.zyx...cba
an die Eingabe anzuhängen.Dyalog APL ,
1099796959388 BytesProbieren Sie es online!
Benötigt
⎕IO←0
Art und Weise zu viele Bytes gespeichert dank Adám und Kühe Quack !
quelle
⍵[⍋⍵]~' '
(sortiert und entfernt Leerzeichen, bevor Sie durch⌸
)'X'/⍨≢
→∊⍕¨×
⍵>0
→×⍵
2⌷⍴
→≢⍉
zweimal05AB1E ,
5847 BytesProbieren Sie es online!
-11 Bytes dank @Emigna
quelle
Python 2 , 192 Bytes
Probieren Sie es online!
Erläuterung
Zeile 2 berechnet die Histogrammwerte relativ einfach und verwirft sie
' '
.Zeile 3 verwendet den Rechentrick
ceil(x/5)
als-(-x/5)
: Wir runden die Maximalfrequenz mit der Formel auf das nächste Vielfache von 5 auf-x/5*-5
. Das isth
.Zeile 4 ist eine Schleife, die von
h
unten nach0
einschließlich zählt und jede Zeile druckt:Wenn
y%5==2>>y
wir ein Etikett drucken. Dies ist, wenny
∈ {1, 5, 10, 15, 20,…}(Diese Formel könnte möglicherweise kürzer sein. Für {1, 5, 10,…} brauchen wir nur 1 oder True und für alle anderen Werte von . 0 oder False oder sogar eine negative Ganzzahl
y
.)Wir richten das Label (oder den leeren Raum) mit der rechten Maustaste in
len(`-h`)
Leerzeichen ein: Dies ist eine ordentliche Einsparung von einem Bytelen(`h`)+1
!Dann drucken wir entweder die Buchstaben
X
und Leerzeichen für diese Zeile (wenny
≥ 1) oder die Buchstaben (wenny
= 0) und durchlaufen die Schlüssel-Wert-Paared
in aufsteigender Reihenfolge.quelle
'%d-'%y*(y%5==2>>y)
. Stört es Sie, wenn ich das in meiner Antwort verwende?-~-(y%5*~-y)
funktioniert auch, aber es ist leider ein Byte länger.Holzkohle , 62 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Erstellen Sie eine Liste mit 27 Listen.
Schieben Sie jedes eingegebene Zeichen in die Liste, die seiner Position im Kleinbuchstaben entspricht. Nicht-Kleinbuchstaben werden in die 27. Liste verschoben.
Verwerfen Sie das 27. Element der Liste.
Nimm die Länge aller Elemente der Liste.
Drucken Sie die Kleinbuchstaben aus, die Listenelementen ungleich Null entsprechen.
Drucken Sie die Nicht-Null-Listenelemente nach oben. Da es sich um ein Array von Ganzzahlen handelt, wird jede Ganzzahl als (jetzt vertikale) Zeile in einer separaten Spalte ausgegeben.
Berechnen Sie die Anzahl der Teilstriche auf der Y-Achse und wiederholen Sie diese.
Berechnen Sie die Position des nächsten Häkchens.
Zum nächsten Häkchen springen.
Drucken Sie das Häkchen umgekehrt und von hinten nach vorne aus, und richten Sie es dabei richtig aus.
quelle
Jelly , 48 Bytes
Was für ein Minenfeld zu durchqueren!
Ein vollständiges Programm, das das Ergebnis druckt (als monadischer Link würde es eine Liste mit Zeichen und ganzen Zahlen von zurückgeben
[0,9]
)Probieren Sie es online! Oder schauen Sie sich die Testsuite an
Wie?
quelle
APL (Dyalog Classic) , 56 Byte
Probieren Sie es online!
quelle
Ruby ,
250248234188173157153 BytesProbieren Sie es online!
Dank an:
-x/5*-5
|[]
quelle
Java (JDK 10) , 296 Byte
Probieren Sie es online!
Credits
quelle
--m%5==0
kann sein--m%5<1
, weil du auch den&m>0
scheck hast . Undm<=d[a]?"x":" "
kann seinm>d[a]?" ":"x"
.(--m%5<1|m==1)&m>0
auf--m%5<1|m==1&&m>0
Pyth, 65 Bytes
Probieren Sie es hier aus
Erläuterung
quelle
JavaScript (Node.js) ,
262256 Byte* Danke an @Shaggy für die Reduzierung um 2 Bytes
Probieren Sie es online!
quelle
1.
Nehmen Sie die Eingabe als Array einzelner Zeichen entgegen,2.
Ersetzenx!=" "
durchx>" "
.3.
Ersetzen Siem=0
miti=m=0
undmap((x,i)=>
mitmap(x=>
.Python 2 ,
249224219215205197187188182176 BytesProbieren Sie es online!
Gibt eine Liste mit Listen von Zeichen zurück, die Zeilen darstellen.
map(list,yticks)
drin.y==1
ersetzt durchy<2
.'%d-'%y*(y%5==2>>y)
anstelle von(`y`+'-')*(not y%5or y<2)
.Leicht ungolfed:
quelle
C # (.NET Core) ,
344340338 + 18 ByteBeinhaltet 18 Bytes für
using System.Linq;
6 Bytes gespart dank @KevinCruijssen.
Probieren Sie es online!
quelle
j< m;
, das entfernt werden kann. Undint i=0,j
kann wie,i=0,j
nach den anderen Ints für insgesamt -4 Bytes platziert werden. Sie müssen die 18 Bytes für dieusing System.Linq;
jedoch enthalten ..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;}
zufor(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){...}
. Probieren Sie es online aus.Bash + Coreutils,
332324323318312302298296293291 BytesProbieren Sie es online!
Kommentiert:
Vielen Dank an @IanM_Matrix für das Speichern von 3 Bytes.
quelle
cat b
könnte<b
3 ZeichenC 201 Bytes
Die Eingabe erfolgt über die Befehlszeile (erstes Argument). Verwendet Ausrufezeichen anstelle von X, um die Codegröße weiter zu verringern. Der linke Zähler ist immer drei Zeichen lang.
Getestet mit GCC und clang.
quelle
for(p=b[1];*p;p++)
kann höchstwahrscheinlich seinfor(p=b[1]-1;*++p;)
,main(int a,char **b)
könnte wahrscheinlich zu golfen seinm(a,b)char**b;
.a!=1
wird boolesch sein,a%5&&a!=1?
sollte gleicha%5&a!=1?
oder seina%5&&~-a
.Excel VBA, 316 Bytes
Eine anonyme VBE-Direktfensterfunktion, die Eingaben von der Zelle
[A1]
und Ausgaben in das VBE-Direktfenster übernimmt .Ungolfed Version
quelle
Perl 5
-n
,198168 BytesProbieren Sie es online!
quelle
Python 3 , 177 Bytes
Probieren Sie es online!
Dies ist möglicherweise nicht der byteeffizienteste Ansatz in Python, aber ich wollte dies unbedingt mit einem "echten Einzeiler" -Lambda lösen.
Gibt eine Liste von Zeichenlisten aus. Missbrauch mehrerer führender Zeilenumbrüche und Leerzeichen wie jeder andere auch. Es kann tatsächlich weiter auf 174 Bytes reduziert werden, wenn es akzeptabel ist, das Ergebnis in eine andere Liste zu setzen, damit wir die endgültige
[0]
Indizierung in die Fußzeile übertragen können.quelle
JavaScript (ES8), 200 Byte
Nimmt die Eingabe als Array von Zeichen. Gibt eine Zeichenfolge zurück.
Probieren Sie es online!
Kommentiert
quelle