DESAFIO

DESCRIÇÃO


O desafio é composto por quarto questões disponibilizados no arquivo code.zip. Cada arquivo possui uma Suite de Testes que apresenta a sua respectiva validação por meio de testes.

Contudo, para executar cada cenários de validação da Suite de Teste será necessário instalar a ferramenta Jest usando o npm e o package.json por meio do comando:

$ cd nome-aluno-matricula
$ npm install

Também se certifique se a versão do node está atualizado:

$ node -v

Após a instalação do Jest, é preciso verificar se tudo ocorreu perfeitamente. Então, por uma questão de verificação, digite o seguinte comando para executar da Suite de Testes da Questão 1:

$ npm run test triangle/triangle.test.js

Se a resolução do problema ainda não foi inicializada e o Jest funcionou corretamente, então esse comando deverá exibir algo como:

$ npm run test triangle/triangle.test.js

> desafio-ecma@1.0.0 test /Users/.../simulado-ecma
> ./node_modules/jest/bin/jest.js "triangle/triangle.test.js"

 FAIL  triangle/triangle.test.js
  ● Triangle › equilateral triangles have equal sides

    TypeError: triangle.kind is not a function

      at Object.<anonymous> (triangle/triangle.test.js:7:21)
          at Promise (<anonymous>)
      at Promise.resolve.then.el (node_modules/p-map/index.js:46:16)
          at <anonymous>

  Triangle
    ✕ equilateral triangles have equal sides (3ms)
    ○ skipped 10 tests

Test Suites: 1 failed, 1 total
Tests:       1 failed, 10 skipped, 11 total
Snapshots:   0 total
Time:        1.291s
Ran all test suites matching "triangle/triangle.test.js".

Ou seja, no total de 11 testes foi executado apenas 1, que mesmo assim não está se comportanto conforme esperado.

Contudo, ao concluir a implementação corretamente o mesmo comando deverá exibir:

$ npm run test triangle/triangle.test.js

> desafio-ecma@1.0.0 test /Users/.../simulado-ecma
> ./node_modules/jest/bin/jest.js "triangle/triangle.test.js"

 PASS  code-response/triangle/triangle.test.js
  Triangle
    ✓ equilateral triangles have equal sides (4ms)
    ✓ larger equilateral triangles also have equal sides (1ms)
    ✓ isosceles triangles have last two sides equal
    ✓ isosceles triangles have first two sides equal (1ms)
    ✓ isosceles trianges have first and last sides equal
    ✓ isosceles triangles have two first sides equal
    ✓ isosceles triangles have in fact exactly two sides equal
    ✓ scalene triangles have no equal sides
    ✓ scalene triangles have no equal sides at a larger scale too (1ms)
    ✓ scalene triangles have no equal sides in descending order either
    ✓ very small triangles are legal

Test Suites: 1 passed, 1 total
Tests:       11 passed, 11 total
Snapshots:   0 total
Time:        1.203s
Ran all test suites matching "triangle/triangle.test.js".

O que significa que todos os cenários listados funcionam conforme descrito na Suite de Teste.

Observação: É importante destacar que os arquivos de teste fazem parte de um estratégia de otimização e automatização da validação das entradas e saídas de cada problema. Mas, nada impede que esse processo seja realizado manualmente.

Por fim, é importante destacar que cada questão irá detalhar um teste específico, por exemplo, na QUESTÃO 1 alguns cenários de testes são descritos no arquivo triangle/triangle.test.js do problema que deve ser codificado no arquivo triangle/triangle.js.

QUESTÕES


QUESTÃO 1 - O conjunto de três retas podem formar um triângulo que é classificado em função da quantidade de retas de tamanho igual. Se o triângulo possui todas, duas ou nenhuma reta igual, ele será classificado respectivamente como sendo equilateral, isosceles e scalene.

Para facilitar essa identificação crie um objeto Triangle no arquivo triangle/triangle.js que recebe em sua construção os tamanhos das três retas, e ao chamar o método kind() deve-se retornar o seu tipo por meio de uma string:

Triangle

conforme ilustra o código a seguir:

let triangle = new Triangle(2, 2, 2)
console.log(triangle.kind()) //=> equilateral
let triangle = new Triangle(2, 2, 1)
console.log(triangle.kind()) //=> isosceles
let triangle = new Triangle(3, 2, 1)
console.log(triangle.kind()) //=> scalene

Detalhe, algumas outras condições de retorno estão previstas na Suite de Teste triangle/triangle.test.js.

QUESTÃO 2 - O Sistema de controle acadêmico de uma instituição educacional possui um problema para geração das médias de suas turmas, o que acarreta em um esforço sobrenatural dos professores para gerar essa métrica, pois depende do fornecimento das notas de cada aluno para o cálculo final da média.

Por meio de vários contatos, os professores souberam que os alunos do IFPB poderiam resolver esse problema de modo super fácil, então, inevitavelmente a instituição foi em busca de tais profissionais.

