¡Compártelo!
Share on facebook
Share on twitter
Share on linkedin

Día del programador: resolviendo el enigma

En este artículo vamos a explicar cómo resolver el reto que nos propuso Profile con motivo del día del programador, así como algunas curiosidades sobre esta celebración anual.

Día del programador

¿Por qué se celebra el día del programador?

Me gustaría aprovechar la ocasión para comentaros el motivo por el que la comunidad de programadores decidió que el día del programador se celébrese el día 256 del año y no cualquier otro de los 365 (o 366 si es bisiesto), no es casualidad.

Si el año no es bisiesto, el día del programador caerá en un 13 de septiembre, en cambio, si el año sí que es bisiesto, se celebrará el 12 de septiembre.

Para explicar el porqué, vamos a comenzar hablando de los bits, ya que los ordenadores solamente son capaces de entender bits, y por tanto, es un aspecto de vital importancia en la comunicación con una computadora informática. Un bit solamente puede albergar los valores 1 y 0. 

Para entender mejor cómo funciona en un ordenador podemos decir que trabaja con puertas lógicas que irán incrementando las posibles combinaciones en función de la cantidad de bit que enviemos en dicha comunicación.

Un ejemplo típico para explicar los bits es el de las bombillas. Cuando un bit está a 1 estará encendida, en cambio, cuando este a 0 apagada:

Fuente: David Bernal González: Comenzando a programar con Java

Aunque el bit es la unidad mínima, existen unidades que son capaces de albergar gran cantidad de bits. Un ejemplo de ello es el byte (equivale a 8 bits). Y que usamos más frecuentemente de lo que nos imaginamos. Por ejemplo, cuando pulsamos una tecla de un teclado. 

En este caso, la A en mayúscula equivale al envió de el byte: 0100 0001 si transformamos el binario en conversor, podemos ver que es correcto:

Fuente: David Bernal González: Comenzando a programar con Java

Si escribiéramos HOLA el resultado sería el siguiente:

Fuente: David Bernal González: Comenzando a programar con Java

Existe una alternativa a utilizar un conversor entre código binario y su correspondiente ASCII Text, que es la de pasar un código binario a hexadecimal, tal y como se ve en la tabla y una vez tenemos el código hexadecimal pulsad la tecla ALT + EL VALOR DEL HEXADECIMAL

En el caso de la H si el valor en decimal es 72, y si pulsamos ALT + 72 nos escribirá una H y ya podemos confirmar cuál es el valor de dicho byte.

En los bits, se utiliza la base 2 ya que solamente tenemos dos opciones (1 y 0), por tanto, cuando trabajamos con unidades superiores al bit, para calcular el total de combinaciones que nos ofrece un rango de bits, por ejemplo, un byte (unidad que equivale a 8 bits) elevamos 2^8 vemos que tenemos 256, aunque esto nos muestra el rango máximo que puede tener un byte.

Que el día del programador se celebre el día 256 no es casualidad, sino que representa al conjunto de combinaciones que tenemos disponible dentro de un byte.

2^8 = 256 en la que 2 es la base binaria, 8 la cantidad de bits a la que equivale un byte y finalmente 256 representa como ya hemos dicho al conjunto de combinaciones que tenemos disponibles dentro de un byte.

Día del programador

Fuente: David Bernal González: Comenzando a programar con Java

Por lo que es común ver frases como la siguiente en la que se ven los 8 bits activos formando un 255 (+ el 0) hacen 256 en binario

Día del programador

Fuente: David Bernal González: Comenzando a programar con Java

En caso de utilizar la función Programador que nos ofrece la calculadora de Windows, si nos situamos sobre binario y escribimos 1111 1111, podemos ver que el valor en Hexadecimal es 255 y no 256.

Esto es debido a que el 0 también cuenta como posible valor y por ello siempre en muchas estructuras de datos se empieza por el 0 y no por el 1.

