2017-09-20 9 views
2

나는 쉽게 할 수있는 바보 같은 연습 문제를 발견했다. 그래서 나는 그것을 할 수있을 것이라고 생각했다. 전제는 진단을하기 위해 의사가 환자의 말을 듣지 않으면 안되지만 환자의 aah는 의사가 요청한 aah와 일치해야한다는 전제가 있습니다. 의사가 아아아아를 구하고 환자가 아라고 말하면 진단을 내릴 수 없습니다. Haskell 프로그램은 의사와 환자 aah를 순서대로 읽어야하고 진단을받을 수 있다면 Bool 값을 반환해야합니다. 처음에 나는 그들이 동일하게 필요하다고 생각 그래서 이것은 내 코드이었다하스켈에서 두 개의 문자열 비교하기

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"는 거짓을 반환하지만 내 코드는 True를 반환합니다. 환자가 아무 말도하지 않는다면 'a'다음에 'h'가 하나 있어야하고 다른 문자가 없어야합니다. 제가 제안한 테스트 사례를 시작하기 시작한 후에는 제가 이해하지 못하는 것을 깨달았습니다. 각 문자열에 'a'수를 유지할 수 있습니까? 여분의 문자는 어떻게 확인합니까? 죄송합니다. 읽으려면 시간이 좀 걸립니다. 여기까지 와줘서 고마워. 여기

정확한 질문이다 ". 때로는 의사가 말을 우리에게 필요합니다"

아아 아아 "우리가 의사에게 갈 때, 의사가 항상 말을 우리에게 묻습니다"aaaaaah "하지만, 우리는 "aaah"라고 대답 할 수 있습니다.이 경우 우리는 "우리의"aaah "의 a가 자신의 요구 사항보다 적기 때문에 우리의 질병을 진단 할 수 없습니다. 이제는 하스켈이라는 함수를 작성하십시오. 의사가 우리의 "aah"로 진단 할 수 있다면 의사를 판단하십시오 함수의 입력은 두 개의 문자열로 구성됩니다. 첫 번째 문자열은 의사가 필요하고 두 번째 문자열은 우리가 말할 수있는 "aah"입니다. "aah"가 의사의 요구 사항을 충족하면 "True"를 출력하고 그렇지 않은 경우 은 "False"를 출력합니다. 이 테스트에 통과해야 "참"단지 '의와'시간의가 사용되는 소문자, 각 문자열은 시간 '. "당신 이후

+0

요청을 그대로 게시 할 수 있습니까? 당신이 그것을 묘사하는 방식은 분명하지 않습니다. –

+0

그래서 올바르게 이해하면 두 문자열의 형식은'a * h *'(정규 표현식,'*'는 이전 문자 중 임의의 숫자를 의미 함),'a '와'h 요청한 아아보다 크거나 같아야합니까? –

+2

'seeDoctor "foo" "aaaaaaaah"'의 출력은 무엇이되어야합니까? –

답변

5

' '는이 하나의 다음의'특정 번호가 포함 된 경우 하스켈을 배우려고 노력 하겠지만, 해결책을주지는 않겠지 만, 함께 함수를 넣을 수있는 충분한 힌트를 제공하려고합니다.

문자열은 목록이므로 보통 목록 기능은 Data.List입니다. 예를 들어 isSubsequenceOf은 필요한 것을 거의 처리합니다.

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

문제 설명을 올바르게 해석하면 입력 문자열에 ah 만 있고 그 마지막 문자가 h인지 확인해야합니다. 아마도 당신은 또한 불량 문자 입력을 확인하고 두 개의 문자열 경우 False을 반환 할 것

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

: 그 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"과 같은 문자열에 대해 어떻게 하시겠습니까? 나는 이것을 운동으로 남겨 둘 것입니다.