A princícpio uma equipe planejou a criação de um Sistema Web para tal problema, que deveria possuir um objeto chamado School no arquivo grade-school/grade-school.js. O objeto possuirá duas ações, a roster() e grade(), que respectivamente devem gerar a lista de notas por lista nomes ordenado dos alunos, e a lista dos nomes dos alunos de uma nota específica:

School

Com a ajuda da instituição foi possível esboçar alguns casos de teste para validar os possíveis comporatamentos do objeto School:

let school = new School()

console.log(school.roster()) //=> {}
let school = new School()

school.add('Aimee', 2)

console.log(school.roster()) //=> { 2 : [ 'Aimee' ] }
let school = new School()

school.add('Blair',2)
school.add('James',2)
school.add('Paul',2)

console.log(school.roster()) //=> { 2 : [ 'Blair', 'James', 'Paul' ] }
let school = new School()

school.add('Franklin',5)
school.add('Bradley',5)
school.add('Jeff',1)

console.log(school.roster()) //=> { 1: ['Jeff'], 5: [ 'Bradley', 'Franklin' ] }
let school = new School()

school.add('Franklin',5)
school.add('Bradley',5)
school.add('Jeff',1)

console.log(school.grade(5)) //=> [ 'Bradley', 'Franklin' ]
let school = new School()

console.log(school.grade(1) //=> []



QUESTÃO 3 - A Criptografia é considerada uma importante área da computação, mesmo possuindo muitas novidades recentes, é possível encontrar vários fatos que demonstram que sua origem é antiga.

Um exemplo disso seria a própria Cifra de César, considerada uma técnica de criptografia de substituição, com origem no Império Romano, e que recebeu este nome em uma homenagem à Júlio César devido ao seu uso em correspondências militares.

“A ação de uma Cifra de César é mover cada letra do alfabeto um número de vezes fixo abaixo no alfabeto. Este exemplo está com uma troca de três, então o B no texto normal se torna E no texto cifrado.” Wikipedia, 2017

Rot 3
Fonte: Wikipedia, 2017

O número de deslocamentos também pode definir uma segunda nomenclatura para essa criptografia, por exemplo, a cifra anterior também é conhecida por ROT3, por se tratar de um rotacionamento de 3 letras do alfabeto, então, por consequência, o ROT13 iria rotacionar 13 letras, fazendo que a letra A seja substituída por N.

Para ajudar nesse processo foi fornecido o arquivo cipher/cipher.js que possui a função rot, e o cipher/cipher.test.js que define alguns casos de teste de rot:

Cipher

Por exemplo:

const cipher = new Cipher()

cipher.rot('abc', 2)  //=> cde
cipher.rot('abc', 13) //=> nop

Pensando nisso, o professor da disciplina de LS resolveu usar esta cifra com um propósito mais pacífico, e resolveu divulgar o seguinte texto no Slack da disciplina com ROT13 no intuito de ver a reação da turma ao ler a mensagem descriptografada:

Dhny é n áeiber cersrevqn qr hz nqzvavfgenqbe qr erqrf? Vcê.
Dhny é b qvgb cbchyne znvf hfnqb cbe hz nanyvfgn qr erqrf? Pnvh an erqr, é cuvfuvat!

Detalhe, para decifrar uma mensagem em ROT3 basta usar o ROT 23, ou seja:

rot(mensagem, rotCifra) = mensagemCriptada
rot(mensagemCriptada, rotDecifra) = mensagem

Onde rotDecifra = 26 - rotCifra 



QUESTÃO 4 - Segundo o Só Biologia a “Síntese de RNA (mensageiro, por exemplo) se inicia com a separação das duas fitas de DNA. Apenas uma das fitas do DNA serve de molde para a produção da molécula de RNAm. A outra fita não é transcrita. Essa é uma das diferenças entre a duplicação do DNA e a produção do RNA.”.

Síntese do RNA
Fonte: Só Biologia

Essa síntese estava sendo analisada em um centro de genética, através de equipamento que geraram a cadeia de DNA e RNA de modo textual.

Pensando em automatizar funturos mapeamentos de mutação, foi solicitado a criação de um programa que pudesse gerar de modo mais rápido a sequência de RNA a partir de um DNA.

Imaginando um segmento hipotético de um filamento de DNA com a seqüência de bases:

DNA - ATGCCGAAATTTGCG

O segmento de RNA formado na transcrição terá a seqüência de bases:

RNA - UACGGCUUUAAACGC

Ou seja, o processo consiste basicamente na conversão:

DNA RNA
G C
C G
T A
A U

Então, tente criar um script rna-transcription/rna-transcription.js que gere essa conversão, e para efeitos de validação use a Suite de Teste rna-transcription/rna-transcription.test.js, por exemplo:

const dnaTranscriber = new DnaTranscriber()
dnaTranscriber.toRna('C')) //=> G
dnaTranscriber.toRna('G')) //=> C
dnaTranscriber.toRna('A')) //=> U
dnaTranscriber.toRna('T')) //=> A
dnaTranscriber.toRna('ACGTGGTCTTAA')) //=> UGCACCAGAAUU

DNA Transcriber




Alternativa de resposta: triangle/triangle.js, grade-school/grade-school.js, rna-transcription/rna-transcription.js e cipher/cipher.js.