"wer mag wen" - arbeiten mit Strings

CDW

0
Mitarbeiter
Eingereicht von Ook!:
1.) Wer mag wen?! - Schwierigkeit 1

Jim likes Larry and Jean, but hates Kim.
Bob loves Jean, and likes Larry and Kim.
Jean loves Bob, likes Jim, but hates Kim.
Kim hates Jim, likes Larry and Bob.
Larry loves Martin, and hates Karl and Jean.


Schreibe ein Programm, dass für jede Person angibt, wen sie liebt, mag und hasst.
Die Aufgabe besteht darin, den Text zu splitten in z.B. Listen
Beispiel anhand des ersten Satzes:
Jim: [ likes: Larry, Jean] [loves: ] [ hates: Kim]
Hier sollen die Sätze auseinandergenommen werden. Man beachte den Schwierigkeitsgrad und das Ziel (Stringfunktionen seiner Programmiersprache kennenzulernen) - also NICHT unbedingt Lex&yacc/SableCC/Javacc/usw anwenden ;)
 
Also genau für sowas wurde z.B. Prolog geschrieben.
Da spielt auch Stark Graphentheorie mit rein.

Also Ziel ist es einen Parser zu schreiben, der das Wissen hat, dass die Prädikate(likes/hates) immer als Subjekt-Prädikat-Objekt stehen. Und dann nurnoch Stringschnippelei. Ist also nicht sooooooo schwer.
 
Nicht schön aber selten:
Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

text = """Jim likes Larry and Jean, but hates Kim.
Bob loves Jean, and likes Larry and Kim.
Jean loves Bob, likes Jim, but hates Kim.
Kim hates Jim, likes Larry and Bob.
Larry loves Martin, and hates Karl and Jean."""

reg_exps = {}
for verb in ("loves", "hates", "likes"):
    reg_exps[verb] = re.compile("%s ([a-zA-Z]*)( and [a-zA-Z]*)*" % verb)

for line in text.split("\n"):
    person = line.split(" ")[0]
    print person
    for verb in reg_exps.keys():
        persons = reg_exps[verb].findall(line)
        print "  ", verb,
        try:
            print [p.replace(" and ", "") for p in persons[0] if p]
        except IndexError:
            print "nobody"
 
@01: wenn Du da Graphentheorie brauchst, machst Du irgendwas falsch ;)
Das ist wirklich NUR String splitten/verarbeiten.
 
Dachte eher an eine Exportfkt für DOT also Graphviz.
Sry hatte verpeilt das das als Competition gedacht war :rolleyes:
 
Original von CDW
@01: wenn Du da Graphentheorie brauchst, machst Du irgendwas falsch ;)
Das ist wirklich NUR String splitten/verarbeiten.

Es wäre ein Graph wenn die Gefühle sich transitiv verbreiteten :) z.B. ich mag Bob, bob mag Alice also mag ich auch Alice.
 
Code:
$ cat list
Jim likes Larry and Jean, but hates Kim.
Bob loves Jean, and likes Larry and Kim.
Jean loves Bob, likes Jim, but hates Kim.
Kim hates Jim, likes Larry and Bob.
Larry loves Martin, and hates Karl and Jean.
$ perl -ne '($Z,$_)=/(\w+)\s+(.+)\.\n/;my%h;for(split/,/){($l)=/(likes|hates|loves)/;s/likes|loves|hates|but|and//g;$h{$l}=$_}print"$Z:\n";for(keys%h){print"$_\t$h{$_}\n"}print"\n"' list
Jim:
likes    Larry  Jean
hates      Kim

Bob:
likes      Larry  Kim
loves    Jean

Jean:
likes     Jim
hates      Kim
loves    Bob

Kim:
likes     Larry  Bob
hates    Jim

Larry:
hates      Karl  Jean
loves    Martin
Viel kleiner hab ichs nit bekommen =(
 
Zurück
Oben