También, me gustaría destacar que la mitad de este rango de 256 combinaciones de bits son positivos y la otra mitad (en la que se incluye el 0 como negativo) son negativos.

Por tanto, 256 / 2 = 128 por lo que el rango irá de -127…0…+128

Byte = { -127…0…+128}

Resolviendo el reto

Bueno ahora sí que vamos a intentar resolver el reto, eso sí, me gustaría matizar que en la programación hay muchos caminos diferentes que tomar y que este solo es uno de ellos.

Tengo que reconocer que el reto es muy original y me recuerda a los mensajes cifrados que se mandaban para realizar las comunicaciones durante la 2ª guerra mundial. Todos los países juntaban a sus mejores expertos con la finalidad de descifrarlos ¿Seremos capaces? Yo creo que sí.

Día del programador

Lo primero que vamos a hacer es identificar cual es el patrón que sigue este mensaje, para ello, escribimos el abecedario junto a los números correspondientes empezando por el 0:

01234567891011121314151617181920212223242526
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ

Si sabemos que Java es ÑFAF podemos escribimos inmediatamente debajo para empezar a sacar pistas para realizar el descriframiento: 

01234567891011121314151617181920212223242526
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ
FJA

Como también sabemos que ÑFAF XHWNUY equivale a JavaScript, podemos continuar añadiendo letras a nuestro alfabeto:

01234567891011121314151617181920212223242526
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ
FHANJUWXY

Si analizamos la serie podemos ver que cada letra equivale a la letra que está 5 números más a la derecha, y por tanto donde ponemos una J pondremos una Ñ, y que con el resto de letras pasa lo mismo:

JKLMNÑ
12345

Para resolver el reto se me ocurren dos caminos, aunque existen muchos más:

  1. Crear un nuevo array en el que ordenar el texto
  2. Trabajar con el array actual sin tener que crear un array nuevo.

En mi caso, me he decantado por el 2 camino.

El problema con el que nos encontramos es que a las letras que hemos marcado en amarillo, no podemos restarle -5 ya que el array de caracteres acaba aquí y, por tanto, necesitaremos realizar una operación diferente para dichos casos.

01234567891011121314151617181920212223242526
ABCDEFGHIJKLMNÑOPQRSTUVWXYZ
FHANJUWXY

Os dejo una posible solución en este enlace.

Para escribir vuestro código o ejecutar JavaScript, podéis utilizar JSBIN, una herramienta que te permite ejecutar JS desde el navegador de forma muy sencilla. 

Si ejecutamos el código, podemos ver que el mensaje decía “FELIZ DIA DE LOS PROGRAMADORES”. Por lo que ¡misión superada!✌️

¿Participaste ya en el concurso? Permanece atento/a a los próximos retos que iremos publicando en nuestras redes sociales. ¡No te los pierdas!

Artículos relacionados

Que es TypeScript

TypeScript: qué es, diferencias con JavaScript y por qué aprenderlo

Si te dedicas al desarrollo Front-End o al desarrollo de software en general, seguramente hayas oído hablar de TypeScript, o incluso lo utilizas en tu día a día. Pero a los que simplemente tienen curiosidad por el mundo de la programación, a lo mejor, no

Mejores frameworks de Java en 2021

Los mejores frameworks de Java en 2021 para desarrollo web

En este artículo vamos a diseccionar los mejores frameworks de Java en 2021, aquellos marcos de trabajo imprescindibles para desarrollar aplicaciones web con Java en la actualidad. Java es uno de los lenguajes de programación más utilizados por los desarrolladores hoy en día y uno

qué es Gherkin

Qué es Gherkin: cómo usarlo y cuáles son sus elementos

En este post explicamos qué es Gherkin, un lenguaje DSL (lenguaje de dominio específico) muy cercano al lenguaje natural. Repasamos cómo usarlo y cuáles son sus elementos. Comprendiendo el marco dónde se aplica Gherkin: del TDD al BDD Igual que una planta crece hacia el