ν•™μŠ΅λ‚΄μš©

문제 해결을 μœ„ν•œ 섀계

Play() ν•¨μˆ˜

  • λ§€κ°œλ³€μˆ˜ param0λŠ” μ°Έκ°€μž A, B, C, D μˆœμ„œλ‘œ 이동할 칸을 μ˜λ―Έν•˜λŠ” 숫자λ₯Ό 4κ°œμ”© ν¬ν•¨ν•˜λŠ” λ°°μ—΄μž…λ‹ˆλ‹€.
    • μ˜ˆμ‹œ)Β "1,2,3,4"Β λŠ” A 1μΉΈ, B 2μΉΈ, C 3μΉΈ, D 4μΉΈ μ΄λ™ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. β‡’ 즉, playν•¨μˆ˜λŠ” parameter둜 λ“€μ–΄μ˜€λŠ” A, B, C, D의 μ΄λ™ν•œ μΉΈ 만큼 μ›€μ§μ΄κ²Œ λ§Œλ“€κ³ , κ²Œμž„ μ’…λ£Œ 쑰건을 확인할 수 μžˆλ„λ‘ λ§Œλ“œλŠ” ν•¨μˆ˜μ—¬μ•Ό 함

μ£Όμ‚¬μœ„ κ°’

  • A, B, C, D 4λͺ…μ˜ μ°Έκ°€μžκ°€ μžˆλ‹€κ³  κ°€μ •ν•˜κ³  λ§€ ν„΄λ§ˆλ‹€ μ£Όμ‚¬μœ„ λŒ€μ‹ μ— 1-4 μ‚¬μ΄μ˜ 값이 μž…λ ₯으둜 μ œκ³΅λ©λ‹ˆλ‹€. β‡’ parameter둜 λ“€μ–΄κ°€λŠ” A, B, C, D의 μž…λ ₯은 1-4의 값을 랜덀으둜 λ½‘κ²Œ ν•΄ μ£ΌλŠ” dice() ν•¨μˆ˜ μ œμž‘

이동

  • λͺ¨λ“  μ°Έκ°€μžλŠ” μ‹œμž‘ μ§€μ μ—μ„œ μΆœλ°œν•˜κ³ , μ£Όμ–΄μ§„ 1-4 κ°’λ§ŒνΌ μ΄λ™ν•©λ‹ˆλ‹€. β‡’ play()ν•¨μˆ˜λ₯Ό μ œμž‘ν•˜μ—¬ λͺ¨λ“  μ°Έκ°€μžλ₯Ό μ΄λ™ν•˜κ²Œ λ§Œλ“¦. μ΄λ™ν•œ ν›„μ—λŠ” μ΄λ™ν•œ λ’€μ˜ μ°Έκ°€μž μœ„μΉ˜λ₯Ό 리턴해야 μœ„μΉ˜λ₯Ό 기둝할 수 있음

μ†Œμœ 

  • ν•œ λ²ˆλ„ λ°©λ¬Έν•˜μ§€ μ•Šμ€ 곳에 λˆ„κ΅°κ°€ λ„μ°©ν•˜λ©΄ κ·Έ 곳을 μ†Œμœ ν•©λ‹ˆλ‹€. β‡’ λ§Œμ•½ play()ν•¨μˆ˜μ—μ„œ μœ μ €κ°€ μ›€μ§μ˜€μ„ λ•Œ μ°Έκ°€μž μœ„μΉ˜μ— μ†Œμœ  ν‘œμ‹œκ°€ λ”°λ‘œ λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ©΄ μ†Œμœ  ν‘œμ‹œ β‡’ μ†Œμœ  ν‘œμ‹œλ₯Ό μ–΄λ–»κ²Œ ν•  것인가? β‡’ λ°°μ—΄λ‘œ λ§Œλ“€λ©΄ 인덱슀 번호λ₯Ό 톡해 νŽΈν•˜κ²Œ μ ‘κ·Όκ°€λŠ₯

