Bienvenido al sector de Internet que no sabías que existía.

sábado, 28 de diciembre de 2019

Asesinos de la década

Algunos todavía hacen el error más grande de los últimos años, que muy tristemente pero con enorme coraje la "década", que no alcanza su final aún, a regañadientes debe aceptar. Esta inexactitud, supongo, no es realizada conscientemente, o mucho menos, al acecho de causar un mal a este grupo de diez años.
Todo bien, pero, ¿qué es esto? Oigamos entonces de una vez por todas, el argumento que yo les vengo a "imponer", creo, de cierta manera, debido a que muy pocas veces alguien defiende una cuestión tan inocua como la que leerás pronto, con tanta vehemencia y tanto, tanto entusiasmo. Comienzo:

La década está triste. ¿Por qué? Está triste porque ha recibido amenazas de muerte. No está asustada, porque sabe que nadie le hará daño, pero sin embargo, le pondrán final a su existencia de una forma apresurada, de la misma manera que han hecho con sus parientes "Siglo XX", y "Años 2000". Siempre le contaron que sus antepasados pasaron por un período similar, culminando su existencia en un año completo en el que no pasa ni una cosa, ni la otra.
Vamos a ver.
Años 2010 nació el 1 de enero del año 2011, y vive muy felizmente desde entonces, aunque por alguna razón el día de su nacimiento la gente ya consideraba su existencia hace un año. "¡Bienvenida, Años 2010!", decían los carteles que ya tenían 1 año de antigüedad. Y si bien este es su nombre, su nacimiento no había sido en 2010. Nunca lo entendió bien, hasta que Siglo XX se lo explicó:

"En un momento de la historia, los historiadores cometieron un error bastante insólito y, debo admitir, poco premeditado. Un tipo llamado Beda escribió un libro allá por el año 700 d.C. sobre la historia del pueblo inglés, llamado Historia ecclesiastica gentis Anglorum, y en el mismo documentó el traspaso del año -1, es decir 1 antes de Cristo, al año 1 después de Cristo, sin pasar en ningún momento por el año 0. Beda conocía muy bien el número 0, pero eligió hacer esto porque pensó que tendría mucho sentido: de todas formas, a la hora de contar nunca empezamos diciendo 'cero, uno, dos...'... Lo que Beda ignoraba es que esta decisión suya llevaría a muchos, o bien, a todos los historiadores a contar de la misma manera, empezando en el año 1, y que esto le causaría un estremecimiento muy grande a mucha gente. Incluso algunos podrían llegar a escribir artículos en un blog fantasma al respecto.
En fin, por eso, pequeña Años 2010, es que la gente cree que tu nacimiento fue en el año que lleva tu nombre. Quizás hasta incluso sea cierto, porque es mucho más cómodo hacerlo de esta manera. Lo que no es cierto, bajo ningún concepto, es mi nacimiento. Yo soy siglo XX, y la gente cree que comencé a existir el día 1 de enero del año 1900. ¡Ja! Siempre me causó gracia... Como si 100 años fueran poco, quieren que dure 101.
Veamos. Si el querido señor Beda y los historiadores comenzaron a contar la era común desde el año 1, ¡significa que 100 años se cumplen al final del año 100, no al principio! Te lo muestro en una línea de tiempo barata:

(1 de enero del 1) año 1, año 2, año 3, año 4, (1 de enero del 5) año 5 (31 de diciembre del 5)...

Se cumplen 5 años del comienzo del año 1 cuando termina el año 5. Si dijéramos que el "lustro" (período de 5 años) se termina el 1 de enero del año 5, entonces estaríamos solamente contando 4 años, y a lo sumo un día más...
Por eso, todos mis antepasados Siglo I, Siglo II, y todos hasta mi nacimiento el día 1 de enero de 1901, han nacido un año que termina en "01". Y por lo mismo, moriremos el último día de un año que termine en "00". Bah, no es que morimos, ni siquiera vivimos, somos solamente una construcción social, por eso es que te puedo contar esto, aunque en realidad nunca lo haya dicho porque no puedo hablar porque ni siquiera soy algo tangible y con capacidades. En fin, sigamos.
Y por la misma razón, no tiene sentido contabilizar a las décadas empezando en el año xyN0 y terminando en xy(N+1)0 (por ejemplo, del primer día del 2010 a un día antes del 2020). Esto implicaría automáticamente que existió una década que fue del primer día del año "00" hasta el fin del "09", y sabemos que ¡no hubo ningún año 00! Esto lleva a un absurdo."

Años 2010 no entendió todas las cosas que Siglo XX le dijo, pero sí se quedó con el concepto principal: la gente querrá que mueras a los nueve años, y no diez. Y por un año completo, ellos creerán que ya conviven con Años 2020, mientras que en realidad no hay ninguna década viviente, pues ellos han masacrado a la que coexistía en armonía y paz con sus queridos co-terraplanistas. (Por cierto, están equivocados.)

Años 2010 ha iniciado una petición en change.org que se llama "déjenme vivir un año más". Con todos los avances tecnológicos que ha traído, considera que se merece el respeto suficiente como para terminar su existencia en armonía, y que todos los artículos de Wikipedia que hablan de las "décadas" se pongan de una vez por todas en sintonía con su existencia y cambien su errada fecha de nacimiento y expiración.

Años 2010 se acuerda de las anécdotas de Siglo XX en el año 2000: "Toda la gente decía que este año sería el punto de cambio de la década, el siglo, y el milenio... Pero nadie sabía la fecha en la que lo haría. Sí, tenían razón, todo eso terminaría en el año 2000, pero no el primero de enero, sino el último de diciembre. Así es, hasta el 31/12/2000 la gente habitó en el año 2000, década de los 90, siglo XX (yo!), y segundo milenio (otro error común; ya vamos por el tercero). No fue sino hasta el 1 de enero del 2001 que comenzaron a vivir el esplendor de los Años 2000, y Siglo XXI, mi hermano quien perdura en el mando hoy con casi 19 años de edad."

Siglo XX, ya con la voz quebradiza por los años, dice:
"No dejes que hagan un festín por tu partida un año antes de que corresponda. ¡No como me hicieron a mí!".

Pero, a decir verdad, ¿a quién le importa todo esto? Total, no hay descuentos en helados por que cambie la década ni nadie regala pasas de uva bañadas en chocolate. Así que no jodan y vean una peli. Escribí todo esto un sábado con 30 grados y 100% de humedad sin prender el aire acondicionado porque no tengo nada mejor que hacer. :P

-----------------------

P.D.: Si el primer párrafo de este texto parece tener una redacción un poco extraña, es porque fue escrito con un mensaje oculto. Es una especie de acertijo, dejo a continuación una pista:
Uno de cada cual, desde el origen hasta el fin, solamente en el caso de que sea igual a la unidad la cantidad total de: uno de cada cosa, desde el 1 hasta cual, solamente en el caso de que cual dividido cosa no tenga resto. Son todos familiares.

sábado, 21 de diciembre de 2019

Estrafalario

El siguiente párrafo ha sido generado mediante las siguientes reglas:

  1. Se escribe una frase.
  2. Se cuenta la cantidad de caracteres y se la llama C.
  3. Se cuenta la cantidad de palabras y se la llama P.
  4. A continuación se posiciona el cursor inmediatamente después de la palabra en la posición (C mod P), se agregan dos comas, y se escribe algo en ese lugar.
  5. El proceso se repite tantas veces como se desee.
  6. Finalmente, se retiran las comas que sobran, se reemplazan por puntos, paréntesis, o el signo de puntuación que mejor quede.
El autor (que es quien le escribe a usted) supo notar que siguiendo esta metodología después de varios pasos, el valor de (C mod P) se estancaba cerca de 32, por lo que decidió agregar dos frases al final del texto, logrando que este valor ahora se mueva hacia cerca del 65 (estancado de todas formas). El autor se sorprendió por esto, no se esperaba que se mantuviera constante. Supo demostrar su sorpresa y sus decisiones en el texto.

Vamos a ver el texto de una vez:


En un, cumplimos una vez y, nuevamente en el principio, nunca más se repite. Abrir, estoy de acuerdo que por momentos resulta además tedioso, sin mencionar cuando el flujo, ese, el mismo, el único y no distinto que, aunque tenga una cantidad abrumadora de bucles que retornan al mismo punto, existe. Hilo de palabras que, con aspereza y mucha, y no solo mucha sino bastante dificultad, fluye, si bien parece ser que nos está tomando el pelo o quizás, parecería permanecer estático o, salpicado y errático, que no debería seguir una línea derecha, parece ser de una vez lineal y, sin pensarlo, pasa la otra. Suceden situaciones que no se pueden explicar, más de una vez; cerrar, se cierra el ojo que se abre, el del panqueque de fruta, de, sin, pocas cosas son tan confusas, más que agregar, por el final de la (también cuenta el supermercado que existe cerca de casa) historia, ojos. Por momentos, es casi indispensable agregar apéndices. De otra forma, parece ser que el límite es treinta y dos.

Luego de este descubrimiento, el autor no pudo evitar pensar más en este suceso, y llegó a la siguiente conclusión:

