Seite 1 von 1

Algorithmus problem

Verfasst: Freitag 27. August 2010, 14:15
von mit
Hallo,
ich habe folgende eingabe Datei:

Code: Alles auswählen

Eingabe Datei:
#A, B, D
C, A, A
A, C, C
A, C, G
T, A, A
T, A, T
T, A, X
Die Datei besteht aus einer Überschrift (#) und Daten.
1. ) Wenn in einer Zeile zwei gleiche Buchstaben z.B A und A in Spalte B und D besitzt dann wird z.B. die Variable BD inkrementiert.
2.) Eine Zeile wird nicht betrachtet wenn:
a) alle Buchstaben unterschiedlich sind oder
b) ein oder mehrere X vorhanden sind.

Code: Alles auswählen

Zwischen schirtt:
#A, B, D   A/B B/D A/D
C, A, A        +1
A, C, C        +1        
A, C, G        
T, A, A        +1
T, A, T            +1 
T, A, X        
A, A, T    +1

Code: Alles auswählen

Ergebnis:
A/B = 1
B/D = 3
A/D = 1      

Code: Alles auswählen

AB = BD = AD = 0
for line in open("../test/input.txt"):
  if line[0] != "#":
    print line.rstrip().split(',')
Leider weiss ich nicht wie man am Besten dieses Problem lösen könnte.

Vielen Dank im Voraus.

Re: Algorithmus problem

Verfasst: Freitag 27. August 2010, 14:22
von cofi
Etwas mehr Infos bitte: Wenn 2 Zeichen identisch sind, ist dann die Variable vorgegeben oder muss man das aus den Zwischenschritten auslesen?
Oder berechnet sich das anhand der Stellen/Zeichen der Duplikate?

Fuer Strings gibt es btw `startswith`

Re: Algorithmus problem

Verfasst: Freitag 27. August 2010, 14:41
von EyDu
Hallo.

Meinst du so?

Code: Alles auswählen

>>> spam = """CAA
... ACC    
... ACG       
... TAA
... TAT
... TAX       
... AAT""".splitlines()
>>> def eggs(x):
...     if "X" in x:
...         return None
...     for (i, u), (j, v) in itertools.combinations(enumerate(x), 2):
...         if u == v:
...             return (i, j)
... 
>>> map(eggs, spam)
[(1, 2), (1, 2), (3, 4), (1, 2), (0, 2), None, (0, 1)]
Der Rest ist deine Aufgabe.

Sebastian

Re: Algorithmus problem

Verfasst: Freitag 27. August 2010, 14:45
von mit
Den Zwischen schritt habe ich nur eingefügt um das Problem besser erklären zu können und muss nicht vom skript ausgegeben werden. Es soll nur die Eingabedatei betrachtet werden.
Wenn zwei Zeichen gleich sind dann wird die jeweilige Variable (AB oder BD oder AD) inkrementiert.

Re: Algorithmus problem

Verfasst: Freitag 27. August 2010, 14:54
von cofi
Unter der Annahme, dass der Header immer die erste Zeile ist:

Code: Alles auswählen

with open("data") as f:
    first, second, third = map(str.strip, f.readline()[1:].split(",", 3))
    first_with_second = "%s/%s" % (first, second)
    second_with_third = "%s/%s" % (second, third)
    first_with_third = "%s/%s" % (first, third)
    counter = {
        first_with_second : 0,
        second_with_third : 0,
        first_with_third : 0,
        }
    for line in f:
        if line.startswith("#"):
            continue
        first, second, third = map(str.strip, line.split(",", 3))
        if "X" in (first, second, third):
            continue
        elif first == second:
            counter[first_with_second] += 1
        elif first == third:
            counter[first_with_third] += 1
        elif second == third:
            counter[second_with_third] += 1

Re: Algorithmus problem

Verfasst: Freitag 27. August 2010, 15:09
von EyDu
mit hat geschrieben:Den Zwischen schritt habe ich nur eingefügt um das Problem besser erklären zu können und muss nicht vom skript ausgegeben werden. Es soll nur die Eingabedatei betrachtet werden.
Wenn zwei Zeichen gleich sind dann wird die jeweilige Variable (AB oder BD oder AD) inkrementiert.
Mein Zwischenergebnis ist doch schon die Lösung. Du musst nur noch zählen wie häufig die einzelnen Tupel vorkommen.

Re: Algorithmus problem

Verfasst: Samstag 28. August 2010, 12:16
von mit
Vielen Dank für die Lösungen.