Dark Hive
 Despierta, Neo...

Tink

programación esotérica :D

holamundo

Si os digo que la diminuta imagen de arriba es un programa que escribe "Hello World" por pantalla, seguramente creáis que estoy de broma. Pero es verdad.

reverse

Y éste, aún más diminuto, da la vuelta a una cadena de tres caracteres introducidos por el usuario. Se trata de un par de programas escritos -más bien pintados- en Tink (Turing-Ink, Tinta de Turing). Es un lenguaje de programación de cosecha propia en el que los programas se pintan en lugar de escribirse. Pertenece a la familia de los lenguajes esotéricos y Turing-completos. Está inspirado en Brainfuck (literalmente, "Jodecerebros"), otro lenguaje esotérico con el que comparte el repertorio de instrucciones casi por completo. Aquí tenéis el resultado de ejecutar un "pong" incompleto en el intérprete de Tink (evidentemente va lentísimo ya que Tink no está hecho para ser eficiente si no para ser entretenido, además es un lenguaje interpretado implementado en otro lenguaje interpretado.). Podéis pulsar Repetir para verlo ejecutar todas las veces que queráis, darle a E.Continua para que ejecute de golpe (recomendado) en lugar de paso a paso, o usar V+ y V- para ajustar la velocidad de ejecución con más precisión. Si hacéis click en la casilla de Entrada, podéis controlar la barra del pong usando "0"(bajar) y "1"(subir).



This browser does not have a Java Plug-in.
Get the latest Java Plug-in here.

Tink sólo tiene 15 instrucciones, siete más que Brainfuck. La idea es que cada instrucción está representada mediante el color de un píxel. Estos píxeles son recorridos secuencialmente de arriba a abajo y de izquierda a derecha, a menos que se utilicen caminos pintados en color rojo claro. Cuando se termina de recorrer la imagen, el programa acaba. Tink se basa en un array de enteros idealmente infinito (128 enteros en este intérprete) sobre el cual tenemos un apuntador que es capaz de moverse a izquierda y derecha, así como incrementar y decrementar el entero al que apunta. Cada color tiene un efecto distinto sobre el apuntador y/o los enteros. Éstos son los colores básicos que forman parte de Tink:

  • #FFFFFF: Negro (no instruccion)
  • #000000: Blanco (inicio/fin de comentario)
  • #000000 seguido de #000000: Doble Blanco (fin de comentario, ignorado si es un comienzo de comentario)
  • #FF0000: Rojo (desplaza a la izquierda el apuntador de enteros)
  • #0000FF: Verde (desplaza a la derecha el apuntador de enteros)
  • #0000FF: Azul (incrementa en 1 el entero apuntado actualmente)
  • #FFFF00: Amarillo (decrementa en 1 el entero apuntado actualmente)
  • #FF8000: Naranja (escribe en la salida estándar el entero actual usando ASCII)
  • #FF00FF: Fucsia (sustituye el entero actual por el leído de la entrada estándar)
  • #00FFFF: Aguamarina (si el entero actual es 0, avanza a la instrucción posterior al Azul cielo que le corresponda)
  • #0080FF: Azul cielo (si el entero actual es distinto de 0, retrocede a la instrucción posterior al Aguamarina que le corresponda)
  • #FF8080: Rojo claro (esta instrucción es especial, sirve para dibujar caminos y cambiar el flujo de ejecución)
  • #80FF80: Verde claro (dibuja un pixel blanco en el backbuffer, en la posicion (x = memoria[puntero],y = memoria[puntero+1]))
  • #808080: Gris (intercambia los buffers de dibujo, es decir, trae a pantalla lo dibujado en memoria hasta el momento)
  • #000080: Azul oscuro (carga un cero en la posicion actual)

Según el espíritu de Tink, los comentarios han de empezar con blanco, terminar con blanco, y estar escritos en binario ASCII, aunque suele ser más práctico escribirlos a mano en gris claro sobre fondo negro usando letras comunes, ya que ninguno de estos colores tiene significado. También es importante programar bonito, ya que los programas pintados en Tink tienen un componente estético bastante más marcado de lo normal. Por ejemplo, el pescado interestelar de abajo no es más que el programa "hola mundo" de arriba.

holabonito

¿Qué se puede hacer con Tink? Cualquier cosa. Está matemáticamente demostrado que cualquier algoritmo se puede reducir a una máquina de Turing, y Tink contiene las instrucciones de Brainfuck, que es una máquina de Turing. Así que, al menos teóricamente, cualquier programa está al alcance de Tink.

Y ahora viene un reto: ¿Hay alguien que se vea capaz de completar el pong de arriba en Tink? Sólo le falta detección de colisiones con las paletas y añadir la paleta del contrincante. Si alguien lo consigue, su nombre y su programa/dibujo serán expuestos aquí en señal de respeto entre programadores, jejeje.) Aquí está el proyecto de Processing y el código fuente, fácilmente portable a otros lenguajes:

BAJAR INTERPRETE DE TINK

Programas en Tink:

Leer un número decimal de una cifra: (deja el resultado en la posicion actual)lee_numero

Leer un número decimal de dos cifras: (deja el resultado 2 posiciones a la derecha respecto a la de inicio) lee_numero2

Leer un número decimal de dos cifras, usando rojo claro para aislar zonas del programa: leer_numero2_ext

Multiplicar un numero por 10: (deja el resultado 1 posicion a la derecha respecto a la de inicio)mult10

Consejos para programar en Tink:

Lo primero y más importante es que debes tener presente en todo momento dónde está el puntero en la memoria. Lo segundo, cuando utilices el rojo claro para dibujar caminos, ten en cuenta que las zonas por las que vaya a pasar la ejecución en otro momento, y no quieras que afecten a ésta, deberán ser aisladas entre dos blancos. Los caminos dibujados en rojo claro no pueden solaparse, aunque en caso de que ocurra, la ejecución intentará ir siempre hacia arriba o hacia la derecha. En el intérprete, la lista numérica que aparece es el contenido de la memoria de tink. El número seleccionado es siempre la posicion actual de memoria. Usa esta información sabiamente para debuguear.

ArKano 2006.