Vergleich von zwei strings in Haskell
Stieß ich auf ein ziemlich dummes Praxis-problem, die aufgeführt wurde als einfach, so dass ich dachte, ich könnte es tun. Die Prämisse ist, dass muss ein Arzt hört einen Patienten sagen, dass aah in Auftrag zu geben, eine Diagnose, aber die aah aus der patient muss mit der aah Wunsch des Arztes. Wenn der Arzt fragt nach aaaaah, und der patient sagt, ah, dann wird keine Diagnose gegeben werden kann. Das Haskell-Programm soll zu Lesen, in der ein Arzt und ein patient aah in Ordnung und Rückgabe ein Boolescher Wert, wenn eine Diagnose gegeben werden kann. Zuerst dachte ich, Sie müsse identisch sein so das war mein code:
seeDoctor :: String -> String -> Bool
seeDoctor a b = if a == b then True
else False
Jedoch, ich merkte, ich war nicht nach allen Regeln der problem-und es war nicht so einfach. Der patient kann sagen, aah länger als der Arzt, und True zurückgeben, so "aah" "aaaah" gibt True zurück, ebenso wie "" "aaah" und "h", "aah", sondern "aaah" "ah" "False" zurückgibt. Aber selbst wenn der Doktor nicht enthalten ein 'h' in Ihrem aah, der patient muss also "ein" "ein" False " zurückgibt, aber mein code würde True zurückgeben. Also, wenn der patient so etwas sagt, muss es sein, die notwendige Anzahl von 'a' gefolgt von einem einzelnen 'h' und keine anderen Zeichen. Sehen Sie, ich habe einmal den Versuch gestartet, den vorgeschlagenen test Fällen, merkte ich, wie wenig ich es verstanden habe. Kann ich halten eine Anzahl von 'a' in jedem string? Wie kann ich prüfen, ob zusätzliche Zeichen? Sorry das dauerte eine Weile zu Lesen. Vielen Dank, dass Ihr es so weit.
Hier ist die genaue Frage:
"Wenn wir gehen, um zu sehen, ein Arzt, der Arzt fragt immer uns, zu sagen "aaah".
Manchmal, der Arzt muss uns sagen Sie "Aaaaah", aber wir können nur
zu sagen "aaah". In diesem Fall der Arzt nicht in der Lage ist zu diagnostizieren, unsere
Krankheit, da die 'a' s in unserem "aaah" sind Sie weniger als seine oder Ihre
Anforderungen. Schreiben Sie nun eine Haskell-Funktion, die aufgerufen wird seeDoctor zu beurteilen
wenn der Arzt diagnostizieren kann, uns mit unseren "aah". Die Eingabe der
die Funktion besteht aus zwei strings. Der erste string ist das "aaaah" der
Arzt braucht, und die zweite Zeichenfolge ist der "aah" wir sind in der Lage zu sagen.
Die Ausgabe "True", wenn unsere "aah" erfüllt die Anforderungen des Arztes, und
die Ausgabe "False" sonst. Sollte der test pass mit einem "True" nur, wenn
Kleinbuchstaben 'a' und 'h' s verwendet werden, und jeder string enthält eine bestimmte
Anzahl der 'a' gefolgt von einem einzelnen 'h'."
- Kannst du die Anfrage bei verbatim? Die Art und Weise, die Sie es beschreiben, ist nicht ganz klar.
- Also wenn ich es richtig verstehe, sind beide strings haben das format
a*h*
(das ist eine regex, die*
bedeutet, dass *die Anzahl der vorherigen char), und die Anzahl dera
's undh
s sollte größer als oder gleich den angeforderten aahh? - Was sollte die Ausgabe von
seeDoctor "foo" "aaaaaaaah"
? - Ich glaube, dass es False sein sollte, in diesem Fall, @MarkSeemann.
- Warum gehst du nicht einfach filter
'a'
s undcompare
Ihre Länge..? - Auch bemerken, dass Ihre erste Versuch wird eine gemeinsame antipattern. Jedes mal, wenn Sie sehen
if p then True else False
Sie können schreiben Sie einfachp
. In diesem Fall könnten Sie selbst geschrieben habenseeDoctor = (==)
und nicht explizit über die Argumente.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie versuchen zu lernen, Haskell, ich werde nicht zu geben Ihnen eine Lösung, aber ich werde versuchen, Ihnen genügend Hinweise, um Ihnen zu ermöglichen, um eine Funktion selbst zusammen.
Strings sind Listen, so können Sie die normalen Funktionen der Liste aus
Data.List
. Zum BeispielisSubsequenceOf
fast tut, was Sie brauchen:Wenn ich interpretiere die Beschreibung des Problems richtig, sollte man wohl auch prüfen, ob nur die
a
undh
sind in der input-strings, und dash
ist das Letzte Zeichen.Um zu überprüfen, dass
h
ist das Letzte Zeichen, können Sie mit derlast
Funktion:Vielleicht möchten Sie auch prüfen wollen, die input für Schurken-Charaktere, und zurück
False
wenn die beiden strings enthalten andere Zeichen alsa
undh
...Was würden Sie tun, um eine Zeichenfolge wie
"aha"
, obwohl? Das überlasse ich Ihnen als übung 🙂