www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

florianwe23

Gepostet:
08.12.2008 19:51

Vorkommen einer Liste in einer anderen Liste finden  
Hallo zusammen,
ich möchte bzw. muss eine Funktion schreiben die folgendes tut
ich habe eine "Liste"
["AAbbbbbbbbAAbbbbbbbAA"]
und eine Liste
["AA"]
nun möchte ich die genauen Positionen vom Vorkommen von Liste 2 in 1 finden
also
[1,11,20]
soll das Ergebniss sein.

in php würde mb_strpos etwas ähnliches tun.

Meine Frage
Gibt es evtl bereits eine Funktion in Haskell die soetwas macht oder wenn nicht, wäre ich über einen Tip wie ich die Sache angehen kann dankbar.
Ich hab vorher schon eingen anderen Programmiersprachen programmiert. Da wäre eine solche Aufgabe in ein paar Minuten gelöst. Hier sitze ich allerdings schon seid ein paar Stunden mit wachsendem frust dran. Wäre also nett, wenn mir jemand auf die Sprünge helfen kann.
Gruß
Zum Seitenanfang    
 
florianwe23

Gepostet:
09.12.2008 13:04

   
Hallo,
ich habe die Lösung falls es jemanden intressiert oder so


exactmatch::(Eq a)=>[a]->[a]->[Int]

exactmatch x y = kram 0 (take (length x) x) (take (length y) y)
where
kram a [] c = []

kram a b c = if take (length c) b == take (length c) c then [a+1]++ kram (a+1) (drop 1 b) c else [] ++ kram (a+1) (drop 1 b) c
Zum Seitenanfang    
 
david

Gepostet:
05.03.2009 22:53

   
als Listenkomprehension siehts etwas übersichtlicher aus :)

exactmatch :: (Eq a) => [a] -> [a] -> [Int]
exactmatch a b = let v = (length b) in [ (i+1) | i <- [0..((length a) - v)] , b == (take v (drop i a))]

ich geh dabei davon aus, dass deine zwei Listen an sich Strings (also Listen aus Chars) sind
also
a = "AAbbbbbbbbAAbbbbbbbAA"
b = "AA"

hoffe das ist der Aufgabe entsprechend
Zum Seitenanfang    
 
chrisslater

Gepostet:
29.03.2009 12:27

   
Ich hätte da mal ne Frage....

Das Programm von dir funktioniert wunderbar, aber ich versteh nicht wirklich was bei der Programmzeile exactmatch a b = let v = (length b) in [ (i+1) | i <- [0..((length a) - v)] , b == (take v (drop i a))] eigentlich passiert. Wäre nett, wenn mir das jemand erklären könnte:

Danke.
Zum Seitenanfang    
 
Siracusa

Gepostet:
31.03.2009 17:03

   
Hallo,

exactmatch a b = let v = (length b)
in [ (i+1) | i <- [0..((length a) - v)] , b == (take v (drop i a))]

v erhält erstmal die Länge von b. i durchläuft dann alle Werte in der Liste [0..((length a) - v)], also alle Zahlen von 0 bis (Länge von a) - v. Dann wird geprüft, ob der Substring der Länge v beginnend an Position i im String a gleich b ist und falls ja, dann wird (i+1) in die Ergebnisliste aufgenommen, sonst nicht.


Viele Grüße,

Siracusa
Zum Seitenanfang