jueves, 26 de febrero de 2015

Librojuegos

Tal vez recuerden los libros de "Elige tu propia aventura" ochenteros. Parecen emparentados con una serie de entretenimientos como los juegos de rol o las aventuras conversacionales de ordenador: Los  antiguos MUD venían a ser un híbrido entre estos dos últimos.

Los librojuegos o "gamebook" serian una especie de juego de rol solitario. Aquí tenemos una herramienta que ayuda a escribirlos http://twinery.org/, que permite una planificación visual de las historias. También he encontrado un paquete de LaTEX, que ayuda en la construcción de esos libros (aquí archivo .tex con ejemplo). El paquete tiene un comando para identificar a los villanos, pero no entiendo muy bien como puede funcionar eso, o si solo sirve para resaltar la palabra.

En fin, ya saben:

Estás escribiendo a altas horas de la noche en tu computadora. A través de la ventana entra el frío resplandor de la luna y los párpados empiezan a pesarte. De repente escuchas unos amortiguados sonidos en el balcón, como si algún ave se hubiera posado.

  • Si decides irte a dormir, ve a la página 12
  • Si vas a inspeccionar el balcón, ve a la página 23
Yo me voy a la página 12.

lunes, 23 de febrero de 2015

Una historia de biblioteca


Imagen solo enlazada

Subí a la segunda planta de la biblioteca y también estaba plagada de humanidad, siquiera quedaba un taburete libre. La llamo “segunda planta” pero no es más que un ancho pasillo con estanterías sobre una gran sala central, compartimentada gracias a la disposición de las estanterías. 

Bajé y me senté en uno de los pocos lugares libres de una larga mesa que cobijaba diez sillas, entre la estantería de religión y política (sin duda el lugar más ignominioso). La compartía con estudiantes y algún jubilado. Entre los portátiles, libros y hojas que poblaban la mesa coloque mi libreta para practicar la resolución de integrales. 

Me llamo la atención un chaval de unos 17 o 18 años, sentado frente a mi y a la derecha, escuchando música con cascos, alternativamente mirando el móvil y dibujando en una libreta. Un lejano y quedo ritmo de reggetton fluía de sus orejas y se desparramaba tibiamente sobre la mesa. Un mal estudiante, pensé. Entre cambio y cambio de variable me fijé que toda su libreta estaba llena de dibujos, más bien textos dibujados, del tipo : “te quiero”, “Anarkia”,... 

Mi valoración sobre él cambió cuando le escuché algunos sonidos guturales mientras, concentrado, perfilaba unas letras. Sinceramente, pensé que estaba aquejado de algún retraso mental leve y sentí cierta piedad. Al rato dijo en alto; “un regalo para mi madre”, mientras alzaba su cuaderno. Dada mi recién parida opinión, evité mirar para no crear una situación incómoda puesto que no creí que la afirmación fuera dirigida a nadie en concreto. Sin embargo, un muchacho a mi derecha le contestó un “está guapo”. Pude oír el ruido sordo del romperse de mi esquema y el fino crepitar de una grieta más en mi esperanza en la supervivencia de la humanidad. Debía ser un chaval normal. 

 Unas cuantas integrales después, los dos muchachos de mi derecha se levantaron para irse y el de más allá, que fue el que apreció la obra tipográfica recientemente exhibida, se acercó al artista para decirle un “nos vemos en la autoescuela”. 

Esa inesperada entrada de datos, me ratifico que efectivamente el sujeto debía tener al menos 18 años y que era probable que no cursara estudios académicos (no hubo un “nos vemos en clase”, que sería más de esperar). El sujeto, llamado así pues ya se había convertido en objeto de estudio de mi distraída curiosidad, continuó dibujando y coloreando, mientras yo, habiendo completado mis taras prefijadas, me dedicaba a escribir estas líneas. 

 Finiquitando esta crónica, oteaba para poder ratificar que fuera un estudiante por medio de identificar algún utensilio típico: mochila, libros, calculadora. Pero fue en vano. Tenía un estuche de tela con cremallera repleto de colores y en vez de mochila al uso llevaba una bolsa de tela. Parecía que simplemente iba a dibujar a la biblioteca. 

 Era una situación extraña, el individuo coloreaba de azul el espacio entre un perfil de una nube y unas grandes letras que configuraban la frase: “te quiero mama”, mientras a escasos centímetros, frente a él, alguien aprovechaba para hacer estúpidos e inquietantes ensayos literarios. El te quiero mama, escrito con colores sobre papel de libreta cuadriculado, volvió a despertarme cierta compasión. No ya la que pueden ocasionar algunos adultos por estar atrapados en una mente que recuerda la de los niños. Era algo más general. La humanidad en su conjunto me parecía digna de lástima, se me antojaba como un perro aprendiera a decir te quiero a su amo, como un triste mono que  supera hablar de filosofía. Como si la conciencia fuera un camino perdido en los senderos de la evolución. 

