superpollo, 04.05.2010 17:55:
since i have some kind of computer literacy (as opposed to most of my
colleagues), some years ago i was kindly asked to try and solve a
"simple" particular problem, that is to write a program that generates
math exercises (q+a) from an example taken from the textbook. for
instance, this:
%%TITLE:Sample worksheet
%%
%%SCHEMA:\lim_{x \to <A>}
%%SCHEMA:\frac
%%SCHEMA:{x^3-<A-B>x^2-<AB>x}
%%SCHEMA:{x^3-<A>x^2+<C>x-<AC>}\\
%%
%%ANS:FRAC
%%ANSNUM:<A^2+AB>
%%ANSDEN:<A^2+C>
%%
%%AMIN:1
%%AINC:1
%%AMAX:2
%%BMIN:3
%%BINC:1
%%BMAX:4
%%CMIN:2
%%CINC:1
%%CMAX:3
should generate this latex source document:
\documentclass[a4paper,10pt,twocolumn,fleqn]{article}
\title{Sample worksheet}
\pagestyle{empty}
\usepackage[italian]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{cancel}
\usepackage{mathrsfs}
\usepackage[dvips]{graphicx}
\usepackage{eurosym}
\usepackage{pstricks}
\usepackage{pst-eucl}
\usepackage{pst-poly}
\usepackage{pst-plot}
\frenchspacing
\begin{document}
\section*{\center{\framebox{Sample worksheet}}}
\noindent
\begin{enumerate}
\item
\begin{multline*}
\lim_{x \to 1}
\frac
{x^3+3x^2-4x}
{x^3-x^2+2x-2}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 2}
\frac
{x^3+x^2-6x}
{x^3-2x^2+2x-4}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 2}
\frac
{x^3+2x^2-8x}
{x^3-2x^2+2x-4}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 1}
\frac
{x^3+2x^2-3x}
{x^3-x^2+2x-2}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 1}
\frac
{x^3+2x^2-3x}
{x^3-x^2+3x-3}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 1}
\frac
{x^3+3x^2-4x}
{x^3-x^2+3x-3}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 2}
\frac
{x^3+x^2-6x}
{x^3-2x^2+3x-6}\\
\end{multline*}
\item
\begin{multline*}
\lim_{x \to 2}
\frac
{x^3+2x^2-8x}
{x^3-2x^2+3x-6}\\
\end{multline*}
\end{enumerate}
\subsection*{\center{Answers}}
\begin{enumerate}
\item
\begin{displaymath}
\frac{5}{3}
\end{displaymath}
\item
\begin{displaymath}
\frac{5}{3}
> [...]
I'm not exactly sure I understand the mapping between the two formats, but
it seems to me that you'll need a proper math expression parser (with a
strong emphasis on *parser*) for this. Math expressions are not exactly
trivial (recursion, prefix/infix/postfix notations, functions), which is
why 'real' programmers don't write parsers for them but download tested,
working code for that from somewhere.
another thing is that for some features i intended to include i found
convenient to use python (since it's the language i feel i am more at
ease with), so i had to cope with template lines like this:
%%SCHEMA:<PYCODE1:import math ; print int(math.sqrt($A**2-2.*$A*$B))>
You should assure that the math module is always imported, and otherwise
restrict the expressiveness to expressions (terms that result in a value),
not arbitrary statements (executable commands that do things without
returning anything).
to make a long story short: the whole program is now 4775 lines of bash
code,
Argh!
*but* it was and it is a wonderful experience to learn to program
It does sound like you almost completely skipped over two very important
programming lessons, though: reading code is harder than writing it (i.e.
maintenance cost matters), and the best code is the code that you don't
need to write (and debug and maintain).
Stefan
--
http://mail.python.org/mailman/listinfo/python-list