κ°•νƒˆλΆˆκ°€

  • λ‹€λ₯Έ μ‚¬λžŒμ΄ 이미 μ†Œμœ ν•œ 곳에 λ„μ°©ν•˜λ©΄ 뺏을 수 μ—†μŠ΅λ‹ˆλ‹€. β‡’ μ†Œμœ ν‘œμ‹œκ°€ λ˜μ–΄ 있으면 κ·Έλƒ₯ λ”°λ‘œ 아무것도 없이 μ§€λ‚˜κ°

λ¬΄ν•œλ£¨ν”„

  • μ—¬λŸ¬ μ‚¬λžŒλ“€μ΄ λͺ¨λ“  μž₯μ†Œλ₯Ό μ†Œμœ ν•  λ•ŒκΉŒμ§€ 계속 μž…λ ₯으둜 이동할 수 μžˆμŠ΅λ‹ˆλ‹€. β‡’ λͺ¨λ“  μž₯μ†Œμ— μ†Œμœ  ν‘œμ‹œκ°€ 될 λ•ŒκΉŒμ§€ 이동 β‡’ μ†Œμœ  ν‘œμ‹œλ₯Ό κ³„μ†ν•΄μ„œ 확인해야 함 β‡’ μ†Œμœ  ν‘œμ‹œλŠ” κ³„μ†ν•΄μ„œ 루프λ₯Ό λŒλ©΄μ„œ ν™•μΈν•˜κΈ°λ³΄λ‹€λŠ” λ”°λ‘œ μ†Œμœ ν•œ 곳의 수λ₯Ό μ„Έμ„œ 15κ°œκ°€ 되면 μ’…λ£Œν•˜λ„λ‘ λ§Œλ“ λ‹€λ©΄ μ‹œκ°„ λ³΅μž‘λ„κ°€ 쀄어듀 것

κ²Œμž„ μ’…λ£Œ 쑰건

  • 더 이상 이동할 μž…λ ₯값이 μ—†κ±°λ‚˜, 더 이상 μ†Œμœ ν•  μž₯μ†Œκ°€ μ—†μœΌλ©΄ κ²Œμž„μ„ μ’…λ£Œν•©λ‹ˆλ‹€. β‡’ κ²Œμž„μ’…λ£Œ 쑰건은 이동할 μž…λ ₯값이 μ—†κ±°λ‚˜ μ†Œμœ ν•  μž₯μ†Œκ°€ 없을 경우 β‡’ μ²˜μŒμ—” A, B, C, D 4λͺ…μ˜ μ°Έκ°€μžκ°€ μžˆλ‹€κ³  κ°€μ •ν•˜κ³  λ§€ ν„΄λ§ˆλ‹€ μ£Όμ‚¬μœ„ λŒ€μ‹ μ— 1-4 μ‚¬μ΄μ˜ 값이 μž…λ ₯으둜 μ œκ³΅λ©λ‹ˆλ‹€.λΌλŠ” 말을 보고 λ‚΄κ°€ 직접 ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ μƒκ°ν–ˆμ§€λ§Œ ν•΄λ‹Ή 쑰건을 λ³΄λ‹ˆ μ•„λ§ˆ μž…λ ₯으둜 μ œκ³΅λ˜λŠ” κ²ƒμœΌλ‘œ 생각됨. β‡’ ν•˜μ§€λ§Œ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ μ œμž‘ν•˜κΈ°μ—λŠ” κ²Œμž„λ‹Ή 섀계 μ†Œμš”μ˜ μ‹œκ°„μ΄ 컀 λ”°λ‘œ dice() ν•¨μˆ˜λ₯Ό λ§Œλ“€κΈ°λ‘œ κ²°μ •

리턴

  • μ’…λ£Œ μ‹œμ μ—λŠ” 각 μ°Έκ°€μžλ³„λ‘œ μ†Œμœ ν•œ μž₯μ†Œ 개수λ₯Ό λ¦¬ν„΄ν•˜μ„Έμš”. β‡’ play() ν•¨μˆ˜μ˜ 리턴값 μ˜ˆμ‹œ)Β [ "A" : 4 , "B" : 3 , "C" : 5, "D" : 3 ]

