text:
Rock Paper Scissors
Implement the classic rock paper scissors.
Conditions:

user will input 'r', 'p' or 's'
program will output 'r', 'p' or 's' and the result
program choice ('r', 'p' or 's') has to be pseudo random (I'm looking at you Howard)
result can be represented with any printable character, there should always be three possible results for what the user has input (the user wins, lose or is a tie).
what happens if the user inputs nothing, or something different that 'r', 'p' or 's' should be not important.

You need to:

Provide the golfed code.
The ungolfed code
How do you invoke the program
A sample run

I will choose the answer with less characters, if a tie presents the most up voted answer will be chosen.
Good golfing and may luck be ever in your favor.
I will be posting an answer my self, in Java.
For the ones that live in a mountain under a rock:

r = rock
p = paper
s = scissors
rock: wins to scissors, loses with paper, a tie with rock.
paper: wins to rock, loses with scissors, a tie with paper.
scissors: wins to paper, loses with rock, a tie with scissors.

Current Positions:

UN: Username
PL: Programming Language
CC: Character Count
UV: Up votes

╔══════════════════╦════════════╦══════╦════╗
║        UN        ║     PL     ║  CC  ║ UV ║
╠══════════════════╬════════════╬══════╬════╣
║ Howard           ║ GolfScript ║    6 ║ 15 ║
║ primo            ║ Perl       ║   27 ║  7 ║
║ TwiNight         ║ APL        ║   31 ║  4 ║
║ primo            ║ Perl       ║   33 ║  7 ║
║ marinus          ║ APL        ║   36 ║  5 ║
║ primo            ║ Perl       ║   38 ║  7 ║
║ primo            ║ Perl       ║   48 ║  7 ║
║ yehuda-schwartz  ║ javascript ║   49 ║  1 ║
║ manatwork        ║ Ruby       ║   54 ║ 13 ║
║ w0lf             ║ GolfScript ║   62 ║  4 ║
║ tmartin          ║ K          ║   67 ║  2 ║
║ Abhijit          ║ Python 3   ║   74 ║  5 ║
║ beary605         ║ Python 3   ║   76 ║  4 ║
║ rlemon           ║ javascript ║   85 ║  4 ║
║ ugoren           ║ C          ║   86 ║  3 ║
║ Egor Skriptunoff ║ LUA        ║   87 ║  4 ║
║ Fors             ║ Befunge    ║  107 ║  3 ║
║ Vi.              ║ Clojure    ║  129 ║  1 ║
║ Henrik           ║ C#         ║  167 ║  4 ║
║ dystroy          ║ Go         ║  169 ║  1 ║
║ primo            ║ ferNANDo   ║  259 ║  5 ║
║ anakata          ║ Java       ║  259 ║  1 ║
║ epoch            ║ Java       ║  387 ║  1 ║
║ jdstankosky      ║ LOLCODE    ║ 1397 ║ 15 ║
╚══════════════════╩════════════╩══════╩════╝

I can't select Howards answer, since it was a (successful) attempt to bend the rules, but I change them, to make them extra explicit.
primo 27 character answer can't be selected because it's not pseudo random per se
primo -p answer, I'm gonna go with "-p would be counted as 3 bytes: one for the -, one for the p, and one more the necessary whitespace."
Thanks to all who answered, I hope you have had a good time!
NOTE: I will be trying to edit this every other week, to adjust the table, and change my selected answer if someone beats the current one, so If you just got here, post your answer if you want!

You might consider adding a clause that all outcomes - Win, Lose, Draw - must be possible.

Since this is popularity, I decided to go with the LOLZ

I edited the rules before you submitted your answer. Popularity will only be the tie breaker.

I don't understand the point of this question. The spec seems to be: 1) get a random number 2) see if your random number is better than the one input by the user. Where's the challenge?

@Gareth I guess if you don't want to participate you may choose not doing so, or looking for other questions that better suit your interest

Pfft, it's not popularity anymore? Boring.

@anakata It's not like I site here hitting the refresh button every 10 seconds when I'm writing code to make sure the rules don't suddenly change. I submitted appropriately for the rules that existed when I started writing my code. You edited the rules during the creation of my submitted answer.

@jdstankosky you are right, I'm sorry, I made a mistake, but, for fairness you were writing something that a) can not be executed b) It was only an exploitation of the rules I posted before

@anakata If I could be bothered to check the syntax (the lolcode language spec site is broken), there are compilers and parsers. OTherwise I could just adjust the language slightly and use LOLpython. It's a completely valid language. There's a few other ESOlangs I was considering, but this is my favorite.

Wouldn't this be better as a [king-of-the-hill] or [ai-palyer]?

@dmckee If that were the case, I would DEFINITELY change my guessing methods. Also, didn't somebody already make an RPS king-of-the-hill?

@anakata By traditional Perlgolf rules (compiled by none other than Ton Hospel himself) -p would be counted as 3 bytes: one for the -, one for the p, and one more the necessary whitespace. However, many other competitions on CG.SE have counted each option as a single byte. It's usually up to the author of the question to decide which system to honor.

You could add the script that automatically updates the scoreboard.

APL, 31
'TWL'[1+3|-/x⍳⎕←⍞,(?3)⌷x←'rps']

x←'rps' Assign string 'rps' to x
(?3)⌷ Choose random integer 1~3, choose that index of x
⍞, Prepend user input to machine choice
⎕← Output resulting string
x⍳ Convert to numerical array by indexOf in x
-/ Difference of the two numbers
1+|3 Modulus 3 and plus 1
'TWL'[...] indexing from 'TWL'
Sample
r
rp
L

User choose rock, program choose paper: Lose

LOLCODE, 1397
Note: I submitted this before I noticed the winning requirement was changed from popularity with golf tie-break to golf with popularity tie-break.
There's not really any strict syntax, but I'm sure this is acceptable.
HAI
    I HAS A CRAZY, LUCKY, CHALLENGE, TREAT
    I HAS YUMMY ITZ "LOL U LOZED"
    I HAS MEH ITZ "NOWAI TIED"
    I HAS GROSS ITZ "OMG U WONNED"
    I HAS BURNT ITZ "LAME"
    GIMMEH CHALLENGE
    BTW I HOPE I R TEH WINZ
    LOL CRAZY IZ BETWEEN 1 AN 3
    I HAS A SUPA ITZ A BUKKIT
    LOL SUPA'Z 1 R "ROCK"
    LOL SUPA'Z 2 R "PAPER"
    LOL SUPA'Z 3 R "SCIZZORS"
    LOL LUCKY R SUPA'Z CRAZY
    GOT CHALLENGE, WTF?
        OMG "Rock"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R MEH, GTFO
                OMG PAPER, LOL TREAT R YUMMY, GTFO
                OMG SCIZZORS, LOL TREAT R GROSS, GTFO
            OIC
        OMG "Paper"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R GROSS, GTFO
                OMG PAPER, LOL TREAT R MEH, GTFO
                OMG SCIZZORS, LOL TREAT R YUMMY, GTFO
            OIC
        OMG "Scissors"
            GOT LUCKY, WTF?
                OMG ROCK, LOL TREAT R YUMMY, GTFO
                OMG PAPER, LOL TREAT R GROSS, GTFO
                OMG SCIZZORS, LOL TREAT R MEH, GTFO
            OIC
        OMGWTF
            VISIBLE "WHAT U SAYZ?", LOL TREAT R BURNT
            GTFO
    OIC
        BOTH SAEM TREAT AN BURNT, O RLY?
            YARLY
                VISIBLE "YOU BURNTED MAH TREAT!"
            NOWAI
                VISIBLE SMOOSH "I GUESSED " AN LUCKY
                VISIBLE TREAT
        KTHX
KTHXBAI

If this were to be successfully executed as RockPaperScissors.LOL, here's what some possible random outcomes could be:

Input: Rock - Output: I GUESSED SCIZZORS U WONNED
Input: Paper - Output: I GUESSED PAPER NOWAI TIED
Input: Scissors - Output: I GUESSED ROCK LOL U LOZED
Input: Tuna - Output: WHAT U SAYZ? YOU BURNTED MAH TREAT!

+1 just for being LOLCODE. Looks like something I should learn sometime, just for the LOLz.

GolfScript
n"Draw"

Above code implements the required functionality. Additionally, it ensures that the player will never be left angry because of a (perceived) unfairness of computer's strategy.
Ungolfed version
n"Draw"

How to invoke the program
The input (a single character of 'r', 'p', 's') has to be provided on STDIN, possibly terminated with newline.
A sample run
> echo r | ruby golfscript.rb rockpaperscissors.gsc
r
Draw

Explanation of the code
For all those not familiar with GolfScript I'll add an detailed explanation of how this code works. The code essentially exists of three parts.
### Computer's strategy ###
# The strategy used to play r/p/s.
# The computer is so fast, it can really guess in an instance
# what the player has played. Since the computer should
# not play unfair, the best strategy is to always go for a
# draw and choose the same move.
        # on the stack is player's move
        # choose to play the same -> now the computer's move is on the stack

### Fiddle with input ###
# The input may of may not be delimited by newline.
# In order to make the output readable, we'll give
# a newline here.
n       # Push a newline onto the stack

### Give the result ###
# We can skip a complicated calculation of the result
# since we chose to play draw anyways.
"Draw"  # Push the result onto the stack

# Output is printed automatically when GolfScript code terminates.

Notes
Since this is not code-golf but popularity contest I didn't choose the shortest version. Maybe in case of a tie a shorter code will knock out my solution. Nevertheless, for those interested in golfing, the following possibilities are given:

Deal only with proper input and force user to provide a newline. This will save one character.
The rules have a small insufficiency which allows to save another character by bending the rules. The result can always be printed as "Win" - it was not specified that the correct result has to be printed. But note that players will soon get angry if you choose to implement a cheating program.
The output format is not well specified. We can choose 0 as output for draw. Thus, the shortest valid program is the single-character code 0.

OK, I have added more verbosity to the rules ! I admit I made two rookie mistakes.

"The only winning move is not to play." :P

+1 for the ungolfed version and the really good explanation

I suggest n"d", as the question said that the output must be any printable character, it doesn't say anything about using full words.

Ruby: 61 54 characters
o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]

Somehow explained:
The entire problem is reduced to calculating the following results:
  ╲ machine
h  ╲| 0 1 2
u ──┼──────
m 0 │ 0 1 2
a 1 │ 2 0 1
n 2 │ 1 2 0

Where the numbers mean:

choice: 0 rock, 1 paper, 2 scissor
result: 0 draw, 1 win, 2 lose

For this I used the formula: machine_choice - human_choice. This occasionally results negative value, but as it is only used as index and negative index is counted backward, will pick the correct array element.
# ┌── choosable object type
# │           ┌── machine's choice numeric code
# │           │                  ┌── result type
# │           │                  │                   ┌── human's choice
# │           │          ┌───────┴───────┐           │
  o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]
#           └─────┬────┘                   └─────┬────┘
#                 └── machine's choice letter    │
#                                                └── result numeric code

