-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
136 additions
and
0 deletions.
There are no files selected for viewing
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
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 | ||
|
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
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 | ||
])) |