Алгоритм кодовых войн

Проблема

Есть две группы враждебных писем.

적대하는 두 문자 그룹이 있다.

Напишите функцию, которая принимает строку «бой», состоящую только из маленьких букв, и возвращает, кто выиграл бой.

'борьба'

Когда побеждает левая сторона, верните «Победа левой стороны!», когда побеждает правая сторона, верните «Победа правой!», в противном случае верните «Давай снова сразимся!».

левая сторона가 이긴다면: Левая сторона побеждает!

right side가 이긴다면: Правая сторона побеждает!

그 외의 경우에는: Давай снова сразимся!

Мощность левой стороны:

w: 4

p: 3

b: 2

s: 1

Сила правой стороны:

m: 4

q: 3

d: 2

z: 1

Решение 01

function alphabetWar(fight) {
  const leftPower = {
    w: 4,
    p: 3,
    b: 2,
    s: 1
  };
  const rightPower = {
    m: 4,
    q: 3,
    d: 2,
    z: 1
  };
  let leftScore = 0;
  let rightScore = 0;
  let arr = fight.split('');
  for (let i = 0; i < arr.length; i++) {
    if (leftPower[arr[i]]) {
      leftScore += leftPower[arr[i]];
    }
    if (rightPower[arr[i]]) {
      rightScore += rightPower[arr[i]];
    }
  }
  if (leftScore > rightScore) return `Left side wins!`;
  else if (leftScore < rightScore) return `Right side wins!`;
  else return `Let's fight again`;
}
alphabetWar('wwqq');  // Left side wins!
alphabetWar('mmpp');  // Right side wins!
alphabetWar('wwmm');  // Let's fight again!
  • split(): 문자열을 부분 문자열로 분할하고, 새 배열로 반환한다.

Решение 02

function alphabetWar(fight) {
  const powers = {
    w: 4,
    p: 3,
    b: 2,
    s: 1,
    m: -4,
    q: -3,
    d: -2,
    z: -1
  };
  const result = fight.split('').reduce((sum, i) => sum + (powers[i] || 0), 0);
  return result > 0 ? `Left side wins!` : result < 0 ? `Right side wins!` : `Let's fight again!`;
}
alphabetWar('wwqq');  // Left side wins!
alphabetWar('mmpp');  // Right side wins!
alphabetWar('wwmm');  // Let's fight again!
  • reduce(): 배열을 하나의 값으로 줄이고, 그 값을 반환한다.