Algoritmos

- Algoritmo Shuting-Yard, para interpretar entradas de fórmulas (rollo (3^3 + 45)/2.)
http://en.wikipedia.org/wiki/Shunting-yard_algorithm

sábado, 21 de febrero de 2015

Experimentos OCR sobre catalogación holgazaniforme de libros

Como quiero hacerme un inventario de libros, pero soy muy holganzán para hacerme el listado físico, he pensado a ver si un "reconocedor de caracteres óptico" (OCR) sería capaz de tal proeza a partir de unas fotos.
Si tuviera mediano éxito ya los alinearía mejor y tal.
En primer lugar he probado con par de programas online.

Obteniendo los siguientes resultados:

Foto a saco de 19 libros

http://www.free-ocr.com/ 
Eficacia de 2/19 = 0,105 (10%)

umtlíuanJ w sumo ll '“"’ “ """ ‘N’ 5
"""“ "’ l i" ‘ . ‘A usruuu
 1\1()(‘l( W125 m’ “su <x_)l1l1‘\l(
   
1 . 1. «.11 u.’ n’h|¡“.ur\u1 mnof)
A ’ «1 11111111111» 1=”.1111f;11’>‘1 1 t
 fl’
1
_¿ 910m1 llllfl n I| 0p sima 821 «mi».
’ EDGAR A. POE ’ POESÍA COMPLETA
N) . MELOUIAUEL 1NF1E1<NL> y»
_‘ 1o MLLO111A11EL1NF1ERNO f‘
mm .’11-«mm_’.w1yr¡ wrmuvng .11 Ï
‘AMAN ’
  LUCKY LUKE
VUSHIÏII USUI SHIIHÏHHII



http://www.onlineocr.net/ 
(Parece que lo ha reconocido al revés, se la he vuelto a subir girada, pero hace lo mismo) Eficacia de un 5% aprox, pero no es comparable.

1111113-NINS MS11 01111S0A
4NNOS09 MINOW
,5119nOVIMI 81/90
o oNsÁ3991 ih3ci \mol Á31.1 4 ~1'3991 `[ja Vicol 231-4
SI IANG-IIAI
aNni Dsoni
NVZ1:1111 4,41110~Gi
LNIAItri
t•MAIii1
"111 1:11.11,4
ar
1 II wos  1.I 1,1”.0111
V V •
V13'111,1100 VIS30d • 3041• IIVDC13
~ion las claves de la argumentación
VIIF1919
11,11111'1 '
\n'uno NODV11W1101 V1
101W11 I(') ) )1%1 I Ir 1 )1 )
I A cuinol'Ocl 410 est A

Software PC
Motor Tesseract 
No coment

v muy“
lS |)I ll\|( ( N'H ‘l\\|( A
N1 N |( ¡Y
K   a 
m IOR MULMION QUIMICA
‘ 1 ‘ EDGARA.POE°POFSIACOMHHA
N 1 ‘ —..v‘ U‘M‘Nv ¿Lenmgunngmo Q ¿ ’ ' w «ln
y WN myü'.'üm, ‘ TARZAN
í LUCKY LUKE
" vnsmmusm " sum-cual

Motor Cuneiform

W()('l(AI'i l>l I lbl( l )(„)l li1l( A  A fe  LP $Pt $ „8. !/f QI *)  I

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


Foto de 8 libros, también tal cual salen.


http://www.free-ocr.com/ 
Eficacia de un 1/8=0,12.
H» Ludwig Wittgenstem g 15mm w,“ g;
-‘o”u’.‘ u’ .l, ' ‘.° ,v'_ .’ ,""_'.o'_.’ "’.’.’. i.
Él a A ’fl’-‘--‘--‘I@www aw’:
I Fedónfá’ Platún ,
I ‘Jacas, gercüs. guerras y bruma‘
b Ütnpm  Y Uta?“ "“‘ ,


http://www.onlineocr.net/ 
Eficacia de 4/8=0,5 o superior. WOW!
I Ludwig Wittgenstein
■ Isidoro Reguera
RENE DESCARTES DISCURs0 Di 1. MÉTODO
a'hiN'L II t'II
Fedón ♦ Platón
Vacas. cerdos, guerras y brujas
Harris
Pr• • 1 • 1 1 •
Utopía riir
Utopía 1-, 

Con software en PC, el resultado era peor.

Resumen:
Se ha llegado a un reconocimiento del 50%, cosa que no esta nada mal. Seguramente, mejorando la fotografía (alineación y dirección de los títulos) se podrían conseguir mejores resultados. Por cierto, en la página más eficaz (http://www.onlineocr.net/ ), da igual la dirección en que subas la imagen, supongo que debe detectar la dirección automáticamente, por desgracia los libros están desordenados y pasa lo que pasa.

Los resultados no han sido dramáticamente malos, por lo que tal vez continúe la investigación.


viernes, 20 de febrero de 2015

Configurar colores en LaTeX.


En el preámbulo, ya sea en TexMaker o Lyx, podemos utilizar:

\definecolor{gris_x}{gray}{0.95}
\definecolor{naranja_x}{rgb}{1,0.56,0}

El primero es para gris y el segundo para color en RGB.
En estos enlaces tenemos un listado de colores y un conversor de códigos RGB. En el comando hay que indicar las proporciones de color (Red, Green, Blue, de ahí el RGB) en proporción de 0 a 1.

Códigos RGB:
https://web.njit.edu/~kevin/rgb.txt.html 

Conversor de códigos:
http://w3.unpocodetodo.info/utiles/conversor.php

domingo, 15 de febrero de 2015

Programa en C++

Un programa en C++, para practicar con cadenas y eso.
Queda más bonito con unos applets que dejan el código muy bonito, pero como hay que ponerlos en la parte HTML del post, y es un código de programación, da errores y cosas raras. Así que lo meto a la antigua usanza.  
El resultado es este:


Es una chorradita, pero haciendo un programa más complejo, se podría ayudar a despejar derivadas bastante complicadas. Si se pone la ecuación como una cadena, el programa puede ir desgranándola y aplicando las reglas de derivación iterativamente. Como ejercicio puede ser interesante. 

//##############################################
/*
Este es un programa de práctica en C++.
Si se introduce una función exponencial con base
y exponente de una solo cifra, retorna su derivada.
*/
//##############################################
//Se declaran librerias que se usaran
#include <iostream> //Esto iria con <> en vez de "" pero blogger no lo coge si no.
#include <string.h>
using namespace std;// Esto es para usar cout,cin.

int main(){


  // Declaro variables#################
   int x=0; //Como enteros. Aquí pongo x a 0 que usaré como contador.
   int base;
   int exp;
   int largo;
   char formula[30]; //Como caracteres
   char signo[2]="^";


   cout<<"La función a ingresar ha de ser de la forma x^y, donde \n";
   cout<<" x e y son enteros. P.ej. 4^6 \n";


cout<<"Ingrese la función: ";//Pregunta por la fórmula


cin>>formula; //Aquí captura la fórmula


largo=strlen(formula); //Mide la lingitud de la fórmula (auqne es siempre 3
            //Servirá para un programa más elaborado

 while (x<largo){ //Aquí empieza un bucle que busca el signo 

if (formula[x]==signo[0]){
 base=formula[x-1];//Asigna el valor del anterior a "^" como
 //base pero como numero ASCII (trabajamos con caracteres).
 exp=formula[x+1];//Aquí le asigna el valor del siguiente de ^ (exponente.

x=largo;} //Con esto se sale del bucle, si no hace cosas raras
               x++; }//Va sumando 1 a x para ir rastreando la cadena
               //Fin de while
cout<<"\n La derivada es :"<<char(exp)<<"*"<<char(base)<<"^"<<char(exp-1);
//Aquí da el resutado. Cuidado porque:
//char()es el valor del caracter en ASCII, pj char(52)=4
}

Raj derrotado. Chessmaster.

Otra partidilla contra una personalidad del Chessmaster. Una refriega un tanto sucia, pero hace tiempo que no jugaba y nunca había derrotado a un personaje de ELO > 1000. Ya sé que es muy poca cosa, pero es un progreso for me.

Aquí la partida:

jueves, 12 de febrero de 2015

Conexión LAN vs WIFI

Aquí los resultados:

LAN unos 16 metros hasta el router.

WIFI.

 Parece que la diferencia es la estabilidad de la conexión. EL cable no es solo ligeramente más rápido, pero sobretodo es siempre igual de rápido. 


lunes, 9 de febrero de 2015

2º Ejercicio resuelto de extremos de función con valores absolutos

Calcula los valores absolutos de f(x) = |x-1|+|x-2| en [0,4].

Resolveremos otro por que siempre me lío con lo del valor absoluto, y no es tan complicado.

En primer lugar le quitamos el valor absoluto a hostias  del siguiente modo:

\(|x-1|=0\) si x = 1, entonces:
\(x \geq 1 \Rightarrow |x-1|= (x-1) \)
\( x < 1 \Rightarrow |x-1|= -(x-1) \)

Por otro lado:

\(|x-2|=0\) si x = 2, entonces:
\(x \geq 2 \Rightarrow |x-2|= (x-2) \)
\( x < 2 \Rightarrow |x-2|= -(x-2) \)

De ese modo:
Si \(x< 1 \Rightarrow f(x)= -(x-1)-(x-2) = -2x +3 \)
Si \(1 \leq x < 2 \Rightarrow  f(x)= (x-1)+(-(x-2))= 1 \)
Si \(x \geq 2 \Rightarrow f(x)= (x-1)+(x-2) = 2x-3 \)

Derivando vemos que \(x<1\) es derivada < 0 y \(x>2\) es derivada >0. La función baja y sube. En el intervalo [1,2] es plana. Ver las derivadas es inmediato. Entonces el valor mínimo es [1,2] y el máximo es un extremo que para \(f(4) = 5\).

Representación de las funciones estudiadas y de su descomposición.



Ejercicio resuelto de máximos y mínimos en función de valor absoluto

Estudie los máximos y mínimos (extremos) de \(x|x-2|\) en [-1,3]. 


-------

Vemos que el valor absoluto \(|x-2|= 0\) para \(x = 2\). Y así:

Para \(x \geq 2 \Rightarrow \; x|x-2| = x(x-2)=x^2 -2x\)
Para \(x < 2 \Rightarrow \; x|x-2| = x -(x-2)=-x^2 +2x\)

Se trata de ponerle el signo a la operación, según el resultado del interior del valor absoluto dado el tramo.

Si derivamos para conocer los máximos:

\(x \geq 2 \; (x^2 -2x)'=2x-2 = 0 \) para x= -1. Ahí podría existir un máximo o mínimo (no siempre) pero cuidado porque estamos en  \(x \geq 2\), así que nada.

\(x < 2 \; (-x^2 +2x)'=-2x+2=0\), para x=1, que sí está en el rango qeu estamos evaluando. Para saber si es máximo o mínimo estudiamos la segunda derivada. (-2x+2)'=-2, que al ser negativa ese punto se trata de un máximo.

Para hacer un estudio detallado de los extremos, tenemos que estudiar también los puntos no derivables y los extremos.

¿Como sabemos que un punto puede ser no derivable? Estudiaremos los puntos raritos (esto solo es para sobrevivir), en este caso es precisamente x=2. Evaluamos con la fórmula de la derivada.

\(x \geq 2\Rightarrow  x^2-2x \Rightarrow \lim _{x \rightarrow 2^-}=\frac{f(x)-f(2)}{x-2}=  \frac{f(-x^2+2x)-0}{x-2}\) Por l'Hôpital; \(\frac{-2x+2}{1}=-2\).

Por el otro lado:
\(x < 2\Rightarrow -x^2+2x \Rightarrow \lim _{x \rightarrow 2^+}=\frac{f(x)-f(2)}{x-2}=  \frac{f(-x^2+2x)-0}{x-2}\) Por l'Hôpital; \(\frac{-2x+2}{1}=-2\).

Puesto que \(\lim _{x \rightarrow 2^-}\neq \lim _{x \rightarrow 2^+}\), no existe derivada en ese punto y hay que tener el cuenta el valor como posible máximo o mínimo. Siendo \(f(0)=0\).

Por último, evaluaremos los extremos del intervalo dado. \(f(-1)=-3\) y \(f(3)=3\), que resultan los extremos de la función.

Y aquí tenemos unas gráficas para seguir el ejercicio visualmente.



martes, 3 de febrero de 2015

Programar en C++

Compilador online:
http://cpp.sh/

Cursos:
http://www.cplusplus.com/doc/tutorial/program_structure/
http://www.c.conclase.net/curso/?cap=002b#inicio

Ejemplos:
https://saforas.wordpress.com/2008/01/04/codigos-sencillos-hechos-en%C2%A0c/

Me he instalado en el blog el  google-code-prettify, que se llama usando
<pre class="prettyprint">
Código aquí
</pre>
en el html. Lo anoto aquí como referencia.
// Programa basico
#include "iostream" //Imprime instrucciones en pantalla "" debería ser <> pero da problemas el código bonito este
using std::cout;
int main() // Siempre empieza así
{
        cout << "Hola mundo\n"; // Mensaje de salida
        return 0; //indica que el programa terminó bien
} //fin del programa

Si no ponemos en using std::cout, deberíamos ponerlo cada vez que ponemos cout (salida).



// Programa basico 2
#include "iostream" //Imprime instrucciones en pantalla
using std::cout; // se usa cout es un Out
using std::cin; // ídem pero en In
using std::endl; // ídem endl, fin de linea

int main() // Siempre empieza así
{
    int numero1; // se declara variable (entero)
    int numero2;
    cout << "Escriba dos números a sumar\n\n";
    cin >> numero1 >> numero2; // Lee los dos números
    cout << numero1 + numero2<< endl;
    return 0; //el programa terminó bi
} //fin del programa
// ####################
// # Programa basico 4#
// ####################

#include "iostream" //Imprime instrucciones en pantalla
using std::cout; // se usa cout es un Out
using std::cin; // ídem pero en In
using std::endl; // ídem endl

int main() 
{
    int numero_secreto; // se declara variable (entero)
    int numero1;
   
    srand(time(0)); // Se inicializa el random
    numero_secreto =rand()%1000; // El resto de 1000 de un número al azar
cout<< "Adivine el número secreto entre 0 y 999\n \n";
cout<< "Introduzaca su número\n";
cin>> numero1;

while ( numero1 != numero_secreto )
    {
          if ( numero_secreto > numero1 )
          {
               cout << "Su número es menor." << '\n' << endl;
              
               cout << "Intentelo de nuevo: ";
               cin >> numero1;
          }
          
          if ( numero_secreto < numero1  )
          {
               cout << "Su numero es mayor." << '\n' << endl;
              
               cout << "Intentelo de nuevo: ";
               cin >> numero1;
          }
          
          if ( numero_secreto == numero1  )
          {
               cout << "\n#####################\n"; 
                 cout << "### ¡Ha acertado! ### \n"; 
  cout << "#####################\n\n" << endl;
          }
    }
    
    return 0; 
} 
A continuación, otro código donde se introducen clases y objetos. A mi me parecen las viejas subrutinas del BASIC, pero bueno.
 // Programa de prueba
#include "iostream"
using std::cout;
using std::endl;

//Defino clase
class Letreros
{
public:
 
void correcto()
  {                                  
cout << "╔═══════════════════════╗\n║\t¡Correcto!\t║\n╚═══════════════════════╝  \n"<< endl;    
  }
void error()
  {                                  
cout << "╔═══════════════════════╗\n║\t¡Error!\t║\n╚═══════════════════════╝  \n"<< endl;    
  }
  void bravo()
  {                                  
cout << "╔═══════════════════════╗\n║\t¡Bravo!\t║\n╚═══════════════════════╝  \n"<< endl;    
  }
};

int main()
 {
 Letreros  micartel; //crea un objeto de la clase
 micartel.correcto();
 }
 
Finalmente, podemos añadirle subrutinas u objetos al código anterior.
// ####################
// # Programa basico 4#
// ####################

#include "iostream" //Imprime instrucciones en pantalla
using std::cout; // se usa cout es un Out
using std::cin; // ídem pero en In
using std::endl; // ídem endl

//#################################################
//Defino clase
class Letreros
{
public:
void correcto()
  {                                  
cout << "╔═══════════════════════╗\n║\t¡Correcto!\t║\n╚═══════════════════════╝  \n"<< endl;    
  }
void error()
  {                                  
cout << "╔═══════════════════════╗\n║\t ¡Error!\t║\n╚═══════════════════════╝ "<< endl;    
  }
};//Fin de la clase
//#################################################

int main() 
{
    int numero_secreto; // se declara variable (entero)
    int numero1;
   Letreros  micartel; //crea un objeto de la clase
    srand(time(0)); // Se inicializa el random
    numero_secreto =rand()%1000; // El resto de 1000 de un número al azar
cout<< "Adivine el número secreto entre 0 y 999\n \n";
cout<< "Introduzaca su número\n";
cin>> numero1;

while ( numero1 != numero_secreto )
    {
          if ( numero_secreto > numero1 )
          {
               cout << "Su número es menor." << '\n' << endl;
               micartel.error();
               cout << "Intentelo de nuevo: ";
               cin >> numero1;
          }
          
          if ( numero_secreto < numero1  )
          {    micartel.error();
               cout << "Su numero es mayor." << '\n' << endl;
               
               cout << "Intentelo de nuevo: ";
               cin >> numero1;
          }
          
          if ( numero_secreto == numero1  )
          {
                micartel.correcto();
          }
    }
    
    return 0; 
}