Нужна помощь, я его даже начать не могу [найти команду победителя для конкретной суперсерии]

Реализуйте и экспортируйте по умолчанию функцию, которая находит команду победителя для конкретной суперсерии. Победитель определяется как команда, у которой больше побед (не количество забитых шайб) в конкретной серии. Функция принимает на вход массив, в котором каждый элемент — это массив, описывающий счет в конкретной игре (сколько шайб забила Канада и СССР). Результат функции – название страны: 'canada' , 'ussr' . Если суперсерия закончилась в ничью, то нужно вернуть null .

import getSuperSeriesWinner from './superseries.js'
// Первое число – сколько забила Канада
// Второе число – сколько забила СССР
const scores = [
  [3, 7], // Первая игра
  [4, 1], // Вторая игра
  [4, 4],
  [3, 5],
  [4, 5],
  [3, 2],
  [4, 3],
  [6, 5],
];
 
getSuperSeriesWinner(scores); // 'canada'

Можно использовать функцию [Math.sign]

Слушай, ну принцип тот же, что и здесь

Нужно пройти по всем элементам массива, посчитать кто выиграл на каждом шаге, сложить данные во временную переменную (или две) и в конце посмотреть: кто из них больше выиграл, такую строку и вернуть. Ну или null, если ничья.

1 лайк