Used methods (others then Fixnum's obvious ones):

Kernel.p(obj) → obj – “For each object, directly writes obj.inspect followed by a newline to the program’s standard output.”
Kernel.rand(max=0) → number – “If called without an argument, or if max.to_i.abs == 0, rand returns a pseudo-random floating point number between 0.0 and 1.0, including 0.0 and excluding 1.0.”
String.index(substring [, offset]) → fixnum or nil – “Returns the index of the first occurrence of the given substring or pattern (regexp) in str.”

Ungolfed:
object_type = "rps";
result_type = %w{Draw Win Lose}

machine_choice = rand(3)
human_choice = $_

p object_type[machine_choice]

result_code = machine_choice - object_type.index(human_choice)
p result_type[result_code]

Sample run:
bash-4.2$ ruby -nle 'o="rps";p o[c=rand(3)],%w{Draw Win Lose}[c.-o.index$_]'
r
"p"
"Win"
p
"p"
"Draw"
s
"p"
"Lose"

Very similar to mine. [(c-o.index($_)+3)%3] can be replaced by [c.-o.index$_] for 7 bytes. Also, you should add two to your score for -nl at the very least.

Doh! That was my very first intention, to make use of negative indexes. Seems I forgot to retry this approach after fixing an operand order issue. Thank you, @primo. And one more thank you for the c. tip.

I have to say that I love this answer!!

@manatwork the trick is actually .-. Dotted operators have a much lower precedence than their non-dotted counterparts. For example, a/(b+c) can be replaced by a./b+c.

Perl 48 bytes
$%=rand 3;print"$%
"^B,(Draw,Lose,Win)[$%-=<>^B]

The script prints the result from the computer's perspective, for example if the player chooses r and the computer chooses s, the result is Lose. $% (format page number) is used to store the computer's move, as it may only contain an integer value, which saves an int cast.
Ungolfed:
# choose a random move index 0, 1, or 2
$cindex = int(rand 3);
# convert this index to a move
# 0 => r, 1 => s, 2 => p
$cmove = "$cindex" ^ B;

# read the player's move
$pmove = <>;
# convert this move to its index
$pindex = $pmove ^ B;

# print computer's move
print $cmove, $/;
# compare indices, and output result
@result = (Draw, Lose, Win);
print $result[$cindex - $pindex];

Sample usage:
$ echo p | perl rps.pl
s
Win

$ echo r | perl rps.pl
r
Draw

$ echo s | perl rps.pl
p
Lose

The script may also be run interactively, by typing your move followed by Enter:
$ perl rps.pl
r
s
Lose

Rule Stretching
Perl 35 +3 bytes
$_=($%=rand 3).(D,L,W)[$%-($_^B)]^B

Requires the -p command line switch (counted as 3 bytes). Each of the outcomes Win, Lose and Draw have been mapped to W, L, D. The newline between the computer's choice and the result has been excluded.
Sample usage:
$ echo r | perl -p rps.pl
sL

Perl 30 +3 bytes
$_=($%=rand 3).($%-($_^B))%3^B

Once again requires -p. Here Win, Lose and Draw have been mapped to 2, 1 and 0 respectively. This is still technically compliant, as they are printable characters.
Sample usage:
$ echo r | perl -p rps.pl
s1

Perl 24 +3 bytes
$_=$^T%3 .($^T-($_^B))%3^B

Requires -p, WLD mapped to 2, 1, 0 as before. Each ^T should be replaced with a literal ascii character 20. This one is admittedly a bit of a stretch; $^T returns the number of seconds since epoch from when the script was started. All outcomes are possible, but it doesn't quite qualify as pseudo-random.
Sample usage:
$ echo r | perl -p rps.pl
s1

C# (167 characters)
My very first try at golfing.
Golfed
using System;class P{static void Main(string[] i){var m="rspr";var a=m[Environment.TickCount%3];Console.WriteLine(a+" "+(i[0][0]==a?"T":m.Contains(i[0]+a)?"W":"L"));}}
Un-golfed
using System;

class P
{
    static void Main(string[] i)
    {
        var m = "rspr";
        var a = m[Environment.TickCount % 3];
        Console.WriteLine(a + " " + (i[0][0] == a ? "T" : m.Contains(i[0] + a) ? "W" : "L"));
    }
}

Sample Run
The app requires single char inputs as argument 1 to the application, either r, s or p.
cmd > app.exe r

All possible outcomes

cmd > app.exe r gives output r T (rock, tie)
cmd > app.exe r gives output p L (paper, lost)
cmd > app.exe r gives output s W (scissors, win)
cmd > app.exe p gives output r W (rock, win)
cmd > app.exe p gives output p T (paper, tie)
cmd > app.exe p gives output s L (scissors, lost)
cmd > app.exe s gives output r L (rock, lost)
cmd > app.exe s gives output p W (paper, win)
cmd > app.exe s gives output s T (scissors, tie)

APL (38 36)
c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]

Outputs 'T', 'W' and 'L' for tie, win and lose.
Sample run:
      c[i],(⌽↑⌽∘'TWL'¨⍳3)[⍞⍳⍨c←'rps';i←?3]
p
rW

(User types 'p' for paper. Computer chooses 'r' (rock), user wins)
Explanation:

⌽↑⌽∘'TWL'¨⍳3: generates the following matrix:

TLW
WTL
LWT

⍞⍳⍨c←'rps': set c to the string 'rps', read user input and get the index of the user input in the string (this will be a value from 1 to 3). This index is used as the Y coordinate into the matrix.
i←?3: get a random  number from 1 to 3 and store it in i, this is the computer's choice. This is used as the X coordinate into the matrix.
c[i]: use i as an index into c, displaying the computer's choice as 'r', 'p', or 's'.

ferNANDo 1184 (259 golfed) bytes
An interpreter written in Python can be found at the bottom of the linked page.
ferNANDo is a esoteric language which supports only one variable type, boolean, and only one operation, NAND. As you might imagine, this can lead to some fairly long logic to accomplish seemingly simple tasks. It has support for reading from stdin (one byte at a time), writing to stdout (also one byte at a time), conditional loops, and also a random boolean generator.
There are no keywords whatsoever; everything is a variable. A statement's function is determined solely by the number of variables it contains. There are also no comments, so I've done my best to make the code self-commenting. The last four lines might be a bit confusing, but it will probably suffice to say that it prints Win!, Lose, or Draw depending on the outcome.
not sure, but right now i'm guessing you're_not_paper you're_scissors
you're_paper not you're_not_paper
you're_not_scissors not you're_scissors
you're_rock you're_not_paper you're_not_scissors
you're_rock you're_rock

o_shi-
i'm_not_paper right ?
i'm_scissors right ?
i'm_paper not i'm_not_paper
i'm_not_scissors not i'm_scissors
o_shi- i'm_paper i'm_scissors
o_shi- o_shi-
o_shi-
i'm_rock i'm_not_paper i'm_not_scissors
i'm_rock i'm_rock

print right now but only if i'm_not_paper i'm_scissors
print a newline here, not more, not less

i_win_if i'm_scissors you're_paper
or_if i'm_rock you're_scissors
or_even_if i'm_paper you're_rock

i_win i_win_if or_if
i_win i_win
i_win or_even_if

i_lose_if i'm_paper you're_scissors
or_if i'm_scissors you're_rock
or_even_if i'm_rock you're_paper

i_lose i_lose_if or_if
i_lose i_lose
i_lose or_even_if

i_don't_win not i_win
i_don't_lose not i_lose
we_tie i_don't_win i_don't_lose
we_tie we_tie
we_don't_tie not we_tie

print now if i_win i_lose not i_win i_win
print but not we_tie we_don't_tie i_lose i_don't_win we_don't_tie
print right now i_lose i_win i_win we_don't_tie i_don't_win
print i_don't_win but we_tie or i_don't_win we_tie now

The script can be run interactively, by typing your move followed by Enter.
Sample usage (assuming you've named the interpreter nand.py):
$ python nand.py rps.nand
p
s
Win!

$ python nand.py rps.nand
r
r
Draw

$ python nand.py rps.nand
s
p
Lose

Edit: Just to prove that ferNANDo can compete with Java, here's a 'golfed' version at 259 bytes. The logic is sightly different; it checks not win and not tie, which saves a few NAND gates (because then I only need the not versions of the player's moves, and because not lose wasn't required for the output). Not nearly as interesting to read, though.
1 _ _ _ _ _ _ A b
B 1 b
C A B
o
P 1 ?
s 1 ?
p 1 P
S 1 s
o p s
o o
o
r P S
r r
0 1 1 1 0 0 P s
0 0 0 0 1 0 1 0
t s A
u r B
v p C
W t u
W W
W v
t p A
u s B
v r C
D t u
D D
D v
w 1 W
d 1 D
l W D
l l
0 1 0 w l 1 w w
0 1 1 d D l W D
0 1 1 l w w D W
0 W 1 d 0 W d 1

HAHAHA o_shi- o_shi- o_shi- This was hilarious self-commenting.

@jdstankosky perhaps a bit of an over-reaction to rolling a q, but he does do the sensible thing and reroll.

Python 3, 55 bytes
q={*'rps'}.pop()
print(q,'rrppssrpsr'.count(q+input()))

Try it online!
With the release of Python 3.3 came default hash randomization. As such, we can use the set.pop method to get a random character from the string 'rps'.
The program appends the input character to the randomly generated character and counts how often the combination appears in the string 'rrppssrpsr'.
Outputs 0 for program win, 1 for tie and 2 for player win.

Python 3.x: 74 Characters
import time
A,f="psr",time.gmtime()[5]%3
print(A[(A.find(input())+f)%3],f)

How it works
Before Machine Proceeds it determines the outcome of the game and based
on the outcome, it determines the choice which would result in the outcome
viz Human's choice

\     Outcome
 \    0  1  2
  \_____________
H  |
U 0|  0  1  2
M 1|  1  2  0
A 2|  2  0  1
N  |

Where Choices are represented as
0 --> Paper
1 --> Scissor
2 --> Rock

Outcome (From Computer's Perspective)
0 --> Draw
1 --> Win
2 --> Fail

Given the sequence of choices as a string
"psr"
So its easy to see, if computer needs to win, it needs to choose the character
next to what human chooses.
If computer needs to loose, it needs to choose the previous character to what
human chooses

MACHINE's|      CHOICES    |  Formulation
FATE     |-----------------|  For Machine's
         |  P     S      R |  Choice
---------|-----------------|-----------------------------
WIN(1)   |        H ---> M | (CHOICE+1) % 3 = (CHOICE+WIN)%3
---------|-----------------|-----------------------------
LOSS(2)  |  M     H -----\ | (CHOICE+2)%3   = (CHOICE+LOSS)%3
         |  ^            | |
         |  |____________| |
---------|-----------------|------------------------------
DRAW(0)  |        H        | (CHOICE+0)%3   = (CHOICE+DRAW)%3
         |        M        |
---------|-----------------|

Combining all the above we have

MACHINE's CHOICE = (HUMAN CHOICE + MACHINE's FATE) % 3

Based on the fate, it determines what should it's choice be based on the formula
result = (User_choice + machines_fate) % no_of_choices

machine_choice = "psr"[result]

Un-golfed Version
import time
choices = "psr"
#time.gmtime() returns the time structure in gmt
#time.gmtime()[5] is the current second tick
fate = time.gmtime()[5]%3
user_choice = input()
result = (choices.find(user_choice)+fate)%len(choices)
machine_choice = choices[result]
print(machine_choice, fate)

Sample run
D:\temp\rivalry>rps.py
r
r 0

D:\temp\rivalry>rps.py
r
p 1

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
r 2

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
s 1

D:\temp\rivalry>rps.py
p
p 0

interesting, deciding beforehand the outcome, then throwing whatever sign to get that result...

I'm not sure time in seconds qualifies under "program choice ('r', 'p' or 's') has to be pseudo random". Milliseconds probably would, though.

Lua, 87
c,n=os.time()%3+1,'rps'print(n:sub(c,c),({'Draw','Win','Defeat'})[(n:find(...)-c)%3+1])

Usage:
$ lua rps.lua p
s   Defeat

Ungolfed:
names = 'rps'
comp_idx = os.time()%3 + 1                -- 1, 2 or 3 (depends on timer)
comp_move = names:sub(comp_idx, comp_idx) -- 'r', 'p' or 's'
user_move = ...                           -- input parameter: 'r', 'p' or 's'
user_idx = names:find(user_move)          -- 1, 2 or 3
delta_idx = (user_idx - comp_idx) % 3     -- 0, 1 or 2
all_results = {'Draw', 'Win', 'Defeat'}   -- [1]=='Draw', [2]=='Win', [3]=='Defeat'
game_result = all_results[delta_idx + 1]
print(comp_move, game_result)

You can save 3 characters by using 'Lose' instead of 'Defeat' and 'Tie' instead of 'Draw'. ;)

Python 2 (86 84 80 78), Python 3 - 76 chars
0 - tie, 1 - lose, 2 - win
from random import*
a=raw_input()
b=choice('psr')
print(a!=b)+(b+a in'rpsr'),b

from random import*
a=input()
b=choice('psr')
print((a!=b)+(b+a in'rpsr'),b)

Ungolfed
from random import*
moves = 'psr'
inp   = raw_input()
comp  = choice(moves)
match = comp+inp
is_not_tie = inp!=comp
wins = 'r' + moves         #rpsr; rock beats scissors, scissors beats paper, paper beats rock
print is_not_tie + (match in wins), comp

How to run:
python file_name_here.py
Problems:
Computer AI: 35 characters

Nice! I don't think you need A though, and you can save another char with from random import*.

@grc: thanks, I didn't try from random, because I thought it didn't change it...

You can strip a further 2 characters by changing (a==b)*2 to (a!=b) and changing outcomes to "0-tie, 1-win, 2-lose"

Sorry, meant ""0-tie, 1-lose, 2-win"

@Dhara: Thanks, wouldn't have figured that out. manatwork: Oh! I'll fix that.

If you go with Python 3, you can use input instead of raw_input for a net savings of 2 characters (print will require parenthesis, costing 2 of the 4 saved characters).