섀계λ₯Ό μœ„ν•œ ν•™μŠ΅ κ³Όμ •μ—μ„œ κΈ°λ‘ν•œ 것듀

객체 μ΄ˆκΈ°κ°’ μ„€μ •

// Map(4) { 'A' => 0, 'B' => 0, 'C' => 0, 'D' => 0 }
let userInfo = new Map([
  ["A", 0],
  ["B", 0],
  ["C", 0],
  ["D", 0],
]);

객체와 맡의 차이

MapObject
λ³΄μ•ˆMap은 μ‚¬μš©μžκ°€ μ œκ³΅ν•˜λŠ” 킀와 값에 λŒ€ν•΄μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŒμ‚¬μš©μžκ°€ μ œκ³΅ν•œ ν‚€-κ°’ μŒμ„Β Object에 μ„€μ •ν•˜λ©΄ κ³΅κ²©μžκ°€ 객체의 ν”„λ‘œν† νƒ€μž…μ„ μž¬μ •μ˜ν•˜μ—¬Β κ°μ²΄ μ£Όμž… 곡격 을 λ°œμƒμ‹œν‚¬ 수 있음
돌발적인 ν‚€ λ¬Έμ œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œΒ nullΒ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  μˆ˜λ„ 있음
ν‚€ μœ ν˜•Map의 ν‚€λŠ” λͺ¨λ“  κ°’(ν•¨μˆ˜, 객체 λ˜λŠ” μ›μ‹œκ°’ 포함)이 될 수 있음Object의 ν‚€λŠ”Β StringΒ λ˜λŠ”Β Symbol이여야 함
ν‚€ μˆœμ„œMapμ—μ„œ ν‚€λŠ” λ‹¨μˆœν•˜κ³  직관적인 λ°©μ‹μœΌλ‘œ μ •λ ¬
MapΒ κ°μ²΄λŠ” ν•­λͺ©μ„ μ‚½μž…ν•œ μˆœμ„œλŒ€λ‘œ ν•­λͺ©, ν‚€ 및 값을 반볡
일반적인 Object의 ν‚€λŠ” μ •λ ¬λ˜μ–΄ μžˆμ§€λ§Œ 항상 κ·ΈλŸ°κ²ƒμ€ μ•„λ‹ˆλ©° μˆœμ„œκ°€ λ³΅μž‘ν•¨. 결과적으둜 속성 μˆœμ„œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” 것이 κ°€μž₯ μ’‹μŒ
크기Map의 μ•„μ΄ν…œμ˜ μˆ˜λŠ”Β size μ†μ„±μ—μ„œ μ‰½κ²Œ κ°€μ Έμ˜¬ 수 있음Object의 μ•„μ΄ν…œ μˆ˜λŠ” μˆ˜λ™μœΌλ‘œ κ²°μ •ν•΄μ•Ό 함
순회Mapμ€Β μˆœνšŒκ°€λŠ₯(iterable)ν•˜κΈ° λ•Œλ¬Έμ— 직접 λ°˜λ³΅ν•  수 있음ObjectλŠ”Β iteration protocol을 κ΅¬ν˜„ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ°œμ²΄λŠ”Β for…of문을 μ‚¬μš©ν•˜μ—¬ μ§μ ‘μ μœΌλ‘œ λ°˜λ³΅ν•  수 μ—†μŒ

μ°Έκ³ :
- κ°μ²΄λŠ” iteration protocol을 κ΅¬ν˜„ν•˜κ±°λ‚˜Β Object.keysΒ ν˜Ήμ€Β Object.entriesΒ λ₯Ό μ‚¬μš©ν•˜μ—¬ 객체의 반볡 κ°€λŠ₯ ν•­λͺ©μ„ 얻을 수 있음
- for…in 문을 μ‚¬μš©ν•˜λ©΄ 객체의 μ—΄κ±° κ°€λŠ₯ν•œ 속성(enumerable)을 λ°˜λ³΅ν•  수 있음
μ„±λŠ₯ν‚€-κ°’ 쌍의 λΉˆλ²ˆν•œ μΆ”κ°€ 및 μ œκ±°μ™€ κ΄€λ ¨λœ μƒν™©μ—μ„œλŠ” μ„±λŠ₯이 μ’€ 더 μ’‹μŒν‚€-κ°’ 쌍의 λΉˆλ²ˆν•œ μΆ”κ°€ 및 μ œκ±°μ— μ΅œμ ν™”λ˜μ§€ μ•ŠμŒ
Serialization and parsing직렬화 λ˜λŠ” ꡬ문 뢄석에 λŒ€ν•œ κΈ°λ³Έ 지원이 μ—†μŒJSON.stringify()λ₯Ό μ‚¬μš©ν•˜μ—¬Β Object을 JSON으둜 직렬화λ₯Ό κΈ°λ³Έ 지원

