Bandwagoner

Bandwagoner

학습 연습 문제

소개

레이블이 있는 필드

사용자 정의 타입의 변형이 데이터를 담고 있으면 이를 레코드라고 하고, 담긴 각각의 값은 _필드_에 들어 있어요.

pub type Rectangle {
  Rectangle(
    Float, // The first field
    Float, // The second field
  )
}

Gleam에서는 가독성을 높이기 위해 필드에 이름을 붙일 수 있어요.

pub type Rectangle {
  Rectangle(
    width: Float,
    height: Float,
  )
}

레이블을 사용하면 레코드의 생성자에 인자를 순서에 상관없이 전달할 수 있어요.

let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)

a == b
// -> True

사용자 정의 타입에 변형이 하나만 있으면 .label 접근자 문법으로 레코드의 필드를 가져올 수 있어요.

let rect = Rectangle(height: 10.0, width: 20.0)

rect.height // -> 10.0
rect.width  // -> 20.0

레코드 업데이트 문법은 사용자 정의 타입에 변형이 하나일 때, 기존 레코드에서 일부 필드를 새로운 값으로 바꾼 새 레코드를 만들 때 사용할 수 있어요.

let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)

tall_rect.height // -> 50.0
tall_rect.width  // -> 20.0

패턴 매칭으로 레코드에서 값을 추출할 때도 레이블을 사용할 수 있어요.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, width: _) if h >. 20.0 -> True
    _ -> False
  }
}

일부 필드에만 매칭하고 싶다면 스프레드 연산자 ..를 사용해서 나머지 필드를 무시할 수 있어요.

pub fn is_tall(rect: Rectangle) {
  case rect {
    Rectangle(height: h, ..) if h >. 20.0 -> True
    _ -> False
  }
}

지침

이 연습 문제에서 여러분은 열렬한 스포츠 팬이고, 막 NBA 농구에 대한 열정을 발견했어요. NBA 농구가 처음이라, NBA 역사를 깊이 파고들면서 팀과 코치, 그들의 승패 기록을 추적하고 서로 비교하고 있어요.

아직 좋아하는 팀이 없기 때문에, 특정 팀을 응원할지 판단하는 알고리즘도 만들어 볼 거예요.

여러분만의 팀 응원 알고리즘을 개발하는 데 도움이 될 일곱 가지 과제가 있어요.

1. 모델 정의하기

다음 두 필드를 가진 Coach 레코드를 정의해요:

  • name: 코치의 이름, String 타입이에요.
  • former_player: 코치가 선수 출신인지 나타내며, Bool 타입이에요.

다음 두 필드를 가진 Stats 레코드를 정의해요:

  • wins: 승리 횟수, Int 타입이에요.
  • losses: 패배 횟수, Int 타입이에요.

다음 세 필드를 가진 Team 레코드를 정의해요:

  • name: 팀의 이름, String 타입이에요.
  • coach: 팀의 코치, Coach 타입이에요.
  • stats: 팀의 전적, Stats 타입이에요.

2. 팀의 코치 만들기

코치 이름과 선수 출신 여부를 매개변수로 받아 Coach 레코드를 반환하는 create_coach 함수를 구현해요:

create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)

3. 팀의 전적 만들기

승리 횟수와 패배 횟수를 매개변수로 받아 Stats 레코드를 반환하는 create_stats 함수를 구현해요:

create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)

4. 팀 만들기

팀 이름과 코치, 전적을 매개변수로 받아 Team 레코드를 반환하는 create_team 함수를 구현해요:

let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Larry Bird", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

5. 코치 교체하기

NBA 구단주들은 성격이 급해서, 팀 성적이 나쁘면 코치가 자주 교체된다는 걸 알게 됐어요. 팀과 새 코치를 매개변수로 받아, 새 코치가 반영된 팀을 반환하는 replace_coach 함수를 구현해요:

let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)

let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
//   name: "Indiana Pacers",
//   coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
//   stats: Stats(wins: 58, losses: 24),
// ) 

6. 같은 팀인지 확인하기

전적을 파고들면서 팀과 그 전적 목록을 관리하고 있어요. 가끔 실수해서 목록에 중복된 항목이 생기기도 하죠. 두 팀을 받아 같은 팀이면 True를, 그렇지 않으면 False를 반환하는 is_same_team 함수를 구현해요:

let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)

let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)

is_same_team(pacers_team, lakers_team)
// -> False

7. 팀을 응원해야 하는지 확인하기

수많은 팀과 경기를 살펴본 끝에 알고리즘을 하나 떠올렸어요. 다음 중 하나라도 참이면 그 팀을 응원해요:

  • 코치의 이름이 "Gregg Popovich"예요
  • 코치가 선수 출신이에요
  • 팀의 이름이 "Chicago Bulls"예요
  • 팀이 60경기 이상 승리했어요
  • 팀이 승리보다 패배가 많아요

팀을 받아 응원해야 하면 True를, 그렇지 않으면 False를 반환하는 root_for_team 함수를 구현해요:

let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Gleam Exercism

Bandwagoner 문제를 시작해 볼 준비가 됐나요?

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