GolfScript 62
An alternative GolfScript solution, much more boring than Howard's :).
The program chooses a move randomly and displays the result from the perspective of the user.
The Code
'rssppr'.[6rand=]''+:§@+..&,({?)§\'Lose''Win'if}{;;§'Draw'}if`

Sample run

> echo s | ruby golfscript.rb rps.gs
r"Lose"

Online test
You can run the program and experiment with different inputs here: http://golfscript.apphb.com/?c=OydzJwoKJ3Jzc3BwcicuWzZyYW5kPV0nJys6wqdAKy4uJiwoez8pwqdcJ0xvc2UnJ1dpbidpZn17OzvCpydEcmF3J31pZmA%3D
Note, however, that the parameter (user move) that's usually passed in the command line is now added to the stack in the code itself (there's no way to provide "real" command line parameters in this online tool).
"Ungolfed" version
I don't have any idea what ungolfed means when it comes to GolfScript, so I tried to add comments. Hopefully that will clarify how the code works and make it a bit more readable:
# initially, the input (user's move) is on the stack

'rssppr'                # push the string 'rsspr' on the stack...
.                       # ...twice.

[
    6rand               # get a pseudo-random integer in the [0-5] range
    =                   # use the random index to get
                        # a letter from the string above

]''+                    # workaroud to get the actual letter instead of the
                        # ASCII code

:§                      # assign the randomly chosen letter (computer's move)
                        # to a nice variable called "§"

@                       # rotates last 3 elements on the stack, bringing
                        # the user input in the uppermost position
                        # So, now we have: "rssppr" <computer_move> <user_move>
                        # on the stack

+                       # concatenate the two moves, so now we have a string
                        # that contains both (ex: "rs")

..                      # copy the move string twice
&                       # do a setwise AND to get the DISTINCT elements
,(                      # get the length of the resulting string and subtract 1
                        # (now we have 0 if the letters were equal and non-zero otherwise)

{                       # beginning of block to execute when the moves are different:

                        # now we have on the stack two strings:
                        #     - the string 'rssppr'
                        #     - the string containing the moves (ex: 'rs')

    ?                   # find the second string inside the first one,
                        # and get the index at which it occurs
                        # (or -1 if it does not)

    )                   # increment that number (we now get 0 if no occurrence, 1 otherwise)

    §                   # recall the § variable (so we display the computermove)
    \                   # rotate the uppermost two stack entries

    'Lose''Win'if       # if the move pair is found in the 'rssppr' string,
                        # then print 'Lose', otherwise print 'Win'
}

{                       # beginning of block to execute when the moves are identical:

    ;;                  # discard the latest two stack items (not needed in this case)
    §                   # display computer's move
    'Draw'              # display the text 'Draw'
}
if                      # if computer's and user's moves were NOT equal,
                        # execute the first block.
                        # if they were, execute the second block

`                       # put the last word in quotes to separate it from computer's move

C, 92 86 chars
main(y){
    srand(time(0));
    y="rps"[rand()%3];
    printf("%c%c\n",y,"LWWTLLW"[getchar()-y+3]);
}

Prints the computer's choice, and the result from the user's point of view - W=you win, L=you lose, T=tie.
The simple formula x-y, given the ASCII values of the choices, gives 0 on draw (obviously) and a unique value in each other case.

First try without reviewing others.
golfed: 107 85 bytes
i=prompt(),c="rps"[new Date%3],w={r:"s",p:"r",s:"p"};alert(c+(i==w[c]?2:w[i]==c?1:3))

output is [npc-choice][1:win, 2:loss, 3:tie]
ungolfed:
var input = prompt(),
    choices = ["r","p","s"],
    computer_choice = choices[Math.floor(Math.random() * 3)],
    outcomes = {'r':'s','p':'r','s':'p'},
    winner;

    if( input == outcomes[computer_choice] ) {
        winner = 'NPC';
    } else if ( computer_choice == outcomes[input] ) {
        winner = 'You';
    } else {
        winner = 'No one, it was a Tie!';
    }

    alert('Computer chose: ' + computer_choice + '\n' +
          'The winner is: ' + winner);

PowerShell: 144 133 117 111 92 73

Changes from original:

Completely re-wrote script after seeing Danko Durbic's three-player even or odd solution.
Changed $s to a single string instead of a character array.
Used IndexOf as a direct method on $s, instead of spelling out the .NET class & method.
Removed redundant %3s.

All told, nearly cut the length in half from my original answer!

Golfed code:
$p=($s='rps').IndexOf((read-host));$s[($c=Random 3)];"TWLLTWWLT"[$p+$c*3]

Can be run straight from the console.
Ungolfed, with comments:
# Variable $p will store the player's selection as a ternary digit by finding its position in a string containing the possible choices.
$p=(
    # Possible choices will be stored in a variable, $s, for later reuse.
    $s='rps'
# Get the position of the player's choice from $s.
).IndexOf((read-host));

# Express the computer's choice by outputting the appropriate character from $s.
$s[(
    # Computer's choice will be stored as a ternary digit in $c.
    $c=Random 3
)];

# Outcome for the player will be chosen from a string of possible outcomes by looking up the decimal repesentation of a two-digit ternary number.
# The threes digit is represented by $c, ones digit by $p.
"TWLLTWWLT"[$p+$c*3]

# Variable cleanup - do not include in golfed code.
rv p,s,c

Some sample runs at the console:

