Ir al contenido principal

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 ] [-o ] [ [ | -n [...] ] | -n] -h (--help): muestra esta "ayuda" -l (--language): Selecciona el lenguaje -o (--output) : Selecciona el archivo de salida (a stdout por defecto) El resto se toma como información, el -n (--newline) es considerado un salto de línea ===============================================================================

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 ] [-o ] [ [ | -n [...] ] | -n] -h (--help): prints this help -l (--language): Set's output language, currently supported: Ook!, Brainf*ck, Whitespace, Zombie -o (--output) : Set's output file (to stdout by default) Whatever else is considered as data, the -n (--newline) is considered a line jump

"""

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 ] [-o ] [ [ | -n [...] ] | -n] "     print "-h (--help): prints this help"     print "-l (--language): Set's output language"     print "-o (--output) : Set's output file (to stdout by default)"     print "Whatever else is considered as data, the -n (--newline) is considered a line jump"     print "If no data is entered, it will be received from STDIN"     print "Supported languages:"     print """   - Brainfuck    - Ook!    - Whitespace    - Zombie """

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() ===============================================================================