트랙
/
Gleam
Gleam
/
연습 문제
/
숫자 맞히기 게임
숫자 맞히기 게임

숫자 맞히기 게임

학습 연습 문제

소개

case 표현식

Gleam에서는 case 표현식을 사용해 코드를 조건부로 실행할 수 있어요. case 표현식을 사용하면 값을 하나 이상의 _패턴_과 비교할 수 있어요. 이런 패턴의 한 예가 _리터럴 패턴_으로, 값을 리터럴 값(예: 1이나 "hello")과 일치시켜요.

case 표현식은 case 키워드로 작성해요:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

다른 언어의 switch 문과 비슷해 보일 수도 있지만, 다른 패턴들도 함께 사용하면 패턴 매칭이 진가를 발휘해요. 그런 패턴 가운데 하나가 _변수 패턴_으로, 변수에 값을 할당할 수 있게 해줘요. 다음 예시에서는 변수 i에 number가 0이 아니면 number의 값이 할당돼요:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

때로는 패턴에 조건을 하나 더 추가하고 싶을 수 있어요. 이것을 가드(절)라고 하는데, if 키워드를 사용해 추가할 수 있어요:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

성능상의 이유로 가드에는 기본적인 수학 연산자와 불리언 연산자만 허용되고, 다른 함수는 가드에 사용할 수 없어요.

위 예시에서는 가능한 모든 입력에 일치하는 패턴이 있는 건 아니에요. 컴파일러가 이를 감지하고 오류를 출력해요. 이것을 _완전성 검사_라고 해요. 이 경고를 해결하려면 모든 경우를 처리해야 해요. 이를 위해 어떤 값과도 일치하는 패턴인 _버림 패턴_을 사용할 수 있어요:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

한 절에서 여러 패턴을 일치시킬 수 있으며, 각 패턴 사이는 |로 구분해요. 절에는 가드를 하나만 추가할 수 있어요:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

case 표현식은 일치하는 패턴을 찾아 그 패턴에 연결된 로직을 실행할 때까지 값을 위에서 아래로 각 패턴과 비교해요. 패턴의 순서가 중요해요!

지침

이 연습 문제에서는 친구와 함께 숫자 맞히기 게임을 해요. 규칙은 간단해요. 1과 100 사이에서 숫자 하나를 몰래 고르면, 친구가 어떤 숫자를 골랐는지 맞혀봐요. 친구를 돕기 위해, 추측한 숫자가 고른 숫자(42)에 얼마나 가까운지에 따라 다르게 대답해요. 각 대답에 대한 규칙은 다음과 같아요.

  • 추측한 숫자가 42라면: "Correct"
  • 추측한 숫자가 41이나 43이라면: "So close"
  • 추측한 숫자가 41보다 작다면: "Too low"
  • 추측한 숫자가 43보다 크다면: "Too high"

추측에 대한 대답을 구현하는 네 가지 과제가 있어요.

1. 정답인 추측에 대답하기

정답인 추측에 대답하도록 reply 함수를 구현해요.

reply(42)
// -> "Correct"

2. 가까운 추측에 대답하기

가까운 추측에 대답하도록 reply 함수를 수정해요.

reply(41)
// -> "So close"

3. 너무 낮은 추측에 대답하기

너무 낮은 추측에 대답하도록 reply 함수를 수정해요.

reply(25)
// -> "Too low"

4. 너무 높은 추측에 대답하기

너무 높은 추측에 대답하도록 reply 함수를 수정해요.

reply(88)
// -> "Too high"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Gleam Exercism

숫자 맞히기 게임 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.