все равно если честно не понял(((

Нужно попробовать разбить задачу на несколько итераций. А потом их оптимизировать.
Например в этом случае

  1. Пройтись по массиву и заменить каждый элемент на результат игры. Получится новый одномерный массив с данными.

Для этого можно использовать как раз функцию Math.sign, в которую передать разность результатов.
для первого элемента это будет Math.sign(3-7) // -1
для второго элемента Math.sign(4-1) // 1
и т.д. В случае ничьей Math.sign(3-3) // 0
Получим результат типа [-1,1 … 1, -1]

  1. Дальше нам нужно просуммировать эти элементы и по результату мы будем четко знать.
    Если > 0 победила 1 команда
    < 0 - 2 команда
    ===0 - ничья
1 лайк

const getSuperSeriesWinner = (scores) => {
let array = [[], []];
for (let i = 1; i < scores.length; i += 1) {
if
}
}
export default getSuperSeriesWinner;

все что написал…

Для начала неплохо.
Что ты будешь делать в if?
Для чего тебе let array = [[],[]]?

что там делать нужно?

Нужна помощь, я его даже начать не могу

Я тоже попробую. Кстати, задача отличная для начинающих, если можешь - передай тому кто ее придумал что они молодец.

Цель - смоделировать ситуацию где из набора счетов вычисляется новое знание о победе. Промежуточный шаг саккумулировать победы разых команд. Конечный шаг сравнить результаты аккумуляции.

Вопрос который нужно себе задать в голове - каким образом смоделировать в программе победы. Например матч смоделирован как [X, Y]. Победы можно смоделировать как [Y, Z] с той же логикой что первое число - количество побед команды 1, второе - команды 2. На этом этапе у тебя есть куча вариантов как именно смоделировать явления, то есть массив не единственная возможная форма. Например можно просто завести 2 переменные. Или завести объект типа {canada: 0, ussr: 0}. Без опыта обычно не понять какой подход моделированию более удобный, но прелесть этой задачи что тут все равно какой подход выберешь. Поэтому выбирай то с чем более опытен и с учетом следующего шага.

Следующий шаг это задать себе вопрос как получить из входных данных эту промежуточные данные. Плюс-минус ходы будут одинаковые: нужно циклом пройтись по результатам матчей, понять по счету кто выиграл и увеличить количество выигрышей для той команды. Если выбрали моделировать как переменные, то инкрементируй их, если как массив, то меняй соответствующее значение массива.

И вишенка на торте. В результате есть 2 места с количеством выигрышей, используя их, верни нужное значение.

1 лайк

эхх понять бы еще как это сделать(((

Сам должен додуматься, вот всё что тебе необходимо знать:
Переменные - Переменные

Функции - Функции

Операторы сравнения - Операторы сравнения.

Перебор массива - Все способы перебора массива в JavaScript / Хабр

Но если у тебя нет желания научиться, а нужно только решение, то так и напиши

1 лайк

Смотри на похожие решения, желательно написанные на уже известных механиках (циклы-переменные), пробуй копировать элементы решений, играться с ними. Понимание придет только через цикл

“Поставить цель, прикинуть что нужно сделать для достижения цели” → “Попробовать сделать” → “Сравнить результат с целью” → “Поменять подход, цель, методы” и начать с начала.

1 лайк

Можно это как-то еще укоротить?

getSuperSeriesWinner=s=>(r=s.reduce((s,a)=>a[0]>a[1]?++s:a[0]<a[1]?--s:s,0))>0?"canada":r<0?"ussr":null

console.log(getSuperSeriesWinner([[1,2],[2,3],[3,4],[3,2],[1,1],[2,2],[2,1],[4,1],[3,1]]) === 'canada')
console.log(getSuperSeriesWinner([[1,2]]) === 'ussr')
console.log(getSuperSeriesWinner([[1,2],[1,1],[2,2],[2,1]]) === null)
1 лайк

Так нельзя к сожалению

Можно решение…?

У меня чуть длиннее вышло, но не так зловеще ))

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <title></title>
	<style>
	
	</style>
   <script>
/*
Реализуйте и экспортируйте по умолчанию функцию, которая находит команду победителя 
для конкретной суперсерии. Победитель определяется как команда, у которой больше побед
 (не количество забитых шайб) в конкретной серии. Функция принимает на вход массив, в 
 котором каждый элемент — это массив, описывающий счет в конкретной игре (сколько шайб 
 забила Канада и СССР). Результат функции – название страны: 'canada' , 'ussr' . Если 
 суперсерия закончилась вничью, то нужно вернуть null .
*/
// import getSuperSeriesWinner from './superseries.js'
// Первое число – сколько забила Канада
// Второе число – сколько забила СССР

const scores = [
  [3, 7], // Первая игра USSR
  [4, 1], // Вторая игра Canada
  [4, 4],// -------- DRAW
  [3, 5],// USSR
  [4, 5],// USSR
  [3, 2],// Canada
  [4, 3],// Canada
  [6, 5],// Canada
],
      scores2 = [
   [8, 0], // Canada
   [8, 10],// USSR
   [0, 4],// USSR
   [0, 0]// ---- DRAW
];
 
/*
getSuperSeriesWinner(scores); // 'canada'
Можно использовать функцию [Math.sign]
*/
function getSuperSeriesWinner(arr){
let canada = 0,
    ussr = 0;
	arr.forEach( ([a, b]) => a != b ? a > b ? canada++ : ussr++ : '' );
	return canada != ussr ? canada > ussr ? 'Canada' : 'USSR' : null;
}

console.log(getSuperSeriesWinner(scores));
console.log(getSuperSeriesWinner(scores2));
   </script>
  </head>
  <body>	
  </body>
</html>
1 лайк

СПАСИБО БОЛЬШОЕ!!!

Есть куда проще способ.

const getSuperSeriesWinner = (scores) => {
let result = 0;
for (const score of scores) {
result += Math.sign(score[0] - score[1]);
}
if (result > 0) {
return ‘canada’;
}
if (result < 0) {
return ‘ussr’;
}
return null;
}
export default getSuperSeriesWinner;

Интересное решение. У меня возникает вопрос социального характера. Как объяснить умным членам команды, но которые последний раз трогали синусы-косинусы в школе что этот код работает и работает корректно?

Я, немного формулировку не понял, но могу объяснить так как понял. Тут ведь дан метод Math.sign(). “Метод Math.sign() возвращает знак числа, указывающий на то, является ли число отрицательным, положительным или нулём”.

Это я не понял. Я прочитал код как sin а не sign.

Я согласен что код проще и понятнее. @addict1337 обрати внимание на решение от @Bakhtiyar - оно изящнее других предложенных