Probemos dos valores arbitrarios, por ejemplo C = 3 y P = 1. Entonces tenemos C mod P = 3.
Ahora aumentaremos el valor de C siempre en "7", de forma arbitraria, y aumentaremos P siempre en 1. Es decir, estamos asumiendo que agregamos palabras de 6 caracteres, junto con el espacio.
Veamos una "tabla":

  • (3+7) mod (1+1) = 0
  • (3+7+7) mod (1+1+1) = 2
  • (3+3*7) mod (1+3*1) = 0
  • (3+4*7) mod (1+4*1) = 1
Si continuamos así, obtenemos la secuencia 0, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, ... etcétera.
Probamos con otros valores iniciales; digamos C = 6, P = 1, y aumentando C en "14":
0, 0, 1, 0, 2, 4, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... y sigue aumentando en 1, indefinidamente.
Para otros valores se cumple también.

El autor cree que este comportamiento, al variar C en una cantidad no fija (ya que cada palabra tiene una cantidad distinta de caracteres, y cada frase una cantidad distinta de palabras) pero de todas formas siempre del mismo orden (todas las frases agregadas por el autor tuvieron casi la misma longitud y las palabras en promedio tienen la misma longitud), es una forma de explicar por qué el valor de (C mod P) se queda estancado. En una muestra pequeña, los valores 4, 5, 6, 7, 8, son casi iguales, y sumando 30 a esto, obtenemos 34, 35, 36, 37, 38, que parecerían ser el mismo valor.
En verdad no se estanca, sino que aumenta por muy poco y parece mantenerse estable.

Sigue siendo algo que el autor no se esperaba.

viernes, 15 de noviembre de 2019

El origen de una bestia

4 años atrás, la línea 9 era una en el montón. De Retiro a Caraza, con dos ramales que se dividen al llegar al sur, no tenía nada en especial. Coches de aspecto anodino que simplemente se encargaban de transportar a los pasajeros que pagaban por este servicio. Una línea de colectivos perfectamente normal.
Entonces, ¿qué ha pasado para que se convierta en la bestia que atormenta a la gente de Parque Avellaneda y de la Facultad?

El hecho se remonta al lunes 29 de febrero de 2016. El Centro de Estudiantes había sido elegido hace poco y tenían muchas ansias por llevar a cabo sus proyectos de modificación de los recorridos de las líneas de colectivos.
La mayoría pasaba cerca de la Facultad, pero al ser el barrio una zona poco turística, ellos estaban trabajando para hacer que pasen por la misma puerta.
Lograron acordar con la línea 7, con la 114, con la 101, e incluso con la 47 que hace varias cuadras pura y exclusivamente para pasar por la puerta, y luego hace un giro en U y vuelve por donde venía.
Pero no habían logrado acordar con la 56, ni la línea 86.
El 9 no pasa cerca de allí. Nunca lo hizo.

Nicolás, el encargado de llevar este proyecto a cabo, había estado recibiendo presiones de sus superiores para que cerrara efectivamente el acuerdo con todas las líneas. Tras muchos llantos y semanas de estrés, finalmente envió un correo extensísimo detallando por qué no era posible para las líneas 56 y 86 cambiar su recorrido.
Su 'jefe', Blas Arquímedes, no estuvo satisfecho con esta respuesta pero decidió conformarse con las cuatro líneas que había conseguido desviar.

Nicolás se sintió inútil, torpe, y necesitaba hacer algo más para que Blas Arquímedes no lo viera por el resto de su vida como "el que no pudo desviar el 56 y el 86".
Entonces tuvo esta idea; la idea que, sin saberlo, acabaría con él.

Nicolás presentó un escrito a toda su junta mencionando "desvío de la línea 9". Este escrito contaba el nuevo recorrido que la línea 9 tomaría a partir de julio, el cual incluía una parada en la puerta de la facultad.
Por supuesto, esto era un bulo. Un invento. Una farsa. Ficción. Fantasía. No existió nunca tal acuerdo, ni se puso jamás en contacto Nicolás con la línea 9.
Sin embargo, allí estaba ahora el cartelito en la puerta: "Línea 9".

---

Había llegado julio, y era hora de que el "nuevo recorrido" comenzara a surtir efecto. Nicolás estaba un poco nervioso, pues sabía que su historia era una bomba de tiempo. Todo el reconocimiento que Blas Arquímedes le había entregado desaparecería en un santiamén.
Comiéndose las uñas, se sentó junto con Blas y toda la junta a esperar al 9, para hacer una bienvenida inaugural.
Sus dedos comenzaron a sangrar por causa de la poca uña que le quedaba. "Doloroso, pero peor es lo que viene", pensaba.

Ya había pasado bastante tiempo y no asomaba ningún colectivo 9... Blas comenzó a sospechar que algo andaba mal, pero no emitió palabra.
Todos comenzaron a impacientarse, mirando sus relojes de forma intermitente.
Nicolás tenía 6 de 10 dedos sangrando.

Y de repente.
Dobla la esquina.
Un colectivo verde, muy similar al 114.
Pero con un número enorme en el frente:

"9 / Ramal UTN".

La junta comenzó a aplaudir frenéticamente. Todos menos Nicolás, quién estaba al borde de desmayarse.
"Vamos a tomarlo!", le espetó Blas.
"Hoy te doy el día libre. Sé que este te lleva a tu casa Nico, subite nomás. Bien hecho."

Nunca se supo más nada sobre él.

Nunca más nadie del centro se subió al colectivo.

Nadie lo vió. Nunca más.

Al menos, nadie que quiera verlo.

sábado, 9 de noviembre de 2019

El nueve

Era el cruce entre Mozart y Saraza. O más bien, el giro, porque ninguna calle seguía después de ese cruce. Quizás este lugar queda mejor definido como el fin de la avenida Santiago de Compostela, o el choque de Santander con Mozart. Todo esto es prácticamente el mismo lugar, con una diferencia de no más de 60 metros. En la vecindad de esta zona puedo ver varias paradas de colectivos. Muchas más de las que esperaría, pero bueno, parece que estas líneas torcieron sus recorridos para pasar por la puerta de la Facultad. Se leen muchos números, 7, 114, 101, 47, números muy lindos y todos de color azulado o verdoso. Estos colectivos pasan por Saraza y Mozart incesantemente, uno atrás del otro, sin parar. Pero hay otro. En la mismísima puerta de la Facultad, altura 2300 de la calle Mozart, veo siempre ese cartel que me está por enloquecer. "Parada línea 9".
Al principio no lo había notado; entre tantas líneas de colectivo pasó desapercibido. Pero un día comencé a notar que nunca, jamás había visto un 9. La gente comentaba "sí, yo lo ví solo una vez", "ah, yo lo ví dos veces", "no, ni idea el ¿9?". Pero los testimonios del avistaje de 9 existían.

Fue cuestión de tiempo para que un día, lunes lluvioso a la madrugada, me encontrara transitando Santiago de Compostela en la línea 7, y segundos antes de doblar en Mozart, se produjera el milagro:
Un microómnibus verde, de apariencia similar al querido 114 (sus coches nuevos, los anteriores eran una basura) se escapaba furiosamente de mi vista. Sin embargo, olvidó un pequeño detalle: el número de línea se encuentra en los laterales del colectivo, y ahí pude ver con claridad: "Línea 9".
Inmediatamente se fue.
Nunca más lo ví.
Fue anécdota para el día, primer avistaje de 9. O eso creía.

De curioso, al llegar a casa ingresé al sitio web Omnilineas, en el que los recorridos de todas las líneas están a disposición de quien desee verlos. Tecleo "9".
"Enter".
Palidezco.

La Línea 9, de dos ramales, no pasa ni siquiera cerca de la Facultad.
Ya de forma eléctrica, me dirigí hacia otras fuentes. Wikipedia, veamos. Artículo: "líneas de colectivos de Buenos Aires". Línea... A ver... 9, aquí está.
Cargando...

Es azul.
El 9 es azul.
Pero, pero... yo lo ví... Es VERDE

En un estado de confusión máxima, no pude hacer otra cosa que no fuera preguntar a mis compañeros: ¿de qué color es el 9 que vieron?

"Blanco, medio verde". "Verde claro, todo verde". "Rojo, como el 141". "Creo que era azul oscuro".

Crisis, crisis, caos y destrucción. Nada tiene sentido. Todo es ilógico. Me voy a dormir.

---

Pasan varias semanas. Ya había recuperado la compostura. Creo que es hora de salir de casa.
Hice mi querido recorrido usual, tomando dos colectivos para llegar a mi Universidad.
Bueno,  "querido" es un eufemismo de demencial, demoníaco, desagradable, e incómodo. Incómodo como tener que tener ropa mojada todo el día. Desagradable como encontrar una mosca en la sopa, junto con pelos, cucarachas, todo menos sopa.
Día muy nublado. Nubes negras flotaban sobre mí.
Estaba el 7 en la rotonda de Laguna, y yo dentro en el asiento de adelante de todo.
Estaba el 9 delante de nosotros.
"¡¡El 9!! ¡¡El 9!!" grité frenéticamente. Nadie pareció inmutarse. Ni siquiera el chófer, quien por mis gritos debería haber quedado sordo.

