InstruçÔes
construir um motor de remix de playlist
Neste laboratĂłrio, vocĂȘ vai construir um programa que cria uma Ășnica playlist de remix a partir de mĂșltiplas playlists enviadas por ouvintes.
Cada ouvinte fornece uma lista de mĂșsicas que quer ouvir. Algumas mĂșsicas podem aparecer mais de uma vez, e alguns artistas podem aparecer muitas vezes. Seu trabalho Ă© processar essas playlists passo a passo: combinĂĄ-las em uma lista sĂł, pontuar cada mĂșsica, remover mĂșsicas duplicadas, limitar quantas vezes o mesmo artista aparece e entĂŁo criar uma ordem final de reprodução.
Objetivo: Atenda às user stories abaixo e faça todos os testes passarem para completar o laboratório.
User stories:
1. VocĂȘ deve criar uma função chamada
flattenPlaylists que aceita um array de playlists onde cada playlist Ă© um array de objetos com as seguintes propriedades: trackId, artist, title, votes, bpm. Se a entrada nĂŁo for um array, flattenPlaylists deve retornar um array vazio. Um exemplo de playlist foi fornecido para vocĂȘ. VocĂȘ pode usar esse exemplo para testar sua função.
2. flattenPlaylists deve retornar um array plano de objetos de faixa, onde cada objeto inclui todas as propriedades originais da faixa mais uma propriedade source definida como um array com o Ăndice da playlist e o Ăndice da faixa indicando de onde a faixa veio.
3. VocĂȘ deve criar uma função chamada scoreTracks que aceita um array de objetos de faixa conforme retornado por flattenPlaylists (cada um com propriedades trackId, artist, title, votes, bpm e source) e retorna um novo array de objetos de faixa, cada um com uma propriedade score adicionada usando a fĂłrmula: votes * 10 - Math.abs(bpm - 120).
4. VocĂȘ deve criar uma função chamada dedupeTracks que aceita um array de objetos de faixa conforme retornado por scoreTracks e retorna um novo array com entradas duplicadas de trackId removidas, mantendo apenas a primeira ocorrĂȘncia de cada uma.
5. VocĂȘ deve criar uma função chamada enforceArtistQuota que aceita um array de objetos de faixa conforme retornado por dedupeTracks e um nĂșmero representando o mĂĄximo de ocorrĂȘncias permitidas por artista. A função deve retornar um novo array onde nenhum artista aparece mais vezes do que o nĂșmero dado, mantendo as ocorrĂȘncias mais antigas.
6. VocĂȘ deve criar uma função chamada buildSchedule que aceita um array de objetos de faixa conforme retornado por enforceArtistQuota e retorna um novo array de objetos { slot, trackId }, onde slot Ă© um Ăndice baseado em 1 representando a posição de cada faixa na ordem de transmissĂŁo.
7. VocĂȘ deve criar uma função chamada remixPlaylist que aceita um array de playlists e o nĂșmero mĂĄximo de ocorrĂȘncias permitidas por artista. A função deve retornar a programação final de transmissĂŁo como um array de objetos { slot, trackId }, chamando flattenPlaylists, scoreTracks, dedupeTracks, enforceArtistQuota e buildSchedule na ordem.
O que fazer:
Testes:
- VocĂȘ deve ter uma função chamada `flattenPlaylists`.
- VocĂȘ deve retornar um array vazio de `flattenPlaylists` quando a entrada nĂŁo for um array.
- Cada faixa retornada por `flattenPlaylists` deve incluir um campo `source` que Ă© um array contendo o Ăndice da playlist e o Ăndice da faixa.
- VocĂȘ deve ter uma função chamada `scoreTracks`.
- Cada faixa retornada por `scoreTracks` deve incluir um campo numérico `score`.
- VocĂȘ deve calcular `score` usando um BPM alvo de `120` e esta fĂłrmula: `votes * 10 - Math.abs(bpm - 120)`.
- VocĂȘ deve ter uma função chamada `dedupeTracks`.
- Quando existirem valores duplicados de `trackId`, `dedupeTracks` deve manter apenas a primeira ocorrĂȘncia da faixa.
- VocĂȘ deve ter uma função chamada `enforceArtistQuota`.
- `enforceArtistQuota` deve garantir que nenhum artista apareça mais do que `maxPerArtist` vezes removendo faixas extras enquanto mantém as mais antigas.
- VocĂȘ deve ter uma função chamada `buildSchedule`.
- `buildSchedule` deve retornar um array de objetos com a forma `{ slot, trackId }`, onde `slot` começa em `1`.
- VocĂȘ deve ter uma função chamada `remixPlaylist`.
- `remixPlaylist` deve chamar as funçÔes auxiliares na ordem para produzir a programação final.
Console