Last active
October 21, 2022 05:06
-
-
Save felippe-regazio/7bf9a76391135264f6cf724c0a0bc559 to your computer and use it in GitHub Desktop.
Simple gist that shows an implementation of a challenge
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
Desafio intermediário de JavaScript: | |
Imagine que estou apostando corrida de carrinhos Hot Wheels com meu filho, e preciso de uma função JS pra registrar o placar. | |
O problema é que eu só tenho o Internet Explorer de 2010 pra fazer essa função, então tenho algumas regras | |
- não posso utilizar let nem const | |
- não posso manipular o escopo externo | |
- não posso utilizar nenhum mock | |
- devo utilizar vanilla js pra construir | |
- devo utilizar UMA função global | |
- não posso utilizar frameworks | |
- não posso utilizar transpilers | |
O comportamento esperado é: | |
``` | |
var score = scoreboard({ felippe: 0, lorenzo: 0 }); | |
score(); | |
``` | |
output: | |
` | |
Felippe: 0 | |
Lorenzo: 0 | |
` | |
Para marcar pontos precisaremos de um metodo | |
``` | |
score.point('felippe'); | |
score(); | |
``` | |
output: | |
` | |
Felippe: 1 | |
Lorenzo: 0 | |
` | |
E eu posso marcar mais de um ponto se preciso, basta usar um segundo parametro para incrementar mais de um ponto | |
``` | |
score.point('lorenzo', 3); | |
score(); | |
``` | |
output: | |
` | |
Felippe: 1 | |
Lorenzo: 3 | |
` | |
E a qualquer momento da brincadeira nós podemos adicionar novas pessoas: | |
``` | |
score.add('flavia'); | |
score(); | |
``` | |
output: | |
` | |
Felippe: 1 | |
Lorenzo: 3 | |
Flavia: 0 | |
` | |
E também podemos adicionar essa pessoa com uma pontuação inicial se preciso: | |
``` | |
score.add('Joana', 2); | |
score(); | |
``` | |
output: | |
` | |
Felippe: 1 | |
Lorenzo: 3 | |
Flavia: 0 | |
Joana: 2 | |
` | |
Warnings: | |
- Eu posso inicializar o score com mais de 2 pessoas mas nunca somente com uma | |
- Eu não posso somar pontos para uma pessoa que não existe no placar | |
- Você pode ter uma única função global, mas pode ter quantas funções quiser dentro dela | |
Bonus (opcional): | |
As manipulações que requerem que nomes sejam passados devem ser case INSENSITIVE, e o output deve ser escrito em lowercase com a primeira letra do nome maiúscula. | |
ex: | |
score.point('FeLiPPe'); // ponto pra felippe | |
Dicas: | |
https://stackoverflow.com/questions/20705063/javascript-object-keys-method-alternative-for-compatibility-with-ie8 | |
https://stackoverflow.com/questions/690251/what-happened-to-console-log-in-ie8 | |
Boa sorte! | |
*/ | |
function scoreboard(initialPeople) { | |
var people = objKeysToLower(initialPeople); | |
function log(s) { | |
try { console.log(s) } catch {}; | |
} | |
function keyExists(key, obj) { | |
return hasOwnProperty.call(obj, key); | |
} | |
function objEntries(obj, callback) { | |
for (key in obj) { | |
if (keyExists(key, obj)) { | |
callback(key, obj[key]); | |
} | |
} | |
} | |
function printFlatObj(obj) { | |
objEntries(obj, function(key, value) { | |
log(ucFirst(key) + ": " + value); | |
}); | |
} | |
function lc(str) { | |
if (!str) return ""; | |
return str.toLowerCase(); | |
} | |
function ucFirst(str) { | |
if (!str) return ""; | |
return str.charAt(0).toUpperCase() + lc(str.slice(1)); | |
} | |
function objKeysToLower(obj) { | |
var result = {}; | |
objEntries(obj, function(key, value) { | |
result[lc(key)] = value; | |
}); | |
return result; | |
} | |
// --- public --- | |
function score() { | |
return printFlatObj(people); | |
} | |
score.point = function(person, points) { | |
var lcPerson = lc(person); | |
if (!keyExists(lcPerson, people)) { | |
log("There is no person named '" + person + "' in the game."); | |
return false; | |
} | |
var newValue = (people[lcPerson] || 0) + (points || 1); | |
people[lcPerson] = newValue; | |
} | |
score.add = function(person, points) { | |
var lcPerson = lc(person); | |
if (keyExists(lcPerson, people)) { | |
log("A person named '" + person + "' is already playing."); | |
return false; | |
} | |
people[lcPerson] = (points || 0); | |
} | |
// -------------- | |
return score; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment