2017-09-20 15 views
2

私は、簡単にリストアップされたかなり愚かな練習問題に出くわしました。診断を与えるために医者が患者の言うことを聞かなければならないという前提があるが、患者からのaahは医師の要求するaahと一致しなければならない。医者がアアアアを求めて、患者がああと言ったら、診断はできません。ハスケルプログラムは、医師と患者aahをこの順序で読み込み、診断を与えることができる場合のBool値を返します。最初に私は、彼らが同じになるように必要と思わので、これは私のコードだった:ハスケルの2つの文字列を比較する

seeDoctor :: String -> String -> Bool 
seeDoctor a b = if a == b then True 
       else False 

しかし、私は、問題のすべてのルールを以下のいなかった、それはそう単純ではないことに気づきました。患者は医者よりも長い間aahと答えてTrueを返します。 "aah" "aaaah"はTrueを返します。 "aaah"と "h" "aah"と同じですが、 "aaah" "ah"はFalseを返します。しかし、医者が自分のaahに「h」を含めなくても、患者はそうしなければならないので、「a」「a」はFalseを返しますが、私のコードはTrueを返します。したがって、患者が何かを言うならば、必要な数の 'a'の後に単一の 'h'が続き、他の文字はありません。私が提案したテストケースを試してみると、私が理解していなかったことが分かりました。各文字列に「a」の数を保持できますか?余分な文字はどうやってチェックするのですか?申し訳ありませんが、これは読めるのに時間がかかりました。これまでこれを作ってくれてありがとう。ここで

が正確な質問です:

AAAHを「私たちは医者を見に行くと、医師は常に言って、私たちに求められ 『『aaaaaahが、』 時には、医師は言うために私たちを必要とします。』その場合、私たちの "aaah"のaは自分の の要件よりも少ないので、医師は という病気を診断することができません。医師が私たちの "aah"で診断できるかどうか判断するには、Doctor to doctor to 関数の入力は2つの文字列で構成されています。最初の文字列は "aaaah"です 医師のニーズと2番目の文字列は、私たちが言うことができる "ああ"です。 "aah"が医師の要件を満たしている場合は "True"、それ以外の場合は が "False"を出力します。テストはして合格しなければならない「真」のみ 「のと」時間のが使用されている小文字、および各文字列がh「」あなた以来

+0

あなたは逐語でリクエストを投稿できますか?あなたがそれを記述する方法は、あまり明確ではありません。 –

+0

それを正しく理解すれば、両方の文字列は 'a * h *'という形式になります(これは正規表現です、 '*'は前のcharの任意の数を意味します)、 'a'と' h 'sは要求されたaahh以上でなければならない? –

+2

'seeDoctor" foo "" aaaaaaaah "'の出力はどうでしょうか? –

答えて

5

『』シングルに続いての」一定の 数が含まれている場合ハスケルを勉強しようとしていますが、私はあなたに解決策を与えるつもりはありませんが、自分で関数を組み込むための十分なヒントを与えるつもりです。

文字列はリストなので、通常のリスト機能はData.Listです。例えば、isSubsequenceOfはほとんどあなたが必要とするものを実行します:

Prelude Data.List> isSubsequenceOf "aah" "aaah" 
True 
Prelude Data.List> isSubsequenceOf "aaaah" "aah" 
False 

問題の説明を正しく解釈する場合は、ahだけが入力文字列にあり、hが最後の文字であることも確認してください。

Prelude Data.List> last "aaaah" 
'h' 
Prelude Data.List> last "ah" 
'h' 
Prelude Data.List> last "foo" 
'o' 

はおそらく、あなたはまた、不正な文字の入力をチェックし、二つの文字列ならばFalseを返すようにしたいと思います:

hが最後の文字であることを確認するためには、last機能を使用することができますah以外の文字を含む

Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah" 
True 
Prelude Data.List> all (\c -> c == 'a' || c == 'h') "aaah!" 
False 

"aha"のような文字列についてはどうでしょうか?私はそれを練習として残しましょう:)

関連する問題