JSON.parse()λ₯Ό μ‚¬μš©ν•˜μ—¬ JSONμ—μ„œΒ Object으둜의 ꡬ문 뢄석을 κΈ°λ³Έ 지원

μ„€κ³„ν•œ μ½”λ“œ

0-1. μ£Όμ‚¬μœ„ λ§΅

  • play ν•¨μˆ˜μ— 이동할 μΉΈλ“€μ˜ 배열이 parameter둜 λ“€μ–΄κ°„λ‹€λ©΄ play ν•¨μˆ˜μ—λŠ” a,b,c,dλ₯Ό μ›€μ§μ΄κ²Œ λ§Œλ“€λ„λ‘ ν•˜κ³  μ—¬κΈ°μ„œ μ†Œμœ  ν‘œμ‹œλ₯Ό ν•΄μ•Ό 함
  • μ°Έκ°€μžλ³„λ‘œ μ†Œμœ ν•œ μž₯μ†Œ κ°œμˆ˜λŠ” 맡으둜 λ§Œλ“€λ©΄ λ˜μ§€λ§Œ, μ£Όμ‚¬μœ„ 놀이 판 같은 κ²½μš°λŠ” 어디에 기둝? β‡’ κ·Έλƒ₯ 배열에 ν•΄λ‹Ή μΉΈ 수만큼 0으둜 μ±„μ›Œ λ„£κ³  μ†Œμœ ν‘œμ‹œμ˜ 경우 1ν‘œμ‹œν•˜λ©΄ 될듯?
let diceMap = new Array(16).fill(0);

칸은 5μΉΈμ΄μ§€λ§Œ 16개둜 ν•œ μ΄μœ λŠ” μΆœλ°œμ§€λ₯Ό λ”λ―Έλ‘œ λ§Œλ“€μ–΄ 놓아 λ”°λ‘œ diceμ—μ„œ -1을 ν•˜μ§€ μ•Šλ„λ‘ λ§Œλ“¦

0-2. μ°Έκ°€μž μœ„μΉ˜ 및 μ†Œμœ  λ•…

// 각 μ°Έκ°€μžκ°€ μ†Œμœ ν•œ λ•…
let userOwn = new Map([
  ["A", 0],
  ["B", 0],
  ["C", 0],
  ["D", 0],
]);
// μ°Έκ°€μž μœ„μΉ˜
let userLoc = {
  A: 0,
  B: 0,
  C: 0,
  D: 0,
};
// 총 μ†Œμœ  λ•…
let owned = 0;
  • μ°Έκ°€μžκ°€ μ†Œμœ ν•œ 땅은 Map μ‚¬μš©
  • μ°Έκ°€μž μœ„μΉ˜μ˜ 땅은 Object μ‚¬μš©
    • μž¦μ€ μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•˜λŠ”λ°, μ—¬κΈ°μ„œ ν•΄λ‹Ή 값에 μ ‘κ·Όν•˜κ³  μ—…λ°μ΄νŠΈν•˜λŠ” μ½”λ“œλŠ” Objectκ°€ 직관적이라 μ‚¬μš©ν•΄ λ³΄μ•˜μŒ
  • λ°”λ‹₯쑰건을 μœ„ν•œ 총 μ†Œμœ  땅은 숫자λ₯Ό ν• λ‹Ήν•˜μ—¬ λͺ¨λ“  μΉΈ(15μΉΈ)에 λ„λ‹¬ν•˜λ©΄ 더 κ²Œμž„μ„ μ§„ν–‰ν•˜κ²Œ ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ λ”°λ‘œ μ‚¬μš©
    • 맀번 배열을 λŒλ©΄μ„œ μ†Œμœ ν•˜μ§€ μ•Šμ€ 땅을 검사할 ν•„μš”κ°€ μ—†μŒ

