Convert infix expressions to postfix notation
Shell utils -- 60 chars
bc -c|sed -re's/[@iK:Wr]+/ /g;s/[^0-9]/ &/g;s/ +/ /g;s/^ //'
Fixed the various problems, but it got a lot longer :(
C, 250 245 236 193 185 chars
char*p,b[99];f(char*s){int t=0;for(;*p-32?
*p>47?printf("%d ",strtol(p,&p,10)):*p==40?f(p++),++p:
t&&s[t]%5==2|*p%5-2?printf("%c ",s[t--]):*p>41?s[++t]=*p++:0:++p;);}
main(){f(p=gets(b));}
Here's a readable version of the ungolfed source, that still reflects the basic logic. It's actually a rather straightforward program. The only real work it has to do is to push a low-associativity operator onto a stack when a high-associativity operator is encountered, and then pop it back off at the "end" of that subexpression.
#include <stdio.h>
#include <stdlib.h>
static char buf[256], stack[256];
static char *p = buf;
static char *fix(char *ops)
{
int sp = 0;
for ( ; *p && *p != '\n' && *p != ')' ; ++p) {
if (*p == ' ') {
continue;
} else if (*p >= '0') {
printf("%ld ", strtol(p, &p, 10));
--p;
} else if (*p == '(') {
++p;
fix(ops + sp);
} else {
while (sp) {
if ((ops[sp] == '+' || ops[sp] == '-') &&
(*p == '*' || *p == '/')) {
break;
} else {
printf("%c ", ops[sp--]);
}
}
ops[++sp] = *p;
}
}
while (sp)
printf("%c ", ops[sp--]);
return p;
}
int main(void)
{
fgets(buf, sizeof buf, stdin);
fix(stack);
return 0;
}
Bash w/ Haskell w/ C preprocessor sed, 180 195 198 275
echo 'CNumO+O-O*fromInteger=show
CFractionalO/
main=putStr$'$*|sed 's/C\([^O]*\)/instance \1 String where /g
s/O\(.\?\)/a\1b=unwords\[a,b,\"\1\"];/g'|runghc -XFlexibleInstances 2>w
At last, it's not longer than the C solution anymore. The crucial Haskell part is almost as lazy as the bc solution...
Takes input as command-line parameters. A file w
with some ghc warning messages will be created, if you don't like this change to runghc 2>/dev/null
.