Minerva fue un intento de inteligencia artificial de un programador español a fines de los 80s, era una caja de dialogo en la cual el usuario podía charlar con la computadora o un programa, no contaba con los adelantos actuales en la materia, utilizaba trucos gramáticos y heuristicos para dar la impresión de inteligencia, aunque no lo lograba muy bien fue todo un impacto para aquella época y hoy se la recuerda erróneamente como el primer chatbot español, hubieron intentos anteriores con un nivel de análisis y respuesta a los problemas mucho mas avanzado pero no estuvieron nunca al alcance del publico en general, otros desarrolladores en todo el mundo hicieron sus aportes y compartieron sus ideas mediante BBS y otras redes, pero para los hispano parlantes estuvieron vedados por mucho tiempo.
Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas
martes, 22 de octubre de 2019
MINERVA, LA NEUROSIS MAQUINISTA
Minerva fue un intento de inteligencia artificial de un programador español a fines de los 80s, era una caja de dialogo en la cual el usuario podía charlar con la computadora o un programa, no contaba con los adelantos actuales en la materia, utilizaba trucos gramáticos y heuristicos para dar la impresión de inteligencia, aunque no lo lograba muy bien fue todo un impacto para aquella época y hoy se la recuerda erróneamente como el primer chatbot español, hubieron intentos anteriores con un nivel de análisis y respuesta a los problemas mucho mas avanzado pero no estuvieron nunca al alcance del publico en general, otros desarrolladores en todo el mundo hicieron sus aportes y compartieron sus ideas mediante BBS y otras redes, pero para los hispano parlantes estuvieron vedados por mucho tiempo.
lunes, 24 de noviembre de 2014
Inteligencia virtual como la de "Her"
Karen es una aplicación que está siendo desarrollada por la empresa británica Blast Theory, y mediante la cual podremos interactuar con una inteligencia artificial que nos irá conociendo a base de hacernos preguntas sobre nosotros, y reaccionará de diferentes maneras según nuestro estado de ánimo.
lunes, 17 de noviembre de 2014
Estocástico
Un proceso estocástico es aquel cuyo comportamiento es no determinista, en la medida que el subsiguiente estado del sistema está determinado tanto por las acciones predecibles del proceso como por elementos aleatorios. No obstante, de acuerdo a M. Kac y E. Nelson, cualquier desarrollo temporal (sea determinista o esencialmente probabilístico) que pueda ser analizable en términos de probabilidad merece ser denominado como un proceso estocástico.
domingo, 8 de junio de 2014
Asno de Buridán
El asno de Buridán es el nombre que se le da al animal que protagoniza un antiguo argumento de reducción al absurdo contra Jean Buridan (1300 - 1358), teólogo escolástico discípulo de Guillermo de Ockham, defensor del libre albedrío y de la posibilidad de ponderar toda decisión a través de la razón. Para satirizar su posición, algunos críticos imaginaron el caso absurdo de un asno que no sabe elegir entre dos montones de heno (o, en otras versiones, entre un montón de avena y un cubo de agua), y que a consecuencia de ello termina muriendo de inanición (o de sed). Se trata, según algunos, de una paradoja, ya que, pudiendo comer, no come porque no sabe, no puede o no quiere elegir qué montón es más conveniente, ya que ambos montones le parecen iguales. Aristóteles, en el De Cælo, ya se había preguntado cómo un perro confrontado ante dos cantidades idénticas de alimento podría comer.
El ejemplo del asno que muere de hambre por indecisión parece inverosímil, pero es posible imaginar casos menos extremos y más intuitivos de la misma paradoja: piénsese en alguien que sigue la máxima de hacer siempre primero lo que es más urgente y, enfrentado ante varias tareas urgentes, su propia deliberación acerca de cuál es la tarea prioritaria le hace perder valiosísimo tiempo. O piénsese en una persona que ama a dos pretendientes ¿puede amarlos a ambos con la misma fuerza y perderlos a ambos por culpa de su indecisión?
Racionalidad y simetría
El problema es un ejemplo del uso del principio de razón suficiente formulado siglos más tarde por Leibniz, según el cual si no hay una razón suficiente para que una cosa suceda en vez de otra, el principio afirma que no sucede nada, la situación inicial no cambia. La paradoja del asno de Buridán aplica el principio anterior a una situación de simetría bilateral. Otro contexto en el que se suele aducir la paradoja es como argumento de reducción al absurdo del racionalismo para justificar la fe religiosa. Como el asno muerto de hambre, debemos supuestamente tomar una decisión no racional para evitar quedar paralizados en una duda sin fin. Un contra-argumento típico responde que es perfectamente racional reconocer que ambas opciones son igualmente buenas y escoger arbitrariamente una en vez de morir de hambre.
Racionalidad y valor
Por otra parte, en un contexto de interpretación ligeramente distinto al anterior, el significado atribuido a la paradoja es que permite reconocer que ya sea que consideremos racional o no a la decisión, la misma estará siempre impregnada de la noción de valor. Pues la situación planteada en la paradoja conduce a la inmovilidad porque propone al asno dos opciones de igual valor. Pero la mayoría de las decisiones humanas se basan en la percepción de una diferencia de valor; más allá de que tal valoración pueda considerarse racional o no.
jueves, 15 de mayo de 2014
General Problem Solver (GPS)
Marvin Minsky dice que la mejor forma de comprender la mente es construyendo una. En 1957, Simon, Shaw y Newell, diseñaron uno de los grandes hitos de la historia de la Inteligencia Artificial: el General Problem Solver.
![]() |
Bahamas |
El GPS funcionaba realizando una analogía entre su situación actual y el objetivo a cumplir, efectuaba un análisis de las diferencias entre ambos estados, utilizaba métodos para reducir las diferencias, y luego volvía a realizar la analogía inicial hasta que no existiesen diferencias entre el estado actual y el estado deseable. El diseño es muy interesante, sobre todo, por las similitudes que parece reflejar con respecto a la forma que tenemos los seres humanos de solucionar problemas, manteniendo una estructura muy simple:
- Al realizar una comparación entre su situación y sus objetivos, tiene una cierta representación de sí mismo. Si quiero irme de viaje a las Bahamas, lo primero que tengo que saber es que YO no estoy en las Bahamas. Estaríamos todavía a años luz de la autoconsciencia, pero ya es un paso.
- Para reducir las diferencias, el GPS podía suspender momentáneamente su objetivo principal para resolver sub-objetivos. Esto es una característica plenamente humana: suspender las urgencias del presente en pro de un objetivo futuro, es decir, planificar una acción en pasos. Si quiero irme a las Bahamas tengo que solucionar sub-problemas como pagar los billetes de avión, hacer las maletas, coger un taxi al aeropuerto, etc. Cuando queremos solucionar un gran problema, una buena forma de hacerlo es dividirlo en problemas más pequeños.
- El GPS razonaba por analogía, quizá la forma humana más habitual de razonar. ¿Cómo sé que hay que hacer para viajar a las Bahamas? Porque antes he realizado otros viajes o porque he visto a otros hacerlos. Realizo analogías entre ese conocimiento previo y el problema al que me enfrento. Si yo viajé antes a Hawai, también hice las maletas y cogí un taxi al aeropuerto, pero a la hora de comprar los billetes de avión ahora tendré que comprarlos para Bahamas y no para Hawai y, probablemente, el precio será diferente. Hay similitudes que utilizaré sin problemas y diferencias que tendré que solucionar.
Una forma de entender este dilema se ha formulado afirmando que cuando realizamos cualquier acción existe un montón de conocimiento implícito que excede el conocimiento de una simple descripción simbólica como la que maneja un computador. Douglas Lenat nos ofrece un magnífico ejemplo de ello: analicemos la frase “Fred le dijo al camarero que él quería patatas fritas a la inglesa”. ¿Qué tenemos que saber para entender esta afirmación?:
La palabra él se refiere a Fred, y no al camarero. Eso sucedía en un restaurante. Fred era un cliente que estaba cenando allí. Fred y el camarero se encontraban más o menos a un metro de distancia. El camarero trabajaba allí y en aquel momento estaba atendiendo a Fred.
Fred quiere patatas en rodajas finas, no en tiras. Fred no desea unas patatas determinadas, sino solo un tipo determinado de patatas.
Fred indica esto mediante las palabras habladas que dirige al camarero. Tanto Fred como el camarero son seres humanos. Ambos hablan el mismo idioma. Ambos tienen edad suficiente para poder expresarse, y el camarero tiene edad suficiente para trabajar.
Fred tiene hambre. Desea y espera que en unos minutos el camarero le traiga una ración normal, que Fred empezará a comer en cuanto le sirvan.
Asimismo podemos suponer que Fred supone que el camarero también supone todas esas cosas.
No hay más que decir: o el GPS sabe o puede deducir todo este conocimiento implícito, o jamás podrá resolver problemas que ocurran cuando tenga que pedir una ración de patatas en un restaurante. La solución que se dio fue la de crear sistemas expertos. Podríamos dotar al GPS de un montón de conocimiento sobre todos los pasos que hay que dar para realizar un viaje o comer en un restaurante. No obstante, al hacerlo, estamos incumpliendo nuestro propósito inicial, a saber, que nuestra máquina solucione cualquier tipo de problemas y no únicamente problemas específicos. Este es el asunto en el que la Inteligencia Artificial lleva estancada durante las últimas décadas y que no tiene demasiados visos de resolverse a corto plazo.
lunes, 12 de mayo de 2014
Computación basada en ADN
La Computación basada en ADN consiste en usar moléculas de ADN en vez de procesadores basados en silicio. Las ventajas de la computación por ADN se basan en dos características fundamentales:
El gran paralelismo de las hebras de ADN. Muchos de los problemas considerados intratables, pueden ser resueltos haciendo una búsqueda exhaustiva sobre todas las soluciones posibles. Sin embargo, a la fecha (2008), la dificultad consiste en el hecho que tal búsqueda es demasiado grande como para poder ser realizada usando la tecnología actual. Por otro lado, la densidad de información almacenada en hebras de ADN y la facilidad de construir muchas copias de ellas puede convertir esas búsquedas en una posibilidad real.
La complementariedad de Watson-Crick. La complementariedad es algo que viene gratis en la naturaleza. Cuando se unen dos hebras (en condiciones ideales) se sabe el opuesto a cada miembro, no hay necesidad de verificarlo.
Historia
Probablemente la primera vez que fue mencionada la computación sub-microscópica fue en la charla Hay Espacio de sobra allí abajo, por el físico Richard Feynman.
Leonard Adleman, de la Universidad del Sur de California inició el estudio en este campo, en 19941 . Adleman probó la utilidad, al menos teórica, del uso del ADN para resolver problemas. En particular, logró resolver el Problema del camino Hamiltoniano de 7 nodos. Desde los primeros experimentos de Adleman, se han realizado numerosos avances, y se ha probado que se pueden construir varias Máquinas de Turing.
Esta es una tecnología todavía en etapas bastante tempranas, por lo cual su uso existe más que nada como una opción teórica. Todavía usar computación convencional es una opción más eficiente que usar este método.
Modelo de Stickers
Consideremos por ejemplo un modelo de computación con ADN conocido como sticker model. Este modelo usa dos tipos básicos de hebras simples de ADN, llamadas hebras memoria y hebras sticker. Una hebra memoria tiene n bases de largo y contiene k sub-hebras no superpuestas, cada una de largo m. Así que, n\geq mk. Aunque no es necesario, se supondrá para la explicación, que cada sub-hebra sigue otra consecutiva (sin ninguna otra base entre medio). Cada sub-hebra representa exactamente una variable booleana, un bit. Las subhebras deben ser suficientemente diferentes unas de otras. Cada sticker es de largo m y complementario a una y sólo una sub-hebra.
Una sub-hebra está prendida o apagada, dependiendo de si tiene unido su sticker o no. Si tiene su sticker pegado, está prendida (es verdadera o 1), en el otro caso está apagada (falso o 0).
Es importante crear las hebras memoria de tal forma que un sticker no pueda pegarse entre dos sub-hebras. Hay que considerar también que no todas las cadenas son posibles, por lo que al hacer un experimento real hay que buscar un óptimo.
Tanto en el experimento de Adleman, como en la solución de Richard J. Lipton del problema de satifacibilidad, no hay una hebra larga de la cual partir, sino que hebras cortas que se van uniendo paso a paso, dejando un sobrante para que se pueda pegar otra hebra en cada paso. La densidad de
información en ambos casos (con hebras largas o cortas), es básicamente la misma
Aunque el máximo teórico es dos bits por base, una densidad tan alta deja cualquier computador molecular basado en separación peligrosamente propenso a errores.
Operaciones
El elemento básico es un tubo test, o simplemente tubo, el cual es un multiconjunto de hebras memorias. Las operaciones válidas son: merge (combinar), separate (separar), set (encender), y clear (apagar).- La operación merge es mezclar 2 tubos en uno. Así las memorias de dos tubos de entrada con sus stickers pegados sin perturbaciones se combinan para formar el multiconjunto unión de ambos.
- La operación separate produce, dado un tubo de entrada N, y un entero i,
, dos tubos nuevos, +(N,i) y -(N,i). El tubo +(N,i) (respectivamente -(N,i)) consiste en todos las hebras memoria en el tubo original N, donde la i-ésima sub-hebra está prendida (respectivamente apagada).
- Para un tubo dado N y un entero i,
, la operación set produce un nuevo tubo test set(N,i), donde la i-ésima sub-hebra de cada hebra memoria está encendida. (Esto es, se le adhiere el sticker apropiado si la i-ésima subhebra estaba apagada, y se deja sin cambios si ya tenía uno).
- Finalmente para un tubo dado N y un entero i,
, la operación clear produce un nuevo tubo test clear(N,i), donde la i-ésima sub-hebra de cada hebra memoria está apagada, es decir, un eventual sticker fue removido de ella.
La entrada inicial (tubo) será una biblioteca de hebras memoria. En particular una biblioteca (k,l),
El paradigma computacional asociado con el modelo sticker es resolver problemas difíciles buscando exhaustivamente en todas las combinaciones posibles de largo l. Todos las
Aplicaciones
El 2002, investigadores del Instituto Weizmann de Ciencias en Rehovot, Israel, crearon un computador programable, compuesta de enzimas y moléculas de ADN.El 28 de abril de 2004, Ehud Shapiro, Yaakov Benenson, Binyamin Gil, Uri Ben-Dor, y Rivka Adar del Instituto Weizman anunciaron en la revista Nature que habían construido un computador basado en ADN. Aunque era sólo un autómata finito determinista, de dos estados, al unirlo con un módulo de entrada y salida, fue capaz de diagnosticar actividad cancerígena y liberar drogas para su tratamiento.
Ejemplo de Aplicación
Se muestran a continuación los pasos seguidos por Adleman para resolver el problema del camino Hamiltoniano.Se tiene un grafo direccionado G con n vértices vi. Existen aristas conectando algunos vértices. Se denota la arista que conecta al vértice vi con vj como ei→j.
Para simplificar el ejemplo, y sin pérdida de generalidad, se considera que se comienza en el vértice v1 y se termina en el vértice vn
Los pasos son:
- Generar caminos aleatorios.
- Seleccionar aquellos que comiencen con v1 y terminen con vn.
- Seleccionar sólo aquellos caminos que cuenten con exactamente n vértices.
- Seleccionar sólo aquellos caminos que tengan cada vértice una sola vez.
- Si queda algún camino en la muestra, responder SI, de otra forma responder NO.
A cada vértice vi del grafo se le asigna un oligonucleótido si de un largo de 20 pares base. Éstos se generan al azar, cuidando de que ninguno sea idéntico a otro.
A su vez, a cada arista ei→j se le asigna un oligo Ei→j, compuesto de una forma particular; se forma un segundo oligo tomando la segunda mitad del vértice de partida y la primera mitad del vértice de llegada. El oligo que se le asigna a la arista es el complemento de esta hebra.
El primer paso se lleva a cabo mezclando muestras de grandes cantidades de oligos representando vértices y aristas, y se agrega una solución de ADN ligasa para generar una gran cantidad de caminos aleatorios. Gracias a la composición de los oligos, se asegura que se respete la estructura del grafo, y gracias al tamaño de la muestra es probable que el camino Hamiltoniano buscado esté presente.
Para ejecutar el segundo paso, se lleva a cabo un proceso de RCP usando como cebadores los oligos correspondientes a sn y el complemento de s0. Notar que estos dos cebadores representan los complementos de los extremos de las cadenas que interesan, que son las que comienzan con s0 y comienzan con sn. Así se asegura la replicación de los caminos válidos para el siguiente paso solamente.
El tercer paso se efectúa usando electroforesis. Este proceso separa las moléculas en función de su tamaño, dejando las más cortas a un lado y las más largas al otro lado de la matriz. Se seleccionan sólo las moléculas presentes en el rango de largo apropiado para el próximo paso.
El cuarto paso se lleva a cabo mediante un proceso de purificación de proteinas. Se separan las hebras de los caminos, como también las hebras para cada vértice. Se asocian las hebras simples de los vértices con partículas magnéticas. Luego se asocia cada hebra simple de los caminos del paso cuatro con estas partículas, mientras que los caminos que no se logran asociar, por la ausencia de algún vértice, son removidos junto con la solución. Se efectúa este proceso para cada vértice en el camino.
Con las muestras restantes se efectúa un proceso de RCP, al igual que el descrito anteriormente, para luego aplicar electroforesis. Se analiza la matriz para ver si quedan o no muestras, y se responde si el camino fue encontrado o no.
Mas de 3000 personas programadas por MP3
Se trata del llamado “Experimento Mp3″ en su versión número 7 y que es realizado por Improv Everywhere. La gente fue convocada por medio de Internet a participar y más de 3000 personas se ofrecieron!
![]() |
| Experimento 7 |
A todos los participantes se les pidió descargar un archivo MP3 y luego ir a un lugar designado para, ejecutarlo a una hora precisa y recibir las instrucciones del audio que iban oyendo en sus reproductores, acerca de las cosas concretas que deberían hacer al mismo tiempo.
Manhattan fue el sitio elegido, al presionar play simultáneamente en las tiendas del concurrido centro. El experimento Mp3 logró que estas personas se reunieran, se rascaran la cabeza, caminaran hasta el Bryant Park, entre muchas otras cosas, para finalmente terminar con un gran baile de momias con papel higienico.
Es increíble es ver como 3.000 personas sigue al pie de la letra las instrucciones de un audio Mp3 como si fueran robots programados, francamente es muy divertido, espero que lo disfruten.
martes, 29 de abril de 2014
¿Cuánto tarda una supercomputadora en modelar un segundo del cerebro humano?
A pesar de Wikipedia, todavía hay muchas disputas de bar que no se puede resolver fácilmente. Seguramente en alguna ocasión un amigo tuyo aseguró que las computadoras ya rebasaron la capacidad del cerebro humano, y que por tanto darán un golpe de Estado de un momento a otro. Por supuesto, tú no le creíste, pero no encontraste forma de probarle que se equivocaba… hasta ahora.
Este experimento corrió por cuenta del Instituto de Ciencia y Tecnología de Okinawa, Japón, y el Forschungszentrum Jülich, un centro de investigaciones interdisciplinarias de Alemania. Lo que hicieron fue medir la capacidad de la cuarta supercomputadora más potente en el mundo con relación al cerebro humano. La supercomputadora se llama “K” cuenta con 705,024 núcleos de procesamiento y 1.4 millones de GB de memoria RAM.
El experimento consistió en usar Tecnología de Simulación Neurológica (NEST por sus siglas en inglés) para tratar de reproducir 1.73 mil millones de células y 10 billones de sinapsis. Aunque parece mucho, todo esto no representa sino el 1% de la capacidad cerebral. Como te imaginarás, el cerebro ganó de calle la contienda, pues “K” tardó 40 minutos en procesar lo que el cerebro hace en un segundo.
A pesar de estos desalentadores resultados, Markus Diesmann, de la Universidad de Freiburg aseguró que las computadoras alcanzarán la capacidad de nuestro cerebro antes de que acabe esta década. De manera que por el momento no tienes que preocuparte por la llegada de un apocalipsis provocado por máquinas, en diez años será una posibilidad latente, pero por ahora no hay por qué pensar en ello.
lunes, 28 de abril de 2014
Un fallo de 65 años
Durante 65 años, la mayoría de los análisis de las teorías de la información sobre los sistemas criptográficos se han hecho bajo una hipótesis matemática que, a juzgar por los resultados de un nuevo estudio, resulta que está equivocada.
La teoría de la información -la disciplina que nos dio la comunicación digital y la compresión de datos- también estableció en su día los fundamentos matemáticos de la criptografía.
Desde 1948, cuando se publicó el artículo académico en el que se presentó por vez primera la teoría de la información, la mayoría de los análisis teóricos de sistemas seguros habían dependido de una hipótesis común.
Por desgracia, tal como han comprobado unos investigadores del Instituto Tecnológico de Massachusetts (MIT) en Cambridge, Estados Unidos, y la Universidad Nacional de Irlanda en Maynooth, esa hipótesis es falsa y, como consecuencia, los dispositivos para leer tarjetas de manera inalámbrica, que se usan en muchos sistemas que no requieren introducir mecánicamente una clave para obtener el acceso, podrían no ser tan seguros como se venía asumiendo.
![]() |
| Muriel Médard. (Foto: Bryce Vickmark) |
El equipo de Ken Duffy, Mark Christiansen, Muriel Médard y Flávio du Pin Calmon duda que el fallo en la hipótesis de uniformidad signifique que los sistemas de encriptación de uso común hoy en día adolecen de brechas graves de seguridad. Lo que si puede ocurrir es que algunos de ellos sean un poco menos seguros de lo que esperábamos.
En cualquier caso, conforme se profundice en el tema, el mero hecho de averiguar cuáles son los puntos débiles seguramente revelará también las medidas idóneas para reforzarlos de manera apropiada.
Redes nanométricas de transporte controladas mediante ADN
Se ha conseguido crear redes diminutas de transporte autoensamblables, accionadas por motores de tamaño nanométrico y controlables por ADN.
El logro es obra de científicos de la Universidad de Oxford y de la de Warwick, en el Reino Unido.
El sistema es capaz de construir su propia red de vías que se extienden por decenas de micrómetros de largo, puede transportar cargas a lo largo de la red, e incluso desmantelar las vías.
Los investigadores se inspiraron en el melanóforo, utilizado por células de peces para controlar su coloración. Las vías de la red parten todas de un punto central, como los rayos de una rueda de bicicleta. Las proteínas motoras transportan pigmento por la red, ya sea concentrándolo en el centro o diseminándolo por toda ella. Concentrar el pigmento en el centro hace que la célula se vuelva más clara, ya que el espacio que rodea a la red queda vacío y es transparente.
El sistema desarrollado por el equipo de la Universidad de Oxford y la de Warwick es muy similar, y está construido con ADN y una proteína motora llamada kinesina. Energizadas por trifosfato de adenosina (o ATP, definido a menudo como la "batería química recargable" para la vida), las kinesinas se mueven a lo largo de las microvías transportando módulos de control hechos de cadenas cortas de ADN. Los "nanorrobots ensambladores" están hechos de dos proteínas kinesinas, que les permiten mover las vías para ensamblar la red, mientras que los "transbordadores" sólo necesitan una proteína kinesina para viajar a lo largo de las vías. Los transbordadores que llevan sondas fluorescentes de color verde se detienen en las vías antes de volver a reabastecerse de combustible.
Los transbordadores pueden ser utilizados tanto para llevar una carga como para enviar señales que les digan a otros transbordadores lo que deben hacer.
El ADN es un excelente bloque de construcción para fabricar sistemas moleculares sintéticos, ya que se le puede programar para hacer casi cualquier cosa, tal como destaca Adam Wollman, del equipo de investigación.
sábado, 12 de abril de 2014
Python para microcontroladores
Quien esté deseando aprender un lenguaje de alto nivel, encontrará una excelente opción en Python. Y si la idea es aplicarlo en proyectos de hardware, existe el proyecto Micro Python, una versión del lenguaje escrita desde cero, especialmente optimizada para microcontroladores, y que también incluye un módulo de desarrollo oficial.
![]() | |
| microcontroladores |
Si te preguntas para qué se pueden usar microcontroladores, en realidad sería más lógico invertir esa pregunta, y preguntar para qué “no” se pueden usar. A menos que los requerimientos de hardware sean más altos de lo normal, no hay dudas en que un microcontrolador es la plataforma de hardware ideal cuando se necesitan ejecutar tareas específicas. En lo personal, uno de los usos que planeo explorar muy pronto es el de la conversión de señales para establecer una capa de compatibilidad entre viejos teclados mecánicos de terminales y ordenadores modernos, independientemente de marca o sistema operativo. Sin embargo, una cosa es cargar código en un microcontrolador, y otra es escribirlo. Python es un lenguaje muy popular, y ha encontrado un excelente hogar en ordenadores SBC como el Raspberry Pi. Claro que, no siempre es viable montar un Pi en el interior de un teclado, en la puerta de un garaje, o en un robot. Ahí es cuando aparece Micro Python.
De acuerdo a su desarrollador Damien George, Micro Python es un reinicio completo del lenguaje Python, escrito desde cero en ANSI C, con microcontroladores en mente. Posee compilador, sistema runtime, máquina virtual, recolector de basura, parser, y librerías de soporte para su ejecución sobre el STM32F405. Todo el proceso de compilación se lleva a cabo en el chip, por lo que no hay que instalar software adicional en el ordenador. Su uso de memoria fue drásticamente reducido, un detalle que vemos establecido en las especificaciones del módulo oficial de desarrollo. Además de utilizar el chip antes mencionado (con una frecuencia de 168 MHz), el módulo tiene un megabyte de memoria Flash, y 192 KB de RAM., todo en un tamaño de 3,3 por 4 centímetros.
El desarrollador menciona a la robótica como una aplicación ideal para Micro Python, pero lo cierto es que tu imaginación será el límite aquí. Micro Python se convirtió en un proyecto Kickstarter, donde ya obtuvo las quince mil libras esterlinas que necesitaba para pasar a la siguiente fase. ¿Cuánto cuesta cada módulo Micro Python con el lenguaje preinstalado? 24 libras, algo así como 29 euros, más otros cinco en concepto de envío internacional. El precio es similar al de un Raspberry Pi, pero nunca faltan limitaciones de espacio y energía que hacen mucho más conveniente la aplicación de un microcontrolador. Las primeras entregas, en marzo de 2014.
Programador de PICs
Los microcontroladores son la solución a casi cualquier problema de diseño en el campo de la electrónica digital. En NeoTeo hemos hablado ya de ellos, y publicaremos varios artículos con proyectos que los utilizan. Es indispensable tener a mano una herramienta que nos permita programarlos.Efectivamente, los microcontroladores en general, y los de la empresa Microchip en particular, necesitan de un circuito electrónico auxiliar que nos permita transferirles desde el ordenador el programa que hemos escrito para ellos.
![]() |
| Programador de PICs |
miércoles, 9 de abril de 2014
Maze Wars 3D
Maze War (conocido también como The Maze Game, Maze Wars, Mazewar o, simplemente, Maze) es un videojuego de disparos en primera persona de gran relevancia histórica, aparecido entre 1973 y 1974.
Jugabilidad
El jugador se desplaza por un laberinto, lleno de enemigos que se mueven hacia atrás y delante, y que giran a la izquierda y a la derecha. Los jugadores van ganando puntos conforme aciertan con sus disparos a otros jugadores y los pierden cuando son abatidos. La Imlac PDS-1 por ser una computadora central permitía hasta 32 jugadores jugar simultanemente.
El sistema de juego se muestra simple comparándolo con los estándares posteriores. Los demás jugadores tienen forma de globo ocular. Cuando un jugador ve a otro, puede dispararle. Los jugadores van ganando puntos conforme aciertan con sus disparos a otros jugadores, y los pierden cuando son ellos los abatidos. Ocasionalmente, en algunas versiones, también puede aparecer un pato.
Desarrollo
Corría el año 1973 cuando Steve Colley comienza a desarrollar Maze War en la computadora Imlac PDS-1. El videojuego no se terminaría de desarrollar hasta 1974.2
Junto con Spasim, que fue desarrollado por Jim Bowery, es considerado el primer videojuego de disparos en primera persona. Posteriormente fue portado a Mac, computadora NeXT, PalmOS y Xerox Star.
Junto con Spasim, que fue desarrollado por Jim Bowery, es considerado el primer videojuego de disparos en primera persona. Posteriormente fue portado a Mac, computadora NeXT, PalmOS y Xerox Star.
Legado
Steve Colley subsecuentemente trabajo en las primeras versiones del Mars Exploration Rover para la NASA, y encontró que su trabajo de perspectiva en 3D en Maze Wars era útil para este proyecto.1
Maze War originó y extendió un gran número de conceptos usados en miles de videojuegos. Tanto su innovación como la combinación de estos elementos creó un conocimiento previo que permitió que miles de videojuegos fueran desarrollados posteriormente sin preocuparse por disputas sobre propiedad intelectual relacionadas con estas características.
Aunque se suele dar por correcto que Wolfenstein 3D fue el primer videojuego de disparos en primera persona, podría decirse que el real pionero de la perspectiva en primera persona fue Maze War, aunque, efectivamente, no sería hasta Wolfenstein 3D y, sobre todo, Doom, cuando el género se hiciera popular.
Maze War originó y extendió un gran número de conceptos usados en miles de videojuegos. Tanto su innovación como la combinación de estos elementos creó un conocimiento previo que permitió que miles de videojuegos fueran desarrollados posteriormente sin preocuparse por disputas sobre propiedad intelectual relacionadas con estas características.
Aunque se suele dar por correcto que Wolfenstein 3D fue el primer videojuego de disparos en primera persona, podría decirse que el real pionero de la perspectiva en primera persona fue Maze War, aunque, efectivamente, no sería hasta Wolfenstein 3D y, sobre todo, Doom, cuando el género se hiciera popular.
domingo, 6 de abril de 2014
4096 caracteres de código en C
Éste es el ¿absurdo? reto que propone cada año el International Obfuscated C Code Contest (IOCCC), en un intento de picar a programadores de todo el mundo hacia el extremo de la programación más enrevesada e imposible de entender.
De entre los ganadores de 2013 me ha llamado mucho la atención una auténtica obra maestra: un emulador completo de 8086 capaz de ejecutar, sobre MSDOS, AutoCAD, Windows 3.0, etc. Mejor ver algunos screenshots:
Como dice su autor, ”en tan sólo 4043 bytes (8086 nibbles, 28,301 bits), el código se las apaña para implementar casi todo el hardware de un IBM-PC de la era de 1980, usando unos pocos bits menos de código que transitores en la CPU 8086 original”.
Para los programadores más jóvenes, es necesario recordar qué era el 8086. Fue el primer procesador de Intel que realmente se popularizó, gracias al primer PC introducido por IBM en 1980/81. Su arquitectura interna era mucho más compleja e ineficaz que la del Motorola 68000, pero no siempre lo mejor acaba triunfando en el mercado…
La cuestión es que la microarquitectura del 8086 es una pesadilla, y mucho más para emularlo en tan poco código. La codificación de instrucciones es compleja e irregular en tamaño y estructura, con múltiples modos de direccionamiento y sin un posicionado consistente de operandos. Y por supuesto, el esperpéntico invento de la memoria segmentada. Además, el 8086 tiene una serie de bugs (por ejemplo, PUSH SP) y de características arcaicas que deben emularse para que los programas antiguos sigan funcionando.
En total se emulan todos estos dispositivos, que conforman un auténtico viaje al pasado:
El mismo autor reconoce que casi le cuesta un divorcio dedicar tantas horas a encajar ese puzle en tan restringido espacio.
No es el único programa en 4096 caracteres. Otro que me ha llamado la atención es este render 3D iterativo (raytracer):
Aquí está el código fuente.
Y para terminar esta friki-entrada os dejo con otras proezas, en este caso musicales, que se pueden crear con tan sólo una línea de código C:
De entre los ganadores de 2013 me ha llamado mucho la atención una auténtica obra maestra: un emulador completo de 8086 capaz de ejecutar, sobre MSDOS, AutoCAD, Windows 3.0, etc. Mejor ver algunos screenshots:
Como dice su autor, ”en tan sólo 4043 bytes (8086 nibbles, 28,301 bits), el código se las apaña para implementar casi todo el hardware de un IBM-PC de la era de 1980, usando unos pocos bits menos de código que transitores en la CPU 8086 original”.
Para los programadores más jóvenes, es necesario recordar qué era el 8086. Fue el primer procesador de Intel que realmente se popularizó, gracias al primer PC introducido por IBM en 1980/81. Su arquitectura interna era mucho más compleja e ineficaz que la del Motorola 68000, pero no siempre lo mejor acaba triunfando en el mercado…
La cuestión es que la microarquitectura del 8086 es una pesadilla, y mucho más para emularlo en tan poco código. La codificación de instrucciones es compleja e irregular en tamaño y estructura, con múltiples modos de direccionamiento y sin un posicionado consistente de operandos. Y por supuesto, el esperpéntico invento de la memoria segmentada. Además, el 8086 tiene una serie de bugs (por ejemplo, PUSH SP) y de características arcaicas que deben emularse para que los programas antiguos sigan funcionando.
- CPU Intel 8086/186
- 1MB de RAM
- 8072A 3.5″ floppy disk controller (1.44MB/720KB)
- Contrlador de disco duro (hasta 528MB)
- Tarjeta gráfica Hercules, gráficos 720×348 de 2 colores, 64KB de video RAM y suporte de modo texto CGA 80×25 a 16 colores.
- 8253 programmable interval timer (PIT).
- 8259 programmable interrupt controller (PIC).
- Controlador de teclado 8042, con teclado de 83 teclas tipo XT.
- Reloj de tiempo real MC146818.
- PC speaker.
#include "SDL.h"
#define $ for(O=9
#define CX M+=(T%3+2*!(!T*t-6))
#define x ,A=4*!T,O=t,W=h=T<3?u(Q?p:D(A+3),D(A),D(A+1)[i]+D(A+2)*g+):K(t),U=V=K(a),o?U=h,W=V:V,
#define C 8*-~L
#define Z short
#define y a(Z)Y[++O]
#define B ),a--||(
#define _ ),e--||(
#define V(I,D,E)(O=a(I)h[r])&&!(A=(D)(V=(1[E+L]<<16)+*i)/O,A-(I)A)?1[E+L]=V-O*(*E=A):H(0)
#define i(B,M)B(o){return M;}
#define R(O,M,_)(S=L?a(I Z)O:O,N=L?a(I Z)O M(f=a(I Z)_):(O M(f=a(I n)_)))
#define T(_)R(r[u(10,L=4,--)],=,_)
#define u(a,r,T)16*i[a]+(I Z)(T i[r])
#define a(_)*(_*)&
#define L(_)M(W,_,U)
#define M(S,F,T)R(r[S],F,r[T])
#define A(_)(i[L=4]+=2,R(_,=,r[u(10,4,-2+)]))
#define c(R,T)(1[u=19,L+T]=(N=a(R)h[r]*(R)*T)>>16,*i=N,G(F(N-(R)N)))
#define h(_)(1&(L?a(Z)_:_)>>C-1)
#define I unsigned
#define n char
#define e(_)v(F(40[L(_##=40[E]+),E]&N==S|_ N<_(int)S))
I n t,e,l[80186],*E,m,u,L,a,T,o,r[1<<21],X,*Y,b,Q=0,R=0;I Z*i,M,p,q=3;I*localtime(),f,S,kb=0,h,W,U,c,g,d,V,A;N,O,P=983040,j[5];SDL_Surface*k=0;i(K,P+(L?2*o:2*o+o/4&7))i(D,r[a(I)E[259+4*o]+O])i(w,i[o]+=~(-2*47[E])*~L)i(v,(z((f^=S^N)&16),G(N-S&&1&(40[E]^f>>C-1))))J(){V=61442;$;O--;)V+=40[E+O]<<D(25);}i(H,(46[u=76,J(),T(V),T(9[i]),T(M),M(P+18,=,4*o+2),R(M,=,r[4*o]),E]=0))s(o){$;O--;)40[E+O]=1&&1<<D(25)&o;}i(BP,(*i+=262*o*z(F((*E&15)>9|42[E])),*E&=15))i(SP,(w(7),R&&--1[i]&&o?R++,Q&&Q++,M--:0))DX(){$,O*=27840;O--;)O[(I*)k->pixels]=-!!(1<<7-O%8&r[O/2880*90+O%720/8+(88+952[l]/128*4+O/720%4<<13)]);SDL_Flip(k);}main(BX,nE)n**nE;{9[i=E=r+P]=P>>4;$;q;)j[--q]=*++nE?open(*nE,32898):0;read(2[a(I)*i=*j?lseek(*j,0,2)>>9:0,j],E+(M=256),P);$;Y=r+16*9[i]+M,Y-r;Q|R||kb&46[E]&&KB)--64[T=1[O=32[L=(X=*Y&7)&1,o=X/2&1,l]=0,t=(c=y)&7,a=c/8&7,Y]>>6,g=~-T?y:(n)y,d=BX=y,l],!T*t-6&&T-2?T-1?d=g:0:(d=y),Q&&Q--,R&&R--x(O=*Y,O=u=D(51),e=D(8),m=D(14)_ O=*Y/2&7,M+=(n)c*(L^(D(m)[E]|D(22)[E]|D(23)[E]^D(24)[E]))_ L=*Y&8,R(K(X)[r],=,c)_ L=e+=3,o=0,a=X x a=m _ T(X[i])_ A(X[i])_ a<2?M(U,+=1-2*a+,P+24),v(f=1),G(S+1-a==1<<C-1),u=u&4?19:57:a-6?CX+2,a-3||T(9[i]),a&2&&T(M),a&1&&M(P+18,=,U+2),R(M,=,U[r]),u=67:T(h[r])_(W=U B u=m,M-=~L,R(W[r],&,d)B 0 B L(=~)B L(=-),S=0,u=22,F(N>S)B L?c(I Z,i):c(I/**/n,E)B L?c(Z,i):c(n,E)B L?V(I Z,I,i):V(I n,I Z,E)B L?V(Z,int,i):V(n,Z,E))_++e,h=P,d=c,T=3,a=m,M--_++e,13[W=h,i]=(o|=!L)?(n)d:d,U=P+26,M-=~!o,u=17+(m=a)_(a=m B L(+=),F(N<S)B L(|=)B e(+)B e(-)B L(&=)B L(-=),F(N>S)B L(^=)B L(-),F(N>S)B L(=))_!L?L=a+=8 x L(=):!o?Q=1,R(r[p=m x V],=,h):A(h[r])_ T=a=0,t=6,g=c x M(U,=,W)_(A=h(h[r]),V=m?++M,(n)g:o?31&2[E]:1)&&(a<4?V%=a/2+C,R(A,=,h[r]):0,a&1?R(h[r],>>=,V):R(h[r],<<=,V),a>3?u=19:0,a<5?0:F(S>>V-1&1)B R(h[r],+=,A>>C-V),G(h(N)^F(N&1))B A&=(1<<V)-1,R(h[r],+=,A<<C-V),G(h(N*2)^F(h(N)))B R(h[r],+=(40[E]<<V-1)+,A>>1+C-V),G(h(N)^F(A&1<<C-V))B R(h[r],+=(40[E]<<C-V)+,A<<1+C-V),F(A&1<<V-1),G(h(N)^h(N*2))B G(h(N)^F(h(S<<V-1)))B G(h(S))B 0 B V<C||F(A),G(0),R(h[r],+=,A*=~((1<<C)-1>>V)))_(V=!!--1[a=X,i]B V&=!m[E]B V&=m[E]B 0 B V=!++1[i]),M+=V*(n)c _ M+=3-o,L?0:o?9[M=0,i]=BX:T(M),M+=o*L?(n)c:c _ M(U,&,W)_ L=e+=8,W=P,U=K(X)_!R||1[i]?M(m<2?u(8,7,):P,=,m&1?P:u(Q?p:11,6,)),m&1||w(6),m&2||SP(1):0 _!R||1[i]?M(m?P:u(Q?p:11,6,),-,u(8,7,)),43[u=92,E]=!N,F(N>S),m||w(6),SP(!N==b):0 _ o=L,A(M),m&&A(9[i]),m&2?s(A(V)):o||(4[i]+=c)_ R(U[r],=,d)_ 986[l]^=9,R(*E,=,l[m?2[i]:(n)c])_ R(l[m?2[i]:(n)c],=,*E)_ R=2,b=L,Q&&Q++_ W-U?L(^=),M(U,^=,W),L(^=):0 _ T(m[i])_ A(m[i])_ Q=2,p=m,R&&R++_ L=0,O=*E,F(D(m+=3*42[E]+6*40[E])),z(D(1+m)),N=*E=D(m-1)_ N=BP(m-1)_ 1[E]=-h(*E)_ 2[i]=-h(*i)_ 9[T(9[i]),T(M+5),i]=BX,M=c _ J(),T(V)_ s(A(V))_ J(),s((V&~m)+1[E])_ J(),1[E]=V _ L=o=1 x L(=),M(P+m,=,h+2)_++M,H(3)_ M+=2,H(c&m)_++M,m[E]&&H(4)_(c&=m)?1[E]=*E/c,N=*E%=c:H(0)_*i=N=m&E[L=0]+c*1[E]_*E=-m[E]_*E=r[u(Q?p:m,3,*E+)]_ m[E]^=1 _ E[m/2]=m&1 _ R(*E,&,c)_(a=c B write(1,E,1)B time(j+3),memcpy(r+u(8,3,),localtime(j+3),m)),a<2?*E=~lseek(O=4[E][j],a(I)5[i]<<9,0)?(a?write:read)(O,r+u(8,3,),*i):0:0),O=u,D(16)?v(0):D(17)&&G(F(0)),CX*D(20)+D(18)-D(19)*~!!L,D(15)?O=m=N,41[43[44[E]=h(N),E]=!N,E]=D(50):0,!++q?
kb=1,*l?SDL_PumpEvents(),k=k?k:SDL_SetVideoMode(720,348,32,0),DX():k?SDL_Quit(),k=0:0:0;}
i(F,40[E]=!!o)i(z,42[E]=!!o)i(G,48[E]=o)
#define $ for(O=9
#define CX M+=(T%3+2*!(!T*t-6))
#define x ,A=4*!T,O=t,W=h=T<3?u(Q?p:D(A+3),D(A),D(A+1)[i]+D(A+2)*g+):K(t),U=V=K(a),o?U=h,W=V:V,
#define C 8*-~L
#define Z short
#define y a(Z)Y[++O]
#define B ),a--||(
#define _ ),e--||(
#define V(I,D,E)(O=a(I)h[r])&&!(A=(D)(V=(1[E+L]<<16)+*i)/O,A-(I)A)?1[E+L]=V-O*(*E=A):H(0)
#define i(B,M)B(o){return M;}
#define R(O,M,_)(S=L?a(I Z)O:O,N=L?a(I Z)O M(f=a(I Z)_):(O M(f=a(I n)_)))
#define T(_)R(r[u(10,L=4,--)],=,_)
#define u(a,r,T)16*i[a]+(I Z)(T i[r])
#define a(_)*(_*)&
#define L(_)M(W,_,U)
#define M(S,F,T)R(r[S],F,r[T])
#define A(_)(i[L=4]+=2,R(_,=,r[u(10,4,-2+)]))
#define c(R,T)(1[u=19,L+T]=(N=a(R)h[r]*(R)*T)>>16,*i=N,G(F(N-(R)N)))
#define h(_)(1&(L?a(Z)_:_)>>C-1)
#define I unsigned
#define n char
#define e(_)v(F(40[L(_##=40[E]+),E]&N==S|_ N<_(int)S))
I n t,e,l[80186],*E,m,u,L,a,T,o,r[1<<21],X,*Y,b,Q=0,R=0;I Z*i,M,p,q=3;I*localtime(),f,S,kb=0,h,W,U,c,g,d,V,A;N,O,P=983040,j[5];SDL_Surface*k=0;i(K,P+(L?2*o:2*o+o/4&7))i(D,r[a(I)E[259+4*o]+O])i(w,i[o]+=~(-2*47[E])*~L)i(v,(z((f^=S^N)&16),G(N-S&&1&(40[E]^f>>C-1))))J(){V=61442;$;O--;)V+=40[E+O]<<D(25);}i(H,(46[u=76,J(),T(V),T(9[i]),T(M),M(P+18,=,4*o+2),R(M,=,r[4*o]),E]=0))s(o){$;O--;)40[E+O]=1&&1<<D(25)&o;}i(BP,(*i+=262*o*z(F((*E&15)>9|42[E])),*E&=15))i(SP,(w(7),R&&--1[i]&&o?R++,Q&&Q++,M--:0))DX(){$,O*=27840;O--;)O[(I*)k->pixels]=-!!(1<<7-O%8&r[O/2880*90+O%720/8+(88+952[l]/128*4+O/720%4<<13)]);SDL_Flip(k);}main(BX,nE)n**nE;{9[i=E=r+P]=P>>4;$;q;)j[--q]=*++nE?open(*nE,32898):0;read(2[a(I)*i=*j?lseek(*j,0,2)>>9:0,j],E+(M=256),P);$;Y=r+16*9[i]+M,Y-r;Q|R||kb&46[E]&&KB)--64[T=1[O=32[L=(X=*Y&7)&1,o=X/2&1,l]=0,t=(c=y)&7,a=c/8&7,Y]>>6,g=~-T?y:(n)y,d=BX=y,l],!T*t-6&&T-2?T-1?d=g:0:(d=y),Q&&Q--,R&&R--x(O=*Y,O=u=D(51),e=D(8),m=D(14)_ O=*Y/2&7,M+=(n)c*(L^(D(m)[E]|D(22)[E]|D(23)[E]^D(24)[E]))_ L=*Y&8,R(K(X)[r],=,c)_ L=e+=3,o=0,a=X x a=m _ T(X[i])_ A(X[i])_ a<2?M(U,+=1-2*a+,P+24),v(f=1),G(S+1-a==1<<C-1),u=u&4?19:57:a-6?CX+2,a-3||T(9[i]),a&2&&T(M),a&1&&M(P+18,=,U+2),R(M,=,U[r]),u=67:T(h[r])_(W=U B u=m,M-=~L,R(W[r],&,d)B 0 B L(=~)B L(=-),S=0,u=22,F(N>S)B L?c(I Z,i):c(I/**/n,E)B L?c(Z,i):c(n,E)B L?V(I Z,I,i):V(I n,I Z,E)B L?V(Z,int,i):V(n,Z,E))_++e,h=P,d=c,T=3,a=m,M--_++e,13[W=h,i]=(o|=!L)?(n)d:d,U=P+26,M-=~!o,u=17+(m=a)_(a=m B L(+=),F(N<S)B L(|=)B e(+)B e(-)B L(&=)B L(-=),F(N>S)B L(^=)B L(-),F(N>S)B L(=))_!L?L=a+=8 x L(=):!o?Q=1,R(r[p=m x V],=,h):A(h[r])_ T=a=0,t=6,g=c x M(U,=,W)_(A=h(h[r]),V=m?++M,(n)g:o?31&2[E]:1)&&(a<4?V%=a/2+C,R(A,=,h[r]):0,a&1?R(h[r],>>=,V):R(h[r],<<=,V),a>3?u=19:0,a<5?0:F(S>>V-1&1)B R(h[r],+=,A>>C-V),G(h(N)^F(N&1))B A&=(1<<V)-1,R(h[r],+=,A<<C-V),G(h(N*2)^F(h(N)))B R(h[r],+=(40[E]<<V-1)+,A>>1+C-V),G(h(N)^F(A&1<<C-V))B R(h[r],+=(40[E]<<C-V)+,A<<1+C-V),F(A&1<<V-1),G(h(N)^h(N*2))B G(h(N)^F(h(S<<V-1)))B G(h(S))B 0 B V<C||F(A),G(0),R(h[r],+=,A*=~((1<<C)-1>>V)))_(V=!!--1[a=X,i]B V&=!m[E]B V&=m[E]B 0 B V=!++1[i]),M+=V*(n)c _ M+=3-o,L?0:o?9[M=0,i]=BX:T(M),M+=o*L?(n)c:c _ M(U,&,W)_ L=e+=8,W=P,U=K(X)_!R||1[i]?M(m<2?u(8,7,):P,=,m&1?P:u(Q?p:11,6,)),m&1||w(6),m&2||SP(1):0 _!R||1[i]?M(m?P:u(Q?p:11,6,),-,u(8,7,)),43[u=92,E]=!N,F(N>S),m||w(6),SP(!N==b):0 _ o=L,A(M),m&&A(9[i]),m&2?s(A(V)):o||(4[i]+=c)_ R(U[r],=,d)_ 986[l]^=9,R(*E,=,l[m?2[i]:(n)c])_ R(l[m?2[i]:(n)c],=,*E)_ R=2,b=L,Q&&Q++_ W-U?L(^=),M(U,^=,W),L(^=):0 _ T(m[i])_ A(m[i])_ Q=2,p=m,R&&R++_ L=0,O=*E,F(D(m+=3*42[E]+6*40[E])),z(D(1+m)),N=*E=D(m-1)_ N=BP(m-1)_ 1[E]=-h(*E)_ 2[i]=-h(*i)_ 9[T(9[i]),T(M+5),i]=BX,M=c _ J(),T(V)_ s(A(V))_ J(),s((V&~m)+1[E])_ J(),1[E]=V _ L=o=1 x L(=),M(P+m,=,h+2)_++M,H(3)_ M+=2,H(c&m)_++M,m[E]&&H(4)_(c&=m)?1[E]=*E/c,N=*E%=c:H(0)_*i=N=m&E[L=0]+c*1[E]_*E=-m[E]_*E=r[u(Q?p:m,3,*E+)]_ m[E]^=1 _ E[m/2]=m&1 _ R(*E,&,c)_(a=c B write(1,E,1)B time(j+3),memcpy(r+u(8,3,),localtime(j+3),m)),a<2?*E=~lseek(O=4[E][j],a(I)5[i]<<9,0)?(a?write:read)(O,r+u(8,3,),*i):0:0),O=u,D(16)?v(0):D(17)&&G(F(0)),CX*D(20)+D(18)-D(19)*~!!L,D(15)?O=m=N,41[43[44[E]=h(N),E]=!N,E]=D(50):0,!++q?
kb=1,*l?SDL_PumpEvents(),k=k?k:SDL_SetVideoMode(720,348,32,0),DX():k?SDL_Quit(),k=0:0:0;}
i(F,40[E]=!!o)i(z,42[E]=!!o)i(G,48[E]=o)
El mismo autor reconoce que casi le cuesta un divorcio dedicar tantas horas a encajar ese puzle en tan restringido espacio.
No es el único programa en 4096 caracteres. Otro que me ha llamado la atención es este render 3D iterativo (raytracer):
Aquí está el código fuente.
Y para terminar esta friki-entrada os dejo con otras proezas, en este caso musicales, que se pueden crear con tan sólo una línea de código C:
Diseñan algoritmos para mejorar el control de robots a través de Internet
Investigadores del Grupo de Robótica Inteligente (MAPIR) perteneciente al departamento de Ingeniería de Sistemas y Automática de la Universidad de Málaga han diseñado una aplicación web que garantiza la continuidad y fiabilidad del control remoto de robots móviles cuando algunos de los componentes del sistema, como por ejemplo Internet, produzcan retardos impredecibles en los tiempos de comunicación.
Los robots móviles controlados remotamente son dispositivos complejos que incorporan tres elementos. Por un lado, una red de comunicaciones como Internet, por otro, la propia plataforma robótica móvil y, finalmente, el software utilizado a todos los niveles para que el conjunto funcione. “Todo este sistema debe actuar de la manera más fiable posible, ya que deben interactuar con su entorno de manera segura. Por ejemplo, pueden realizar labores como operaciones médicas en remoto, tareas de vigilancia y rescate o asistencia a personas mayores”, expone a la Fundación Descubre el responsable de la investigación, Juan Antonio Fernández Madrigal de la Universidad de Málaga.
Los expertos han diseñado una aplicación para superar el obstáculo de la interrupción o pérdida de calidad del control robótico debidos a la conexión a Internet, que produce retardos no predecibles en las transmisiones o están relacionadas con otros componentes impredecibles. En su artículo, ‘Marginal ProbabilisticModeling of theDelays in theSensory Data Transmission of NetworkedTelerobots’ publicado en la revista Sensors, los expertos describen un conjunto de modelos y algoritmos que posibilitan anticiparse a este tipo de fallos y ajustar la cantidad de información mostrada al operador dinámicamente, de forma que se consigue un sistema de teleoperación adaptable a muy diversas circunstancias, posiblemente cambiantes.
Hasta ahora, los expertos han abordado estos problemas dotando de más inteligencia al propio robot, para que tome decisiones de manera autónoma si no le llegan órdenes a través de la red en los tiempos especificados. Por su parte, los investigadores de la Universidad de Málaga enfocan su modelo desde otra perspectiva. “Monitorizamos la red y el resto de componentes, observando cuánto tardan en transmitir los datos en cada momento, y deducimos las probabilidades de que ‘soporten’ la tarea que debemos acometer en ese preciso instante. Por ejemplo, si necesitamos obtener una imagen del entorno obtenida de una de las cámaras del robot, podemos elegir recibirla con más o menos resolución y en color o en blanco y negro, en función de los retardos que tengamos en ese momento”, explica.
Modelos matemáticos
Ajustando los datos que es capaz de transmitir el sistema a la tarea que hay que acometer en cada momento se evita que los retardos provoquen errores en el control remoto del robot. Para ello utilizan modelos basados en distribuciones de probabilidad. “Éstos son novedosos por su simplicidad y porque algunos de ellos no se habían utilizado antes para modelar este tipo de retardos, sino para otras aplicaciones completamente distintas como la predicción de lluvias. Se trata de algoritmos matemáticos que pueden ejecutarse eficientemente en los ordenadores que controlan el robot y también en los del operador remoto, que suelen contar con una potencia limitada si son, por ejemplo, dispositivos móviles tipo tablets o smartphones.”, subraya.
Además de esta gran capacidad de cálculo con los recursos limitados que ofrecen los dispositivos móviles, el sistema ofrece otras ventajas como la adaptación a la capacidad de transmisión en cada momento y la rápida toma de decisiones. La aplicación se materializa en una interfaz donde el usuario ve la información de todos los sensores que tiene el robot. El sistema va decidiendo qué datos recibir y a qué renunciar en función de la disponibilidad de tiempo, de forma automática. “Por ejemplo, si hay escasa señal de wifi, la imagen de una cámara puede irse a blanco y negro o incluso el propio interfaz puede renunciar a mostrarla, optando por activar otros sensores más eficientes para la misma tarea. El objetivo es que sigamos recibiendo información suficiente a tiempo, con el mínimo retardo”, ejemplifica.
Pruebas para tareas de vigilancia
Los científicos han probado el sistema en robots de laboratorio capaces de ejecutar en remoto tareas de vigilancia, que consisten en explorar edificios tomando datos sensoriales del entorno que luego son analizados por el vigilante. “En este caso el usuario recibe un flujo aproximadamente constante de datos a pesar de los altibajos que pueda haber en la red o en otros componentes. El operario puede dirigir correctamente al robot sirviéndose de imágenes o de datos de otros sensores, en función del ancho de banda. Esto supone que el interfaz muestra lo que ve una videocámara o sónares para la ubicación del robot en el entorno, dependiendo de que tenga más o menos potencia de transmisión”, subraya Fernández Madrigal.
Estos resultados son fruto del proyecto de excelencia titulado ‘Control Remoto Óptimo y Adaptable de Robots Móviles con Componentes No Deterministas’ financiado por la Consejería de Economía, Innovación, Ciencia y Empleo de la Junta de Andalucía y por fondos FEDER. Asimismo, los expertos siguen explorando las aplicaciones del sistema más allá de esta investigación enfocada a la robótica móvil, en otras áreas que requieran la optimización de tiempos de transmisión de datos, como telepresencia, videovigilancia, videoconferencias o el cuidado de pacientes a distancia.
Inteligencia en juegos para móviles
Para garantizar el éxito comercial de los videojuegos para móviles es necesario asegurar un algoritmo de Inteligencia Artificial que suponga al jugador un desafío ni demasiado elevado ni demasiado bajo.
![]() |
| tekken tag tournament |
En estos casos muchos de los agentes IA pueden presentar un comportamiento más aleatorio que inteligente, por lo que se precisa el uso de algoritmos de inferencia por parte de la máquina que le permitan intuir las intenciones del oponente, tal y como hacemos los seres humanos.
La mejor forma en la que un algoritmo IA obtendría información de su oponente sería infiriendo información sobre su estilo de juego y de su tendencia a reaccionar ante determinadas situaciones. Por tanto el algoritmo de aprendizaje iría compilando un perfil del comportamiento de dicho jugador. Así, cada comportamiento podría ser identificado con una clase o categoría: jugador agresivo, esquivo, etc. Al fin y al cabo de lo que se trata es de un problema de reconocimiento de patrones.
| Diagrama |
Hay básicamente dos métodos de predicción:
- discriminativo
- no-discriminativo.
Predicción discriminativa
Uno de los métodos de clasificación discriminativa más eficaces son las máquinas de soporte vectorial o SVM (Support Vector Machine). Sin entrar en detalles matemáticos, un algoritmo basado en SVM construye un modelo capaz de predecir si una muestra nueva (cuya categoría desconocemos) pertenece a una categoría o a la otra.
![]() |
| PAC-MAN malo malo |
Predicción no-discriminativa
Por el contrario, el modelo no-discriminativo o bayesiano estimaría la predicción en base a la regla de Bayes (la probabilidad de que un jugador realice tal movimiento, dado que antes ha realizado este otro) y entonces cada nueva instancia se compararía con la clase más probable.
Así, el sistema no discriminativo tiende a ser más eficiente en dispositivos móviles, ya que consume menos recursos computacionales que los métodos discriminativos, a pesar de que estos últimos presenten un mejor desempeño deliberativo. Por tanto se adapta mejor a juegos donde necesitamos un mayor procesamiento de datos en tiempo real con muchas fuentes de incertidumbre (por ejemplo el mítico StarCraft, que por cierto estará disponible muy pronto en Android mediante controles táctiles).
![]() |
| STARCRAFT |
sábado, 5 de abril de 2014
Las tres leyes
http://www.last.fm/robots.txt
Lo extremadamente friki del fichero de esta web en particular son las 3 líneas que hay sobre el final:
Disallow: /harming/humans
Disallow: /ignoring/human/orders
Disallow: /harm/to/selfAunque robots.txt es un protocolo de facto para decirle a Google y otros indexadores webs qué URLs explorar y cuales no, está claro que esas tres no son URLs precisamente… si alguien aún no las ha reconocido, estas son las Tres Leyes de la Robótica de Issac Asimov:
- Un robot no debe dañar a un ser humano o, por su inacción, dejar que un ser humano sufra daño.
- Un robot debe obedecer las órdenes que le son dadas por un ser humano, excepto si estas órdenes entran en conflicto con la Primera Ley.
- Un robot debe proteger su propia existencia, hasta donde esta protección no entre en conflicto con la Primera o la Segunda Ley.
El "camarero robótico" basado en Kinect: TurtleBot
WillowGarage, la empresa-federación que más fuerte pega hoy día en investigación robótica a nivel mundial, apoyada económicamente por el gigante Google.Hace unos días presentaron un nuevo prototipo de robot “económico” TurtleBot. Se presenta como un “camarero robótico“, aunque, realmente el uso que más se le acabará dando será el de experimentar y jugar con él y su software:
Como todo lo relacionado con WillowGarage, todo el software es gratuito y de código abierto (la plataforma ROS) y el robot vendrá “de fábrica” con módulos software funcionales para muchos de los problemas más importantes que debe resolver un pobrecito robot móvil en un entorno de peligrosos humanos. El siguiente vídeo promocional resume los usos que se le pueden dar al robot, se ve cómo puede construir mapas del entorno (SLAM) o identificar los movimientos de personas gracias al sensor Kinect (ver ROS para más detalles de los módulos software):
Su precio en el mercado es de unos 1200$, relativamente barato en comparación con otras plataformas robóticas en el mercado.
Como todo lo relacionado con WillowGarage, todo el software es gratuito y de código abierto (la plataforma ROS) y el robot vendrá “de fábrica” con módulos software funcionales para muchos de los problemas más importantes que debe resolver un pobrecito robot móvil en un entorno de peligrosos humanos. El siguiente vídeo promocional resume los usos que se le pueden dar al robot, se ve cómo puede construir mapas del entorno (SLAM) o identificar los movimientos de personas gracias al sensor Kinect (ver ROS para más detalles de los módulos software):
domingo, 30 de marzo de 2014
Nuevo lenguaje matemático para crear máquinas con capacidad de decisión
Las mentes pensantes de DARPA parecen haberse cansado de los métodos de recopilación de datos actuales y ya tienen su propia forma de lidiar con el asunto: crear un nuevo lenguaje matemático unificado que enseñe a los sensores a pensar.
El proceso se llevará a cabo dentro de su programa MSEE (Matemáticas para la Detección, Explotación y Ejecución), que no sólo persigue conseguir que los chips recojan datos, sino también aprendan a interpretarlos y actúen en consecuencia.
viernes, 21 de marzo de 2014
AIBO (Artificial Intelligence Robot, en español Robot de Inteligencia Artificial, homónimo de AIBO (相棒 aibō?), "Amigo" o "compañero" en japonés) es una serie emblemática de mascotas robóticas diseñadas y fabricadas por Sony.
![]() |
| AIBO |
Sony anunció un robot prototipo a mediados de 1998. El primer modelo de consumo se introdujo el 11 de mayo de 1999. Los nuevos modelos fueron lanzados cada año hasta 2005. Aunque la mayoría de los modelos fueron perrunos, también se incluyeron otras inspiraciones como leones-cachorros y exploración espacial, y solo la última versión, la ERS-7, fue explícitamente un "perro robot".
Suscribirse a:
Entradas (Atom)





























