-
Notifications
You must be signed in to change notification settings - Fork 2
Algoritmo Mensaje Secreto
Este problema es muy sencillo, obtendrás una cadena que represente a una frase en código binario, y deberás traducirlo a palabras. No hay forma directa de hacer esto por lo que tendrá que traducir dos veces.
Primero debes convertir de binario a decimal para luego poder traducirlo a caracteres.
Las cosas son más fáciles si te centras en partes pequeñas, divide el mensaje lo que recibas y céntrate en una letra la vez.
Asegúrate luego de transcodificar un carácter de binario a decimal de restablecer cualquiera de las variantes que utilizaste para realizar la traducción. Asimismo, no te olvides de poner todo de nuevo en una sola cadena.
¡Solución abajo!
function binaryAgent(str) {
biString = str.split(' ');
uniString = [];
// Utilizando el parámetro base en parseInt podemos convertir el número
// binario a número decimal mientras simultáneamente lo convertimos a carácter.
for(i=0;i < biString.length;i++){
uniString.push(String.fromCharCode(parseInt(biString[i], 2)));
}
// Simplemente unimos la cadena.
return uniString.join('');
}
// realizamos el test
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
- Separamos la cadena en una matriz de cadenas separadas por espacios en blanco.
- Creamos una variable que será necesaria a lo largo del camino, el nombre se explica por si mismo.
- Iteramos por la nueva matriz de binarios.
- Convertimos a decimal utilizando parseInt(binario, 2) (con el segundo parámetro le decimos en que base nuestros números están actualmente)
- Al final, retornamos nuestro mensaje convertido.
function binaryAgent(str) {
// Separamos el código binario por sus espacios.
str = str.split(' ');
var power;
var decValue = 0;
var sentence = '';
// Comprobamos cada número binario de la matriz.
for (var s = 0; s < str.length; s++) {
// Comprobamos cada bit del número binario.
for (var t = 0; t < str[s].length; t++) {
// Esto solo toma en consideración los activos.
if (str[s][t] == 1) {
// Esto es equivalente a 2 ** posición.
power = Math.pow(2, +str[s].length - t - 1);
decValue += power;
// Guardamos el valor decimal sumándolo al anterior.
}
}
// Luego de que el número binario es convertido a decimal, lo convertimos en una cadena y lo guardamos.
sentence += (String.fromCharCode(decValue));
// Reseteamos el valor decimal para el próximo número binario.
decValue = 0;
}
return sentence;
}
// realizamos el test
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
- Para cada cadena binaria comprobamos los unos e ignoramos los ceros.
- Para aquellos que son uno o activo los convertimos en decimal. Esto toma en cuenta la posición y la potencia adecuada a la que tiene que ser elevado.
- Guardamos la potencia en la variable power sumándolo a los anteriores unos en la variable decValue. Esta variable continuará sumando las potencias de los unos activos hasta el final del bucle y luego retornará un número decimal.
- Convertimos el número decimal final en ASCII y lo añadimos a la variable sentence junto con cualquier otra cadena de texto ya convertida y almacenado.
- Restablecemos el valor de la variable decValue para evitar decimales equivocadas antes de continuar con el bucle externo.cara
function binaryAgent(str) {
return String.fromCharCode(...str.split(" ").map(function(char){ return parseInt(char, 2); }));
}
// realizamos el test
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
- Primero utilizamos
split()
para poder trabajar cada carácter como un elemento de matriz. - Luego utilizamos
map()
para procesar cada elemento binario a decimal utilizandopareseInt()
- Finalmente podemos utilizar
String.fromCharCode()
para convertir cada número ASCII a su correspondiente carácter. - Sin embargo
fromCharCode()
espera una serie de números en lugar de una matriz. Podemos utilizar ES6 Spread Operator para pasar una matriz de números como números individuales. Más información: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
function binaryAgent(str) {
var re = /(\d+)(\s?)/g;
function convertToChar(match,p1,p2){
return String.fromCharCode(parseInt(p1, 2));
}
return str.replace(re, convertToChar);
}
// realizamos el test
binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111");
- En esta solución utilizamos
String.replace()
para encontrar todos los números binarios y los convertimos en caracteres. - En primer lugar utilizamos una expresión regular para encontrar todos los números binarios y los espacios finales opcionales.
- A continuación, definimos una función que convierte cada primer subcoincidencia a número con
parseInt()
y luego en un carácter conString.fromCharCode()
. Al no utilizar la segunda subcoincidencia dejamos de lado todos los espacios que se encuentran entre cada número binario. - Por último utilizamos nuestra expresión regular y la función definida como parámetro de
String.replace()
.
Si encuentras útil este artículo puedes dar las gracias copiando y pegando este mensaje en el chat principal: Thanks @Rafase282 @JamesKee @sabahang @crisvdkooij for your help with Algorithm: Binary Agents
NOTA: Por favor añade tu nombre de usuario solamente si has añadido contenido relevante al artículo. (Por favor no remuevas ningún nombre existente.)
Learn to code and help nonprofits. Join our open source community in 15 seconds at http://freecodecamp.com
Follow our Medium blog
Follow Quincy on Quora
Follow us on Twitter
Like us on Facebook
And be sure to click the "Star" button in the upper right of this page.
New to Free Code Camp?
JS Concepts
JS Language Reference
- arguments
- Array.prototype.filter
- Array.prototype.indexOf
- Array.prototype.map
- Array.prototype.pop
- Array.prototype.push
- Array.prototype.shift
- Array.prototype.slice
- Array.prototype.some
- Array.prototype.toString
- Boolean
- for loop
- for..in loop
- for..of loop
- String.prototype.split
- String.prototype.toLowerCase
- String.prototype.toUpperCase
- undefined
Other Links