Acto seguido, como una paloma cuando descubre que la están siguiendo y se va volando, el 9 dobló por una calle en contramano y se desvaneció.
Al pasar por esa calle, miré hacia el horizonte, y no había rastro alguno del colectivo.
¿A dónde habría ido? No hay forma de que hubiera recorrido toda la cuadra y doblara en ese tiempo. Fueron apenas 2 segundos.
"¿Viste eso?", le pregunté al chofer.
No respondió, ni siquiera levantó la vista. Parecía como si yo estuviese viendo un video de un tipo manejando un colectivo, y estuviera dentro de él.
Miré a mi alrededor, y toda la gente estaba sentada silenciosamente, sin decir una palabra, ni mirar a nadie.

Llegamos a la parada de la Universidad, y toda la gente bajó a la vez. Yo bajé último.
Al pisar la calle mojada, esquivando los charcos, decido levantar la vista.
No había ningún 7, ninguna persona. Nadie había hecho ningún ruido.

Quizás se tomaron el 9.

viernes, 4 de octubre de 2019

Tutorial de C: (ce dos puntos, cdots)

En este breve instructivo pretendemos brindarle al lector una introducción al lenguaje C:.
Ce dos puntos, en inglés "c dots", creado en el año 2000 por el holandés Felicitos Van Emoji y el macedonio del norte Bing Bong Smijlejfajs, es un lenguaje de programación basado en C que busca utilizar la simbología que lleva el apellido de su creador Emoji para facilitar la tarea del programador, y para brindarle un momento jovial durante su trabajo que, de otra manera, sería más aburrido.
Veamos algunos operadores y su correspondencia en C.

Asignación de Variables
Funciona de una forma muy similar a C, con la única diferencia de que, como C: es más flexible, permite usar absolutamente cualquier nombre de variable. Si recordamos, C tiene algunas restricciones: no podemos llamar a una variable "int", o "char", o cualquier otro tipo de dato, y tampoco podemos llamarla comenzando con un número, como "3hola".
Para diferenciar el tipo de dato del nombre de variable, C: utiliza el operador ":V". También llamado 'pacman', se debe colocar entre el tipo de dato y el nombre. Ejemplo:

int :V contador ;)

Algo que es importante mencionar, como se puede ver en el ejemplo de arriba, es que el tradicional punto y coma de C se reemplaza por un ";)", también llamado 'emoji de guiño'. Se debe dejar un espacio antes de insertar este operador.

Si quisieramos asignar un valor a una variable, utilizaríamos el comando "=)", también llamado 'carita rara'. De la siguiente forma:

int :V contador =) 34 ;)

O bien, si ya existiera la variable:

contador =) 0 ;)

Comparaciones
En C tenemos comparaciones como <, >, ==, <=, etcétera. En C: también las tenemos, pero con algunas modificaciones. He aquí un listado de las comparaciones en C y a su lado el equivalente en C: :

  • < (menor) pasa a ser o<o (se lo suele llamar "duck" o "pato")
  • > (mayor) pasa a ser o>o (a este también)
  • == (igual) pasa a ser \o/ (se le llama "rexona no te abandona")
  • >= (mayor o igual) y <= (menor o igual) quedan iguales, pues ya son caritas
  • != (distinto) pasa a ser u.u (se lo llama "únu", ¡pero no hay que confundir su ortografía!)
Por ejemplo, dentro de un bucle "if" podríamos tener una condición como sigue:

:thinking:
if (: contador o<o 5 :)¿
      variable+o+ ;)
?

Equivalente en C

if(contador < 5){
      variable++;
}

Aprovechamos para introducir la sintaxis de C:. Podemos ver que en lugar de corchetes {} C: utiliza signos de pregunta ¿?. Se utilizan de la misma forma que C, exactamente. Es decir, se pueden y deben escribir en los mismos lugares que en C. Según los creadores: "no teníamos ganas de pensar nada".
Además, podemos ver que la condición se abre y cierra con caritas sonrientes (: y :), y que antes del bucle se incluyó un emoji de 'pensando'. C: sostiene que ante todo debe ubicarse la diversión, incluso antes que la legibilidad del código, por lo que antes de cada bucle "if" debe colocarse un emoji de :thinking:.

Esto dará pie a nuestra siguiente sección:

Bucles (while, for y sus correspondencias)
Ya vimos el uso del "if" en la sección anterior de este tutorial. Procederemos ahora con los bucles "while" y "for".
Estos bucles tienen una tamaña diferencia en comparación con C, a diferencia de "if". La sintaxis de un "while" es como se muestra a continuación:

:eyes:
boring (: contador o<o 5 :)¿
      :thinking:
      if (: cdots.internal.donkey.happy \o/ true :)¿
            break dem loop XD ;)
      ?
      else oof ¿
            //instrucción
            contador -.- ;)
      ?
?
:yay:

Ese código es el equivalente a lo siguiente en C

while(contador<5){
      //instrucción
      contador--;
}

Es notoriamente más largo, pero los creadores aseguran que "la diversión que provoca programar en C: lo vale, y mucho". Algunos programadores, sin embargo, difieren con creces al respecto.

Analicemos el código del "while" en C:. Primero, vemos que el nombre del bucle es "boring". Esta es la diferencia más notable a la hora de programar, pues es el único lenguaje que utiliza este término. También podemos ver una gran presencia de emojis y stickers, pues se debe incluir un :eyes: antes del bucle, y un :yay: posteriormente. Esto simboliza al programa aburriéndose y luego alegrándose cuando el bucle termina; los creadores afirman: "nuestros estudios indican un bajo nivel de adrenalina en el CPU al ejecutar ciclos while en C, sin embargo, los ciclos boring en C: han aumentado estos niveles y por consiguiente la esperanza de vida y felicidad promedio de nuestros computadores".

Además, podemos ver a simple vista que todo ciclo 'boring' posee un 'if' dentro suyo, con el :thinking: que le corresponde. Vemos que se corrobora el estado de una variable de un objeto que no nos interesa mucho a estas alturas como programadores (ya veremos tutorial de objetos en C: en otra ocasión). Lo que nos importa aquí es lo siguiente:

"cdots.internal es un método que accede a las variables y objetos internos de C:"

Uno de ellos es el "donkey", objeto interno muy muy importante en C:. Este 'burro' tiene una variable que representa su estado de felicidad. Básicamente, está feliz si no se ejecuta un ciclo 'boring'. Entonces, cuando el burro esté feliz, significa que debe salir del ciclo, y por eso llama al comando "break dem loop XD", que se debe escribir tal cual lo hemos enunciado. Si les causa gracia, pues los creadores de C: han logrado su cometido.
Finalmente, vemos que el "--" de C se convierte en "-.-" en C:. Una sutileza.
Lo mismo sucede con "++", esto se escribe "+.+".

Uno podría plantearse, ¿para qué es necesario incluir un break si estamos hablando de un ciclo equivalente al 'while'? Sencillo: los creadores olvidaron codificar el ciclo 'boring' de forma correcta, y nunca se termina a no ser que se rompa explícitamente. Por eso hay que hacerlo a mano y controlando el estado del 'donkey'.

Otra cosa a notar es el "else oof". Normalmente en C uno tiene "if", "else if", y "else". Esto ha sido reemplazado en C: por "if", "else ree", "else oof", respectivamente.

Ahora bien, intentemos ver el ciclo "for":

:robertdowneyjunior:
four (: int :V i =) 0 ;) i o<o 5 ;) i+.+ :)¿
      :lol:
      //instrucción
?

Equivalente en C

for(int i=0; i<5; i++){
      //instrucción
}

Vemos que la sintaxis de este es mucho más corta que la de un 'boring', pero la condición es absolutamente ilegible. Intentemos desglosarla a continuación:

  • (:, apertura de paréntesis
  • int :V i =) 0, se encarga de inicializar la variable "i" en 0 como hemos visto en la primera parte del tutorial
  • ;) es el punto y coma de C:, y siempre debe escribirse a continuación de un espacio, recordemos.
  • i o<o 5 indica que debe repetirse mientras i sea menor a 5
  • ;) otro punto y coma
  • i +.+ incrementa i en 1, como i++ de C
  • :) clausura de paréntesis.
Es decir, su sintaxis es prácticamente idéntica a la de C, con la sutil diferencia de que todo se escribe utilizando la sintaxis ilegible, absolutamente detestable, pero "hilarante" (según los creadores tarados), plagada de emojis, de C:.
Así como los otros bucles, el bucle "for" (que en C: se escribe "four" porque "lol why not", de acuerdo a los creadores) lleva un sticker o emoji de Robert Downey Jr., ya que su cumpleaños es el 4 de abril, o 4/4. A los creadores les causó tanta gracia esta elección que para conmemorarla añadieron como obligación incluir un :lol: antes de la instrucción dentro del ciclo "four".

Algunos ejemplos
Veamos algunos ejemplos de programas en C:. El primero es uno que devuelve los primeros 14 números de la sucesión de Fibonacci a partir del 3ero (0 y 1 no se muestran):

Podemos ver como nuevo el operando o+o que equivale a "+" en C. También existe el o-o que equivale a "-".
Vemos la función thiccPrint() que se encarga de imprimir en pantalla el contenido de una variable.
También, podemos ver que la variable dentro del ciclo "four" no se llama "i", como comúnmente se suele llamar, sino que se llama "B". Esta es una sugerencia de los programadores, para incentivar la cultura dank, referenciando al "B button".

