Reverse words without changing capitals or punctuation
GolfScript, 58 54 48 characters
" "/{.{65- 223&26<}:A,\{.A{96&\)31&@+}*}%+}%" "*
This is a GolfScript solution which became rather long. Lots of the code is actually finding out if a character is in a-zA-Z. Maybe someone can find an even shorter way of testing it.
You can try the code online. Examples:
> Hello, I am fish.
Olleh, I ma hsif.
> This; Is Some Text!
Siht; Si Emos Txet!
> Don't try this at home.
Tno'd yrt siht ta emoh.
Coffeescript, 134 133 characters
alert prompt().replace /\S+/g,(x)->c=x.match r=/[a-z]/gi;return x.replace r,(y)->return c.pop()[`(y<"a"?"toUpp":"toLow")`+"erCase"]()
Coffeescript is (for the purposes of code golf) a slightly denser version of javascript. It doesn't have the ternary operator, but it has an escape to javascript.
Here's the javascript version:
Javascript, 152 151 characters
alert(prompt().replace(/\S+/g,function(x){c=x.match(r=/[a-z]/gi);return x.replace(r,function(y){return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()})}))
Indented:
alert(prompt().replace(/\S+/g,function(x){
c=x.match(r=/[a-z]/gi);
return x.replace(r, function(y){
return c.pop()[(y<"a"?"toUpp":"toLow")+"erCase"]()
})
}))
APL 69
Takes screen input via: t←⍞
⎕av[1↓∊(↑¨v),¨((¯1×⌽¨z)+z←¯32×~1↓¨v>97)+¨⌽¨1↓¨v←(+\v<66)⊂v←0,⎕av⍳t←⍞]