Skip to content

Instantly share code, notes, and snippets.

@felippe-regazio
Last active October 21, 2022 05:06
Show Gist options
  • Save felippe-regazio/7bf9a76391135264f6cf724c0a0bc559 to your computer and use it in GitHub Desktop.
Save felippe-regazio/7bf9a76391135264f6cf724c0a0bc559 to your computer and use it in GitHub Desktop.
Simple gist that shows an implementation of a challenge
/**
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