1. μ£Όμ‚¬μœ„ κ°’

const dice = () => {
  let diceList = [];
  for (let person = 0; person < 4; person++) {
    const random = Math.floor(Math.random() * 100);
    let moveCnt;
    if (random >= 0 && random < 25) {
      moveCnt = 1;
    } else if (random >= 25 && random < 50) {
      moveCnt = 2;
    } else if (random >= 50 && random < 75) {
      moveCnt = 3;
    } else if (random >= 75 && random < 100) {
      moveCnt = 4;
    }
    diceList.push(moveCnt);
  }
  return diceList;
};
  • 4λͺ…μ˜ μ°Έκ°€μžκ°€ μžˆλ‹€κ³  κ°€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ λͺ…μ‹œ
  • 4λ²ˆλ™μ•ˆ 루프문을 λŒλ©΄μ„œ λžœλ€ν•œ 수λ₯Ό 뽑고 각자 같은 ν™•λ₯ λ‘œ 1, 2, 3, 4λ₯Ό λ‚˜λˆ  moveCntλ³€μˆ˜μ— ν• λ‹Ή
  • ν• λ‹Ήν•œ 수λ₯Ό 배열에 4번 λ„£μ–΄ 리슀트λ₯Ό μ™„μ„±ν•œ ν›„ 리턴

2. Play() ν•¨μˆ˜

const play = (dice) => {
  console.log(dice);
  for (let i = 0; i < dice.length; i++) {
    let user;
    switch (i) {
      case 0:
        user = "A";
        break;
      case 1:
        user = "B";
        break;
      case 2:
        user = "C";
        break;
      case 3:
        user = "D";
        break;
    }
    let move = (userLoc[user] + dice[i]) % 16;
    userLoc[user] = move;
    if (diceMap[move] === 0 && move !== 0) {
      diceMap[move] = 1;
      userOwn.set(user, userOwn.get(user) + 1);
      owned++;
    }
    if (owned === 15) {
      return userOwn;
    }
  }
  return userOwn;
};
  • λ§€κ°œλ³€μˆ˜ param0λŠ” μ°Έκ°€μž A, B, C, D μˆœμ„œλ‘œ 이동할 칸을 μ˜λ―Έν•˜λŠ” 숫자λ₯Ό 4κ°œμ”© ν¬ν•¨ν•˜λŠ” λ°°μ—΄μž…λ‹ˆλ‹€.
    • μ˜ˆμ‹œ)Β "1,2,3,4"Β λŠ” A 1μΉΈ, B 2μΉΈ, C 3μΉΈ, D 4μΉΈ μ΄λ™ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. β‡’ 즉, playν•¨μˆ˜λŠ” parameter둜 λ“€μ–΄μ˜€λŠ” A, B, C, D의 μ΄λ™ν•œ μΉΈ 만큼 μ›€μ§μ΄κ²Œ λ§Œλ“€κ³ , κ²Œμž„ μ’…λ£Œ 쑰건을 확인할 수 μžˆλ„λ‘ λ§Œλ“œλŠ” ν•¨μˆ˜μ—¬μ•Ό 함
  • 이동은 항상 ν•΄μ•Ό ν•˜λ―€λ‘œ μ£Όμ‚¬μœ„ κ°’κ³Ό ν˜„μž¬ μœ μ €μ˜ μœ„μΉ˜λ₯Ό λ”ν•œ λ‹€μŒ 16으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ‘œ μœ„μΉ˜ μ—…λ°μ΄νŠΈ
  • μ†Œμœ ν•  수 μžˆλŠ” 쑰건(ν•΄λ‹Ή 쑰건에 땅에 건물이 μ—†κ³  μ‹œμž‘μ (더미)κ°€ μ•„λ‹Œ 경우)
    • ν•΄λ‹Ή μœ μ €μ˜ 건물 수 μΆ”κ°€
    • ν•΄λ‹Ή μ£Όμ‚¬μœ„νŒμ˜ 땅을 μ†Œμœ ν–ˆλ‹€λŠ” 것을 1둜 ν‘œμ‹œ
    • 총 μ„Έμš΄ 건물 수λ₯Ό μΆ”κ°€
    • μ†Œμœ ν•  수 μ—†λŠ” 경우 κ·Έλƒ₯ μ§€λ‚˜κ°
  • play()ν•¨μˆ˜μ—μ„œ λ§Œμ•½ μ΅œλŒ€ μ†Œμœ  개수λ₯Ό λ„˜μœΌλ©΄ λ°”λ‘œ λΉ μ Έλ‚˜μ˜€λ„λ‘ λ°”λ‹₯쑰건 λͺ…μ‹œ

