#!/usr/bin/env python2
"""
grph.py
LICENSING: PUBLIC DOMAIN
Peace... -George
"""
#_____________________________________________________________________________
# Imports
#
from math import sin, cos, tan
import os
import sys
#_____________________________________________________________________________
# Functions
#
def fprintf(fstream, fmt, *args):
"""
Emulate C's fprintf() function.
"""
fmt %= args
fstream.write(fmt)
return len(fmt)
def plot(x_expression, xmin, xmax, ymin, ymax):
"""
plot(str, int, int, int, int) -> str
Return a string representation of a graph of x_expression.
BUGS:
- The graph is inverted.
- Zero Divison Error when expressions like `1/x` are passed as
x_expression.
"""
return '\n'.join(
''.join((
lambda x,y: 'o' if round(eval(x_expression)) == y else (
' ' if y != 0 and x != 0 else (
'|' if y != 0 and x == 0 else (
'-' if y == 0 and x != 0 else
'+' ))))
(x,y)
for x in xrange(xmax, xmin-1, -1))
for y in xrange(ymax, ymin-1, -1))
#_____________________________________________________________________________
# Main function
#
def main():
x_expression = raw_input("f(x) = ")
fprintf(sys.stdout, "\nGraph of f(x) = %s\n%s\n",
x_expression,
plot(x_expression, -10, 10, -10, 10))
return 0
if __name__ == '__main__':
main()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMgoKIiIiCmdycGgucHkKCkxJQ0VOU0lORzogUFVCTElDIERPTUFJTgoKUGVhY2UuLi4gLUdlb3JnZQoiIiIKCiNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIEltcG9ydHMKIwpmcm9tIG1hdGggaW1wb3J0IHNpbiwgY29zLCB0YW4KaW1wb3J0IG9zCmltcG9ydCBzeXMKCiNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIEZ1bmN0aW9ucwojCmRlZiBmcHJpbnRmKGZzdHJlYW0sIGZtdCwgKmFyZ3MpOgogICAgIiIiCiAgICBFbXVsYXRlIEMncyBmcHJpbnRmKCkgZnVuY3Rpb24uCiAgICAiIiIKICAgIGZtdCAlPSBhcmdzCiAgICBmc3RyZWFtLndyaXRlKGZtdCkKICAgIHJldHVybiBsZW4oZm10KQoKZGVmIHBsb3QoeF9leHByZXNzaW9uLCB4bWluLCB4bWF4LCB5bWluLCB5bWF4KToKICAgICIiIgogICAgcGxvdChzdHIsIGludCwgaW50LCBpbnQsIGludCkgLT4gc3RyCgogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZ3JhcGggb2YgeF9leHByZXNzaW9uLgoKICAgIEJVR1M6CiAgICAtIFRoZSBncmFwaCBpcyBpbnZlcnRlZC4KICAgIC0gWmVybyBEaXZpc29uIEVycm9yIHdoZW4gZXhwcmVzc2lvbnMgbGlrZSBgMS94YCBhcmUgcGFzc2VkIGFzCiAgICAgIHhfZXhwcmVzc2lvbi4KICAgICIiIgogICAgcmV0dXJuICdcbicuam9pbigKICAgICAgICAgICAgJycuam9pbigoCiAgICAgICAgbGFtYmRhIHgseTogJ28nIGlmIHJvdW5kKGV2YWwoeF9leHByZXNzaW9uKSkgPT0geSBlbHNlICgKICAgICAgICAgICAgICAgICAgICAnICcgaWYgeSAhPSAwIGFuZCB4ICE9IDAgZWxzZSAoCiAgICAgICAgICAgICAgICAgICAgJ3wnIGlmIHkgIT0gMCBhbmQgeCA9PSAwIGVsc2UgKAogICAgICAgICAgICAgICAgICAgICctJyBpZiB5ID09IDAgYW5kIHggIT0gMCBlbHNlCiAgICAgICAgICAgICAgICAgICAgJysnICkpKSkKICAgICAgICAgICAgICAgICh4LHkpCiAgICAgICAgZm9yIHggaW4geHJhbmdlKHhtYXgsIHhtaW4tMSwgLTEpKQogICAgICAgIGZvciB5IGluIHhyYW5nZSh5bWF4LCB5bWluLTEsIC0xKSkKCiNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIE1haW4gZnVuY3Rpb24KIyAKZGVmIG1haW4oKToKICAgIHhfZXhwcmVzc2lvbiA9IHJhd19pbnB1dCgiZih4KSA9ICIpCiAgICBmcHJpbnRmKHN5cy5zdGRvdXQsICJcbkdyYXBoIG9mIGYoeCkgPSAlc1xuJXNcbiIsIAogICAgICAgICAgICB4X2V4cHJlc3Npb24sCiAgICAgICAgICAgIHBsb3QoeF9leHByZXNzaW9uLCAtMTAsIDEwLCAtMTAsIDEwKSkKICAgIHJldHVybiAwCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCgo=