diff --git a/README.md b/README.md index 083b8a0..3454d28 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,9 @@ depois siga as instruções abaixo: - Na **primeira vez** que você for rodar, abra o arquivo `setup.bat` que está na pasta inicial, isso instalará todas as dependência necessárias pra rodar. -- Posteriormente você pode rodar o arquivo `start.bat` pra iniciar o projeto. \ No newline at end of file +- Posteriormente você pode rodar o arquivo `start.bat` pra iniciar o projeto. + +## Como preservar suas soluções? + +Antes de atualizar você pode salvar a pasta `solutions` e depois de atualizar +jogar ela por cima da pasta `solutions` que veio em branco na versão nova! \ No newline at end of file diff --git a/client/src/components/TestGroup.vue b/client/src/components/TestGroup.vue index e8fe09f..9c5f402 100644 --- a/client/src/components/TestGroup.vue +++ b/client/src/components/TestGroup.vue @@ -28,14 +28,21 @@ Saída: {{caseOutput(testCase)}} @@ -69,10 +76,13 @@ caseOutput(testCase) { const r = this.test.run(testCase); - if (r === undefined) { + return this.valueToString(r); + }, + valueToString(v) { + if (v === undefined) { return 'undefined'; } else { - return r.toString(); + return JSON.stringify(v); } } } diff --git a/client/src/views/world-0/0-2/Level-0-2.vue b/client/src/views/world-0/0-2/Level-0-2.vue index 7b5c131..4ccf140 100644 --- a/client/src/views/world-0/0-2/Level-0-2.vue +++ b/client/src/views/world-0/0-2/Level-0-2.vue @@ -5,136 +5,124 @@

- Estruturas condicionais em Javascript são utilizadas para verificar uma condição e definir se algo deve - ou não acontecer.
- Um bom exemplo disso, e que não tem nada a ver com programação, é a linguagem que utilizamos para nos - comunicar: -
-
- Se cancelarem a aula de hoje, vou para a mureta. -
-
- Temos uma condição (se cancelarem a aula de hoje) para executar uma ação (vou para a mureta) dependendo do - resultado dessa condição. Se verdadeira, a ação é executada. + O JavaScript possui tanto operadores binários quanto unários, além de um operador ternário, + o condicional. Um operador binário exige dois operandos, um antes do operador e outro depois. + Já o operador unário exige um único operando, seja antes ou depois do operador.

-

- Em Javascript, podemos utilizar de duas estruturas diferentes de condicionais: o if e - o switch. -

+ + x+y; //Operador binário + x++; //Operador unário +

- O if statement + Operadores de atribuição

- O if é a principal e mais simples estrutura de condicional no Javascript. Ela testa se uma - dada condição é verdadeira, executando um bloco de código caso seja. + Um operador de atribuição atribui um valor ao operando à sua esquerda baseado no valor do operando à + direita. O operador de atribuição básico é o =, que atribui o valor do operando à direita ao + operando à esquerda.

-let x = 5; -if (x > 5) { - console.log('X é maior que 5.'); -} -//O console.log() não é executado. + x = 10; //x recebe 10 + x = y; //x recebe o valor de y

- Além disso, o if pode conter também a expressão else, que determina um bloco de - código para ser executado caso a condição seja falsa. + Existem outros operadores de atribuição que servem como encurtamentos do operador padrão, os mais utilizados + sendo o de adição e de subtração:

