Piet es un lenguaje de programación esotérico desarrollado por David Morgan-Mar. El lenguaje Piet usa imágenes coloridas como programas. Un programa de Piet parece una abstracción pospictórica . Piet obtuvo su nombre del artista holandés Piet Mondrian .
El código del programa en lenguaje Piet se presenta en forma de dibujo abstracto.
#FFC0C0 rojo claro |
#FFFFC0 amarillo claro |
#C0FFC0 verde claro |
#C0FFFF cian claro |
#C0C0FF azul claro |
#FFC0FF magenta claro |
#FF0000 rojo |
#FFFF00 amarillo |
#00FF00 verde |
#00FFFF cian |
#0000FF azul |
#FF00FF magenta |
#C00000 rojo oscuro |
#C0C000 amarillo oscuro |
#00C000 verde oscuro |
#00C0C0 azul oscuro |
#0000C0 azul oscuro |
#C000C0 magenta oscuro |
#FFFFFF blanco | #000000 negro |
Se utilizan 20 colores diferentes (tabla a la derecha). Los 18 colores de las tres primeras filas de la tabla están conectados cíclicamente por los siguientes dos ciclos:
Esto implica que la luz es más oscura que la oscuridad y viceversa. Los colores blanco y negro no están incluidos en los ciclos.
También se pueden usar colores complementarios, aunque su efecto depende de la implementación. En el caso más simple, el intérprete de idioma trata los colores no estándar como blancos (de lo contrario, se pueden usar como análogos al negro).
El código Piet es una forma de gráficos ensamblados a partir de colores reconocibles. Los píxeles de color individuales son importantes en un idioma, por lo que la regla se aplica a los programas que deben ampliarse para mostrar detalles. En dichos programas ampliados, el término códelo se usa para describir un bloque con un color equivalente a un píxel de código, para evitar confusiones con los píxeles reales de los gráficos ampliados, que de hecho pueden ser un códelo.
El elemento principal del lenguaje Piet es el bloque de color. Un bloque de color es un bloque de cualquier número de códigos contiguos del mismo color, delimitados por bloques de un color diferente o por el borde de los gráficos del programa. Los bloques de colores que solo son adyacentes en diagonal no se consideran adyacentes. Un bloque de color puede tener cualquier forma y puede tener "agujeros" de otros colores en el interior que no forman parte del bloque.
Piet usa una pila para almacenar todos los datos. Los datos existen solo como números enteros, aunque se pueden leer o generar como caracteres Unicode mediante los comandos apropiados.
D.P. | CC | Código seleccionado |
---|---|---|
Correcto | A la izquierda | más alto |
Correcto | más bajo | |
camino hacia abajo | A la izquierda | más a la derecha |
Correcto | más a la izquierda | |
A la izquierda | A la izquierda | más bajo |
Correcto | más alto | |
arriba | A la izquierda | más a la izquierda |
Correcto | más a la derecha |
El intérprete de lenguaje Piet comienza a ejecutar el programa en el bloque de color que contiene el código superior izquierdo del programa. El intérprete contiene un puntero de dirección (DP), que inicialmente apunta a la derecha. DP puede apuntar a la derecha, izquierda, arriba, abajo. El intérprete también contiene un Selector de Codel (CC), apuntando primero a la izquierda. CC puede apuntar hacia la izquierda o hacia la derecha. Las direcciones de DP y CC suelen cambiar con frecuencia durante la ejecución del programa.
Durante la ejecución del programa, el intérprete atraviesa bloques de colores de acuerdo con las siguientes reglas:
El intérprete continúa realizando estas acciones hasta que finaliza el programa.
Cada bloque de color que no sea negro ni blanco en Piet es el equivalente entero del número de códelos en ese bloque. Tenga en cuenta que los enteros negativos no se pueden representar, aunque se pueden construir mediante operadores. Cuando el intérprete codifica un número, no tiene que hacer nada con él. En particular, no lo empuja a la pila automáticamente; hay un comando especial para esto (ver más abajo).
Los bloques negros y los límites del programa limitan el flujo del programa. Si el intérprete del programa Piet intenta moverse hacia un bloque negro o fuera de los límites, se detiene y CC cambia. A continuación, el intérprete intenta moverse de nuevo desde este bloque actual. Si falla por segunda vez, el DP cambia 90 grados en el sentido de las agujas del reloj. Estos intentos se repiten mientras CC y DP cambian entre intentos alternativos. Si, después de ocho intentos, el intérprete no puede abandonar el bloque actual, no hay ruta de salida y el programa termina.
Los bloques blancos quedan libres a través de zonas que el intérprete salta libremente. Si se mueve de un bloque de color a un espacio en blanco, el intérprete se mueve a través de los códelos blancos hacia el DP hasta que llega a un bloque que no es blanco. Si el intérprete golpea un bloque o borde negro, se considera limitado; de lo contrario, se mueve al bloque de color que golpeó. Moverse a través de un bloque blanco a uno nuevo de color no activa un comando (ver más abajo). En este caso, los bloques blancos se pueden usar para cambiar el color actual sin ejecutar comandos, lo cual es muy útil para la codificación de bucles.
Aclaración sobre bloque blanco
Moverse a lo largo del bloque blanco lleva al intérprete en línea recta antes de tocar un píxel o borde de color. No utiliza el procedimiento descrito anteriormente para determinar dónde saldrá el intérprete de un bloque de color que no sea blanco.
Exactamente lo que sucede cuando el intérprete se mueve sobre un bloque blanco y golpea un bloque o borde negro no estaba claro en la especificación original. La interpretación se deriva de una lectura literal del siguiente texto:
cambio de brillo | |||
---|---|---|---|
cambio de tono | No | Más oscuro por 1 | Más oscuro por 2 |
No | empujar | estallido | |
1 paso | agregar | sustraer | multiplicar |
2 pasos | dividir | modificación | no |
3 pasos | mayor que | puntero | cambiar |
4 pasos | duplicar | rodar | en número) |
5 pasos | en (char) | fuera (número) | fuera (char) |
Los comandos se definen moviéndose de un bloque de color a otro de acuerdo con el movimiento a través del programa. El número de pasos a través del ciclo de color y el ciclo de luminancia en cada transición determina el comando a ejecutar, como se muestra en la tabla de la derecha. Si la transición es a través de un bloque blanco, el comando no se ejecuta.
Algunos se describen a continuación.
Las operaciones que no se pueden realizar se ignoran (ejemplo: extraer un valor inexistente de la pila).
Lenguajes de programación | |
---|---|
|