Hablando en esotérico
Hoy traigo un script que programa en lenguajes esotéricos, concretamente en Brainfuck, Ook!, Whitespace y Zombie.
Lo único que hace es escribir un programa que muestre por pantalla lo que el usuario pida, su uso es:
===============================================================================
./esoprint.py [-h] [-l
El script se puede descargar [aquí] o al final coloreado
Dejando a parte de Brainfuck y Ook!, de_los_que_se_habló_antes, Whitespace es un lenguaje compuesto únicamente por espacios, tabuladores y saltos de línea, con un conjunto de instrucciones bastante completo [Whitespace_Tutorial] . Zombie está por estar, ni siquiera encontré un intérprete así que no puedo asegurar que funcione, simplemente parecía fácil de programar :).
Y eso es todo.
Tengo que dejar la manía de poner los comentarios en inglés :S ...
[Referencias] http://compsoc.dur.ac.uk/whitespace/ http://esoteric.voxelperfect.net/wiki/Main_Page
===============================================================================
!/usr/bin/env python
-- coding: utf-8 --
""" esoprint.py, encodes in esoteric language code
Supported languages: - Brainfuck - Ook! - Whitespace - Zombie # Blindly coded, not tested
Maybe future supported languages: - Tink - Piet - Befunge - False - Q-BAL # When I find a interpreter - Malbolge # Maybe too big... - Beatnik # Really ¿? - Unlambda
Not future supported languages: # It's not a logical thing to make a computer generate this! - Sheakspere - Haiku - Chef # Make's it boring - Whenever # Impossible - HQ9+ - BIT
Copyright (C) 2010 kenkeiras <kenkeiras@gmail.com>
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
Usage:
./esoprint.py [-h] [-l
"""
Language dictionary elements for BrainFuck-like langs
init: program initalization
inc
dec
push
pop
show
# get [Actually unused]
def usage(): import sys
print sys.argv[0]+" [-h] [-l
brainfuck = { "init": "", "inc":"+", "dec":"-", "push":">", "pop":"<", "show":".", "get":",", #Unused "loop":"[", # Unused "endloop":"]" # Unused }
ook = { "init": "", "inc":"Ook. Ook. ", "dec":"Ook! Ook! ", "push":"Ook. Ook? ", "pop":"Ook? Ook. ", "show":"Ook! Ook. ", "get":"Ook. Ook! ", # Unused "loop":"Ook! Ook? ", # Unused "endloop":"Ook? Ook! " # Unused }
Encodes in a Zombie program
def zombie_encode(data):
z = "Dundun is a zombie\n" z += " summon\n" z += " task talk\n" for p in data.split("\n"): z += " say \""+str( p.replace("\"","\\"") )+"\"\n" z += " animate\n" z += "animate" return z
Encodes in a Whitespace program
def whitespace_encode(data): for c in data: w += " " # Push into the stack: [Space] [Space] w += " " # Element, always positive [Space] # Character to binary (needed) b = bin( ord( c ) ) w += b[ 2 : ].replace("0"," ").replace("1","\t") # Space: 0 || Tab: 1 w += "\n" # Element end: [LF] w += "\t\n " # Output stack top: [Tab][LF][Space][Space]
w += "\n\n\n" # Ending [LF][LF] return w
Encodes in a Brainf*ck-like language
def stack_encode(lang, data): s = lang['init'] n = 0 for c in data: i = ord( c ) while ( n > i ): s += lang['dec'] n -= 1
while ( n < i ): s += lang['inc'] n += 1
s += lang['show']
return s
bf_like = {"brainfuck":brainfuck,"ook":ook} langlist = {"whitespace":whitespace_encode,"zombie":zombie_encode} if name == "main":
import sys argc=len(sys.argv) lang="" data="" out = "" i=1 while (i < argc): if (sys.argv[i] == "-l") or (sys.argv[i] == "--language"): i += 1 lang = sys.argv[i]
elif (sys.argv[i] == "-o") or (sys.argv[i] == "--output"): i += 1 out = sys.argv[i]
elif (sys.argv[i] == "-h") or (sys.argv[i] == "--help"): usage() sys.exit(0)
elif (sys.argv[i] == "-n") or (sys.argv[i] == "--newline"): data += "\n"
else: data = (data+" "+sys.argv[i]).strip()
i+=1 if (lang == ""): lang = raw_input("Select language: ")
lang = lang.lower() if (lang not in langlist) and (lang not in bf_like):
print "Unknown language (lenguaje desconocido)" sys.exit(1)
if (data == ""): for line in sys.stdin: data += line
if (data == "\n"): print "Sin entrada, saliendo..."
sys.exit(0)
if (lang in langlist): result = langlistlang else: result = stack_encode(bf_like[lang],data)
if (out == ""): print result
else: f = open(out,"w") f.write(result) f.close() ===============================================================================