3. κ²Œμž„ μ‹œμž‘ 및 μ’…λ£Œ

function game(diceCnt) {
  let diceData = dice(diceCnt);
  while (true) {
    let dice = diceData.pop().split(",").map(Number);
    let result = play(dice);
    if (owned === 15 || diceData.length === 0) {
      return result;
    }
  }
}
 
console.log(game(1));
  • λ‚΄κ°€ ν„΄μˆ˜λ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή ν„΄μˆ˜λ§ŒνΌ μ§„ν–‰ν•˜λ„λ‘ λ§Œλ“¦
  • while(true)κ°€ λ¬΄ν•œλ£¨ν”„μ— κ°‡νž μœ„ν—˜μ„±μ΄ μžˆμ§€λ§Œ λ°”λ‹₯쑰건을 꼼꼼히 λͺ…μ‹œν•˜μ—¬ νƒˆμΆœ
    • λ°”λ‹₯쑰건
      • μ£Όμ‚¬μœ„κ°€ 더 없을 λ•Œ
      • 더 이상 μ†Œμœ ν•  땅이 없을 λ•Œ

μ™„μ„± μ½”λ“œ

let diceMap = new Array(16).fill(0);
let userOwn = new Map([
  ["A", 0],
  ["B", 0],
  ["C", 0],
  ["D", 0],
]);
let userLoc = {
  A: 0,
  B: 0,
  C: 0,
  D: 0,
};
let owned = 0;
 
const play = (dice) => {
  for (let i = 0; i < dice.length; i++) {
    let user;
    switch (i) {
      case 0:
        user = "A";
        break;
      case 1:
        user = "B";
        break;
      case 2:
        user = "C";
        break;
      case 3:
        user = "D";
        break;
    }
    let move = (userLoc[user] + dice[i]) % 16;
    userLoc[user] = move;
    if (diceMap[move] === 0 && move !== 0) {
      diceMap[move] = 1;
      userOwn.set(user, userOwn.get(user) + 1);
      owned++;
    }
    if (owned === 15) {
      return userOwn;
    }
  }
  return userOwn;
};
 
const dice = (cnt) => {
  let diceData = [];
  for (let i = 0; i < cnt; i++) {
    let diceList = [];
    for (let person = 0; person < 4; person++) {
      const random = Math.floor(Math.random() * 100);
      let moveCnt;
      if (random >= 0 && random < 25) {
        moveCnt = 1;
      } else if (random >= 25 && random < 50) {
        moveCnt = 2;
      } else if (random >= 50 && random < 75) {
        moveCnt = 3;
      } else if (random >= 75 && random < 100) {
        moveCnt = 4;
      }
      diceList.push(moveCnt);
    }
    diceData.push(diceList.join(","));
  }
  return diceData;
};
 
function game(turns) {
  let diceData = dice(turns);
  while (true) {
    let dice = diceData.pop().split(",").map(Number);
    let result = play(dice);
    if (owned === 15 || diceData.length === 0) {
      return result;
    }
  }
}
 
console.log(game(1));