{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introducción a la Teoría de la información con Python" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](https://relopezbriega.com.ar/) en [Matemáticas, análisis de datos y python](https://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"NLP\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> \"La información es la resolución de la incertidumbre\" \n", "\n", "**[Claude Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon)**\n", "\n", "> \"Lo que está en el corazón de cada ser vivo no es *un fuego*, ni un *aliento cálido*, ni una *chispa de vida*. Es información, palabras, instrucciones ... Si quieres entender la vida... piensa en la tecnología de la información\"\n", "\n", "**[Richard Dawkins](https://es.wikipedia.org/wiki/Richard_Dawkins)**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introducción\n", "\n", "Muchas veces hemos escuchado decir que vivimos en la [era de la información](https://es.wikipedia.org/wiki/Era_de_la_informaci%C3%B3n). La *información* parece estar en todo los que nos rodea. Ya sea que consideremos a las computadoras, la evolución, la física, la [inteligencia artificial](https://relopezbriega.github.io/blog/2017/06/05/introduccion-a-la-inteligencia-artificial/), o nuestro cerebro; podemos llegar a la conclusión de que su comportamiento esta principalmente determinado por la forma en que procesan la *información*. \n", "\n", "La idea de la *información* nació del antiguo arte de la codificación y decodificación de códigos. Los encargados de esconder los secretos de estado durante la segunda guerra mundial utilizaban, en esencia, métodos para ocultar *información* y transmitirla de un lugar a otro. Cuando el arte de quebrar estos códigos se combinó con la ciencia de la [Termodinámica](https://es.wikipedia.org/wiki/Termodin%C3%A1mica), la rama de la [física](https://es.wikipedia.org/wiki/F%C3%ADsica) encargada del estudio de la interacción entre el calor y otras manifestaciones de la energía; surgió lo que hoy conocemos como [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n). Esta teoría fue una idea revolucionaria que inmediatamente transformó el campo de las comunicaciones y preparó el camino para la *era de las computadoras*. Pero las ideas de la [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) no solo gobiernan las comunicaciones y los *bits* y *bytes* de las computadoras modernas; sino que también describen el comportamiento del *mundo [subatómico](https://es.wikipedia.org/wiki/Part%C3%ADcula_subat%C3%B3mica)*, e incluso de toda la vida en la Tierra. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ¿Qué es la información?\n", "\n", "Hasta no hace no tanto tiempo atrás, nuestro conocimiento de la *información* era bastante vago y limitado. En 1948, [Claude Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) publicó un artículo titulado *[\"Una teoría matemática de la comunicación\"](https://es.wikipedia.org/wiki/Una_teor%C3%ADa_matem%C3%A1tica_de_la_comunicaci%C3%B3n)*, el cual transformó para siempre la forma en que entendemos la *información*. La [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) proporciona una definición matemática de *información* y describe con precisión cuánta *información* se puede comunicar entre los diferentes elementos de un sistema. La teoría de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) respalda nuestra comprensión de cómo se relacionan las *señales y el ruido*, y por qué existen límites definidos para la velocidad a la que se puede comunicar la *información* dentro de cualquier sistema, ya sea creado por el hombre o biológico. La habilidad de separar la *señal* del *ruido*, para extraer la *información* en los datos, se ha vuelto crucial en las telecomunicaciones modernas. \n", "\n", "La [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) es tan poderosa porque la *información* es física. La *información* no es solo un concepto abstracto, y no solo son hechos o figuras, fechas o nombres. Es una propiedad concreta de la materia y la energía que es cuantificable y mensurable. Es tan real como el peso de un trozo de plomo o la energía almacenada en una ojiva atómica, y al igual que la masa y la energía, la *información* está sujeta a un conjunto de leyes físicas que dictan cómo puede comportarse, cómo la *información* puede ser manipulada, transferida, duplicada, borrada o destruida. Y todo en el universo debe obedecer las leyes de la *información*, porque todo en el universo está formado por la *información* que contiene.\n", "\n", "Según la perspectiva de la *información* de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon), el significado no es importante, sino que lo que importa es *cuánta información es transmitida* por un mensaje. Una de las grandes intuiciones que tuvo [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) fue darse cuenta que cualquier pregunta que tenga una respuesta finita puede ser respondida por una cadena de preguntas por sí o por no. Así es como surge el concepto de *[Bit](https://es.wikipedia.org/wiki/Bit)*. \n", "\n", "### Bits\n", "\n", "Un *[Bit](https://es.wikipedia.org/wiki/Bit)* es la unidad fundamental en la que podemos medir la *información* y nos permite decidir entre dos alternativas igualmente probables. La palabra *[Bit](https://es.wikipedia.org/wiki/Bit)* deriva de binary digit, o sea [dígito binario](https://es.wikipedia.org/wiki/Sistema_binario), los cuales son representados por 1s y 0s. Pero si bien la palabra *[Bit](https://es.wikipedia.org/wiki/Bit)* deriva de binary digit no debemos confundirlos, ya que representan entidades distintas. Un *[Bit](https://es.wikipedia.org/wiki/Bit)* representa una *cantidad de información* definitiva. En cambio, un [dígito binario](https://es.wikipedia.org/wiki/Sistema_binario) es el valor de una variable [binaria](https://es.wikipedia.org/wiki/Sistema_binario), el cual, como ya dijimos, puede ser 0 o 1; pero un [dígito binario](https://es.wikipedia.org/wiki/Sistema_binario) no representa *información* en sí misma.\n", "\n", "Ahora bien, volviendo a las preguntas por sí o por no que mencionamos antes; responder cada una de estas preguntas requiere un *[Bit](https://es.wikipedia.org/wiki/Bit)* de *información*. Sólo necesitamos un *[Bit](https://es.wikipedia.org/wiki/Bit)* para responder una pregunta como ¿sos un hombre o una mujer?; el 0 puede significar hombre y el 1 mujer. Con simplemente transmitir ese dígito en el mensaje, estamos transmitiendo la respuesta. Pero aquí viene otra de las grandes intuiciones de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon); tampoco importa la *forma* que tome el mensaje, puede ser una luz roja versus una luz verde; o una bandera blanca y otra roja; realmente no importa el medio que se utilice, el mensaje siempre contiene un *[Bit](https://es.wikipedia.org/wiki/Bit)* de *información*. \n", "\n", "Y ¿qué pasa con otro tipo de preguntas? preguntas como adivinar un número entero entre 1 y 1000, o como, ¿cuál es la capital de Islandia? Estas preguntas también pueden ser respondidas con una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*. El lenguaje no es más que una cadena de símbolos y cualquier símbolo puede ser representado con una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*. Por lo tanto, cualquier respuesta que pueda ser escrita en un lenguaje puede ser representada con una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*, de 1s y 0s. Los *[Bits](https://es.wikipedia.org/wiki/Bit)* son el medio fundamental de la *información*.\n", "\n", "Esta realización, que cualquier información, cualquier respuesta, puede ser codificada en una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*, nos abre la puerta para pensar que entonces debe existir una forma de medir *cuánta información* hay en un mensaje.¿Cuál es la mínima cantidad de *[Bits](https://es.wikipedia.org/wiki/Bit)* para codificar un mensaje? Por ejemplo, para responder la pregunta planteada anteriormente de adivinar un número entero entre 1 y 1000, no se necesitan más que 10 *[Bits](https://es.wikipedia.org/wiki/Bit)*!. [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) encontró que una pregunta con $N$ posibles resultados puede ser respondida con una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)* de $log_2 N$ *[Bits](https://es.wikipedia.org/wiki/Bit)*; es decir que solo necesitamos $log_2 N$ *[Bits](https://es.wikipedia.org/wiki/Bit)* de *información* para distinguir entre $N$ posibilidades. Si no me creen, más abajo les dejo un botón para jugar a adivinar el número. (Si les consume más de 10 bits llegar a la respuesta correcta, no están utilizando la estrategia correcta!).\n", "\n", "Todo esto último relacionado a cómo medir *cuánta información* contiene un mensaje nos lleva a otro de los conceptos fundamentales de la [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n), el concepto de Entropía. \n", "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "## Entropía\n", "\n", "La idea central de la [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) es la Entropía. La *información* y la Entropía están intimimamente relacionadas, ya que esta última es en sí misma una *medida de información*. Cuando [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) comenzó a desarrollar su teoría, encontró una formula que le permitía analizar la *información* en un mensaje en términos de *[Bits](https://es.wikipedia.org/wiki/Bit)*. Esta formula que encontró mide, a grandes rasgos, cuan poco predecible es una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*. Mientras menos predecible, existen menos probabilidades de poder generar el mensaje completo desde una cadena más pequeña de *[Bits](https://es.wikipedia.org/wiki/Bit)*. Es decir, que al intentar medir cuan poco predecible es una cadena de *[Bits](https://es.wikipedia.org/wiki/Bit)*, [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) esperaba poder encontrar *cuánta información* contenía el mensaje. Ahora bien, ¿cuál es la cadena de 0s y 1s menos probables? Pues aquella que sea completamente aleatoria, como cuando lanzamos una moneda al aire y tenemos 50% de probabilidades de obtener cara o seca. Mientras más aleatoria es una cadena de símbolos, es menos predecible y menos redundante; y por lo tiende a contener una mayor cantidad de *información* por símbolo. Si bien esto parece una paradoja, ¿cómo algo que es completamente aleatorio contiene más *información* que algo que no lo es? Acoso, ¿lo aleatorio no es no lo contrario de *información*? Parece ser contra intuitivo, pero en realidad no lo es. Se puede observar facílmente con un ejemplo. Supongamos que arrojamos una moneda al aire 16 veces y representamos a la cara con un 1 y a la seca con un 0. Podemos obtener una cadena como la siguiente: 1101001110001011. Esta cadena es aleatoria y por lo tanto no podemos encontrar ningún patrón en ella que nos diga cuál va a ser el próximo valor que podemos obtener más alla de la chance de 50% habitual, por tal motivo, no podemos *comprimir* la cadena y cada símbolo contiene un *[Bit](https://es.wikipedia.org/wiki/Bit)* de *información*. Ahora supongamos que la moneda esta sesgada y que siempre sale cara; en este caso nuestra cadena será la siguiente: 1111111111111111. Esta cadena es sumamente predecible, no nos aporta ninguna sorpresa y tenemos una probabilidad de 100% de adivinar que el siguiente dígito también será un 1. Es totalmente *redundante* y por lo tanto no nos aporta ninguna *información*. Cada símbolo contiene un *[Bit](https://es.wikipedia.org/wiki/Bit)* de *información*. Sin sorpresa, no hay *información*. \n", "\n", "La fórmula matemática que encontró [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) para medir la Entropía de un mensaje es muy similar a la que se utiliza en [Termodinámica](https://es.wikipedia.org/wiki/Termodin%C3%A1mica) para medir el grado de desorden de un sistema. Es la siguiente:\n", "\n", "$$ H(x) = - \\sum_{i} p(i) log_2 p(i) $$\n", "\n", "Cuando [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) se dio cuenta de que la Entropía de una secuencia de símbolos estaba relacionada con la cantidad de *información* que la cadena de símbolos tiende a contener, de repente tuvo una herramienta para cuantificar la *información* y la redundancia en un mensaje. Fue capaz de demostrar, matemáticamente, cuánta *información* puede transmitirse en cualquier medio y que existe un límite fundamental para la cantidad de *información* que puede transmitir con un equipo determinado. \n", "\n", "\n", "Veamos algunos ejemplos de como calcular la Entropía con la ayuda de [Python](https://www.python.org/):" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "code_folding": [ 0 ] }, "outputs": [], "source": [ "# \n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import warnings\n", "\n", "# ingnorar mensajes de advertencias en el notebook\n", "warnings.filterwarnings('ignore')\n", "\n", "# graficos en el notebook\n", "%matplotlib inline\n", "\n", "\n", "def entropia(X):\n", " \"\"\"Devuelve el valor de entropia de una muestra de datos\"\"\" \n", " probs = [np.mean(X == valor) for valor in set(X)]\n", " return round(np.sum(-p * np.log2(p) for p in probs), 3)\n", "\n", "\n", "def entropia_prob_pq(x):\n", " \"\"\"Devuelve la entropia de una probabilidad de dos posibilidades\"\"\"\n", " return round((-x * np.log2(x)) + (-(1 - x ) * np.log2((1 - x))), 3)\n", "\n", "\n", "def entropia_posibilidades(x):\n", " \"\"\"Devuelve la entropía para la cantidad de posibilidades independientes x\"\"\"\n", " return round(np.log2(x), 3)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Graficando la información como sorpresa\n", "# Mientras menos probable, más sorpresa y más información contiene.\n", "vent = np.vectorize(entropia_posibilidades)\n", "\n", "X = np.linspace(0, 1, 11)\n", "\n", "plt.plot(X, vent(X)*-1)\n", "plt.title(\"Información como sorpresa\")\n", "plt.grid(color='b', linestyle='-', linewidth=.3)\n", "plt.xlabel(r'Probabilidades $p(x)$')\n", "plt.ylabel(r'sorpresa $H(x) = log_2 1/p(x)$')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Graficando la entropia en el caso de 2 posibilidades con\n", "# probabilidad p y (1- p)\n", "\n", "# vectorizar la función para poder pasarle un vector de parámetro\n", "vent = np.vectorize(entropia_prob_pq)\n", "\n", "X = np.linspace(0, 1, 11)\n", "\n", "plt.plot(X, vent(X))\n", "plt.title(\"Entropia para 2 posibilidades con probabilidad p\")\n", "plt.grid(color='b', linestyle='-', linewidth=.3)\n", "plt.xlabel('Probabilidades p')\n", "plt.ylabel('Bits')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1.0, 1.0)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# La entropia de una muestra de 2 posibilidades completamente\n", "# aleatorias, en la que cualquiera de los 2 valores tiene la \n", "# misma probabilidad (p=0.5) de ser seleccionada es de 1 bit\n", "\n", "# Muestra de 10000 valores aleatorios entre 0 y 1\n", "X = np.random.randint(0, 2, size=10000)\n", "\n", "entropia(X), entropia_posibilidades(2)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3.0, 3.0)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# La entropia de una muestra de 8 posibilidades completamente\n", "# aleatorias es igual a 3 bits.\n", "\n", "# Muestra de 10000 valores aleatorios entre 0 y 7\n", "X = np.random.randint(0, 8, size=10000)\n", "\n", "entropia(X), entropia_posibilidades(8)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Redundancia\n", "\n", "Otro de los conceptos fundamentales de la [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) es el de [Redundancia](https://es.wikipedia.org/wiki/Redundancia). La [Redundancia](https://es.wikipedia.org/wiki/Redundancia) son esas pistas adicionales en una sentencia o mensaje que nos permiten entender su significado incluso si el mensaje esta incompleto o distorsionado; son esos caracteres extra en una cadena de símbolos, la parte predecible que nos permite completar la *información* faltante. Cualquier sentencia de cualquier lenguaje es altamente redundante. Todo sentencia nos proporciona *información* adicional para que podemos descifrarla. Esta [Redundancia](https://es.wikipedia.org/wiki/Redundancia) es fácil de ver, simplemente tr-t- d- l--r -st- m-ns-j-. A pesar de que quitemos todas la vocales, igualmente se podemos entender la sentencia.\n", "\n", "Para nosotros, la redundancia del lenguaje es algo bueno, porque hace que un mensaje sea más fácil de comprender incluso cuando el mensaje está parcialmente modificado por el entorno. Podemos entender a un amigo hablando en un restaurante abarrotado de gente o hablando con un teléfono celular con mucha estática gracias a la [Redundancia](https://es.wikipedia.org/wiki/Redundancia) . La [Redundancia](https://es.wikipedia.org/wiki/Redundancia) es un mecanismo de seguridad; nos asegura que el mensaje se transmita incluso si se daña levemente en el camino. Todos los idiomas tienen estas redes de seguridad integradas compuestas de patrones, estructuras y un conjunto de reglas que los hacen redundantes. Usualmente no estamos al tanto de esas reglas, pero nuestro cerebro las usa inconscientemente mientras leemos, hablamos, escuchamos y escribimos. \n", "\n", "Cuando eliminamos toda la redundancia en una cadena de símbolos, lo que queda es su núcleo concreto y cuantificable. Eso es la *información*, ese algo central e irreductible que se encuentra en la esencia de toda sentencia. \n", "\n", "Para explorar en carne propia como la *información* es una medida de sorpresa y como la mayoría de los mensajes contienen bastantes *[Bits](https://es.wikipedia.org/wiki/Bit)* redundantes, les dejo otro juego; la idea es adivinar nombres que empiezan con \"R\" de Raúl a medida que se van descubriendo nuevas letras. Les garantizo que podrán descubrir los nombres sin tener que llegar que se descubra la última letra!\n", "
\n", "\n", "\n", "\n", "\n", "## Información e incertidumbre\n", "\n", "Nuestra experiencia del mundo nos lleva a concluir que muchos eventos son impredecibles y algunas veces bastante inesperados. Estos pueden variar desde el resultado de simples juegos de azar como arrojar una moneda e intentar adivinar si será cara o cruz, al colapso repentino de los gobiernos, o la caída dramática de los precios de las acciones en el mercado bursátil. Cuando tratamos de interpretar tales eventos, es probable que tomemos uno de dos enfoques: nos encogeremos de hombros y diremos que fue por *casualidad* o argumentaremos que podríamos haber sido más capaces de predecir, por ejemplo, el colapso del gobierno si hubiéramos tenido más *información* sobre las acciones de ciertos ministros. En cierto sentido, podemos decir que estos dos conceptos de *información* e *incertidumbre* están más estrechamente relacionados de lo que podríamos pensar. De hecho, cuando nos enfrentamos a la *incertidumbre*, nuestra tendencia natural es buscar *información* que nos ayude a reducir esa *incertidumbre* en nuestras mentes. Las herramientas que nos proporciona la [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) están en las bases de todos los modelos que desarrollamos para intentar predecir y lidiar con la *incertidumbre* del futuro.\n", "\n", "Aquí concluye esta introducción, el trabajo de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) habrió un campo enorme del conocimiento científico. Por años, criptógrafos habían intentado esconder *información* y reducir la redundancia sin siquiera saber como medirlas; o los ingenieros trataron de diseñar maneras eficientes de transmitir mensajes sin conocer los límites que la Naturaleza ponía a su eficiencia. La [Teoría de la información](https://es.wikipedia.org/wiki/Teor%C3%ADa_de_la_informaci%C3%B3n) de [Shannon](https://es.wikipedia.org/wiki/Claude_Elwood_Shannon) revolucionó la [criptografía](https://es.wikipedia.org/wiki/Criptograf%C3%ADa), el [procesamiento de señales](https://es.wikipedia.org/wiki/Procesamiento_digital_de_se%C3%B1ales), las [ciencias de la computación](https://es.wikipedia.org/wiki/Ciencias_de_la_computaci%C3%B3n), la [física](https://es.wikipedia.org/wiki/F%C3%ADsica), y un gran número de otros campos.\n", "\n", "Para cerrar, les dejo la implementación de los juegos utilizados en el artículo utilizando [Python](https://www.python.org/)! :)\n", "\n", "Saludos!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "code_folding": [ 0 ] }, "outputs": [], "source": [ "# \n", "import random\n", "\n", "random.seed(1982)\n", "\n", "\n", "def adivinar_numero():\n", " mi_numero = random.randint(1, 1000)\n", " bits = 1\n", " tu_numero = int(input(\"Adivine un número entero entre 1 y 1000\\nIngrese un número entre 1 y 1000: \"))\n", " \n", " while tu_numero != mi_numero:\n", " if tu_numero < mi_numero:\n", " tu_numero = int(input(\"Su número es muy bajo!\\nIngrese otro número entre 1 y 1000:\"))\n", " else:\n", " tu_numero = int(input(\"Su número es muy alto!\\nIngrese otro número entre 1 y 1000:\"))\n", " bits += 1\n", " \n", " print(\"Felicidades el número es {0} y ha utilizado {1} bits!\".format(mi_numero, bits))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "code_folding": [ 0 ] }, "outputs": [], "source": [ "# \n", "def adivinar_nombre():\n", " nombres = [\n", " \"ramses\", \"rodolfo\", \"regina\", \"ruth\", \"ramiro\",\n", " \"ramon\", \"roxana\", \"rebeca\", \"raquel\", \"ruben\",\n", " \"rosario\", \"renata\", \"raul\", \"romina\", \"roberto\",\n", " \"ricardo\", \"rafael\", \"rosa\", \"rodrigo\", \"rocio\"\n", " ]\n", " index = random.randint(0, 19)\n", " mi_nombre = nombres[index]\n", " tu_nombre = input(\"Adivina el nombre! Empieza con R y tiene {} letras: \".format(len(mi_nombre)))\n", " letras = 2\n", " bits = 1\n", " \n", " while tu_nombre.lower() != mi_nombre:\n", " mi_nombre_parcial = mi_nombre[:letras]\n", " if mi_nombre_parcial == mi_nombre:\n", " break\n", " \n", " tu_nombre = input(\"Inténtalo otra vez! Empieza con {0} y tiene {1} letras:\".format(mi_nombre_parcial,\n", " letras))\n", " bits += 1\n", " letras += 1\n", " \n", " print(\"El nombre es {0} y has utilizado {1} bits! Los restantes {2} son redundantes!\".format(mi_nombre.upper(),\n", " bits, \n", " len(mi_nombre) - bits))\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "adivinar_numero()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "adivinar_nombre()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Este post fue escrito utilizando [Jupyter notebook](https://jupyter.org/). Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/pyInformationTheory.ipynb) o ver su version estática en [nbviewer](https://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/pyInformationTheory.ipynb).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }