Freitag, 18. Januar 2013

Letter Distribution

Bei HP Codewars war 2012 als Aufgabe 8 für einen Text die Häufigkeit der auftretenden Buchstaben zu ermitteln und "grafisch" in der Konsole auszugeben.
import string


def text_analysieren(text):
    ''' Der Text soll analysiert werden und
    die Zahl des Auftretens der Buchstaben zurueckgegeben
    werden. Die Satzzeichen und das EOF ignoriere ich
    einfach. Die Funktion wird damit sehr knapp.

    '''
    result = {}
    
    # Verarbeiten
    for a in string.ascii_lowercase:
        result[a] = text.lower().count(a)
    
    return result


def analyseergebnis_ausgeben(analyseergebnis):
    ''' Erledige die Ausgabe, an die folgende
    Anfordeungen gestellt sind:
    a.) Buchstabe und Anzahl in einer Zeile
    b.) Für jedes Auftreten ein "*"
    c.) Zwei oder mehr Buchstaben mit identischer
        Haeufigkeit des Auftretens sollen in
        alphabetischer Reihenfolge ausgegeben
        werden

    '''
    # Ich schaue mir die Daten an
    keys = analyseergebnis.keys()
    values = list(analyseergebnis.values())
    values.sort(reverse=True)

    # Ich drehe das Wörterbuch um und
    # muss vermeiden, dass Buchstaben ueberschrieben werden
    w2 = {}
    liste = []
    
    for key in keys:
        item = w2.get(analyseergebnis[key],0)
        if item == 0:
            w2[analyseergebnis[key]] = [key]
        else:
            item.append(key)
            w2[analyseergebnis[key]] = item

    # Wir holen uns die Schluessel
    keys = list(w2.keys())
    keys.sort(reverse=True)
    
    for key in keys:
        liste = w2[key]
        liste.sort()
        for a in liste:
            print(a.upper(),"*" * key)        
        

text = """I have a dream that one day this nation will rise up and live out the true
meaning of its creed: "We hold these truths to be self-evident, that all men
are created equal." I have a dream that my four little children will one day
live in a nation where they will not be judged by the color of their skin but
by the content of their character.
###"""

analyseergebnis = text_analysieren(text)
analyseergebnis_ausgeben(analyseergebnis)
Das Skript erledigt die Aufgabe ist aber wahrscheinlich noch nicht elegant genug. Insbesondere das Schieben der Daten von einem Wörterbuch ins nächste könnte vielleicht umgangen werden; das ist ein Bauchgefühl.

Was die Ausgabe angeht, so gibt obiges Skript für den Beispieltext (siehe Quelltext) ein korrektes Ergebnis aus:
E ***************************************
T *******************************
A **********************
I ********************
H ******************
L *****************
N *****************
R ****************
O ***************
D ************
U ********
C *******
S *******
Y ******
B *****
F *****
M *****
V *****
W *****
G **
J *
K *
P *
Q *
X
Optimierung gewünscht ;D

Keine Kommentare:

Kommentar veröffentlichen