Otro ejemplo. El programa a continuación halla una aproximación de la raíz cuadrada de un número basado en el método Babilonio:
Vemos que el tipo "float" se llama "pennywise" en C:, como un chiste interno referenciando al payaso de la saga "IT". También podemos ver las operaciones "*" y "/", que en C: se escriben *.* y (o/o). La división busca simbolizar una nariz de un cerdo, chancho, puerco, cochino, o jamón. Aunque usé un '/' y anduvo bien igual, qué se yo. Lo mismo con un "+". Seguro se olvidaron de anularlo.

(Para mí el "compilador" de C: son solo un par de #define y listo, qué querés que te diga).

Crean o no, estos programas funcionan a la perfección.

Espero que no haya quedado ninguna duda sobre como comenzar a utilizar C:. En otra ocasión explicaré el uso de arrays y de objetos.

Ante el surgimiento de cualquier pregunta, no dudes en realizarla.

Día emoji.

miércoles, 18 de septiembre de 2019

Respawn [contiene improperios]

Abro los ojos. Miro a mi entorno, encandilado por las luces perpetuamente encendidas. Me había dormido en una camita más o menos cómoda, a oscuras, pero aparecí acá. Siempre lo mismo. Me cubro con la mano porque me molesta, naturalmente. Refunfuño un poco, lanzo un improperio sin remitente, y voy a buscar la bolsa con ropa que dejé el día anterior. Me cambio. Aunque el baño no tenga puerta, eso no importa, total es temprano y todavía no vino nadie. Ya soy un experto en este arte.
Por suerte hay un McDonald's a una cuadra. Por mala suerte, ayer me olvidé de dejar la copia de las llaves en la bolsa y voy a tener que esperar a que lleguen los de seguridad y me abran... Da muchísima bronca arrancar así el día, ¿no? Y bueno, que más puedo hacer.
Esperé un rato, sentado en el piso, más o menos hasta las 7:30 que es cuando llegan los tipos esos. Esperé un ratito más, y usé la famosa fábula del profesor que entra por la puerta que "dejaron abierta por accidente" y que luego "habían cerrado" para pedirles las llaves, porque solo vine a dejar mis cosas y quería ir a desayunar. Nada, nadie puede creer eso, pero no tengo ganas de inventarme algo mejor.
El McDonald's está cerrado. Voy a tener que caminar un par de cuadras para el otro lado, creo que hay algunas confiterías abiertas ahora. Pero creo que los imbéciles no tienen comida apta para celíacos, y mi organismo inútil decidió que 'no le gusta comer productos con TACC'. Lpm. Que suerte la mía.
Este intento de híbrido entre un bar y un antro pulgoso estaba abierto, y como esperaba, no tienen nada que no sea medialunas, sanguchitos, todo eso. Me compré un café negro y por poco no me lo tiro en la cara de la bronca que tengo. Lo peor de todo es que esto es así todos los días.
Vuelvo a la facultad, intentando disimular un poco la bronca que tengo, aunque creo que ya nadie lo nota, es tan natural para mí...
Los tipos de seguridad se fueron. Empiezo a golpear bien fuerte la puerta. Si no me abren, la tiro y listo.
Ah, ahí vino uno. Me pregunta qué carajo me pasa. Lo mando a cagar y listo, ahí suele quedar nuestra charla amistosa. Ya lo conozco a Anselmo, es un pelado vago que nunca está en su puesto.
Todavía faltan 30 minutos para que arranque la clase. Probablemente me esconda en algún lugar que pueda pegarle a una pared, o donde pueda romper algo. Usualmente me encierro en algún aula desierta, total hay miles que a esa hora están vacías. Hay una que ya tiene la mayoría de los bancos a la miseria de tanto que los pateé... Por suerte justo ahí no hay cámaras.
Ahora que faltan 10 minutos debería andar cerca este otro profe con el que siempre hablo, no sé si porque es el único que me da charla sin putearme o por qué, pero esas oraciones que intercambio con él son los únicos momentos en el día en los que no quiero matar a alguien.
Ahí viene. Le voy a preguntar cómo le va. Bien, dice. Qué bueno. Le voy a decir que yo también, como siempre le digo. Creo que se lo cree.
Bueno, hora de entrar al aula. Uh, pero no tengo ganas de ver a mis alumnos. Son todos de madera. A veces les copio mal las cosas a ver si se dan cuenta, y ni idea... O les dicto una definición cualquier fruta con cosas que no vimos y nadie pregunta, están tan perdidos que ni se dan cuenta.
Ya fue, vamos a entrar.
Ni los saludo, para qué si total me voy a morir.
Bueno, a ver qué boludez puedo copiar hoy. Y vamos a copiar esto, ni sé qué es.
Nadie hizo preguntas, genial, porque no tengo idea de qué puse. Voy a copiar un ejercicio y que se mueran, si lo hacen bien y si no no me importa.

Ya terminaron las dos horas de clase, sólo quedan otras nueve antes de que termine mi turno.
Descubrí que extenuarme hasta ese punto es la única manera de poder terminar mi día.
Voy a la parada del colectivo, porque obviamente el auto es inútil en mi situación... "Veintiuno", le digo, aunque haya un cartel grande que dice "INFORMAR AL CHOFER SU DESTINO, NO EL PRECIO DE SU BOLETO". Qué me importa a mí eso.
Llego al otro lugar este, doy otra clase. Quedan seis horas. Ya siento el cansancio, muy fuerte, y solo voy por la mitad.
Colectivo, "veinte" (pintó ratonear un peso), llegué al otro. Quedan cuatro. Intento usar la mayor cantidad de energía que puedo, y ni siquiera almuerzo, ni como nada. A duras penas puedo caminar.
Paso por mi casa, agarro ropa para mañana, y me voy para la facultad otra vez.
Por suerte puedo ir en subte desde acá, así que ni pago, la salida de emergencia se puede abrir desde afuera sin problemas. Me miran mal pero que se jodan. Casi me caigo a las vías; hubiera sido una pena, todavía no dejé las cosas.

Otra vez en este edificio de mierda, vamos al quinto piso... A subir los noventa y nueve escalones que me separan desde ese baño maloliente y la planta baja.
Ya llegué. Agarro la bolsa con las cosas de hoy, la cambio por la nueva... La dejo bien escondidita, total nunca nadie la ve ahí donde la meto. Dejo la sube, también, porque sino mañana no me muero.
Ya no sé qué pasa a mi alrededor. Casi no puedo respirar, mi vista está completamente nublada, y probablemente mi sangre tenga menos azúcar que el cacao puro.
Es una buena señal.

Voy de nuevo al subte, paso por abajo de los molinetes porque ya no tengo fuerzas para saltar o abrir una puerta. Ni me puedo parar, así que viajo en el piso. Creo que creen que soy un granuja o algo así. Sería bueno estar en esa situación, la prefiero un millón de veces antes que la mía...
Ya llegué a mi parada, voy a bajarme. Le pido ayuda a la gente, capaz se compadecen, aunque internamente no puedo parar de pensar en agarrarlos de las piernas para hacerlos tropezar y que se partan la cabeza. Algunos me ayudan a pararme, y salgo a la calle.
Sólo un par de cuadras más, y casi llego.
Quedan dos...
Bueno, acá estamos. A ver las llaves... ¿? Uh, dónde las habré dejado... Bueno, ya fue, me tiro contra la puerta de vidrio.
El vidrio grande estalló en mil pedacitos. Lo habían reemplazado hace unos días porque la otra vez me pasó lo mismo y también me tiré encima. Probablemente esté todo ensangrentado ahora mismo pero como no puedo ver nada no tengo idea. Igual no importa, en serio.
El ascensor está acá, así que no tengo que llamarlo. Creo que hay gente afuera que se dio cuenta de que me estampé contra el vidrio. A veces me sorprende la poca capacidad de observación de los humanos. Pueden escuchar un estruendo y el ruido del cristal astillándose, ver al profe loco en el piso todo hecho pelota y no darse cuenta de que lo hago a propósito porque me olvidé las llaves.
Ah, hablando de eso, recién las encontré, las tenía en el otro bolsillo.

Creo que me pasé, estoy en el piso 15 y yo vivo en el... Uh, estoy demasiado mal, yo vivo en planta baja. Para qué mierda habré subido...
Bueno, aprovecho que subí, la escalera tiene un lindo agujero. Siempre me gusta tirarme por acá porque es re alto.
Nunca me doy cuenta cuando llego al piso, tampoco supe qué pasa con ese cuerpo.

---

Abro los ojos. La luz de mierda me encandila otra vez. Es muy loco ver que, no importa cuán bosta me haga el día anterior, siempre aparezco acá sano y salvo. Sólo tengo la ropa llena de sangre, pero bueno, eso pasa a veces. A ver, voy a buscar la bolsa...
¿La bolsa? ... La dejé justo acá...
Nooooo, decime que nooo.... Otra vez ANSELMO Y SU PUTA MADRE, ME CHOREASTE LA BOLSA DE NUEVOOOOOOOOOO

[Repetir indefinidamente]

jueves, 22 de agosto de 2019

Presentación: The Full Year Project

En la nueva solapa incluida en el menú de este blog, o bien siguiendo este vínculo, es posible encontrar el documento del The Full Year Project.
¿De qué va esto? Es un documento de texto que busca recopilar hechos sucedidos en todas las fechas del año, incluyendo conmemoraciones, nacimientos, y festividades.
Cada día se agrega, conforme lo incorpore a mi mente, una pequeña sección dedicada a esa fecha.
La información se recopila mayormente de Wikipedia, aunque también una gran parte proviene de vivencias personales (como por ejemplo, cumpleaños de conocidos).
El proyecto comenzó el 18 de agosto y terminará el 17 de agosto del año próximo.

Disfrutadlo.

domingo, 2 de junio de 2019

Tutorial de Cualquiera++

En esta pequeña guía mencionaremos algunos aspectos de Cualquiera++ que todo principiante debe tener en cuenta a la hora de comenzar a programar en este bello lenguaje. Comencemos:

Vamos a suponer que el lector ya cuenta con los conocimientos básicos de la programación, y se maneja con un nivel intermedio de confianza en otros lenguajes como C++, o C, o el que sea. Este artículo utilizará C++ como referencia a la hora de mencionar las diferencias que Cualquiera++ tiene respecto a C++, debido a que como podemos ver por el nombre, Cualquiera++ se ha basado en C++; de hecho, es una versión completamente mejorada y optimizada. Pero no me adelanto más, ¡empecemos de una vez!

Comportamiento del condicional 'if not' en Cualquiera++
A diferencia de otros lenguajes, Cualquiera++ no cuenta con el clásico operador 'if'. Para evaluar una condición, sólo es posible analizar si la condición no se cumple. Los creadores han optado por hacerlo de esta forma dado que acelera los tiempos de procesamiento y hace que el código sea más difícil de leer, y por lo tanto más difícil de vulnerar (Cualquiera++ es un lenguaje diseñado específicamente para que los hackers no puedan molestar).
Veamos algunos ejemplos:

if not(a > b){{
      // hace algo
}}

En este caso, solo se realiza el contenido dentro del condicional si 'a' no es mayor a 'b', es decir, si 'a' es menor o igual a 'b'.
Como podemos notar, la sintaxis es un poco diferente: se utilizan 2 llaves para abrir un condicional, y para abrir cualquier tipo de bucle o lo que fuera.

Tipos de variables en Cualquiera++
En este lenguaje podemos definir todos los tipos tradicionales admitidos en la mayoría de los lenguajes; es decir, int, float, double, char, etcétera. Tiene un tipo "string" nativo. Como método de prevención, sin embargo, el compilador intentará convertir la variable a todos los otros tipos de dato, por si el programador se ha equivocado a la hora de hacer el código. Por supuesto, ese caso nunca sucede, así que el programa siempre dará error.
Para evitarlo, debemos incluir el comando "please do not convert". Son cuatro comandos por separado, veremos el comando 'please' en detalle más adelante (Cualquiera++ le da mucha importancia a los buenos modales). Entonces, la declaración de una variable podría ser de la siguiente manera:

please do not convert int nota;;;
please do not convert string nombre = "Guido";;;

Podemos ver que es posible inicializar las variables en el momento de su declaración, como en el caso del string, y además vemos otra diferencia en la sintaxis: todos los finales de instrucción terminan con tres puntos y coma. Para asegurarse que el programador no se los olvide. De lo contrario, se dispara un comando 'shutdown' que apagará el ordenador en menos de 5 segundos. ¡Mucho cuidado! Recordemos que Cualquiera++ busca luchar contra el hackeo ilegítimo.

Bucles 'for' y 'while'
Estos dos bucles funcionan casi de la misma manera que en otros lenguajes, a diferencia de que, como no existe el condicional 'if', todos los controles se realizan de forma implícita con un 'if not'. Por lo tanto, se debe indicar que el bucle solamente se romperá cuando (en el caso del for) se agote el iterador, o (en el caso del while), cuando la condición sea falsa. Veamos un ejemplo para clarificarlo:

for (please do not convert int i=0; i<5; i.increaseBy(1)){{
      please do not break;;;
      // hace algo cinco veces
}}

Cosas que podemos notar de ese pedazo de código:
No existe la forma de incrementar una variable como i++, o como i+=1, o como i = i+1. Para ello existe el método increaseBy(num) que le suma 'num' a la variable. Puede utilizarse para operaciones aritméticas, o para sumar 1 en estos casos. Nuevamente, una prueba de que la ilegibilidad de Cualquiera++ es su mayor fortaleza.
Notamos también el uso de la palabra 'please' para indicar que el loop no debe romperse siempre. Es decir, la condición "i<5" se controla internamente con un "if not", por lo que podemos optar por escribir la condición negada, o bien agregar el comando 'please do not break' (internamente lo que hace es negar el resultado del 'if not' para que equivalga a un 'if' tradicional).

NOTA: dentro del "for" se utiliza solo un ";" y no tres.

Veamos el ejemplo de un while:

please do not convert int contador = 0;;;
while(contador < 5 or maybe contador == 5){{
      please do not break;;;
      // hace algo si se cumple la condición
      contador.increaseBy(1);;;
      reminder{{
            please break;;;
      }}
}}

Vemos varias estructuras nuevas en este código. Vamos a explicarlas:
No existe el operador "<=", es decir "menor o igual", por lo que se debe incluir el "igual" como condición separada.
Los operadores lógicos son "and also", "or maybe", "exclusive or maybe", "not really", a diferencia de otros lenguajes. Su uso es análogo a "and", "or", "exclusive or" (pocos lenguajes tienen este notable operador), "not".
El bucle "reminder" se emplea para recordarle al compilador que debe romper el 'while' cuando no se cumpla la condición. Esto se debe agregar cuando el bucle tiene una longitud mayor a 5 líneas, o cuando no estamos seguro si lo recordará. Pues, el compilador solamente recuerda las últimas 3 instrucciones dadas, como forma de optimizar la memoria RAM utilizada.
Solamente debemos incluir un "please break;;;" dentro del mismo en el caso de un while. Podemos ver el bloque 'reminder' utilizado también en otros bucles como el 'switch', o en definición de algunas funciones. Pero eso lo veremos más adelante.

El operador 'please'
A diferencia de otros lenguajes, Cualquiera++ busca tratar de una forma más amigable al programador, y espera lo mismo de quien escriba el código. Por lo tanto, todas las instrucciones descritas a continuación deben incluir el comando 'please' en el comienzo:

  • please break
  • please do not convert
  • please do not break
  • please run
  • please do not shutdown(this)
  • please compile
  • please keep going
Hay algunos más, pero no los incluiremos todos en este artículo para evitar posibles fallas de seguridad. Recalcamos, la esencia de Cualquiera++ es su perfecta seguridad. ¡No podríamos dar todos los comandos así sin más!
Algunos de los comandos que no hemos explicado:
-"please run" se debe incluir al comienzo de cualquier código escrito en Cualquiera++, de lo contario el programa nunca se iniciará.
-"please do not shutdown(this)" es un comando que debe incluirse si uno no desea que ante el menor fallo de optimización su ordenador se apague (Cualquiera++ a menudo interpreta cosas erróneamente como fallas de la seguridad). shutdown(this) es una función de la biblioteca 'safety', que se debe importar al comienzo del programa si se desea incluir el 'please do not shutdown(this)'.

NOTA: Las bibliotecas se importan de la siguiente manera, al comienzo del código:

   please #include <nombreDeBiblioteca> thank{{sys.compiler;;;please do not answer;;;}}
Luego veremos el bloque "thank" en detalle.

NOTA 2: algunos novatos creen que si no se importa la biblioteca 'safety' entonces no se podrá llamar al método shutdown() que apaga el ordenador, pero eso no es cierto. Cualquiera++ puede hacerlo porque tiene otro método idéntico propio. Esta llamada, sin embargo, se anula al utilizar el 'please do not shutdown(this)'

Otro error común es pensar que la parte que dice (this) es un parámetro. Esto es falso. "shutdown(this)" es el nombre completo de la función.

-"please compile" es un comando opcional, que no realiza nada a nivel software, pero genera la ilusión de que el programador está proporcionando motivación y ánimos al compilador, y le genera felicidad.

-"please keep going" es una forma alternativa de escribir 'please do not break'. Su función es exactamente la misma, pero a veces el programador querría optar por cambiar un poco las palabras para no aburrir al compilador.

Los otros comandos que contengan 'please' serán notificados al programador a medida que se tope con el error "#ERRORNAME: BePolite (line X)". Eso significa que en la línea número X falta un comando 'please'.

Definición de funciones
En Cualquiera++, la definición de funciones se escribe de la siguiente manera: (ejemplo con función que suma dos enteros)

please do not convert the following
please let me define functionName(param1, param2){{
      param1 istype int;;;
      please do not convert param1;;;
      param2 istype int;;;
      please do not convert param2;;;
      please do not convert int suma = param1.increaseBy(param2);;;

      please return suma;;;
      thank{{
            functionName;;;
            please do not answer;;;
      }}
}}

Cosas nuevas en este código:
  • 'please let me define' es el comando que se utiliza para definir funciones. Así como en Python es "def", y en Javascript es "function".
  • 'please do not convert' debe ser incluido antes de la definición de la función, pues como Cualquiera++ no admite funciones con tipo de dato (como en C++ uno podría decir "int algo(x,y)", debemos aclararle que no la convierta.
  • 'the following' significa que el tipo de dato al que nos referimos está en la siguiente línea. Esto es análogo a escribir 'please do not convert please let me define functionName' en una sola línea, pero a veces el compilador libera la RAM antes y se olvida lo que está haciendo. Es una buena práctica utilizar 'the following' al definir funciones. No lleva ";;;" al final.
  • 'istype' se utiliza para indicar el tipo de dato que es un parámetro de la función. Esto es obligatorio. Por supuesto, a continuación se le debe indicar que no lo convierta.
  • NOTA: no podemos primero indicar 'istype' para todas las variables y luego indicar que no lo convierta, porque correríamos el riesgo de que el compilador libere RAM y olvide la instrucción.
  • El bloque 'thank', se utiliza para agradecer a la función por haber hecho su trabajo. El bloque 'thank' solo toma como contenido el nombre de la función, y como por default retorna "#ERRORNAME: YouAreWelcome" debemos aclararle que no responda con el statement 'please do not answer'. Pues, el compilador intenta ser educado, pero al solo poder hacerlo mediante un error, el ordenador lo interpreta como una falla de seguridad y se apaga.
NOTA: No utilizamos el bloque "reminder" porque en este caso toda operación está dentro de un margen de 3 líneas. Si tuviésemos la declaración de param1 a 6 líneas de distancia de la declaración de 'suma' como param1.increaseBy(param2), deberíamos incluir un 'reminder{{please keep going;;;}}' en el medio.
Operaciones matemáticas básicas (resta, división, multiplicación)
La suma ya hemos visto que puede ser realizada mediante el comando increaseBy(num). Veamos cómo realizar multiplicaciones:
Dado que no existe ninguna forma de multiplicar dos números, debemos hacer un bucle 'for' que sume X cantidad de veces. Por ejemplo, para hacer 2 * 3:

please do not convert int num1 = 3;;;
please do not convert int num2 = 2;;;
please do not convert int suma = 0;;;
please do not read emoji;;;
for(please do not convert int i=0; i<num1; i.increaseBy(1)){{
      please do not break;;;
      suma.increaseBy(num2);;;
}}

Luego, a "suma" se le sumará "2" unas "3" veces.
Lo único nuevo acá es "please do not read emoji". Esto se debe incluir porque, en este caso, al reemplazar num1 con '3' en la condición del for tendremos "i<3", y el compilador puede interpretar <3 como un corazón y causar un error que apagará la computadora.

Para darle amor al compilador, el programador debe optar por agregar comandos 'please' vacíos.
NOTA: incluir un 'please do not answer', porque Cualquiera++ automáticamente responde con un "#ERRORNAME: YouAreWelcome" y apaga el ordenador.
Ejemplo:

      please;;;
      please do not answer;;;
      please;;;
      please do not answer;;;

Por otro lado, si deseamos multiplicar números que son ambos no enteros (1.5 * 2.3, por ejemplo), o son ambos negativos, deberemos crear un script en otro lenguaje e importarlo como biblioteca, dado que Cualquiera++ no lo admite. Cualquiera++ puede importar bibliotecas en C, C++, o C#.

Sin embargo, si tuviéramos sólo uno de ellos negativo o con parte fraccionaria, no habría problema dado que increaseBy() puede trabajar con cualquier tipo de dato (incluso no números).
Eso sí, debemos aclarar que no convierta el número, y que es un float (o double, o long float, etc.) Por ejemplo, si sumaramos a+1,5:

      a.increaseBy(please do not convert 1,5 float);;;

Y si el número fuera negativo, debemos aclararle que es 0 menos que el número, e incluir el comando 'isnegative' al final, para evitar que se malinterprete como un error (y ya sabemos qué pasa cuando Cualquiera++ halla un error... SHUTDOWN), de la siguiente manera (para hacer a-5):

      a.increaseBy(please do not convert 0-5 isnegative);;;

Esto se debe a que la función increaseBy(x) internamente comienza con la instrucción "x istype auto;;;", sin un 'please do not convert', dado que asume que será un 'int' (y lo convertirá exitosamente, si es un 'int'). Pero 1,5 no es int (es un 'float' o 'double'), y -5 tampoco (es un 'isnegative int', o 'isnegative').

PROTIP:
Para dividir, podemos hacer dos bucles 'for' anidados, que controlen todas las multiplicaciones posibles y guarden el valor cuando se cumpla la condición de que su multiplicación sea igual al primer número. No haremos el programa porque la forma más corta de hacerlo lleva alrededor de 50 líneas.
Sugerimos utilizar otro lenguaje para realizar operaciones aritméticas.

Esto es todo por hoy.
Esto ha sido una breve introducción a Cualquiera++. Recomendamos que experimenten con este maravilloso lenguaje, y encuentren los errores por su cuenta, dado que esa es la mejor manera de aprender. Posiblemente deban encender su computadora varias veces, ya que cualquier error se interpreta como violación de la seguridad. Incluso hay algunos errores que eliminan el sistema operativo completo, o archivos muy importantes.
No diremos cuales, dado que allí radica la gracia y la diversión de aprender Cualquiera++ :)

¡Diviértanse!

Cualquier duda, dejar un comentario; gustosos la responderemos.

Un guiño del escritor:
please thank{{please do not convert reader isObject;;;please do not answer;;;}}

(veremos clases y objetos en otro artículo)

viernes, 10 de mayo de 2019

Cómo ser un calendario humano (remake)

Un remake de una vieja entrada... Disponible aquí. A ver si lo logro explicar mejor.

A menudo para entretener a la gente le pido su fecha de nacimiento... "26 de septiembre de 1999". Y luego les digo "¿te acordás si ese domingo llovió o había sol?". La mayoría se ríe, alguno que otro se queda un poco perplejo, existen también los que responden "ah no pero vos estás completamente demente". Hay de todo, como en todos los aspectos de la vida, mucha variedad.
Pero también están los que preguntan, con sinceridad... "decime, ¿cómo es que hacés eso? Quiero aprender". Así que les dedico la siguiente explicación:

Vamos al grano. ¿Qué hace falta?
Mi respuesta es: saber sumar, saber lo que es un número par, saber dividir por 2, saber las tablas del 7 (ni siquiera hace falta saberla completa), y tener la suficientes ganas de aprender esta técnica como para practicarla un poquito, porque, bueno, lleva un poco de práctica agarrarle la mano.

Y entonces, vos decime, ¿qué sumo?
Primero, se van a sumar unos cuantos números y al final vas a tener que hallar el resto de eso al dividir por 7 (o la congruencia módulo 7, como se le llama). En español: si te queda 71, como 70 es múltiplo de 7 (7*10) solo nos importa el 1 que sobra. Porque 71 = 70+1, entonces 71 = 1 (mod 7). Y dada esta característica del método, no hace falta sumar todos los números, sino que alcanza con sumar los mod 7 de cada uno.
Nota: se divide todo por 7 porque la semana tiene 7 días. Entonces el día 8 es lo mismo que el día 8-7 = 1. Etc.
Esta es una forma de agilizar un poco las sumas que hay que hacer mentalmente, ejemplo:

  • 71 + 14 + 5 = ummm ni idea
  • ah pero 71 es 1, 14 es 0, 5 es 5
  • entonces hago 1+0+5 y es lo mismo
  • 71+14+5 = 6 (mod 7)
Jajá, lo tengo en cuenta... pero decime qué tengo que sumar, ctm
Andando:

  1. Sumar el día. En 26 de septiembre de 1999, el "día" es "26"
  2. Sumar el código del mes. Cada mes tiene un valor asignado... solo hay que memorizarlo, no son muchos!
  3. Sumar el código del 'siglo'. Cada año comienza con 2 números: 1999 con 19, 2000 con 20, etc. Cada siglo tiene un código asignado, hay que memorizarlo pero es sumamente sencillo, son solo 2 números a efectos prácticos, salvo que quieran calcular fechas del año 1600 o por ahí, ahora lo explico.
  4. Sumar el 'valor del año'. Probablemente este sea el paso más trabajoso. Pero básicamente, consiste en lo siguiente: el 'año' son los dos últimos dígitos del año entero (1999=99, 2015=15, etc). Entonces el 'valor del año' se obtiene sumando el año + el año dividido 4, todo eso módulo 7. Puede resultar un poco complicado de calcular, pero hay algunos atajos. Ahora lo explico.
  5. Nota: Restarle 1 al resultado si el año es bisiesto y el mes es enero o febrero. Ojo con esto, casi nunca pasa pero existe el caso.
Entonces para 26 de septiembre de 1999, las sumas serían:
26 + código(septiembre) + código(19xx) + (99+99/4)
o lo que es lo mismo, todo mod 7, y reemplazando por los códigos (ya lo explico, aguantame!)

5 + 4 + 1 + (1 + 3) = 14 = 0
entonces como 0 = domingo, 1 = lunes, 2 = martes... etc, decimos que fue un domingo.
Nota: fijate que cambié 26 por 5 porque 26 = 21+5, y 99 por 1 porque 99 = 98+1 = 14*7 + 1, etcétera. Es más fácil para hacer las sumas mentalmente.

Bueno, eso se entiende, pero explicame los códigos que no entiendo nada.
Okey. Para los meses tenés que aprenderte esto (te dejo algunas reglas mnemotécnicas también):
Lo mejor es aprenderlo con práctica, y repitiendo. Realmente, no son muchas, son solo 12. Con algo de práctica y ganas se aprende.

  • Enero = -1 (enero es el primero, así que restamos 1. Nota: es lo mismo que sumar 6)
  • Febrero = 2 (como el número del mes)
  • Marzo = 2 (como su hermano febrero!)
  • Abril = 5 (como la cantidad de letras que tiene, ABRIL)
  • Mayo = 0 (la más fácil de sumar, porque no hay que sumar nada)
  • Junio = 3
  • Julio = 5 (igual que abril, la cantidad de letras que tiene JULIO)
  • Agosto = 1 (siempre me acuerdo esto como que es "a gosto", una sola 'a')
  • Septiembre = 4
  • Octubre = 6, o bien, -1
  • Noviembre = 2 (no! tiene 2 letras)
  • Diciembre = 4
A los que no le puse regla mnemotécnica es porque no tengo ninguna, simplemente me los acuerdo por práctica. Estás invitado a crear tus propias reglas.
Como vemos en el ejemplo anterior reemplacé septiembre por "4" porque es su código.

¿Y el código del año? No me veo haciendo todas esas cuentas...
Bueno. Antes yo había dicho que solo hacía falta saber dividir por 2 y saber cuando un número es par... Y creo que estamos de acuerdo que dividir por 2 no es algo que sea extremadamente difícil. Quizás hay algunos casos como 54/2 = 27 pero no es nada terrible. Así que:
Método más sencillo para obtener el código del año:

  1. Si el año es impar, restarle 1. Si no, nada.
  2. Dividirlo por 2.
  3. Repetir el paso 1 y 2.
  4. Sumar el año original + el resultado del paso 3, en módulo 7 si se prefiere, o los números completos, como quieras.
  5. Listo!
Ejemplo con 1957:

  • 57 => 56 (-1 porque es impar)
  • 56 => 28 (divido)
  • 28 => 28 (es par, no hago nada)
  • 28 => 14 (divido)
  • 57 + 14 = 1 + 0 = 1 (sumo todo en mod 7)
Con una mínima práctica, se puede hacer mentalmente. Pero bueno, no es el paso más fácil, estoy de acuerdo con eso.

Una pequeña nota sobre los años bisiestos:
Un año es bisiesto si sus dos últimos números son múltiplos de 4... Excepto que sean "00"... Excepto que el año sea 2000 (u otro múltiplo de 400, como 1600 o 2400 pero no nos importan mucho). Literalmente, esas son las reglas para años bisiestos. Súper extrañas. A nosotros solamente nos importa:

  • Si sus dos últimos dígitos son múltiplos de 4 y no son "00" es bisiesto (ej 1964, 2016)
  • Si es 2000 o 1600 o 2400 o cualquier múltiplo de 400, es bisiesto.
  • En todo otro caso, no es bisiesto (ejemplo: 2005 no es, 1900 no es, 1803 no es).
Entonces si estamos haciendo un cálculo con un año, y resulta ser bisiesto... al resultado final le tengo que restar "1" si y sólo si el mes es enero o febrero. Sino no hace falta.

¡Con esto ya estamos! Parece un poco largo, pero realmente es corto. Es decir, este programa hace todo eso y en solamente 3 (o 4, si se quiere) líneas:

def a(d,m,y):
    b=[0,6,2,2,5,0,3,5,1,4,6,2,4];c=[0,5,3,1];e=y%100;f=0
    if m<3 and y%4==0 and(y%100!=0 or y%400==0):f=1
    return(d+b[m]+c[y//100%4]+e+e//4-f)%7

Un poquito agolpado pero, realmente, eso es todo lo que describí recién. Es solo sumar 4 números y hallar el resto dividiendo por 7. Todo lo demás que escribí son ayudas para agilizar todo este tema cuando se hace mentalmente.

Tengo casi todo, me falta el 'código del siglo', wtf es eso?
Nada, es re fácil. Si el año arranca con 20xx, es "0". Si arranca con 19xx, es "1". Listo, eso nada más.

Peeero... si querés hacer cuentas más extremas, como en el año 1776, o en el futuro en el 2395, entonces te cuento un poco más (sentite libre de saltear esta parte si no te interesa):
Este 'código' sigue un período que es "1, 0, 5, 3", y se repite indefinidamente. Entonces, viene de la siguiente forma:
1600: 0
1700: 5
1800: 3
1900: 1
2000: 0
2100: 5
etc...
Así que solamente hace falta, o bien contar para adelante/atrás, o bien acordarse todos los valores para los siglos que te importen, o bien asociar que según los primeros dos dígitos mod 4 (20 = 0 mod4, 18 = 2 mod 4, etc), basta con fijarse qué número corresponde:
0 => 0
1 => 5
2 => 3
3 => 1

¿Por qué es útil saber la tabla del 7?
A la hora de calcular los 'módulo 7', no hace falta hacer toda la división ni nada... solamente, hay que pensar cuán cerca está el número del múltiplo de 7 menor más cercano. Con saber estos alcanza:
0
7
14
21
28
35
42
49
56
63
70
77
84
91
98
Los primeros son sumamente fáciles (0, 7, 14, vamos...), pero hay algunos que no son tan 'conocidos' como 98, u 84, incluso quizás no te suene el 63 o el 42... es bueno tenerlos frescos.

A continuación algunos ejemplos completos:


  • 31 de diciembre de 1977:
    • 31 + código(diciembre) + código(19) + (77+77/4)
    • 3 + 4 + 1 + (0 + 5) = 6, sábado.
    • Nota: el 3 y el 4 no los sumé, porque 3+4 = 7 = 0 (mod 7)
  • 14 de octubre de 2012:
    • 14 + código(octubre) + código(20) + (12+12/4)
    • 0 + 6 + 0 + (5+3) = 7 = 0, domingo.
    • Nota: sumar 5+3=8 es lo mismo que sumar 1.
  • 12 de junio de 1915:
    • 12 + código(junio) + código(19) + (15+15/4)
    • 5 + 3 + 1 + (1 + 3) = 6, sábado.
    • Nota: lo mismo, 5+3 es lo mismo que +1.
  • 4 de septiembre de 1998:
    • 4 + código(septiembre) + código(19) + (98+98/4)
    • 4 + 4 + 1 + (0 + 3) = 12 = 5, viernes
    • Nota: en este caso me pareció más fácil tomar 4+4 como +1 y hacer 1+1+3=5, salteándome el 12... a gusto de cada uno.
  • Para los atrevidos, 25 de febrero de 1778:
    • 25 + código(febrero) + código(17) + (78+78/4)
    • 4 + 2 + 5 + (1 + 5) = 3, miércoles
    • Nota: en este caso tomé 4+2 y 1+5 como ambos 6, o sea, como ambos -1. Entonces solo tuve que hacer 5-2 = 3.
  • 29 de febrero del 2000 (la mejor fecha de la historia):
    • 29 + código(febrero) + código(20) + (00+00/4)
    • 1 + 2 + 0 + (0+0) = 3... pero el 2000 fue bisiesto, le resto 1 = 2, martes!
    • Nota: es la mejor fecha porque fue el primer 29 de febrero (la mejor fecha) en un año con 3 ceros (el mejor año), en la historia de la humanidad.
  • 10 de mayo de 2019:
    • 10 + código(mayo) + código(20) + (19+19/4)
    • 3 + 0 + 0 + (5+4) = 12 = 5, viernes. Sí, hoy es viernes.
    • Nota: mañana es sábado pero hay clases igual. :c
Y bueno, eso es todo... Ahora solamente voy a describir, para los aventureros, cómo todo esto puede ser hecho incluso más rápido, y con menos cálculo mental... Aunque hace falta practicarlo muchísimo más. Bueno, acá voy:

Es posible memorizar el valor de año de los años entre el '90 y el 2019, para calcular las fechas más recientes en un abrir y cerrar de ojos. Además, sabiendo toda la década del '90 y los dosmiles, ya tenemos la fecha de nacimiento de mucha gente facilitada. ¿Alguna regla mnemotécnica? Sí, por supuesto. Te brindo del '90 a los '20, unos 40 años:

Algo a notar: el valor conforme aumenta el año, aumenta siempre en "1", salvo que se llegue a un año bisiesto, en ese caso se suma "2". Mirando un poco los ejemplos siguientes se puede razonar y entender bien:

los 90:

  • 90 = 0. Los primeros dos coinciden con su número final.
  • 91 = 1. Ves, te dije.
  • 92 = 3. Ahora, hasta el 96 tenemos que sumarle uno más a su último dígito nada más.
  • 93 = 4
  • 94 = 5
  • 95 = 6. Listo, tenemos más de la mitad ya.
  • 96 = 1. Estos se pueden aprender por repetición, son 4 nomás.
  • 97 = 2
  • 98 = 3
  • 99 = 4. Y este es el más útil, porque calcular el código de 99 mentalmente duele mucho.
los '00 y el 10 (súper fácil):

  • 00 = 0. Si es menor a 4, no podemos dividir por 4, así que queda el mismo número.
  • 01 = 1
  • 02 = 2
  • 03 = 3. Nada más que decir.
  • 04 = 5. A partir de ahora sí que podemos, así que solamente le sumamos 1.
  • 05 = 6
  • 06 = 0 (lo mismo que 7)
  • 07 = 1 (lo mismo que 8)
  • 08 = 3. Y bueno, acá es mejor aprendérselos, no cuesta nada.
  • 09 = 4. Este y el anterior.
  • 10 = 5. Acá pensamos que 5 es la mitad de 10 y ya está.
los '10:

  • 11 = 6. Hay una canción que se llama así.
  • 12 = 1. De acá hasta el 15 es como restar sus dos cifras, 2-1.
  • 13 = 2. 3-1, etc.
  • 14 = 3.
  • 15 = 4. Ya tenemos la mitad hecha.
  • 16 = 6. Se repite el 6.
  • 17 = 0. Es uno de los años "raíz", o sea que vale 0. ¡Es útil aprenderse las raíces!
  • 18 = 1. Me acuerdo porque viví este año hace muy poco.
  • 19 = 2. Es el año corriente.
los '20:

  • 20 = 4. Viene 4, 5 y 6 seguidos, sin mucha vuelta. A aprenderlos y listo.
  • 21 = 5
  • 22 = 6
  • 23 = 0. 23 es una raíz piola. Y la próxima viene pronto.
  • 24 = 2. De acá a la próxima raíz solamente es como restar sus cifras. 4-2.
  • 25 = 3. 5-2, etc.
  • 26 = 4.
  • 27 = 5.
  • 28 = 0. Llegamos a la otra raíz. Por supuesto, todos los múltiplos de 28 son raíces. (56, 84)
  • 29 = 1. Uno más que la raíz.
  • bonus: 30 = 2. Dos más que la raíz.
Y así se puede seguir. Lo conveniente, si ya se llega a este punto de desear memorizar los valores de cada año (son 100, por supuesto), es armar una lista y estudiarlos... O bien aprender las raíces y hacer cuentas en torno a eso... En fin, ya supone un esfuerzo, y no todos están dispuestos a enfrentarlo. Pero la herramienta está.

De ahora en más, la entrada anterior, del 9 de abril de 2014 (qué día fue? click) queda oficialmente obsoleta y la presente debe ser utilizada como referencia en su lugar.

Día.

miércoles, 1 de mayo de 2019

Éxito aquí

Cada tanto en esas clases entraba la señora con el teclado. Un teclado, digo, un piano eléctrico. El instrumento. Pedía permiso al docente, se asentaba en una mesa adelante de todo, observaba el panorama de la clase, y comenzaba a cantar. Su voz era bastante poco armoniosa, chillona, y a menudo mantenía esas notas agudas que generaban un murmullo en el aula, producto de una risa contenida en masa. Y como si eso fuera poco, sus hits estaban todos en una lengua extranjera que nadie del aula manejaba: el hebreo.

A lo largo de los años la misma señora se presentó de la misma manera en todos los cursos, incluso algunos dicen haberla visto en la terraza sola o en el vestuario de la pileta. Siempre saludaba afectuosa y cordialmente a los docentes, y se mostraba como una conocida. Pero nos quedamos en 'se mostraba'.

Un día, de tantos que existen en la vida de uno, se comenzó a rumorear que nadie conocía verdaderamente la proveniencia de la señora. Pues, se contaba que se escuchó a unas profesoras manteniendo una conversación similar a la siguiente:

+ "Che, ¿vos sabés quién es esa del piano?"
- "No, ni idea, pensé que la conocías."
+ "¿En serio? Yo pensé lo mismo. ¿Y quién es?"
- "Creo que nadie la conoce. Varias veces hablé con otras del área y todas la saludan porque las otras la saludamos nomás."
+ "Que raro..."

El rumor se hizo más extenso, pasando por todos los docentes, llegando a la jefa del área de historia (pues la señora del piano siempre entraba a las aulas de los docentes de historia), y ante tamaño misterio, esta pregunta llegó al mismísimo Director de la institución. Bueno, en realidad el rumor del esparcimiento del rumor de la señora del piano era otro rumor.

Pasó un tiempo... No se produjo ningún avistamiento de la señora del piano por unos meses. Pero eso era habitual, no estaba por todo el año interrumpiendo las clases de historia.
Hasta que me pasó esto.

Me había dormido muy temprano el día anterior, y entonces terminé despertándome más temprano que de costumbre. Como no tenía nada para hacer, me fui a clases bien bien temprano. Total, abrían las puertas como hora y media antes de la primera hora.
Llegué, bien temprano, de hecho antes que nadie, y me quedé esperando en la puerta hasta que abrieran, para poder entrar. En todos los años que había asistido allí, nunca había oído de nadie, ni de nadie que hubiera oído de nadie más, que hubiese llegado tan temprano como para esperar afuera. Creo que fui uno de los primeros en hacer eso, sino el primero.

Ya faltando 90 minutos para la primera hora (había llegado unas 2 horas antes), se abren las puertas, desde adentro. Me llamó muchísimo la atención, porque esto significa que ya había gente adentro, o que entraron por otra entrada, aunque yo no conocía ninguna otra además de la principal. Supuse que habría otra entrada.

Cuando entré, el lugar estaba completamente desierto. Ni siquiera había alguien que pudiera haber abierto la puerta. "Bueno, cerradura electrónica o algo", pensé.
Ya que era tan temprano, pensé caminar un poco por el colegio, total, no tenía nada para hacer, y bueno, ya fue.

Así que subí las escaleras, me propuse ir hasta el lugar más recóndito en la hora más insólita, solo como un 'logro desbloqueado' para mí mismo. Estaba, repito, sin nada mejor para hacer.
Entonces pensé subir a la terraza. Siempre había visto una puerta que conducía a algún lugar al que nunca había logrado entrar, y pensé aprovechar la situación para echarle un vistazo.
Llego al piso número seis, hago un pequeño paso de parkour para saltar por un hueco y ver si podía abrir la puerta desde ahí. Era como un mostrador o una barra extraña que había ahí, no sabía bien por qué... Hasta ese momento.

Debajo de la barra había una tapa, en el piso. No sé qué se me cruzó por la cabeza, que se me ocurrió levantarla a ver qué había debajo.

Al hacer eso, yo esperaba ver cablerío, o bien algunos caños, una rejilla... Pero no... Veo una escalera vertical que descendía unos metros para abajo. Curioso, pues, este era el último piso para arriba; no suele haber sótanos en la terraza...

Y bueno, qué más da... Descendí. Con cuidado dejé la mochila, iluminé un poco para ver si había algo que pudiera salir mal, y con un poco de imprudencia simplemente me metí en el agujero.
Tras descender unos 5 metros, me encontraría en una especie de entrepiso entre el piso 4to y 5to. Y hasta el día de hoy no puedo creer lo que vi.

Era un salón gigantesco, que ocuparía todo el piso de ese ala del edificio, sin ninguna pared en el medio, con un techo de una altura de cerca de 120 centímetros. Ahora me hacía mucho sentido por qué los pisos tenían tantos escalones entre ellos... Existían entrepisos muy amplios, quién sabe para qué.
Pero este no era un entrepiso cualquiera.
Estaba lleno,
completamente lleno
de teclados eléctricos.

Tenía una iluminación muy tenue, que venía principalmente del hueco por el que había bajado. Ya con un poquito de miedo (qué digo, estaba cagado) encendí la linterna de mi teléfono celular para ver mejor.
Ni bien se encendió el LED, que demora aproximadamente 0,7 segundos desde que se presiona el botón, me estremecí completamente y sentí escalofríos como si la temperatura hubiese descendido a -15 grados centígrados.

En el fondo del salón, bien allá lejos, estaba la señora. Quiero decir, yo pensé en algún momento de mi travesura que la señora podría haber estado allí múltiples veces, que utilizase eso como espacio de almacenamiento. Pero nunca, nunca, me esperaba verla allí... En su cama.

Por supuesto apagué inmediatamente la luz, pero lo que pude ver era una cama, al fondo de la sala, un velador al lado de la cama, una pila de libros, muchísimas partituras, y muchísimos, INNUMERABLES teclados rotos, y algunos sanos.

Escuché un movimiento, como si hubiese despertado a la señora, pero inmediatamente salí corriendo, subí por la escalerita, me raspé un poco las manos sin querer, puse la tapa, y rajé súbitamente de ese lugar.
Me fui lo más lejos que pude, yendo al comedor que estaba en la planta baja, esperando que la señora no bajase... Pues, yo seguía siendo el único que estaba en todo el lugar.

Afortunadamente eso no sucedió, y después de una hora comenzó a llegar más gente. El día siguió con normalidad.

---

Hasta el día de hoy, no me había animado a contarle esto a nadie. ¿Qué significaría lo que ví? ¿Cuánto tiempo hacía que la señora estaba en ese sótano de un metro 20 de altura? ¿Cómo podía ser que alguien viviera así? ¿Era acaso legal? ¿De dónde vino, y hacia dónde iría la señora? Demasiadas preguntas que nadie podría contestar, demasiadas preguntas que nadie debería plantearse nunca.

Pero hoy, ya varios años después de que yo terminara de cursar en ese lugar, me animo a contarlo...

Espero que no desate la catástrofe.

Sinceramente,
                       yo.