JAVA 259 :(
class c {public static void main(String[]a){char y=a[0].charAt(0);char m="rps".charAt(new java.util.Random().nextInt(3));if(y==m)a[0]="T";else if((y=='r'&& m=='s')||(y=='s'&& m=='p')||(y=='p'&& m=='r'))a[0]="1";else a[0]="0";System.out.println(m+":"+a[0]);}}

Highly ungolfed code:
class c {
    public static void main(String[] a) {
        char y = a[0].charAt(0);
        char m = "rps".charAt(new java.util.Random().nextInt(3));
        if (y == m) {
            a[0] = "T";
        } else if ((y == 'r' && m == 's') || (y == 's' && m == 'p') || (y == 'p' && m == 'r')) {
            a[0] = "1";
        } else {
            a[0] = "0";
        }
        System.out.println(m + ":" + a[0]);
    }
}

Sample runs:

C:>java c r
s:1
C:>java c p
p:T
C:>java c s
s:T

Befunge: 107 characters
~v@,"w"<   <   <  <
v?v3.14159265@,"l"<
"""358979323846>3-|
rps26433832>:1+|
"""7950>:2+|
>>>:,-:|
28@,"t"<

Slightly clunky. It is shrinkable, the question is by how much.

JavaScript (87)
Golfed:
o='LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)];alert(b+o)

Ungolfed:
var player = prompt(),
    computer = 'prs'[new Date%3], // Date mod 3 "pseudo-random"
    outcome = 'LDW'[2*(player+computer != 'ps'
                    & player < computer
                    | player + computer == 'sp') // convert boolean W/L outcome to int (0,2)
              +
              +(player == computer)]; // convert D outcome to int (0,1)
alert(computer + outcome);

You can simply paste the code in your browser's javascript console to run it.
If I'm allowed to print the result before printing the computer's selection (83):
alert('LDW'[2*((a=prompt())+(b='prs'[new Date%3])!='ps'&a<b|a+b=='sp')+ +(a==b)]+b)

x86-64 machine code (Linux), 98 bytes
00000000  54 5d 31 c0 31 ff 48 8d  75 f0 6a 02 5a 0f 05 8a  |T]1.1.H.u.j.Z...|
00000010  5d f0 b8 3e 01 00 00 48  8d 7d f0 6a 01 5e 31 d2  |]..>...H.}.j.^1.|
00000020  0f 05 8a 45 f0 6a 03 59  48 f7 f1 8a 8a 58 00 00  |...E.j.YH....X..|
00000030  00 88 4d f0 28 cb 80 c3  03 8a 8b 5b 00 00 00 88  |..M.(......[....|
00000040  4d f1 6a 01 58 6a 01 5f  48 8d 75 f0 6a 02 5a 0f  |M.j.Xj._H.u.j.Z.|
00000050  05 6a 3c 58 31 ff 0f 05  72 70 73 6c 77 77 64 6c  |.j<X1...rpslwwdl|
00000060  6c 77                                             |lw|

Disassembly:
   0:   54                      push   rsp
   1:   5d                      pop    rbp ; Setup basic frame pointer
   2:   31 c0                   xor    eax,eax
   4:   31 ff                   xor    edi,edi
   6:   48 8d 75 f0             lea    rsi,[rbp-0x10]
   a:   6a 02                   push   0x2
   c:   5a                      pop    rdx
   d:   0f 05                   syscall ; Read 2 bytes from STDIN into RBP-0x10 (input char + newline)
   f:   8a 5d f0                mov    bl,BYTE PTR [rbp-0x10] ; Move input into BL
  12:   b8 3e 01 00 00          mov    eax,0x13e
  17:   48 8d 7d f0             lea    rdi,[rbp-0x10]
  1b:   6a 01                   push   0x1
  1d:   5e                      pop    rsi
  1e:   31 d2                   xor    edx,edx
  20:   0f 05                   syscall ; Get 1 random byte
  22:   8a 45 f0                mov    al,BYTE PTR [rbp-0x10]
  25:   6a 03                   push   0x3
  27:   59                      pop    rcx
  28:   48 f7 f1                div    rcx
  2b:   8a 8a 58 00 00 00       mov    cl,BYTE PTR [rdx+0x58]
  31:   88 4d f0                mov    BYTE PTR [rbp-0x10],cl ; Get random throw
  34:   28 cb                   sub    bl,cl
  36:   80 c3 03                add    bl,0x3
  39:   8a 8b 5b 00 00 00       mov    cl,BYTE PTR [rbx+0x5b]
  3f:   88 4d f1                mov    BYTE PTR [rbp-0xf],cl ; Decide win/lose/draw
  42:   6a 01                   push   0x1
  44:   58                      pop    rax
  45:   6a 01                   push   0x1
  47:   5f                      pop    rdi
  48:   48 8d 75 f0             lea    rsi,[rbp-0x10]
  4c:   6a 02                   push   0x2
  4e:   5a                      pop    rdx
  4f:   0f 05                   syscall ; Print 2 chars to STDOUT (the computer's throw (r/p/s) and the winner (w/l/d))
  51:   6a 3c                   push   0x3c
  53:   58                      pop    rax
  54:   31 ff                   xor    edi,edi
  56:   0f 05                   syscall ; Exit with return code 0
  58:   727073 6c7777646c6c77 (data)

Outputs 'w' for win, 'l' for lose, and 'd' for draw.
Example run:
$ ./rps
r
sw

User picked rock and computer picked scissors. User wins.

Welcome to the site, nice first answer!

Suggest mov edi,eax instead of push 0x1; pop rdi

Jelly, 13 bytes
“rps”ɓ3XṄ+i@ị

Try it online!
Decides and prints the outcome (3 for a tie, 2 for a win, 1 for a loss) before determining its own move, so the validity might be somewhat dubious.
“rps”            Set the left argument to "rps",
     ɓ           then start a dyadic link with reversed arguments:
      3X         choose 1, 2, or 3,
        Ṅ        print that number with a newline,
         +       add it to
          i@     the index of the left argument in the right argument,
            ị    and take the element of the right argument at that modular index.

Without going backwards:
Jelly, 14 bytes
“rps”ðXṄ⁸i_i%3

Try it online!
0 for tie, 2 for win, 1 for loss.
“rps”             Set the left argument to "rps",
     ð            then start a dyadic link:
      X           choose a random element of the left argument,
       Ṅ          print it,
        ⁸i        find its index in the left argument,
          _       subtract
           i      the right argument's index in the left argument,
            %3    and mod 3.

K, 67
{-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}

Prints W,L,D for win/lose/draw.
Ungolfed:
rps:{[x]
    res:x,*1?"rps";        // join user input to random selection of r,p,s
    -1'f;                  // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp"); // the universe of winning combinations
    losses:|:'wins;        // reverse each win to the get losses

    $[f in wins;
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Or in Q, which is more readable:
rps:{[x]
    res:x,rand["rps"];        // join user input to random selection of r,p,s
    -1 each f;                // print the user input and the program selection to stdout
    wins:("pr";"rs";"sp");    // the universe of winning combinations
    losses:reverse each wins; // reverse each win to the get losses

    $[f in wins;
        "win";
    f in losses;
        "lose";
    "draw"]
    }

Sample Run:
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"r"
r
s
"W"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"s"
s
s
"D"
k){-1'f:x,*1?"rps";$[f in b:("pr";"rs";"sp");"W";f in|:'b;"L";"D"]}"p"
p
s
"L"

Javascript, 117 characters
Here's a data-driven approach to the problem.  This can probably be optimized by generating the win/lose/draw data instead of mapping it manually, but it's a start :)
Golfed:
alert((r=[{v:"r",r:d="D",p:w="W",s:l="L"},{v:"p",r:l,p:d,s:w},{v:"s",r:w,p:l,s:d}][Math.random()*3|0]).v+r[prompt()])

Ungolfed:
//Output the result to the user
alert(
    (
        //Store the random computer outcome data
        randomRPSData =
            //Create the data for if the computer chooses r, p, or s
            [
                {
                    value: "r",
                    r: (d = "Draw"),
                    p: (w = "Win"),
                    s: (l = "Lose")},
                {
                    value: "p",
                    r: l,
                    p: d,
                    s: w},
                {
                    value: "s",
                    r: w,
                    p: l,
                    s: d}
            ]
            //Have the computer pick a random variable
            [Math.random() * 3 | 0]

    //Output the value the computer chose
    ).value

    //Output whether the user won or not
    + r[prompt()]
);

Finally, here's a fiddle with both.

Javascript: 256
golfed:
i=prompt(),a=['p','r','s'];a=a[Math.floor(Math.random()*(3-1+1))+1];if(i==a){alert('d');}else if(i=='p'){if(a=='s'){alert('l');}else{alert('w');}}else if(i=='r'){if(a=='s'){alert('w');}else{alert('l');}}else if(i=='s'){if(a=='r'){alert('l');}else{alert('w')}}

ungolfed:
i=prompt(),a=['p','r','s'];
a=a[Math.floor(Math.random()*(3-1+1))+1];
if(i==a){
    alert('d');
}
else if(i=='p'){
    if(a=='s'){
        alert('l');
    }else{alert('w');}
}else if(i=='r'){
    if(a=='s'){
        alert('w');
    }else{alert('l');}
}else if(i=='s'){
    if(a=='r'){
        alert('l');
    }else{alert('w')}
}

Clojure:
(def r 0) (def s 1) (def p 2)
(def object-name #(get {'p "Paper", 's "Scissors", 'r "Rock"} %))
(def result-name #(get {\d "Draw", \w "Win", \l "Lose"} %))
(defn computer-choice [] (nth ['r 's 'p] (int (rand 3))))
(defn game [a b] (get "dwlldwwld" (+ (* 3 a) b) ))
(defn print-game [user comp result] (print (format
  "User: %s\nComputer: %s\nResult: %s\n"
  (object-name user) (object-name comp) (result-name result))))
(println "Enter 'p', 's' or 'r' and press return")
(let [comp (computer-choice),  user (read)]  (print-game user comp (game (eval user) (eval comp))))

Mini version (129 code characters):
java -jar clojure.jar -e \
"(def r 0)(def s 1)(def p 2)(let[u(read),c(nth['r 's 'p](int(rand 3)))](print c)(print (get \"dwlldwwld\"(+(* 3(eval u))(eval c)))))"

JAVA (387) first code golf!
import java.util.HashMap;public class _ {public static void main(String i[]){HashMap l = new HashMap(){{put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');}};char u =i[0].charAt(0);char c ="rps".charAt((int)(Math.random()*3)%3);int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};System.out.println("U"+u+"C"+c+"R"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));}}

Ungolfed
import java.util.HashMap;
public class _ {
    public static void main(String[] input) {
       input = new String[] {"s"};
       HashMap lookup = new HashMap(){{
           put('r', 0);
           put('p', 1);
           put('s', 2);
           put(0, 'T');
           put(1, 'L');
           put(2, 'W');
       }};
       char user = input[0].charAt(0);
       char computer = new char[] {'r', 'p', 's'}[(int)(Math.random()*3)%3];
       int[][] matrix = new int[][] {{0,1,2}, {2,0,1}, {1,2,0}};

       Integer userChoice = (Integer) lookup.get(user);
       Integer computerChoice = (Integer) lookup.get(computer);
       Character result = (Character) lookup.get(matrix[userChoice][computerChoice]);

       System.out.println("u:" + user + ",c:" + computer + ",r:" + result);
    }
    /*
     t = 0, l = 1, w = 2
     *
        +---------------+
        | * | r | p | s |
        +---------------+
        | r | 0 | 1 | 2 |
        +---------------+
        | p | 2 | 0 | 1 |
        +---------------+
        | s | 1 | 2 | 0 |
        +---------------+
     */
}

Golfed (Spacing/Indentation)
import java.util.HashMap;
public class _ {
public static void main(String i[]) {
    HashMap l = new HashMap(){{
        put('r',0);put('p',1);put('s',2);put(0,'T');put(1,'L');put(2,'W');
    }};

    char u =i[0].charAt(0);char c = "rps".charAt((int)(Math.random()*3)%3);
    int[][] m =new int[][]{{0,1,2},{2,0,1},{1,2,0}};

    System.out.println("U"+u+"C"+c+"R:"+(Character)l.get(m[(Integer)l.get(u)][(Integer)l.get(c)]));
}}

Not the shortest code, but my first try

Some improvements you may apply: 1) import java.util.* 2) HashMap l -> Map l 3) cast to (int) instead of (Integer) 4) new Random().nextInt(3) 5) omit new int[][] 6) remove cast to (Character) 7) use ints instead of chars.

Go (169)
Golfed :
package main
import("fmt";"os")
func main(){v:=map[uint8]int{114:0,112:1,115:2}
u:=os.Args[1][0]
c:="rps"[os.Getpid()%3]
fmt.Printf("%c\n%c\n",c,"TWL"[(3+v[c]-v[u])%3])}

Ungolfed (as formatted by go fmt):
package main

import (
    "fmt"
    "os"
)

func main() {
    v := map[uint8]int{114: 0, 112: 1, 115: 2}
    u := os.Args[1][0]
    c := "rps"[os.Getpid()%3]
    fmt.Printf("%c\n%c\n", c, "TWL"[(3+v[c]-v[u])%3])
}

Run :

go run main.go p
s
W

Groovy, 89
v='rps'
r=new Random().nextInt(3)
print"${v[r]}${'TLW'[((r-v.indexOf(this.args[0]))%3)]}"

Takes user choice as argument. Example:
groovy rps.groovy p
sL

Pyth, 23
J"rps"K+wOJK%-XJ'KXJtK3

Output is in the form:
Tie: 0
Win: 1
Loss: 2
Explanation:
J"rps"             J="rps"
K+wOJ              K=input()+random_choice(J)
K                  print K
  XJ'K             index of K[0] in J
      XJtK         index of K[1] in J
 -XJ'KXJtK         difference of above indexes
%-XJ'KXJtK3        above difference mod 3

Run as follows:
$ cat rps
J"rps"K+wOJK%-XJ'KXJtK3
s
$ cat rps | python3 pyth.py
< Extraneous debug output removed>
sp
1

For only 4 more characters, we can use T for tie, W for win and L for loss:
J"rps"K+wOJKr@"TWL"-XJ'KXJtK

Everything is the same up until the difference of indexes, at which point we use the difference as the index into the string"TWL".

Note: while I did develop this language after the challenge was posted, I had not seen the challenge until today. The challenge did not influence any aspect of the language.

Jelly, 15 bytes
“rsp”
¢i¢ṙi¢XṄ¤

Try it online!
This returns:

3 if you tie
2 if you lose
1 if you win

and expects input as one of r, p or s
How it works
“rsp” - Helper link. Return "rsp"

¢i¢ṙi¢XṄ¤ - Main link. Takes a character C on the left e.g. "r"
¢         - "rsp"
 i        - Get the 1-index of C in "rsp", i           e.g. 1
  ¢       - "rsp"
   ṙ      - Rotate "rsp" i steps to the left           e.g. "spr"
        ¤ - Create a nilad:
     ¢    -   "rsp"
      X   -   Random element, X                        e.g. "r", "s", "p"
       Ṅ  -   Print
    i     - 1-Index of X in the rotated "rsp"          e.g.  3 ,  1 ,  2

Julia 0.7, 35 bytes
p->[c=rand("prs");"WLLDWWL"[c-p+4]]

ungolfed:
function f(p)
    c = rand("prs")
    result = "WLLDWWL"[c-p+4]
    return [c, result]
end

characters are converted to integers when subtracted (for example 'r'-'r' == 0 and 's'-'r' == 1), good thing p, r and s are close in the alphabet
output: 'L' you lose, 'W' you win, 'D' draw
Julia 0.7 because Julia 1.x would use 3 more characters
Try it online!

JavaScript, 49 characters
This an old question but got shorter answer while doing of Advent of Code 2022 day 2

Input:
r = rock
p = paper
s = scissors

Output:
[computers choice][0=Loss, 1=Win, 2=Draw]

Example:
User  Computer  Result
r     r         r2
r     p         p0
r     s         s1

Golfed code:
'rps'[c=new Date%3]+(1+c-'ps'.search(prompt()))%3

This can be invoked by pasting code in browsers console
Ungolfed code
function rock_paper_scissors(play) {
    const computer = new Date%3 // pseudo random choice of 0, 1, or 2
    const choices = ['Rock', 'Paper', 'Scissors']
    const playNumber = choices.indexOf(play)
    let answer = `You chose ${play}, `
    answer += `Computer chose ${choices[computer]}, you `
    answer += ['Lose', 'Win', 'Tied'][(2 + computer - playNumber) % 3]
    return answer
}

rock_paper_scissors('Rock')

Welcome to Code Golf!

C# & LinqPad 133
golfed:
char i,c,r;i=Console.ReadLine()[0];var a="prsp";c="prs"[new Random().Next(3)];r=i==c?'T':a.Contains(""+i+c)?'W':'L';(c+">"+r).Dump();

ungolfed:
        char i, c, r; // i for input / c for choosen by computer / r for result
        i = Console.ReadLine()[0]; //getting input in LinqPad
        var a = "prsp";
        c = "prs"[new Random().Next(3)]; // Computer choose a random string
        r = i == c ? 'T' : a.Contains("" + i + c) ? 'W' : 'L'; (c + ">" + r).Dump(); //check for win - dump for output in LinqPad

sample output(input was s) :
r>L //Computer chooses rock(r) -> so we lost

JavaScript (79)
Bumping an old one, but here we go ...
With the added bonus that you can use any rock you like pegnatite, pyroxenite, scoria, sovite, kimberlite, trondjemite, tuff or any other. Only limitation is that you can not use p or s ;-)

Input:
r = rock      (Or , ...)
p = paper
s = scissors

Output:
[computers choice][0=Loss, 1=Win, 2=Draw]

Example:
User  Computer  Result
r     r         r2
r     p         p0
r     s         s1

Golfed code:
u=~~{p:1,s:2}[prompt()],c=new Date%3;alert('rps'[c]+(u==c?2:!u&c>1|u&!c|u>1&c))

The main tricks used are:
1. u = ~~{}[prompt()]
       Using object {} and retrieving value by user input from prompt(). So far so good. Then instead of having r : 0 we can force it to be converted to 0 by using the ~~ NOT operator. It is frequently used to floor numbers, but also has the (advantage) of not returning NaN when other operators would, like for example: +{a:1, b:2}['c'].
2. c = new Date%3
       Date is frequently tricked with by e.g. using +new Date to convert it to timestamp directly, else one would get a string representation. Here by using mod one achieve the same effect.
3. 'rps'[c]
       Indexed access on string giving computers choice 0 = r, 1 = p or 2 = s.
4. (u==c ? 2 : !u&c>1 | u&!c | u>1&c )
   IF  u == c
       Draw                    (aka 2)
   ELSE IF !u&c>1|u&!c|u>1&c
       Win                     (aka 1)
   ELSE
       Loss                    (aka 0)
   ENDIF

...

The ungolfed code can be something like this:
function rock_paper_scissors() {
    var choices = {
            r : 0,
            p : 1,
            s : 2,
        },
        tr_table = ['Rock','Paper','Scissors'],
        user, pc, result
    ;

    function get_input() {
        var input = prompt("Enter your choice `r', `p' or `s':")
                    .toLowerCase();

        if (!/^[rps]/.test(input)) {
            console.warn("Bad input. Please choose `r', `p' or `s'.");
            // return get_input();
            return null;
        }
        return input[0];
    }
    function report(c1, c2) {
        if (c1 === pc) {
            return 'Draw';
        } else if (
            (c1 === 0 && c2  >  1) ||
            (c2 === 0 && c1 === 1) ||
            (c1  >  1 && c2  >  0)
        ) {
            return 'Win';
        } else {
            return 'Loss';
        }
    }

    if ((user = get_input())) {
        user = choices[user];
        pc = Math.floor(Math.random() * 3);
        result  =
            'Computers choice: ' + tr_table[pc] + ', ' +
            'Your choice: ' + tr_table[user] + ', ' +
            'Result=' +  report(user, pc);
        console.log(result);
    }
    return result;
}

rock_paper_scissors();

Golfscript - 29
This is an actual answer this time (looking at you, n"Draw" :P ).
'rps'.@\?3rand.@- 3%@@[=]''+\

Ungolfed:
'rps'3rand[=]''+.2$={\;'
T'}{.@'rspr'.@?@@(;\?='
L''
W'if=}if

You can run it with ruby golfscript.rb MyCode.txt, where MyCode.txt is the program code.
Sample runs (all with input "r", but it works with everything) (tie is 0, win is 2, loss is 1):
ruby golfscript.rb MyCode.txt
r0
ruby golfscript.rb MyCode.txt
p2
ruby golfscript.rb MyCode.txt
s1

If you want an explanation of either version and/or see a potential improvement, tell me.

Javascript, 65 71 70
Without computer choise output: 65
alert('-+0+0+0'['rppssrr'.indexOf('rps'[new Date%3]+prompt())+1])

Just to test that solution is correct:
for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log("%s %s %s", x, y, '-+0+0+0'['rppssrr'.indexOf(x+y)+1])

With computer choise output: 71
alert((c='rps'[new Date%3])+'-+0+0+0'['rppssrr'.indexOf(c+prompt())+1])

70
alert((g='rps'[new Date%3]+prompt())+-('srps'.match(g)?-1:g[0]!=g[1]))

and the test:
for(x in {r:0,p:0,s:0})
  for(y in {r:0,p:0,s:0})
    console.log((g=x+y)+-('srps'.match(g)?-1:g[0]!=g[1]))

Python 3, 81 76 bytes
from random import*
c=randint(0,2)
print('rps'[c],('rps'.find(input())-c)%3)

Thought I was being clever and using what I learnt in this challenge. It's not enough unfortunately.

Befunge93: 85 bytes
~v>"R"v    >:2+|>"L",@
@>?"P">:,-:|v  <|-3<
  >"S"^v"T"<   >:1+|
^     ,< "W"<   <  <

Same principle as @Fors's answer, with a more compact layout.
Note : I proposed this as an edit to aforementioned answer, but It seems to have been rejected (is there a notification for that ? It's the first time I suggest an edit). If I am mistaken, and the edit gets accepted I'll gladly delete this answer.

Zsh, 83 53 bytes
z=rps;g=$z[RANDOM%3+1];<<<$g
c=wlldwwl;<<<$c[#g-#1+4]

Try it Online!
83 bytes ; hat-tip to @MarcMush

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
Lawnmower Patterns
Taken from Google Code Jam 2013 Qualification Round Problem B:

Alice and Bob have a lawn in front of their house, shaped like an N metre by M metre rectangle. Each year, they try to cut the lawn in some interesting pattern. They used to do their cutting with shears, which was very time-consuming; but now they have a new automatic lawnmower with multiple settings, and they want to try it out.
The new lawnmower has a height setting - you can set it to any height h between 1 and 100 millimetres, and it will cut all the grass higher than h it encounters to height h. You run it by entering the lawn at any part of the edge of the lawn; then the lawnmower goes in a straight line, perpendicular to the edge of the lawn it entered, cutting grass in a swath 1m wide, until it exits the lawn on the other side. The lawnmower's height can be set only when it is not on the lawn.
Alice and Bob have a number of various patterns of grass that they could have on their lawn. For each of those, they want to know whether it's possible to cut the grass into this pattern with their new lawnmower. Each pattern is described by specifying the height of the grass on each 1m x 1m square of the lawn.
The grass is initially 100mm high on the whole lawn.

Write a function which takes a 2D array of integer heights and determines whether the lawn can be cut accordingly.
Here are 100 test cases from Google Code Jam.  The first 35 cases should pass, the rest should not.
Shortest code wins.

Can you point out the licence under which the Google Code Jam problems are test cases are made available?

I've changed it to link to the problem rather than copying it directly.

I think it is very unfortunate if the puzzle/question is presented here with only a link. The problem should be provided in full with all necessary detail.

"All problem statements, input data and contest analyses are licensed under the Creative Commons Attribution License." ~From the problem page

J, 15 chars
   (-:>./"1<./>./)

Didn't expect this short solution.
Short explanation:
(input == ((max of rows of input) table with min of left and right (max in columns of input)))
(      -:          >./"1                        <./                       >./              )

If your function is 4 other function like in the solution: (f1 f2 f3 f4) and an input J computes it like f1(input,f3(f2(input),f4(input))) i.e. input f1 ((f2 input) f3 (f4 input)).

please explain the algorithm (I can't read J code ^^)

@OlivierDulac Just added right now.

APL, 15 characters
{⍵≡(⌈/⍵)∘.⌊⌈⌿⍵}

Explanation:

⌈⌿⍵ calculates the maximum of the columns of rhs
⌈/⍵ does the same with rows
∘.⌊ does the outer product of the previous two with respect to function minimum
⍵≡ compares the result to the rhs

Examples:
      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 3 3 ⍴ 2 1 2 1 1 1 2 1 2
1

      {⍵≡(⌈/⍵)∘.⌊⌈⌿⍵} 2 3 ⍴ 2 2 2 2 1 1
0

Python, 112 104
z=zip
y=lambda l:[[max(r)]*len(r)for r in l]
f=lambda l:l==[map(min,z(*r))for r in z(y(l),z(*y(z(*l))))]

Use map(min,z(*r)) instead of [min(a)for a in z(*r)] to save 8 characters

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/

sort: votes


text:
Print this Multiplication Table
Write shortest code to print the following Multiplication Table:
1×1=1
1×2=2  2×2=4
1×3=3  2×3=6  3×3=9
1×4=4  2×4=8  3×4=12 4×4=16
1×5=5  2×5=10 3×5=15 4×5=20 5×5=25
1×6=6  2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7  2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8  2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9  2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

Is anyone really going to do anything besides 2 for loops? Where's the challenging (interesting) part?

I don't use for. Ok, I use  while.

Are trailing spaces important?

why in the first column there are 2 spaces and not 1? (as the other colums )

@jdstankosky My answer uses the inverted upper triangle of a scaled identity matrix :).

@jdstankosky perhaps you may find my answer a bit more interesting - no loops involved

Are we even allowed to use x in place of ×? (If not, that invalidates a whole lot of programs)

@jdstankosky I use a time loop!

Excel, 92 91 Bytes
From the VBA editor's immediate window, run the following command:
Range("A1:I9").Formula="=IF(ROW()<COLUMN(),"""",COLUMN()&""×""&ROW()&""=""&COLUMN()*ROW())"
The output is directly on the active worksheet.

I golfed an extra byte by swapping the order of an if to change >= to <.  I didn't update the screenshot, but it only affects the formula at the top, not the output.

HA! I wondered when I'd see an excel answer, +1.

Thanks.  I think I was partially motivated by the comments about doing it without the usual nested FOR loop.

Mine was too!!!

Python (75)
r=range(1,10)
for i in r:print''.join('%sx%s=%-3s'%(j,i,i*j)for j in r[:i])

a little better golfed than the other two Python versions.

Use Python 3.6 with f-strings for -1 bytes: TIO

C++, 106 98 bytes
I used two loops and a few tricks.
#import <cstdio>
main(){for(int i,j;i++-9;j=0)while(j++-i)printf("%dx%d=%d%c",j,i,i*j,j<i?32:10);}

Welcome to PPCG! Nice first post!

#import <stdio.h> main(){for(int i=0,j;i++-9;j=0)while(j++-i)printf("%dx%d=%d%s",j,i,i*j,j<i?"\n":" ";} is 3 bytes shorter.

Do you need a space between #import and <cstdio>?

@Zacharý no that space is not needed

J: 57 51 characters
([:;"2*\#"2(":@],'x',":@[,'=',":@*,' '"_)"0/~)>:i.9

No loops.

Conjunctions (and adverbs) have higher precedence than verbs so you can remove 3 pairs of brackets. ([:;"2*\#"2(":@],'x',":@[,'=',":@*,' '"_)"0/~)>:i.9

@randomra Good call.  Thanks for the tip!

Ruby: 60 59 characters
1.upto(9){|i|puts (1..i).map{|j|"%dx%d=%-3d"%[j,i,i*j]}*""}

Sample run:
bash-4.2$ ruby -e '1.upto(9){|i|puts (1..i).map{|j|"%dx%d=%-3d"%[j,i,i*j]}*""}'
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

Could save one character by changing the initial (1..9).map{ into 1.upto(9){!

There are trailing spaces (first 3 lines). The original table doesn't have them. I'm not sure if that makes a difference, though...

@WolframH, all solutions I checked either have trailing spaces or not reproduce the exact formatting.

D, 75 chars
foreach(i,1..10){foreach(j,1..i+1){writef("%dx%d=%d ",i,j,i*j);}writeln();}

you just said code not function or full program

By default, snippets are not allowed; a function or full program is required.

@quartata This answer predates our defaults by a year and a half.

@Dennis Oh, I didn't realize the no snippets allowed rule was that new. Sorry.

Would this work? foreach(i,1..10){foreach(j,1..i+1)writef("%dx%d=%d ",i,j,i*j);writeln;}

APL (37)
∆∘.{⊃(⍺≥⍵)/,/(⍕⍺)'×'(⍕⍵)'=',⍕⍺×⍵}∆←⍳9

And it's not even just two for-loops. In APL, the following construct:
x ∘.F y

where x and y are lists, and F is a function, applies F to each pair of items in x and y and gives you a matrix.
So: ∆∘.×∆←⍳9 gets you a multiplication table from 1 to 9. The above function generates the required string for each pair, i.e. (⍕⍺), string representation of the first number, followed by ×, followed by (⍕⍵), string representation of the second number, followed by =, followed by ⍕⍺×⍵, as long as ⍺≥⍵.

Mathematica, 45
Pretty boring, but I guess it serves as a syntax comparison:
Grid@Table[Row@{a, "x", b, "=", a b}, {a, 9}, {b, a}]

What, you're telling me there isn't a builtin for this?

@Aaron The function bloat of Mathematica doesn't extent that far yet, thankfully.

Perl, 54 Characters
printf"%dx$?=%-3d"x$?.$/,map{$_,$_*$?}1..$?while$?++<9

APL (Dyalog), 28
↑{⍵{⍕⍵,'×',⍺,'=',⍺×⍵}¨⍳⍵}¨⍳9

Analogous to a double loop in other languages
{⍵{...}¨⍳⍵}¨⍳9 sets up the double loop
⍕⍵,'×',⍺,'=',⍺×⍵ creates the string for each pair
↑ Convert array of array of strings to a matrix of stings
Output
1 × 1 = 1
1 × 2 = 2  2 × 2 = 4
1 × 3 = 3  2 × 3 = 6   3 × 3 = 9
1 × 4 = 4  2 × 4 = 8   3 × 4 = 12  4 × 4 = 16
1 × 5 = 5  2 × 5 = 10  3 × 5 = 15  4 × 5 = 20  5 × 5 = 25
1 × 6 = 6  2 × 6 = 12  3 × 6 = 18  4 × 6 = 24  5 × 6 = 30  6 × 6 = 36
1 × 7 = 7  2 × 7 = 14  3 × 7 = 21  4 × 7 = 28  5 × 7 = 35  6 × 7 = 42  7 × 7 = 49
1 × 8 = 8  2 × 8 = 16  3 × 8 = 24  4 × 8 = 32  5 × 8 = 40  6 × 8 = 48  7 × 8 = 56  8 × 8 = 64
1 × 9 = 9  2 × 9 = 18  3 × 9 = 27  4 × 9 = 36  5 × 9 = 45  6 × 9 = 54  7 × 9 = 63  8 × 9 = 72  9 × 9 = 81

you could remove some of the commas to the same effect: ↑{⍵{⍕⍵'×'⍺'=',⍺×⍵}¨⍳⍵}¨⍳9 or even make use of the new "key operator": {⍕⍵'×'⍺'=',⍺×⍵}¨∘⍳⌸⍳9

VBScript (133); without loops.
g=""
sub m(x,y)
    g=x&"x"&y&"="&x*y&vbTab&g
    if x>1 then
        m x-1,y
    elseif y>1 then
        g=vbLf&g
        m y-1,y-1
    end if
end sub
m 9,9
wscript.echo g

On request of the challenger: no loops. This code uses recursive subroutine calls.

Javascript, 190 bytes
Late to the party, but I was piqued by @jdstankosky 's comment and decided to take a different approach. Here's a Javascript entry that mauls a template and evals itself along the way.
t="a*b=c ";u="";r=u;for(i=1;i<10;i++){a=0;u=u+t;r+=u.split(' ').map(x=>x.replace('a',++a).replace('b',i)).map(x=>x.replace('*','x').replace('c',eval(x.substr(0,3)))).join(' ')+'\n'}alert(r);

Un-golfed version (slightly older version in which a function returns the table instead of a script alerting it, but the same principles apply):
function f()
{
    t="a*b=c "; // template for our multiplication table
    u="";r="";  // tmp- and return values
    for(i=1;i<10;i++)
    {
        a=0;    // is auto-incremented in MAP
        u=u+t;// extend the template once per iteration
        v=u.split(' '); // Smash the template to pieces
        w=v.map(x=>x.replace('a', ++a).replace('b', i)) // MAP replaces the A and B's with the correct numbers
        w=w.map(x=>x.replace('*', 'x').replace('c', eval(x.substring(0,3)))).join(' '); // second map evals that and replaces c with the answer, makes the asteriks into an X
        r=r+w+'\n'  // results get concatenated
    }
    return r;
}

I made that comment a looong time ago, haha. I'm actually glad to see this.

Pascal (FPC), 128 125 138 bytes
One recursive procedure takes care of everything. Call with m(9,9).
procedure m(i,j:int8);begin if i<1then Exit;if i=j then begin m(i-1,j-1);writeln;end;m(i-1,j);write(i,'x',j,'=',i*j,' ':2-i*j div 10);end;

Ungolfed:
procedure m(i, j: int8);
begin
  if i<1 then
    Exit;
  if i=j then
  begin
    m(i-1, j-1);
    writeln;
  end;
  m(i-1, j);
  write(i,'x',j,'=',i*j,' ':2-i*j div 10);
end;

The reason for the byte count going up: the output was not aligned correctly. It is fixed now.
Try it online!

Maple, 64
seq(printf(seq(printf("%ax%a=%a ",j,i,i*j),j=1..i),"\n"),i=1..9)

x86_64 machine code (linux), 175 99 76 bytes
0000000000400080 <_start>:
  400080:   66 bf 09 00             mov    $0x9,%di

0000000000400084 <_table.L2>:
  400084:   6a 0a                   pushq  $0xa
  400086:   89 fe                   mov    %edi,%esi

0000000000400088 <_table.L3>:
  400088:   89 f0                   mov    %esi,%eax
  40008a:   f7 e7                   mul    %edi

000000000040008c <_printInteger>:
  40008c:   6a 20                   pushq  $0x20
  40008e:   3c 0a                   cmp    $0xa,%al
  400090:   7d 02                   jge    400094 <_printInteger.L1>
  400092:   6a 20                   pushq  $0x20

0000000000400094 <_printInteger.L1>:
  400094:   66 31 d2                xor    %dx,%dx
  400097:   b3 0a                   mov    $0xa,%bl
  400099:   66 f7 f3                div    %bx
  40009c:   83 c2 30                add    $0x30,%edx
  40009f:   52                      push   %rdx
  4000a0:   66 85 c0                test   %ax,%ax
  4000a3:   75 ef                   jne    400094 <_printInteger.L1>
  4000a5:   6a 3d                   pushq  $0x3d
  4000a7:   66 57                   push   %di
  4000a9:   80 04 24 30             addb   $0x30,(%rsp)
  4000ad:   6a 78                   pushq  $0x78
  4000af:   66 56                   push   %si
  4000b1:   80 04 24 30             addb   $0x30,(%rsp)
  4000b5:   ff ce                   dec    %esi
  4000b7:   75 cf                   jne    400088 <_table.L3>
  4000b9:   ff cf                   dec    %edi
  4000bb:   75 c7                   jne    400084 <_table.L2>

00000000004000bd <_printChars>:
  4000bd:   66 ba 00 08             mov    $0x800,%dx
  4000c1:   b0 01                   mov    $0x1,%al
  4000c3:   66 bf 01 00             mov    $0x1,%di
  4000c7:   48 89 e6                mov    %rsp,%rsi
  4000ca:   0f 05                   syscall

This is a dump of the binary file, and all of this is 175 bytes. It basically does the same two loops that all the answers do, but printing to the console is a bit harder and basically requires pushing the characters to print onto the stack in reverse, and then making a (linux specific) syscall to actually put those chars into stdout.
I've now optimized this so that only 1 write operation is performed (faster!) and has magic numbers (wow!) and by pushing the entire result onto the stack backwards before making the syscall. I also took out the exit routine because who needs proper exit code?
Here's a link to my first and second attempts, in their original nasm syntax.
I welcome anyone who has any other suggestions on how it can be improved. I can also explain the logic in more detail if anyone is curious.
(Also, it doesn't print the extra spaces to make all the columns aligned, but if that's required I can put the logic in at the cost of a few more bytes).
EDIT: Now prints extra spaces and is golfed down even more! It's doing some pretty crazy stuff with the registers, and is probably unstable if this program were to be expanded.

PPCG requires full programs or functions. Snippets are implicitly disallowed (i.e. you can use them only if the OP has explicitly allowed them.)

Oh, my bad. I forgot OP hadn't specified that.

Fourier, 756 632 bytes
Thanks @BetaDecay for 124 bytes!
1o120~Ea1o61a1o10~Na1oEa2o61a2o32~Saa2oEa2o61a4oNa1oEa3o61a3oSaa2oEa3o61a6oSaa3oEa3o61a9o^a1oEa4o61a4oSaa2oEa4o61a8oSaa3oEa4o61a12oSa4oEa4o61a16oNa1oEa5o61a5oSaa2oEa5o61aNoSa3oEa5o61a15oSa4oEa5o61a20oSa5oEa5o61a25oNa1oEa6o61a6oSaa2oEa6o61a12oSa3oEa6o61a18oSa4oEa6o61a24oSa5oEa6o61a30oSa6oEa6o61a36oNa1oEa7o61a7oSaa2oEa7o61a14oSa3oEa7o61a21oSa4oEa7o61a28oSa5oEa7o61a35oSa6oEa7o61a42oSa7oEa7o61a49oNa1oEa8o61a8oSaa2oEa8o61a16oSa3oEa8o61a24oSa4oEa8o61aSoa5oEa8o61a40oSa6oEa8o61a48oSa7oEa8o61a56oSa8oEa8o61a64oNa1oEa9o61a9oSaa2oEa9o61a18oSa3oEa9o61a27oSa4oEa9o61a36oSa5oEa9o61a45oSa6oEa9o61a54oSa7oEa9o61a63oSa8oEa9o61a72oSa9oEa9o61a81o

I managed to golf 124 bytes off your program by saving the number 120 as the variable E, the number 32 as S and 10 as N.

ConTeXt, 67 60 bytes
\let~\dorecurse\starttext~9{~#1{##1x#1=\luaexpr{#1*##1} }

}

Coreutils/Bash: 147 136 135
for i in {1..9}; do
  yes $'\n' | head -n $[i-1] > $i
  paste -dx= <(yes $i) <(seq $i 9) <(seq $[i*i] $i $[9*i]) |head -n$[10-i] >> $i
done
paste {1..9}

Golfed, using explicit newline and, using deprecated head option (thanks manatwork):
for i in {1..9};do yes '
'|head -$[i-1]>$i;paste -dx= <(yes $i) <(seq $i 9) <(seq $[i*i] $i $[9*i])| head -$[10-i]>>$i;done;paste {1..9}

Output:
1x1=1
1x2=2   2x2=4
1x3=3   2x3=6   3x3=9
1x4=4   2x4=8   3x4=12  4x4=16
1x5=5   2x5=10  3x5=15  4x5=20  5x5=25
1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

Spare 8 characters by replacing all $(( )) arithmetic evaluations with $[ ]; share 2 characters by replacing the $'\n' escaped newline character with a literal one (I mean, yes ' in one line, then ' in the following one); spare 2 characters by not using head's -n option explicitly, just - and the number.

@manatwork: I didn't know about the $[ ] notation, good to know. Replacing -n by - is only one character less so it's 11 in total, thank you very much :).

vba 55
(immediate window)
for f=1 to 9:for j=1 to f:?f;"x";j;"=";f*j,:next:?:next

note - GWBasic only needs 2 extra characters:
1 for f=1 to 9:for j=1 to f:?f;"x";j;"=";f*j,:next:?:next

Tcl 98 chars
while {[incr a]<10} {set b 0;while {[incr b]<=$a} {puts -nonewline "$a×$b=[expr $a*$b] "};puts ""}

Javascript, 75
for(s="",a=b=1;a<10;b=a==b?(a++,alert(s),s="",1):b+1)s+=b+"x"+a+"="+a*b+" "

I wonder if something better than two (combined?) for loops is possible...

well, the only thing I am sure is that it is possible to get 75 on separated loops (my old comment)

Python 2, 72
i=1;exec"j=1;exec'print\"%sx%s=%-2s\"%(j,i,j*i),;j+=1;'*i;print;i+=1;"*9

Output:
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

><>, 50 bytes
1v
 1
?\::n"x"o{::n"="o}*n" "o1+:{:})
 \~1+:a=?;ao

You can try it on the online interpreter.
Note that there is trailing spaces on each lines, which might make it incorrect (OP hasn't stated on this point as of this answer).

///, 268 bytes
/_/\/\///x/×_N/x9=_E/x8=_V/x7=_S/x6=_F/x5=_R/x4=_O/
1_t/  2_h/ 3/1x1=1Ox2=2tx2=4Ox3=3tx3=6 hx3=9OR4tR8 hR12 4R16OF5tF10hF15 4F20 5F25OS6tS12hS18 4S24 5S30 6S36OV7tV14hV21 4V28 5V35 6V42 7V49OE8tE16hE24 4E32 5E40 6E48 7E56 8E64ON9tN18hN27 4N36 5N45 6N54 7N63 8N72 9N81

LOLCODE, 202 bytes
IM IN YR o UPPIN YR b TIL BOTH SAEM b AN 10
c R ""
IM IN YR i UPPIN YR a TIL BOTH SAEM a AN SUM OF b AN 1
c R SMOOSH c SMOOSH a "x" b "=" PRODUKT OF a AN b " " MKAY
IM OUTTA YR i
VISIBLE c
IM OUTTA YR o

Ungolfed:
HAI 1.3 BTW Unnecessary in current implementations
IM IN YR outer UPPIN YR multiplicand TIL BOTH SAEM multiplicand AN 10
    I HAS A output ITZ ""
    IM IN YR inner UPPIN YR multiplier TIL BOTH SAEM multiplier AN SUM OF multiplicand AN 1
        output R SMOOSH output AN SMOOSH multiplier AN "x" AN multiplicand AN "=" AN PRODUCKT OF multiplicand AN multiplier AN " " MKAY MKAY BTW AN is optional to separate arguments, a linebreak is an implicit MKAY.
    IM OUTTA YR inner
    VISIBLE output
IM OUTTA YR outer
KTHXBYE BTW Unnecessary in current implementations

Pythonated for non-leetspeakers:
for multiplicand in range(1, 10):
    output = ""
    for multiplier in range(1, multiplicand + 1):
        output = output + (multiplier + "x" + multiplicand + "=" + str(multiplicand * multiplier) + " ")
    print(output)

As someone who's also used LOLCODE in a code challenge submission, have my upvote! LOVE this lang

JAVA, 103 94 92 90 bytes
Using JShell from Java 9 SDK allows me to save large amount of space
for(int i=0,j;i++<9;)for(j=1;j<=i;)System.out.print(i+"*"+j+"="+i*j+"\t"+(j++<i?"":"\n"))

Following  Kevin's suggestion I reduced solution by 2 bytes.
Thanks to cliffroot, I was able to reduce it by another 1 byte

You can save a few bytes by removing the int  from the second for-loop, and add ,j to the first. So like this: for(int i=0,j;++i<=9;)for(j=1;j<=i;)System.out.print(i+"*"+j+"="+i*j+"\t"+(j++<i?"":"\n"));

It seems like you can replace ++i<=9 with i++<9

c#, 142 bytes
Enumerable.Range(1,9).ToList().ForEach(i =>Enumerable.Range(1,i).ToList().ForEach(j=>Console.Write("{0}x{1}={2}{3}",j,i,j*i,j==i?"\n":"\t")));

And not a for in sight...

ForEach "not a for in sight" well... xD

Pyke, 17 16 bytes (noncompeting)
Pyke was created after this question was asked
TFjSF\xj\=ij*s(P

Try it here!
TFj           (  - for j in range(10):
   SF         (  -     for i in range(1,j+1):
     \xj\=ij*s   -         sum(i,"x",j,"=",i*j)
               P - pretty_print(^)

Excel, 57 bytes
Requires Excel 365 / 2019 version 2007 or newer
An excel worksheet function that defines the contextual arrays c and r then outputs an 9x9 array containg the output.
=Let(c,Column(A:I),r,Row(1:9),If(c>r,"",r&"x"&c&"="&r*c))

Excel VBA Version, 64 Bytes
Anonymous VBE Immediate window function that takes no input and outputs to range [A1:I9] on the ActiveSheet object
[1:9]="=Let(c,Column(),r,Row(),If(c>r,"""",r&""x""&c&""=""&r*c))

Output

If you put =LET(c,COLUMN(A:I),r,ROW(1:9),IF(c>r,"",r&"x"&c&"="&r*c)) into a cell, it is only 57 bytes.

@Axuary, thanks - for some reason I was thinking that I already had an Excel answer to this one, but I guess I didn't I've modified my response to show this approach being used both with and without VBA

Japt, 23 bytes
9õÈõ_[X'×Z'=X*Z]¬ú6Ã¸Ã·

Try it

Explanation
9õ                          :Range [1,9]
  È                  Ã      :Pass each integer X through a function
   õ                        :  Range [1,X]
    _              Ã        :  Pass each integer Z through a function
     [X'×Z'=X*Z]            :    Array [X,"×",Z,"=",X*Z]
                ¬           :    Join to a string
                 ú6         :    Pad end with spaces to length 6
                    ¸       :  Join with spaces
                      ·     :Join with newlines

PowerShell, 54 52 bytes
1..9|%{''+(1..($l=$_)|%{"$_`×$l={0,-2}"-f($_*$l)})}

Try it online!

Perl:  65 , 62 characters
map{map{printf"%dx%d=%2d ",$_,$i,$_*$i}1..($i=$_);print$/}1..9

Spare 2 characters by removing the printf's parenthesis; spare 1 character by moving the assignment of $i into the range expression: map{map{printf"%dx%d=%2d ",$_,$i,$_*$i}1..($i=$_);print$/}1..9.

@manatwork: Thank you very much.

Javascript: 82 characters
o="";for(a=1;a<10;a++){for(b=1;b<=a;b++){o+=a+"x"+b+"="+(a*b)+" "}o+="\n"}alert(o)

your code can be shortened to 75 like this for(i=0,s="";9>i++;){for(j=0;j++<i;)s+=j+"x"+i+"="+j*i+" ";s+="\n"}alert(s), however the double spaces thing on 2 digits is not respected, I was about to submit that one but using +(9<i*j?" ":"  ") instead of just +" " edit: on the ternary the double spaces disappeared, but they are on the second param

I will be picky but 4x4 is not directly under 5x4 like in task.

Python: 87
I'm eyeballing the solutions others have posted and most of them don't appear to get the spacing correct.
for i in range(1,10):print''.join(('%s×%s=%s'%(j,i,i*j)).ljust(7)for j in range(1,i+1))

You have trailing spaces, does that count? ;-)

Python (79)
or (77) if I use range(10) except that produces an empty line at the start
for i in range(1,10):print' '.join('%dx%d=%-2d'%(j,i,j*i)for j in range(1,i+1))

1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

C++, 126 characters
I took the expected approach.
#include <iostream>
int main(){for(int i=1,j;i<10;i++){for(j=1;j<=i;j++)std::cout<<i<<"x"<<j<<"="<<i*j<<" ";std::cout<<std::endl;}}

Ruby: 79 77 characters (without loops)
m=->i,j{"%dx%d=%-3d"%[i,j,i*j]+(i<j ?m[i+1,j]:j<9?$/+m[1,j+1]:$/)};$><<m[1,1]

Sample run:
bash-4.2$ ruby -e 'm=->i,j{"%dx%d=%-3d"%[i,j,i*j]+(i<j ?m[i+1,j]:j<9?$/+m[1,j+1]:$/)};$><<m[1,1]'
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

C, 86 85 84 bytes
i;m(j){for(;i++^9;puts(""))for(j=0;j++^i;printf("%d×%d=%d %c",j,i,j*i,j*i>9?:32));}

j*v>9?:32 what does it mean?

jv>9?:32  it seems as  jv>9?0:32 but  j*v>9?32: here seems not compile...

ideone @RosLuP

Yes code as "a>b?9:;" I remember not compile in Ideone but code as "a>b?:9;" compile...

Javascript (using external library) (74 bytes)
n=>_.Range(1,9).WriteLine(v=>_.Range(1,v).Write(" ",x=>v+"x"+x+"="+(v*x)))

Link to lib: https://github.com/mvegh1/Enumerable
Code explanation: Create a range starting from 1, for 9 elements. For each integer in the range, write a line according to the predicate accepting the current value as the input param.
Each line in WriteLine will create a range from 1 to v, and write a space delimited string where each integer in the 1 to v sequence is mapped to the multiplication equation

Kotlin, 73 bytes
(1..10).forEach{(1..it).forEach{x->print("${x}x$it=${x*it} ")};println()}

Kotlin is the latest JVM language and I mainly wanted to try my hand at it.
You can try it on their online interpreter.

Groovy, 65 60 characters
1.upto(9){x->1.upto(x){printf(x+"x$it=%-3d",x*it)}println()}

Sample run:
bash-4.3$ groovy -e '1.upto(9){x->1.upto(x){printf(x+"x$it=%-3d",x*it)}println()}'
1x1=1
2x1=2  2x2=4
3x1=3  3x2=6  3x3=9
4x1=4  4x2=8  4x3=12 4x4=16
5x1=5  5x2=10 5x3=15 5x4=20 5x5=25
6x1=6  6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7  7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8  8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9  9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

k (63 characters)
Prints the output to stdout.
-1@`/:" "/:'{7$x,"×",y,"=",z}.''$v,''(*).''v:(1+!:'t),''t:1+!9;

Example
k)-1@`/:" "/:'{7$x,"×",y,"=",z}.''$v,''(*).''v:(1+!:'t),''t:1+!9;
1×1=1
1×2=2  2×2=4
1×3=3  2×3=6  3×3=9
1×4=4  2×4=8  3×4=12 4×4=16
1×5=5  2×5=10 3×5=15 4×5=20 5×5=25
1×6=6  2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7  2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8  2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9  2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

VBA, 118 bytes
Sub M()
While B<9
B=1-B*(B<>A)
A=A-(B=1)
S=S &B &"x"&A &"="&A*B &IIf(A=B,vbLf,Space(2+(A*B>9)))
Wend
MsgBox S
End Sub

No for loops :-) and only one while loop.
And no If statements, so I could potentially one-line it and get the automatic "End Sub" for 8 fewer bytes if pushed; but I'm not that close to the leaderboard :-)
Sub M():While B<9:B=1-B*(B<>A):A=A-(B=1):S=S &B &"x"&A &"="&A*B &IIf(A=B,vbLf,Space(2+(A*B>9))):Wend:MsgBox S

Python 2, 91 characters
for k in[" ".join(["%ix%i=%i"%(j,i,j*i)for j in range(1,i+1)])for i in range(1,10)]:print k

Or, if each line as string like '1x2=2 2x2=4' is acceptable, this is 85 characters:
for k in[" ".join(["%ix%i=%i"%(j,i,j*i)for j in range(1,i+1)])for i in range(1,10)]:k

This one is slightly varied, resulting 93 characters:
print("\n".join([" ".join(["%ix%i=%i"%(j,i,j*i)for j in range(1,i+1)])for i in range(1,10)]))

This gives me syntax errors. Which version of python are you using?

Which one gave you a syntax error? All of them?
Python 2.7.11 (default, Jan 22 2016, 08:29:18)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin

You're probably using Python3, in which case you should use print(k) instead of "print k" for the first solution.

@nukacolacolic You should probably mention in your post or in your heading that some or all of your code only works for Python 2 and not Python 3. It helps when other people want to check your answers.

You're right @Sherlock9 I'll edit the answer, thanks.

Convex, 27 bytes
9´{_´f{æ*'×@@'=\_s,¿)S*}N}%

Try it online!
Use the following version if only a single space is required between each equation:
Convex, 21 bytes
9´{_´f{æ*'×@@'=\S}N}%

Try it online!

golflua, 54 49 characters
~@i=1,9~@j=1,i I.w(S.q(i.."x%d=%-3d",j,i*j))$w()$

Sample run:
bash-4.3$ golflua -e '~@i=1,9~@j=1,i I.w(S.q(i.."x%d=%-3d",j,i*j))$w()$'
1x1=1
2x1=2  2x2=4
3x1=3  3x2=6  3x3=9
4x1=4  4x2=8  4x3=12 4x4=16
5x1=5  5x2=10 5x3=15 5x4=20 5x5=25
6x1=6  6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7  7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8  8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9  9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

C 79 bytes
i=1,j=1;f(){printf("%dx%d=%d ",j,i,i*j);++i>j?++j,i=1,j<=9?puts(""),f():0:f();}

the main
main(){f();}

the table
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

Julia (236 Bytes, potentially 63) - Could use help.
A=[1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9;1 2 3 4 5 6 7 8 9]
map(x->x>0?print(x,"x",x,"=",x*x,"\t"):println(),triu!(A'))

Someone put in the comments "Who's going to do anything but use 2 loops?"
This guy is!
I don't know how to instantiate matrices easily in Julia, anyone who could help me do the instantiation of the matrix better I will be grateful. I can only get it to make a 2D array, and triu doesn't work on that.
How it works:

A = [...] creates a 9x9 matrix with 1-9 in each vector (someone please teach me to do this right without accidentally creating a 2D array... I want to learn this language better, but I'm confused on the typing differences and a lot of the documentation is pretty terse for matrices.
triu!(A') takes the inverse of the upper triangle of the matrix.
map(x->x?0...:...,A) mapping function that differentiates on x=0, printing a newline when needed.

Output:
1×1=1
1×2=2  2×2=4
1×3=3  2×3=6  3×3=9
1×4=4  2×4=8  3×4=12 4×4=16
1×5=5  2×5=10 3×5=15 4×5=20 5×5=25
1×6=6  2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7  2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8  2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9  2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81

That was my comment! Lol, it's been some years.

PHP, 73 bytes
for(;$m++<9;print"
")for($n=0;$n++<$m;)printf("%d×%d=%-3d",$n,$m,$n*$m);

Try it online!

Pyth, 25 bytes
Now fully conformant!
VS9jdm.[s[N\×d\=*Nd)\ 6SN

Try it online!

05AB1E, 22 20 bytes
9LεLyâε'×ý'=yPðJ6∍]»

-2 bytes thanks to @Grimmy.
Try it online.
Explanation:
9L                 # Push a list in the range [1,9]
  ε                # Map over each value `y`:
   L               #  Push a list in the range [1,y]
    yâ             #  Pair each value in this list with `y`
                   #   i.e. [1,2,3] and 3 → [[1,3],[2,3],[3,3]]
      ε            #  Map over each pair:
       '×ý        '#   Join the pair with "×" delimiter
          '=      '#   Push a "="
            yP     #   Push the pair again, and pop and push it's product
              ð    #   Push a space " "
               J   #   Join all three values on the stack together
                6∍ #   And then shorten the string to size 6
  ]                # Close both the maps
   »               # Join each inner list by spaces, and then each string by newlines
                   # (after which the result is output implicitly)

δ‚ => â for -1.

And here’s 20 using J instead of ý + «.

@Grimmy Ah, of course. Thanks! :)

Burlesque, 45 bytes
9roJcp:SOm{Jpdjimup"x="**j_+}{-]j-]==}gb)wduN

Try it online!
I'm almost positive there're multiple cuts that can be made here, but I just can't get them...
9ro     # Range [1,9]
J       # Duplicate
cp      # Cartesian product
:SO     # Filter for sorted-reversed
m{      # Map
 J      # Duplicate
 pd     # Product
 jimup  # Convert the two numbers into a string ({1 1} => "11")
 "x="** # Riffle in x=                          ("11""x=" => "1x1=")
 j_+    # Append the result
 }
 {
  -]j-] # Heads of both
  ==    # Are equal
 }gb    # Group by first digit being the same
 )wd    # Separate each internal list by spaces
 uN     # Separate main list by newline and prettify

Vyxal, 359 20 bytes,  -j flag
Try it online
9ƛɾMƛ\×j\=+nΠ+9↲7Ẏ;∑

Finally, I'm done, and to round up LoTM, more forward-slashes. (Edit 1: the \s are gone)

20 bytes

@lyxal I had 39 :p

@Ausername honestly I just ported the 05AB1E answer

C#, 131:
Action<string> n=x=>Console.Write(" "+x);Action f=()=>{for(int i=1,x=1;i<10;i++){for(;x<=i;x++){n(x+"x"+i+"="+i*x);}n("\n");x=1;}};

Isn't the EXACT shape, but nearly there.

I'm not sure about the rules, but, isn't your code supposed to include all that is necessary to compile ?

I think I saw somewhere that putting an action is fine in C#.

Erlang escript 99
$ cat multi

main(_)->[[[io:format("~bx~b=~-3b",[B,A,A*B])||B<-s(A)],io:nl()]||A<-s(9)].
s(X)->lists:seq(1,X).

and run
$ escript multi
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12 4x4=16
1x5=5  2x5=10 3x5=15 4x5=20 5x5=25
1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

Javascript, ES6 65
for(i=0,r='';++i<10;r+='\n')for(e=0;e++<i;r+=i+'x'+e+'='+i*e+' ');

It was pretty fun to make!

Nice solution. However, your code does not output anything, and it does not include the required double spaces for alignment. With these added, your solution clocks in at 85 characters: for(i=r="";10>++i;r+="\n")for(e=0;e++<i;r+=i+"x"+e+"="+i*e+(10>e*i?"  ":" "));alert(r)

C 95 bytes
i=1,j=1;f(){printf("%dx%d=%d %c",j,i,i*j,i!=2||j>4?:32);++i>j?++j,i=1,j<=9?puts(""),f():0:f();}

they want this table:
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6  3x3=9
4x1=4 4x2=8  4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81

Racket 94 bytes
(for((n(range 1 10)))(for((i(range 1(add1 n))))(printf "~ax~a=~a  "i  n(* i n)))(displayln""))

Ungolfed:
(define (f)
  (for ((n (range 1 10)))
    (for ((i (range 1 (add1 n))))
      (printf "~ax~a=~a  " i  n (* i n)))
    (displayln ""))
  )

Testing:
(f)

Output:
1x1=1
1x2=2  2x2=4
1x3=3  2x3=6  3x3=9
1x4=4  2x4=8  3x4=12  4x4=16
1x5=5  2x5=10  3x5=15  4x5=20  5x5=25
1x6=6  2x6=12  3x6=18  4x6=24  5x6=30  6x6=36
1x7=7  2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49
1x8=8  2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64
1x9=9  2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

tcl, 93
time {incr i;set j 0;while {[incr j]<=$i} {puts -nonewline $j\x$i=[expr $j*$i]\ };puts ""} 10

demo

Alternative approach with same number of bytes: http://rextester.com/KPMD20731

Python 3.6, 70 68 bytes
r=range(1,10)
for b in r:print(*[f"{a}x{b}={a*b:<2}"for a in r[:b]])

Try it online!

I had not seen Daniel's Answer before submitting this, but credit to him for the original implementation of this idea.

68 bytes

///, 262 bytes
/;/=4//:/x\/\///-/ 6:,/=2//'/ 5:&/=1//%/ 4:#/ 3:"/
1:!/  2x/1x1&"2,!2;"3=3!3=6 #3=9"4;!4=8 #4&2%4&6"5=5!5&0#5&5%5,0'5,5"6=6!6&2#6&8%6,4'6=30-6=36"7=7!7&4#7,1%7,8'7=35-7;2 7x7;9"8=8!8&6#8,4%8=32'8;0-8;8 7x8=56 8x8=64"9=9!9&8#9,7%9=36'9;5-9=54 7x9=63 8x9=72 9x9=81

Try it online!

JavaScript, 70 characters

for(s=i='';i++<9;s+='\n')for(j=0;j++<i;s+=j+'×'+i+'='+j*i+' ');alert(s)

Respecting alignment, 83 characters:

for(s=i='';i++<9;s+='\n')for(j=0;j++<i;s+=j+'×'+i+'='+j*i+(j*i>9?' ':'  '));alert(s)

Haskell, 84 82 bytes
putStr$init$unlines[unwords[s i++'×':s j++'=':s(i*j)|i<-[1..j]]|j<-[1..9]]
s=show

-2 thanks to @Laikoni!
Try it online!

Perl 5, 51 bytes
for$/(1..9){printf$_."x$/=%-3d",$_*$/for 1..$/;say}

Try it online!

Excel VBA, 82 Bytes
Anonymous VBE immediate window function that takes no input and outputs to the VBE immediate window.
For y=1To 9:For x=1To 9:?IIf(x>y,"",Left(x &"x"&y &"=" &x*y &"  ",7));:Next:?:Next

uBASIC, 87 bytes
Anonymous function that takes no input and outputs to the console.
0ForY=1To9:ForX=1To9:z=x*y:Ifx<=yThen?x;"x";y;"=";z;" ";:Ifz<10Then?" ";
2NextX:?:NextY

Try it online!

Yabasic, 101 bytes
Anonymous function that takes no input and prints a multiplication table to the console.
For y=1To 9
For x=1To 9
If(x<=y)Then
?Left$(Str$(x)+"x"+Str$(y)+"="+Str$(x*y)+"  ",7);
Fi
Next
?
Next

-3 bytes for the use of Fi over EndIf
Try it online!

MY-BASIC, 105 bytes
Anonymous function that takes no input and prints a multiplication table to the console.
Str(...) conversions are costly in this solution.
For Y=1 To 9
For X=1 To 9
If x<=y Then Print Left(Str(x)+"x"+Str(y)+"="+Str(x*y)+"  ",7)
Next
Print;
Next

Try it online!

Stax, 18 bytes, (17 chars, UTF-8)
9mc{b"`n×` =`*"mJ

Run and debug it
can't be compressed due to the unicode requirement. a 16 may be possible if I can find a way to compress it. 14 if using x is allowed.

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/


text:
Alex the Truck Driver
Alex is a Truck Driver who wants to find the quickest way to deliver goods to multiple cities. He knows the distances between his destinations, but you need to write a program to help him find the quickest way to deliver goods to them.
Input
The first line of input gives the number of cities Alex needs to deliver goods to. Every line that follows gives the distance between the cities. The second line of input is always the distance between the first and second cities. If there is a third city, the third line of input is the distance between the first and third city. When to distance to the first city has been given for all cities, the next lines of input gives the distance between the the second city and every other city (except the first, as that information as already been given). This continues until every combination has been given. Sample inputs:
//Number of cities
4
//A -> B
2
//A -> C
4
//A -> D
3
//B -> C
5
//B -> D
1
//C -> D
3

3
6
4
2

Output
The output should print the quickest way to deliver goods to every destination in the form A -> C -> D -> C -> A (For every output, the reverse of will also work. You only need to print one solution). Alex ALWAYS starts at A and must always return to A at the end (as A is where he lives). Here are the outputs for the sample inputs above:
A -> B -> D -> C -> A

A -> C -> B -> A

Rules
The shortest code wins.
Happy Golfing!

In short: solve travelling salesman for integer distances?

Looks like. +100 bounty if you can prove that no polynomial-time solution exists?

Can I change the input to comma separated distances only? IE, input: 2,4,3,5,1,3 detection: 4 cities detected. How flexible are you willing to be on the input format?

@histocrat, I think a polynomial-time solution would deserve the bounty, too.

So the graph of the cities is completely connected? Or should we interpret negative distances as not being connected?

@Kyle.  I have seen infinity employed for such  purposes.  Intuitively, it works for me.

How many axioms of metrics are guaranteed here? What if they fail - are we allowed to UB? Symmetry and coincidence are enforced, but are we allowed to fail if the triangle inequality is broken? If TI is not promised, what about negative distances? If TI is not satisfied, I assume we are allowed to visit the same city twice?

Python 2, 210 205
from itertools import*
r=range(input())
d={t:input()for t in combinations(r,2)}
n=0,
print" -> ".join(chr(65+c)for c in n+min(permutations(r[1:]),key=lambda p:sum(d[min(t),max(t)]for t in zip(n+p,p+n)))+n)

Edit: Shortened according to Volatility's suggestion.
I'm amazed that it gets more readable and Pythonic the shorter it gets.

Change d={(i,j):input()for i in r for j in r[i+1:]} to d={t:input()for t in combinations(r,2)} to save 5 chars

C++ - 380
#include<iostream>
#include<algorithm>
#define I new int[n]
#define f for(i=0;i<n;++i)
using namespace std;int main(){int*a,**d,*s,n,i,j,t,b=2e9;cin>>n;d=new
int*[n];a=I;s=I;f{a[i]=i;d[i]=I;}f
for(j=i+1;j<n;++j){cin>>d[i][j];d[j][i]=d[i][j];}do{t=0;f
t+=d[a[i]][a[(i+1)%n]];if(t<b){b=t;copy(a,a+n,s);}}while(next_permutation(a+1,a+n));f
cout<<(char)(65+s[i])<<" -> ";cout<<"A\n";}

This a commentary rather than an entry.
If I am not mistaken, the sample data appear to correspond to an impossible set of distances between cities located in the plane.
The inter-city distances might be represented by a matrix

or, perhaps more conveniently, by a graph in which the edge labels are distances.  (Note: The graph is not a geographical map.)

The figure below arbitrarily sets A at the origin of a coordinate plane.  The distances from A to B, C, and D constrain the latter three cities to positions on circles with center at A and radii of 2, 4, and 3 units. We may arbitrarily place B at (0,2) and continue. Now, because D is one unit away from B and 3 units away from A, it must lie at (0, 3).
But there would appear to exist no position in the plane that is simultaneously 4, 5, and 3 units away from A, B, and D respectively.

The impossibility of the data would not detected by most approaches, although I suspect that a multidimensional scaling analysis would return a stress value that should raise a flag.

Holds only if you interpret "distance" with "euclidean distance" which most often isn't the case if we are talking about cities and streets between them.

@Howard Good point.

@Howard with any metric, the triangle inequality must hold. We should be promised the distances form a metric. Here, BCD disobeys the triangle inequality.

Is there a case where the triangle inequality holds for a tetrahedron but the tetrahedron is still impossible (not just degenerate) in E^3 or, equivalently, in any euclidean space? What about impossibility in "any (continuous) space with any induced metric"? What about general hypertetrahedra in their respective spaces and euclidean spaces?

@JanDvorak can you write a shorter program if the distances obey the triangle inequality than if they don't?

@aditsu It helps to know the optimal path never visits the same city twice. I need no other assumptions.

Alternatively, I can treat "never visits the same city twice" as a restriction over the path.

@JanDvorak hmm he could actually visit a city multiple times? I see now that the question doesn't have a restriction about that. That means my solution is wrong in some cases...

@aditsu only if TI is broken. Note that if there's a negative cycle, there is no optimal solution

Ruby, 242 characters
s,a,c,i=gets.to_i-1,[],[],0
0.upto(s){|x|x.upto(s){|y|a[y]||=[];a[x][y]=a[y][x]=x==y ?0:gets.to_f}}
(0..s).to_a.permutation{|x|x[0]<1&&c<<[(0..s).reduce(0){|y,z|y+a[x[z]][x[z-1]]},x]}
puts c.min_by{|x|x[0]}[1].map{|x|(x+65).chr+" -> "}*""+"A"

This finds the shortest path that never visits the same city twice. If triangle inequality is satisfied, no city should be visited twice. If the triangle inequality is broken, visiting the same city twice may be beneficial. If there are negative cycles, no optimal solution exists, as you can keep driving along the cycle to travel back in time. In practice, triangle inequality (and thus non-negativity) is safe to assume.
The algorithm itself is brute-force and inefficient. Don't use for maps with more than 10 or 12 cities. Three words: O(n!)

GolfScript, 118 108 characters
~](:€,{.€-~:§2$>\)[0]*@§<+}%€.?,{€base}%{$€,1>=},{[0].@+\+.0\{.@[\]$~\5$==@+\}*;[\]}%$\;0=1={65+}%""+" -> "*

A quite clumsy (i.e. really slow) 118 characters GolfScript program.
Example:
> 4 2 4 3 5 1 3
A -> B -> D -> C -> A

> 3 6 4 2
A -> B -> C -> A


text:
Generate a golfed program to evaluate an arithmetic expression
Your task is to write a program that will take input like this:
a + b * c + a / 2

and will generate the source code for a program that takes user input and then evaluates the expression.
The expression can contain the operators +,-,*,/; single-letter lowercase variables; and integers between 0 and 32000.  Standard arithmetic precedence must be correctly followed. The expression is limited to 26 unique variables a to z.  However, a single variable can appear more than once.
You can assume that the input expression is valid (follows these rules).
The generated program must prompt for user input in this form, prompting only once for each variable:
a =

User input from 0 to 32000 should be handled correctly. It will then print the expression and the correct result.  You can use either integer or floating point arithmetic.  The calculations should be performed with at least 32 bit precision. Beyond that, you don't have to worry about overflow or divide by zero.
Example of a non-golfed generated Perl program for the above expression:
print "a = ";
my $a = <>;
print "b = ";
my $b = <>;
print "c = ";
my $c = <>;
print "a + b * c + a / 2 = " . ($a + $b * $c + $a / 2);

Example input and output of program generated for above expression:
a = 1
b = 2
c = 3
a + b * c + a / 2 = 7.5

The score is calculated as length of the program + length of the generated program for this expression:
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000

Lowest score wins.
Update: Just to highlight a couple of requirements of the problem, as stated above:

The output of the program must be source code for another program that evaluates the expression.
The program must print the original expression. Perhaps there is some ambiguity in this (one could argue that a+b is the same expression as a + b), but for clarity let's say that it must be the original expression with white space intact.  All valid answers so far have done it that way.

Perl, 80 + 110 = 190
Directly inspired by another (now deleted) answer in Ruby. Requires Perl ≥ v5.14.
Following the usual rule I've seen of command-line switches counting as one character.
#!/usr/bin/perl -n
chomp;print'print $_="',$_,'"," = ",eval(s#\pL#${$&}//=do{print"$& = ";<>}#ger)'

Perl, 80 + 231 = 311
Because eval'ing in the output feels cheap.
#!/usr/bin/perl -p
chomp;print"print '$_ = ',";s/\pL/$s{$&}++?"\$$&":"do{print'$& = ';\$$&=<>}"/ge

Seems like the output could be shortened by moving the prompting into a sub, but I've run out of enthusiasm.

This is code golf.  Eval'ing the output isn't cheap!

A few suggestions: \pL can replace [a-z]. No need for do block. Can just write: ${$&}//=print"$& = "and<>

@dan1111 Thanks for the \pL, done. Can't use and in either program, because the precedence is too low; and is lower precedence than //=.

Lua, 202 + 166 = 368
File "generate_code.lua"
F=...
C='function G(v)io.write(v.." = ")_G[v]=io.read"*n"end 'V={}for v in F:gmatch'%l'do V[v]=0 end
for v in pairs(V)do C=C..'G"'..v..'"'end
print(C..'F="'..F..'"print(F.." = "..load("return "..F)())')

Usage:
$ lua generate_code.lua "1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000"

Code generated (order of variables is not specified):
function G(v)io.write(v.." = ")_G[v]=io.read"*n"end G"g"G"e"G"d"G"b"G"a"G"h"F="1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000"print(F.." = "..load("return "..F)())

Generated code in action:
g = 4
e = 3
d = 2
b = 1
a = 6.5
h = 4.3
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = 29787.941860465

Tcl 198 + 155 = 352
gets stdin i;puts [string map [list @ [lsort -u [regexp -all -inline {[a-z]} $i]] & [regsub -all {[a-z]} [join $i {}] {$\0}] | $i] {foreach va {@} {puts "$va =";gets stdin $va};puts "| = [expr &]"}]

generates
foreach va {a b d e g h} {puts "$va =";gets stdin $va};puts "1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = [expr 1+$a*4*$b+2/$d*$e-$a-3+$g/$h*32000]"

foreach => lmap ; va => v

Python  125 + 151 = 276
>>> t=raw_input();z=sorted(set(filter(str.isalpha,t)));print','.join(z)+'=[input(x+" = ")for x in%r];print"%s =",%s'%(z,t,t[::2])
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000
a,b,d,e,g,h=[input(x+" = ")for x in['a', 'b', 'd', 'e', 'g', 'h']];print"1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 =",1+a*4*b+2/d*e-a-3+g/h*300

Now executing it:
>>> exec"""a,b,d,e,g,h=[input(x+" = ")for x in['a', 'b', 'd', 'e', 'g', 'h']];print"1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 =",1+a*4*b+2/d*e-a-3+g/h*300"""
a = 1
b = 2
d = 3
e = 4
g = 5
h = 6
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000 = 5

I don't think there's any requirement to sort the variables and I think it turns out to be better to use a string literal instead of a list. That is, replace z=sorted(set(filter(str,isalpha,t))) with z=''.join(set(filter(str.isalpha,t))).