-let x = 5; -if (x > 5) { - console.log('X é maior que 5.'); -} else { - console.log('X é menor ou igual a 5.'); - //O console.log() executado é este -} + x += y //Significa x = x + y + x -= y //Significa x = x - y +

+ Operadores de comparação +

+

- Indo mais além ainda, a expressão else permite que você encadeie outro if, - para que você cheque múltiplas condições, uma após a outra. + Um operador de comparação compara seus operandos e retorna um valor lógico baseado em se a + comparação é verdadeira. +

+ +

+ Na maioria dos casos, se dois operandos não são do mesmo tipo, o JavaScript + tenta convertê-los para um tipo apropriado. As únicas exceções a esta regra são os operadores + === e o !==, que realizam comparações de igualdade e desigualdade "estritas". + Estes operadores não tentam converter os operandos em tipos compatíveis antes de verificar a igualdade.

-let x = 5; -if (x > 5){ - console.log('X é maior que 5.'); -}else if (x < 5){ - console.log('X é menor que 5.'); -}else{ - console.log('X é igual a 5.'); - //O console.log() executado agora é esse -} + let x = 10; //X é do tipo inteiro + let y = '10'; //Y é do tipo string + x == y; //Realiza conversão de tipos, retorna true + x === y; //Não realiza conversão de tipos, retorna false

- Agora, caso você tenha que fazer uma sequência de if / else muito longa, talvez o que você - precise na verdade seja... + Além dos operadores == e ===, o Javascript também possui outros operadores de + comparação:

+ + x > y //Maior que + x < y //Menor que + x >= y //Maior ou igual a + x <= y //Menor ou igual a + x != y //Diferente de + x !== y //Estritamente diferente de + +

- O switch statement + Operadores aritméticos

- O switch também permite que você cheque se certas condições são válidas e execute códigos - diferentes para elas: + Operadores aritméticos tomam valores numéricos (sejam literais ou variáveis) como seus operandos e + retornam um único valor númerico. Os operadores aritméticos padrão são os de soma (+), + subtração (-), multiplicação (*) e divisão (/). +

+ +

+ Em complemento às operações aritméticas padrões, o JavaScript disponibiliza outros operadores aritméticos, + alguns estão listados a seguir:

-let x = 5; -switch (x){ - case 1: - console.log('X igual a 1'); - break; - case 2: - console.log('X igual a 2'); - break; - case 5: - console.log('X igual a 5'); - break; -} -//O console.log() executado é o último + x % y //Retorna o resto da divisão de x por y + x++ //Incrementa o valor de x em 1 + x-- //Decrementa o valor de x em 1 -

- A estrutura switch vai checar se a variável escolhida x assume um dos valores que - aparecem após as palavras case, e executar os comandos específicos do case correto. -

+

+ Operadores lógicos +

- Dica: A palavra break é utilizada para dizer ao programa que não precisa continuar - comparando a variável com os outros casos, pois o caso correto já foi identificado, assim saindo do loop. + Operadores lógicos são utilizados tipicamente com valores booleanos (lógicos); neste caso, retornam um + valor booleano. Os operadores lógicos são o AND lógico &&, o OU lógico || e + o operador de negação !.

- Dica: O switch aceita um tipo de case específico chamado default, - que é utilizado como o else do if, ou seja, é o código que será executado caso - nenhuma das outras condições sejam válidas. + O AND lógico retorna true se o valor dos dois operandos for true, retornando false caso contrário. O OU + lógico retorna true se o valor de pelo menos um dos operandos for true, retornando false caso contrário. + Já operador de negação é um operador unário, que retorna o valor booleano invertido do operando.

-let x = 10; -switch (x){ - case 1: - console.log('X igual a 1'); - break; - case 2: - console.log('X igual a 2'); - break; - case 5: - console.log('X igual a 5'); - break; - default: - console.log('X não encontrado'); -} -//O console.log() executado é o último + let x = true; + let y = false; + x && y //Retorna false + x || y //Retorna true + !x //Retorna false + x && !y //Retorna true + @@ -143,7 +131,7 @@ switch (x){ const info = { world: 0, level: 2, - title: 'Condicionais' + title: 'Operadores' }; export default { diff --git a/client/src/views/world-0/0-3/Level-0-3.vue b/client/src/views/world-0/0-3/Level-0-3.vue index 5bf5752..1d7cc87 100644 --- a/client/src/views/world-0/0-3/Level-0-3.vue +++ b/client/src/views/world-0/0-3/Level-0-3.vue @@ -5,110 +5,135 @@

- Em programação, um loop é uma estrutura que permite realizar o mesmo conjunto de operações repetidas - vezes - o que é chamado de iteração na linguagem de programação.
- Um loop geralmente é composto por 3 itens: + Estruturas condicionais em Javascript são utilizadas para verificar uma condição e definir se algo deve + ou não acontecer.
+ Um bom exemplo disso, e que não tem nada a ver com programação, é a linguagem que utilizamos para nos + comunicar: +
+
+ Se cancelarem a aula de hoje, vou para a mureta. +
+
+ Temos uma condição (se cancelarem a aula de hoje) para executar uma ação (vou para a mureta) dependendo do + resultado dessa condição. Se verdadeira, a ação é executada.

- +

- Em Javascript, existem 2 principais estruturas que funcionam como loops: o for e o while. + Em Javascript, podemos utilizar de duas estruturas diferentes de condicionais: o if e + o switch.

- For loop + O if statement

+

+ O if é a principal e mais simples estrutura de condicional no Javascript. Ela testa se uma + dada condição é verdadeira, executando um bloco de código caso seja. +

+ -for (let i = 0; i < 10; i++) { - console.log(i); -} + let x = 5; + if (x > 5) { + console.log('X é maior que 5.'); + } + //O console.log() não é executado.

- No for loop, primeiro você diz qual a variável que será usada como contador, depois você informa - a condição de saída do loop, e por fim você especifica o iterador, que irá alterar o valor do contador. + Além disso, o if pode conter também a expressão else, que determina um bloco de + código para ser executado caso a condição seja falsa.

-

- No exemplo acima, o contador é a variável i, a condição de saída é i < 10, o que - significa que enquanto o valor de i for menor que 10, o loop continuará sendo executado, e o - iterador é i++, indicando que ao final de cada iteração do loop, o valor de i - deve ser incrementado em 1. -

+ + let x = 5; + if (x > 5) { + console.log('X é maior que 5.'); + } else { + console.log('X é menor ou igual a 5.'); + //O console.log() executado é este + } +

- Dica 1: No exemplo acima, a variável utilizada como contador foi declarada na própria estrutura do loop, - porém isso, apesar de bastante comum, não é regra: você pode usar uma variável declarada anteriormente. + Indo mais além ainda, a expressão else permite que você encadeie outro if, + para que você cheque múltiplas condições, uma após a outra.

-let i = 0; -for (i; i < 10; i = i + 2) { - console.log(i); -} + let x = 5; + if (x > 5){ + console.log('X é maior que 5.'); + }else if (x < 5){ + console.log('X é menor que 5.'); + }else{ + console.log('X é igual a 5.'); + //O console.log() executado agora é esse + }

- Dica 2: i++ é apenas uma forma diferente de escrever i = i + 1, assim como - i-- é outra forma de escrever i = i - 1. O iterador pode ser escrito da sua - maneira desejada, contanto que altere o valor do contador corretamente. + Agora, caso você tenha que fazer uma sequência de if / else muito longa, talvez o que você + precise na verdade seja...

- While loop + O switch statement

+

+ O switch também permite que você cheque se certas condições são válidas e execute códigos + diferentes para elas: +

+ -let i = 0; -while (i < 10) { - console.log(i); - i++; -} + let x = 5; + switch (x){ + case 1: + console.log('X igual a 1'); + break; + case 2: + console.log('X igual a 2'); + break; + case 5: + console.log('X igual a 5'); + break; + } + //O console.log() executado é o último

- No while loop, você começa especificando a condição de saída, e o iterador é definido dentro do - próprio loop, nesse caso o iterador é o i++. Além disso, diferentemente do for loop - , a variável utilizada como contador deve ser declarada antes do loop. + A estrutura switch vai checar se a variável escolhida x assume um dos valores que + aparecem após as palavras case, e executar os comandos específicos do case correto.

- O while loop possui uma variação, o do...while loop, que, resumidamente, coloca - o código a ser executado pelo loop antes da condição de saída. + Dica: A palavra break é utilizada para dizer ao programa que não precisa continuar + comparando a variável com os outros casos, pois o caso correto já foi identificado, assim saindo do loop.

- -let i = 0; -do { - console.log(i); - i++; -} while (i < 10); - -

- Essa alteração faz com que o loop sempre seja executado uma primeira vez, antes de checar se o contador - obedece a condição de saída. + Dica: O switch aceita um tipo de case específico chamado default, + que é utilizado como o else do if, ou seja, é o código que será executado caso + nenhuma das outras condições sejam válidas.

-let i = 10; || let i = 10; -while (i < 10) { || do { - console.log(i); || console.log(i); - i++; || i++; -} || } while(i < 10); -// O console.log não || // O console.log será -// será executado || // executado 1 vez. + let x = 10; + switch (x){ + case 1: + console.log('X igual a 1'); + break; + case 2: + console.log('X igual a 2'); + break; + case 5: + console.log('X igual a 5'); + break; + default: + console.log('X não encontrado'); + } + //O console.log() executado é o último @@ -118,7 +143,7 @@ while (i < 10) { || do { const info = { world: 0, level: 3, - title: 'Loops' + title: 'Condicionais' }; export default { diff --git a/client/src/views/world-0/0-4/Level-0-4.vue b/client/src/views/world-0/0-4/Level-0-4.vue new file mode 100644 index 0000000..aae4cba --- /dev/null +++ b/client/src/views/world-0/0-4/Level-0-4.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/client/src/views/world-1/1-4/Level-1-4.vue b/client/src/views/world-1/1-4/Level-1-4.vue index 7e22e6a..49d8c3b 100644 --- a/client/src/views/world-1/1-4/Level-1-4.vue +++ b/client/src/views/world-1/1-4/Level-1-4.vue @@ -21,19 +21,19 @@ diff --git a/client/src/views/world-1/1-4/tests.js b/client/src/views/world-1/1-4/tests.js index 573fb61..a25c668 100644 --- a/client/src/views/world-1/1-4/tests.js +++ b/client/src/views/world-1/1-4/tests.js @@ -1,5 +1,5 @@ import {TestCase, TestGroup} from '../../../../../shared/tests'; -import {hasAtSign, isValidEmail, palindrome} from "../../../../../solutions/world-1/1-4"; +import {hasAtSign, isValidEmail, palindrome, spaceRemoval, substring} from "../../../../../solutions/world-1/1-4"; export const tests = [ new TestGroup({ @@ -105,5 +105,55 @@ export const tests = [ inputs: ["dpw"], outputs: false }) - ) + ), + new TestGroup({ + name: 'Substring', + signature: 'substring(str, substr)', + description: 'Escreva uma função que receba duas strings e cheque se a segunda está contida na primeira, ou seja, ' + + 'se a segunda é uma substring da primeira.', + fn: substring + }) + .addCase( + new TestCase({ + inputs: ["amora", "amor"], + outputs: true + }) + ) + .addCase( + new TestCase({ + inputs: ["vida", "ida"], + outputs: true + }) + ) + .addCase( + new TestCase({ + inputs: ["sapato", "pato"], + outputs: true + }) + ) + .addCase( + new TestCase({ + inputs: ["monitor", "dor"], + outputs: false + }) + ), + new TestGroup({ + name: 'Remover Espaços', + signature: 'spaceRemoval(str)', + description: 'Escreva uma função que receba uma string e remova todos os caracteres de espaço presentes nela, ' + + 'retornando a string modificada.', + fn: spaceRemoval + }) + .addCase( + new TestCase({ + inputs: ["Não hesite em pedir ajuda!"], + outputs: "Nãohesiteempedirajuda!" + }) + ) + .addCase( + new TestCase({ + inputs: ["UNIRIO"], + outputs: "UNIRIO" + }) + ) ]; \ No newline at end of file diff --git a/client/src/views/world-1/1-5/Level-1-5.vue b/client/src/views/world-1/1-5/Level-1-5.vue new file mode 100644 index 0000000..f3ba939 --- /dev/null +++ b/client/src/views/world-1/1-5/Level-1-5.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/client/src/views/world-1/1-5/tests.js b/client/src/views/world-1/1-5/tests.js new file mode 100644 index 0000000..0b84531 --- /dev/null +++ b/client/src/views/world-1/1-5/tests.js @@ -0,0 +1,88 @@ +import {TestCase, TestGroup} from '../../../../../shared/tests'; +import {concat, highestNumber, includes, arraySum} from "../../../../../solutions/world-1/1-5"; + + +export const tests = [ + new TestGroup({ + name: 'Maior elemento', + signature: 'highestNumber(arr)', + description: 'Escreva uma função que receba um array de inteiros e retorne o maior número desse array.', + fn: highestNumber + }) + .addCase( + new TestCase({ + inputs: [[1, 2, 3]], + outputs: 3 + }) + ) + .addCase( + new TestCase({ + inputs: [[100, 4, 74]], + outputs: 100 + }) + ) + .addCase( + new TestCase({ + inputs: [[-200, 0, 199]], + outputs: 199 + }) + ), + + new TestGroup({ + name: 'Contém elemento', + signature: 'includes(arr, a)', + description: 'Escreva uma função que receba um array e um elemento e diga se o elemento pertence ao array.', + fn: includes + }) + .addCase( + new TestCase({ + inputs: [[1, 2, 3], 2], + outputs: true + }) + ) + .addCase( + new TestCase({ + inputs: [['Oi, ', 'tudo', 'bem?'], 'tudo'], + outputs: true + }) + ) + .addCase( + new TestCase({ + inputs: [['1', '2', '3', '4', '5'], 5], + outputs: false + }) + ), + + new TestGroup({ + name: 'Soma', + signature: 'arraySum(arr)', + description: 'Escreva uma função que receba um array de números e retorne a soma dos mesmos.', + fn: arraySum + }) + .addCase( + new TestCase({ + inputs: [[1, 2, 3]], + outputs: 6 + }) + ) + .addCase( + new TestCase({ + inputs: [[-200, 100, 100]], + outputs: 0 + }) + ), + + new TestGroup({ + name: 'Concatenar', + signature: 'concat(arr1, arr2)', + description: 'Escreva uma função que receba dois arrays e concatene os mesmos, retornando um novo array que ' + + 'contém os elementos dos 2 anteriores.', + fn: concat + }) + .addCase( + new TestCase({ + inputs: [[1, 2, 3], [4, 5, 6]], + outputs: [1, 2, 3, 4, 5, 6] + }) + ) +]; \ No newline at end of file diff --git a/shared/base/extend/Object.js b/shared/base/extend/Object.js index 90c3869..71be869 100644 --- a/shared/base/extend/Object.js +++ b/shared/base/extend/Object.js @@ -17,3 +17,32 @@ Object.forEach = function (obj, fn) { if (this.hasOwnProperty(key)) fn(this[key]); } }; + +Object.compare = function (obj1, obj2) { + //Loop through properties in object 1 + for (let property in obj1) { + //Check property exists on both objects + if (obj1.hasOwnProperty(property) !== obj2.hasOwnProperty(property)) return false; + + switch (typeof (obj1[property])) { + //Deep compare objects + case 'object': + if (!Object.compare(obj1[property], obj2[property])) return false; + break; + //Compare function code + case 'function': + if (typeof (obj2[property]) === 'undefined' || (property !== 'compare' && obj1[property].toString() !== obj2[property].toString())) return false; + break; + //Compare values + default: + if (obj1[property] !== obj2[property]) return false; + } + } + + //Check object 2 for any extra properties + for (let p in obj2) { + if (typeof (obj1[p]) === 'undefined') return false; + } + + return true; +}; \ No newline at end of file diff --git a/shared/tests/index.js b/shared/tests/index.js index e5d449f..454dcb8 100644 --- a/shared/tests/index.js +++ b/shared/tests/index.js @@ -10,7 +10,7 @@ export class TestCase { * @typedef {Object} TestCaseOptions * @property {String} [description] * @property {Array} inputs - * @property {Array|Function} outputs + * @property {Object|Function} outputs */ /** @@ -45,7 +45,11 @@ export class TestCase { if (this.outputs instanceof Function) { return this.outputs(result); } else { - return this.outputs === result; + if (typeof this.outputs === 'object') { + return Object.compare(this.outputs, result); + } else { + return this.outputs === result; + } } } } diff --git a/solutions/world-1/1-4/index.js b/solutions/world-1/1-4/index.js index e8eb4e1..64c5596 100644 --- a/solutions/world-1/1-4/index.js +++ b/solutions/world-1/1-4/index.js @@ -8,4 +8,12 @@ export function isValidEmail(str){ export function palindrome(str){ +} + +export function substring(str, substr){ + +} + +export function spaceRemoval(str){ + } \ No newline at end of file diff --git a/solutions/world-1/1-5/index.js b/solutions/world-1/1-5/index.js new file mode 100644 index 0000000..dd7591a --- /dev/null +++ b/solutions/world-1/1-5/index.js @@ -0,0 +1,15 @@ +export function highestNumber(arr){ + +} + +export function includes(arr, a){ + +} + +export function arraySum(arr){ + +} + +export function concat(arr1, arr2){ + +} \ No newline at end of file