Skip to content

Commit

Permalink
Challenge 23 resolved
Browse files Browse the repository at this point in the history
  • Loading branch information
rau2191 committed Dec 26, 2022
1 parent 904622c commit 224220b
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 0 deletions.
47 changes: 47 additions & 0 deletions 23 - Compilador de Papá Noel/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
Estamos probando una nueva CPU para el trineo de Papá Noel. Pero todavía tenemos que programar el software para que funcione.

La CPU tiene 8 registros disponibles, que se llaman V00..V07. Al comienzo del programa, todos los registros contienen 0. La CPU admite las siguientes instrucciones:

* MOV Vxx,Vyy: copia el valor del registro Vxx al registro Vyy;
* MOV n,Vxx: asigna la constante numérica n al registro Vxx (sobrescribe si ya tiene un valor);
* ADD Vxx,Vyy: calcula (Vxx + Ryy) y almacena el resultado en Vxx;
* DEC Vxx: decrementa el valor de Vxx en 1.
* INC Vxx: incrementa el valor de Vxx en 1.
* JMP i: salta a la instrucción número i si V00 es diferente de 0. i está garantizado que sea un número de instrucción válido y 0 sería la primera instrucción.

**Como la CPU es de 8 bits**, el número que podría representar va desde 0 hasta 255. Si incrementas el número 255 causa un desbordamiento y resulta en 0. Y si decrementas 0, resulta en 255. Ten en cuenta, entonces, que el número 280 sería 24 en la CPU.

Después de que se haya ejecutado la última instrucción, debes devolver una matriz con el resultado para cada registro. **De V00 a V07**. Ejemplos:
```javascript
executeCommands([
'MOV 5,V00', // V00 es 5
'MOV 10,V01', // V01 es 10
'DEC V00', // V00 ahora es 4
'ADD V00,V01' // V00 = V00 + V01 = 14
])

// Output: [14, 10, 0, 0, 0, 0, 0]

executeCommands([
'MOV 255,V00', // V00 es 255
'INC V00', // V00 es 256, desborda a 0
'DEC V01', // V01 es -1, desborda a 255
'DEC V01' // V01 es 254
])

// Output: [0, 254, 0, 0, 0, 0, 0]

executeCommands([
'MOV 10,V00', // V00 es 10
'DEC V00', // decrementa V00 en 1 <---┐
'INC V01', // incrementa V01 en 1 |
'JMP 1', // bucle hasta que V00 sea 0 ----┘
'INC V06' // incrementa V06 en 1
])
```
// Output: [ 0, 10, 0, 0, 0, 0, 1, 0 ]

Todas las instrucciones proporcionadas ya están validadas y garantizadas de ser correctas.

Basado en la entrevista técnica de SpaceX de CodeSignal

89 changes: 89 additions & 0 deletions 23 - Compilador de Papá Noel/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
function executeCommands(commands) {
const MAX_VALUE = 256;
const MIN_VALUE = 0;
const values = { V00: 0, V01: 0, V02: 0, V03: 0, V04: 0, V05: 0, V06: 0, V07: 0 };
let mainThreadIndex = 0;

const commandActions = {
"MOV": ([param1, param2]) => mov(param1, param2),
"ADD": ([param1, param2]) => add(param1, param2),
"DEC": ([param]) => dec(param),
"INC": ([param]) => inc(param),
"JMP": ([param], currentIndex) => jmp(param, currentIndex)
}
const getNewValue = (value) => {
if (value >= MIN_VALUE && value < MAX_VALUE) return value;

return value >= MAX_VALUE
? value - MAX_VALUE
: MAX_VALUE + value
}

const mov = (param1, param2) => {
const newValue = param1.startsWith("V")
? values[param1]
: +param1;

values[param2] = getNewValue(newValue);
}

const add = (param1, param2) => {
values[param1] = getNewValue(
values[param1] + values[param2]
);
}

const dec = (param) => {
const newValue = getNewValue(values[param] - 1);
values[param] = newValue;
}

const inc = (param) => {
const newValue = getNewValue(values[param] + 1);
values[param] = newValue;
}

const jmp = (param, index) => {
if (values.V00 === 0) return;
execute(commands.slice(param, index + 1), false)
}

const execute = (cmds, isMainThread = true) => {
cmds.forEach((command, index) => {
if (isMainThread) mainThreadIndex = index;

commandActions[command.substr(0, 3)](
command.substr(4).split(","),
mainThreadIndex
);
});
}

execute(commands);

return Object.values(values);
}



console.log("Expected:", [14, 10, 0, 0, 0, 0, 0], "Actual:", executeCommands([
'MOV 5,V00', // V00 es 5
'MOV 10,V01', // V01 es 10
'DEC V00', // V00 ahora es 4
'ADD V00,V01' // V00 = V00 + V01 = 14
]))

console.log("Expected:", [0, 254, 0, 0, 0, 0, 0], "Actual:", executeCommands([
'MOV 255,V00', // V00 es 255
'INC V00', // V00 es 256, desborda a 0
'DEC V01', // V01 es -1, desborda a 255
'DEC V01' // V01 es 254
]))

console.log("Expected:", [0, 10, 0, 0, 0, 0, 1, 0], "Actual:", executeCommands([
'MOV 10,V00', // V00 es 10
'DEC V00', // decrementa V00 en 1 <---┐
'INC V01', // incrementa V01 en 1 |
'JMP 1', // bucle hasta que V00 sea 0 ----┘
'INC V06' // incrementa V06 en 1
]))

0 comments on commit 224220b

Please sign in to comment.