# CodeWars VII Problems
# CSI Crime Lab
def suspects_aufbereiten(suspects):
''' Soll die Daten aufbereiten und in
ein Wörterbuch packen
'''
personen = {}
suspects = suspects.split("\n")
for suspect in suspects:
name,DNA = suspect.split(": ")
personen[name] = DNA
return personen
def daten_aufbereiten(scene):
''' Soll die Daten vom Tatort
aufbereiten
'''
data = {}
scene = scene.split("\n")
for datum in scene:
datum = datum.replace("On ","")
ort,dna_spur = datum.split(": ")
data[ort] = dna_spur.split(", ") # Werte sind in einer Liste (!)
return data
def spuren_prüfen(suspects,spuren):
''' Vorgaben von HP
a.) Es gibt nur einen Verdächtigen, dessen Name
zurückgegeben werden muss
b.) Falls kein positiver Treffer, dann ist die Ausgabe
des Programms "NO MATCH", berücksichtigen
c.) Positiver Treffer nur, wenn ein Verdächtiger
DNA-Spuren an allen Tatorten hinterlassen hat
d.) Es kann je Tatort mehrere DNA-Spuren geben
Achtung - meine Ergänzung
e.) Das Programm liefert nur den ersten Treffer mit
Spuren an allen Tatorten zurück. Es wird nicht
geprüft, ob das auch für andere Verdächtige
zutrifft. Das könnte eine Fehlerquelle sein!
'''
# Beispieldaten
# Larry King: GACTAATAACTTCATATATACACAGGTTAC
# revolver: GACTATTC, GACTAATA
# Was muss getan werden?
# Prüfe, ob eine der Spuren in der DNA-Sequenz enthalten ist
results = {}
for suspect in suspects:
results[suspect] = 0
dna = suspects[suspect]
for spurensatz in spuren: # Spuren im Datensatz
match = False
for spur in spuren[spurensatz]:
if spur in dna:
match = True
if match == True:
results[suspect] += 1
# Rückgabe: Name eines Verdächtigen oder "" (= False!)
keys = results.keys()
for key in keys:
if results[key] == 3:
return key
else:
return "NO MATCH"
suspects = """Larry King: GACTAATAACTTCATATATACACAGGTTAC
Paula Abdul: GACTATTCATCATAGATAGACAGTACCTAA
Charlie McCarthy: GATTCATTGACATACATACATTAGAGTTCA"""
scene = """On revolver: GACTATTC, GACTAATA
On door: GACTAAT, CATAGAT
On phone: CATACATT, ATTAGAG, ATAGATAG"""
# Daten aufbereiten
suspects = suspects_aufbereiten(suspects)
spuren = daten_aufbereiten(scene)
# Schick die Daten durch die Datenbank
suspect = spuren_prüfen(suspects,spuren)
# Ermittle das Ergebnis
if not suspect == "NO MATCH":
print("The suspect is: {}".format(suspect))
else:
print("NO MATCH")
Das hätte wohl etwas den Zeitrahmen gesprengt und ich bin mir auch noch nicht sicher, ob das wirklich die beste Implementierung ist. Produktiv würde ich das jedenfalls nicht zum Einsatz empfehlen, weil nur ein erster Verdächtiger benannt wird, nicht alle möglichen Täter ermittelt werden.
Samstag, 2. März 2013
CSI Crime Lab
Bei Aufgabe „CSI Crime Lab“ von HP Codewars VII sollte eine DNA-Prüfung implementiert werden, was mich etwas Zeit und Energie gekostet hat, weniger aufgrund der Komplexität der Aufgabe, als vielmehr, weil ich mir die Datenstruktur mit 2 dictionaries und dort u. U. hinterlegten Listen erst einmal vorgestellen musste.
Abonnieren
Kommentare zum Post (Atom)
Für beide Datenbereiche sind Wörterbücher nicht wirklich erforderlich, weil ja nie über den Schlüssel auf die Daten zugegriffen werden muss, denn es werden *immer* nur alle Schlüssel/Wert-Paare nacheinander abgearbeitet. Da hätten es Listen mit Tupeln die diese Paare enthalten auch getan.
AntwortenLöschenEs werden für meinen Geschmack zu viele Zwischenergebnisse an Namen gebunden. Statt ``x = x.split('\n')`` und dann ``for y in x:`` hätte man auch gleich ``for y in x.split('\n'):`` schreiben können.
Die gesamte `suspects_aufbereiten()` könnte aus einer einzigen Zeile bestehen: ``return dict(suspect.split(': ') for suspect in suspects.split('\n'))``. Oder wie weiter oben schon erwähnt: ``return [tuple(suspect.split(': ')) for suspect in suspects.split('\n')]``.
Das `replace()` von "On " ist eventuell gefährlich, weil nicht garantiert ist, dass dieses Buchstabensequenz nicht noch einmal in der Zeile auftaucht. Zum Beispiel wenn es am Tatort, einem Radiostudio, ein Schild mit der Aufschrift "On Air" mit Spuren gab. Letztendlich braucht man die Bescchreibung von der DNA-Liste aber auch *überhaupt nicht* zum Lösen der Aufgabe!
`spuren_prüfen()` liesse sich mit `any()` und `all()` vereinfachen.
Der Kommentar vor der Rückgabe passt nicht zum Quelltext. Es wird nicht "" zurückgegegen sondern "NO MATCH".
Die Funktion ist ausserdem fehlerhaft, weil sie beim Vergleich am Ende fest von *drei* Gegenständen ausgeht, was aber nicht garantiert ist so wie ich die Aufgabe verstehe.