g | x | w | all
Bytes Lang Time Link
030SAKO250318T153714ZAcrimori
043Bespoke250307T220815ZJosiah W
020Swift230723T224214ZmacOSist
058ReRegex231001T220651ZATaco
nanPiet + asciipiet220724T031957ZnaffetS
005Desmoslang Assembly230529T162228ZDadsdy
001Thunno 2230528T185345ZThe Thon
001Brachylog V1170109T081250ZFatalize
007HP‑41C series230513T113001ZKai Burg
003ARBLE230411T222238ZATaco
nan230409T232842ZRARE Kpo
013awk230204T012537Zgildux
014shell230204T011634Zgildux
033BitCycle190326T092406ZJo King
001Braingolf170602T084944ZMayube
004Z80 machine code220724T111840Zkevidryo
002rusty_deque220408T223042Zbigyihsu
009Piet220406T193223ZSeggan
077LOLCODE220202T083017ZCreaZyp1
001Factor220201T230740Zchunes
070In Floop220201T215736Zrydwolf
028A0A0210706T141341Zstefvans
006Starry210706T133510ZJay Ryan
139MashedPotatoes210706T105627Zcnamejj
010Foam200621T171458ZPkmnQ
257Brainetry200614T003200ZRGS
004International Phonetic Esoteric Language191001T025458Zbigyihsu
014Python 3191224T042204ZSagittar
022Intcode191224T014558ZThe Fift
019Pepe180826T091131Zu-ndefin
029brainfuck191001T094500ZDorian
004√ å ı ¥ ® Ï Ø ¿170315T164705Zcaird co
nan3+ bytes in various methods of representing lambda calculus190401T211127ZThePlasm
028Intel 8080 machine code190328T190108Z640KB
027GFortran190327T165359Zroblogic
888Beatnik180413T180909Zjimmy230
nan190327T120224ZGammaFun
027Commodore BASIC v2 C64190327T103434ZShaun Be
007Cubically170801T221745ZMD XF
068BitCycle U180822T042851ZDLosc
004Flobnar180812T075355ZEsolangi
052BrainFlak170913T063502ZWheat Wi
076Brainfuck180420T200043Zqwr
017TSQL180420T194320ZBradC
036JavaScript Node.js180414T131613Zuser7985
022FRACTRAN180416T162420ZVincent
016Red180416T114031ZGalen Iv
009JavaScript Node.js180414T085747ZMuhammad
005Forked180212T050729ZMD XF
005Wumpus180210T203750ZMartin E
009Java 8170109T120745ZKevin Cr
001Implicit170905T232329ZMD XF
005Pyth171211T192929ZTornado5
035Whispers171210T144350Zcaird co
392Verbosity171210T141438Zcaird co
009Hexagony170109T121729ZMartin E
004x86_64 machine language Linux170906T184413Zceilingc
013QBIC170109T104410Zsteenber
005><>171118T195139ZBolce Bu
006Aceto171118T145355Zqqq
095LOLCODE171107T201955Zqqq
027C#171102T002757ZZaphyk
008Excel VBA170110T175605ZTaylor R
010Ruby171007T060848Ztotallyh
028Go171007T055454Ztotallyh
084Go171007T041032ZMatheus
032Lua171007T043002ZMatheus
034Falcon171007T044245ZMatheus
023Batch File171007T035938ZMatheus
006Cubix170703T151415ZGiuseppe
007Perl 5170913T200023ZXcali
011[C64170913T174119Zpeterh
004QC170219T123101Zuser6333
004Whitespace170801T224222Zascheple
010Tcl170801T223733Zsergiol
006cQuents170719T140855ZStephen
012Lean Mean Bean Machine170719T131959ZMayube
048C170719T120023ZAgent_Me
006Jellyfish170719T092913Zspace ju
005Carrot170719T092804ZTheLetha
006Casio Basic170516T073459Znumberma
012Decimal170605T022516ZMD XF
003CJam170109T152750ZErik the
006Triangular170614T161455ZMD XF
010Ruby170516T102601Zmarmelad
069HEX170516T081257ZMayube
004MATLAB170109T105428ZStewie G
056C170222T221550ZveganaiZ
006Alice170411T112942ZMartin E
152ArnoldC170329T070017ZTom291
8039ZX80 BASIC ~39 bytes170328T191124ZShaun Be
442Taxi170328T181557ZEngineer
015AHK170328T180556ZEngineer
336><>170315T201828ZPidgeyUs
011Röda 0.11170315T170003Zfergusq
003Maple170222T003832ZDSkoog
001Forth170217T182915Z2xsaiko
031Retina170217T182816ZLeo
035Retina170220T155427ZMartin E
017Powershell170220T152118Zcolsw
056BrainFlak170109T143938ZRiley
098C gcc170220T140554ZAhemone
003R170110T150828Zrturnbul
016Piet170109T184139ZMike Buf
040Swift 3170124T234514ZTom Shen
013SmileBASIC170124T184635Z12Me21
057Batch170124T113439Z180Five
059SimpleTemplate170110T123850ZIsmael M
001Noodel170116T032533Ztkellehe
003Haskell170109T142248Zcorvus_1
014Rust170118T130152ZChristop
124Loader170118T031615ZSuperJed
036ForceLang170118T024212ZSuperJed
004Microscript170116T143001ZSuperJed
003Math++170116T033152ZSuperJed
011C#170111T105942ZCarra
063C#170110T183856ZHorv
011Owk170110T182418ZConor O&
004Perl 6170110T181815ZSean
001Clojure170109T151429ZNikoNyrh
010Ruby170110T055439Zanna328p
003Emacs Lisp170110T015922ZAryaman
001Japt170109T141122ZOliver
001Dyalog APL170109T085634ZAdá
005Befunge93170110T011505Zosuka_
004Mathematica170109T080315ZGreg Mar
021PHP170109T175735ZTitus
003dc170109T173321ZDigital
001PigeonScript170109T081441ZTrojanBy
002Pushy170109T170834ZFlipTack
001Scratch170109T111921Zrahnema1
003FOG170109T152229ZRiker
002TIBasic170109T152037ZTimtech
002Scala170109T143911Zcorvus_1
004OCaml170109T140620ZDada
010Groovy170109T123949ZGurupad
011Python 3170109T123146ZBlue
002Pyth170109T122849ZBlue
004Pyth170109T120621ZGurupad
014Python 2170109T115628ZErik the
00105AB1E170109T115201ZErik the
001Jelly170109T115027ZErik the
010C#170109T113326ZHorv
013C GCC170109T090350Zbetseg
009JavaScript ES6170109T084151ZArnauld
005Labyrinth170109T081126ZMartin E

SAKO, 30 bytes

PODPROGRAM:F(N,M)
F()=N×M
WROC

SAKO, 41 bytes

This is a full programme solution.

1)CZYTAJ:N,M
DRUKUJ(9,0):N×M
STOP1
KONIEC

For results longer than 10 digits uses E notation.

Bespoke, 43 bytes

after I input,I multiply something
result=N

In "mnemonic" form:

INPUT N
INPUT N
STACKTOP PRODUCTOF
OUTPUT N

Swift, 25 24 20 bytes

let t:(_,_)->Int=(*)

ReRegex, 58 bytes

#import math
-(.*?)-/$1/(.+)-/-$1/(\d*)x(\d*)/$1*$2/#input

Try it online!

Ungolfed

#import math
-(.*?)-/$1/#		# Remove pairs of -
(.+)-/-$1/#		# Move any - to the start of the text
(\d*)x(\d*)/$1*$2/#	# Take the input of (number)x(number) and convert it to (number)*(number), implicitly multiplying.
#input

Slightly more interesting, 81 bytes

-(.*?)-/$1/(.+)-/-$1/(?<![:_])(_*)x(_*)/:$1x$2/:(_*)x(_*)_/$1:$1x$2/:_*x$//#input

Try it online!

Ungolfed

-(.*?)-/$1/#			# Remove pairs of -
(.+)-/-$1/#			# Move any - to the start of the text
(?<![:_])(_*)x(_*)/:$1x$2/#	# Add a : if there isn't one, to keep track of the output
:(_*)x(_*)_/$1:$1x$2/#		# Whilst the second argument is > 0, remove one from it, and copy the first argument to the output
:_*x$//#			# When the second argument is zero, remove all the supporting stuff, leaving just the output
#input

Piet + ascii-piet, 7 bytes (5×2=10 codels)

TAJsJjj

Try Piet online!

Desmoslang Assembly, 5 Bytes

I*IOT

Thunno 2, 1 byte

×

Attempt This Online!

No, * is exponentiation, not multiplication.

Brachylog V1, 05AB1E, J, K, Underload, MATL, Forth, PigeonScript, Stacked, Implicit, Jolf, Clojure, Braingolf, 8th, Common Lisp, Julia, Pyt, Appleseed, Stax, Reality, dc, Vyxal, Keg, Swift, Fig*, Chocolate, ><>, Thunno*: 1 byte

*

You may edit this answer to add other languages for which * is a valid answer.

*Actually \$\log_{256}(96)\approx\$ 0.823 bytes in Fig and Thunno

HP‑41C series, 7 B

Input is to be placed in the X and Y stack registers.

01♦LBL⸆P           5 Bytes  global label requires 4 + (length of string) Bytes
02 ∗               1 Byte   X ≔ Y × X
03 RTN             1 Byte   `RTN` does not affect local label search

Some other (longer) methods:

ARBLE, 3 bytes

a*b

Similar to the answer for Adding two numbers.

Try it online!

gawk '($_*=$2)_'

The final underscore (..)_ is the most succinct way I could think of to force concat an empty string to the zeros and coerce it into a string in order to print it without using the print statement.

weak typing in awk is advantageous cuz I never defined _, so 1st one is used as numeric zero while 2nd one acts as empty string.

2
20
63
-16
-72
72
0
0
0
0
0

awk, 13 bytes

Simply

{print $1*$2}

shell, 14 bytes

dc -e"$1 $2*p"

BitCycle, 33 bytes

 >>\/v
?+ \/
? +~!/
 A + =
  ~BC^

Try it online!

This takes input via command line args, with the -U flag to convert it into signed unary.

This only uses one pair of collectors in the main loop by representing the first number with unary 0s and the other number with 1s, allowing us to store both in the same collector.

Explanation:

No fancy gifs sorry. This also assumes you have at least a passing familiarity with BitCycle.

?+       Get both numbers as signed unary from the ? sources
? +      Sends 0s upwards (0s signify that the number is negative), and 1s downwards
  >>\/v  Given either 0, 1 or 2 zeroes
  + \/
   + !/  Push a 0 (signifying negative) if there is exactly one 0
 +      Push the first number as unary 1s to collector A
  +     Push the second number as unary 0s to collector B
 A +    Then push the first number into collector B
  ~BC   Then push both into collector C
     /    If the first bit out of collector C is 0
   + =    Turn the = into { and discard the first bit
   BC^    All the 0s go back to collector B, and the 1s go up
  +~!     Duplicate and print all the 1s   
   +      Push the duplicates back into B
  ~B

This loops until it runs out of 0s in the collector, then the = turns into a } and discards the rest of the 1 bits.

Braingolf, 1 byte

*

Try it online!

Implicit input, * multiplies the last 2 number on the stack and pushes the result, implicit output.

Here's a slightly more interesting one:

Braingolf, 9 bytes

<2->[.]&+

Try it online!

Implicit input of x and y. Subtracts 2 from x, (because [] is a do-while and we already have one y), then duplicates y x times, finally, sums the entire stack. Implicit output.

Z80 machine code, 5 4 bytes with djnz

In Machine Language:

81 10 fd c9

In Assembly:

;8-bit Multiply
;Multiplier in B, multiplicand in C, result in A.
Multiply:
    loop:
        add a, c
        djnz loop
    ret

What is djnz?

djnz decrements the B register (in this case the multiplier), and jumps a certain number of bytes forward or back (in this case, 2 bytes back; essentially jumping to the beginning of the loop), but only if, after being decremented, the B register isn't 0.

Some limitations

This subroutine can only perform 8-bit multiplication, so the result will overflow if it exceeds 0xff.

I believe I have no way of making it do 16-bit multiplication without increasing the byte count.

Without djnz

Here's the code before I added djnz:

In Machine Language:

81 05 20 fc c9

In Assembly:

;8-bit Multiply
;Multiplier in B, multiplicand in C, result in A.
Multiply:
    loop:
        add a, c
        inc b
        jr nz, loop
    ret

Testing

I used this snippet of code to test my submission:

ld c,4 
ld b,10 
call Multiply 
ld ($1000),a 

rusty_deque, 2 bytes

Two variants: one for the left of the deque, one for the right of the deque.

*! # left
*~ # right

Piet, 10 9 codels

Piet program

Original image

The 2 white codels on the side can be replaced with any color. Most straightforward solution, literally "read 2 numbers, multiply, output", I really don't know why this answer is more complicated.

Update: saved 1 codel by switching from a 2x5 to a 3x3 grid

LOLCODE, 77 bytes

HAI 1
I HAS A a
I HAS A b
GIMMEH a
GIMMEH b
VISIBLE PRODUKT OF a AN b
KTHXBYE

I has a bettr answar cuz I used PRODUKT OF a AN b in da VISIBLE direktly instaed of in an variable !!1!

Try it Online!

Factor, 1 byte

*

Try it online!

In Floop, 70 bytes, pos. only

r+s[r-]r[-n?o?s+]r+s-[@[-r-n+]r[s-o-[r-]r[-@;]]]r[n[-r@+r-@+]r[-s+]]s+

I wrote this in three parts:

This forms a loop, until o- is 0 after A runs. Then, @0 is printed.

Try It Online!

A0A0, 28 bytes

I0A1V0O0
I0V0M0
G-2G-1G-1G-1

Adapted from my answer to Add two numbers.

Each number is first put into two separate operands (V0 instructions) on two lines via the I0 instructions on each line and then later combined together for adding. After taking input, we jump to the top. The A1 adds the V0 O0 onto the next line, to get the following code: V2 M0 V1 O0. I've labelled the operands with V1 and V2 to represent the different operands. During execution these contain the actual inputs. From there it's simple.

V2 M0 V1 O0
V2          ; operand, put into the S0 next to it
   M0       ; multiplies its value to the operand next to it (V1)
      V1    ; operand, put into the O0 next to it
         O0 ; outputs its value as a number

The line of jumps at the bottom just goes back to the correct line each time.

Starry, 6 bytes

,,  *.
,,      Push input to stack (twice)
    *   Multiply
     .  Output

MashedPotatoes, 139 bytes

 synchronized($ARGV){
 case0.0fof{_->usestrictqw/++i/;goto*read-eval*;SETLOCAL<>}WHILEObject>STDERRs/0.0f//gWENDproc++i{`uniq-c`}{OUTPUT=<>}}

MashedPotatoes isn't on TIO, so I linked the Esolangs page for the language. It's an unusual language, so the code description might not make much sense unless you scan the info about cyclical naming conventions on the Esolangs page first. But here goes nonetheless...

I'm breaking the code into lines, but it has to be formatted as listed above to work, since the values of the labels is bound to the line number in the code.

synchronized($ARGV){              # Label block, assigns "1" to label 1
  case0.0fof{_->                  # Input block
    usestrictqw/++i/;             # Read first number into register ^A
    goto*read-eval*;              # Shift registers, ^A<-^C<-^E-<^A
    SETLOCAL<>                    # Read second number into register ^A
  }                               # Close input block
  WHILEObject>STDERRs/0.0f//gWEND # Multiply ^A*^E and store in ^E
  proc++i{`uniq-c`}{OUTPUT=<>}    # Print ^E as a number
}                                 # Close label block

Foam, 10 bytes

;# ;# * .#

Try it online!

I'm gonna be using this lang for the next few weeks

;# returns an integer from input.

* is...multiplication.

.# is output.

Brainetry, 257 bytes

Golfed version. A more interesting submission follows.

a b c d e f
a b c
a b c d e f
a b
a b c d e f g h
a b c d e
a b c
a b c d e f g h
a b c d e
a b c
a b c d
a b c
a b c d
a b
a b
a b c d e f g h i

a b c d e f g h
a b c d e
a b
a b
a b c d
a b c
a b c
a b c d e f g h i
a
a b c d e f g h i

a b
a b c d e f g

To try this online, follow this repl.it link, paste the code in the btry/replit.btry file and press the green "Run" button.

Ungolfed version:

This is probably my first Brainetry
program that makes
non trivial use of some of
my new
experimental operators that I introduced, expanding the base
brainfuck implementation this is built
upon. We will
see if this made any difference or not.
This program works in a
rather simple way.
First I read inputs.
Then I have
to nest two loops.
One loop,
two loops.
The two loops will be nested, which is nice.

One loop will have me decrement one of
the user inputs, then I
move left,
(not right)
and successively decrement the
cell I'm at.
I do this
and keep accumulating in another cell. If I loop
with
enough dedication, the final result will be stored someplace.

Legend says,
the correct place is the second cell.

International Phonetic Esoteric Language, 4 bytes (WIP language) (OLD)

ɪɪθo

No TIO interpreter yet, but is runnable by cloning the repository above, and calling python3 main.py "code here".

ɪɪθo
ɪ    ; push int
 ɪ   ; push int
  θ  ; pop, pop, push a * b
   o ; pop, print

Python 3, 14 bytes

lambda x,y:x*y

It's literally just multiplication, lol

Intcode, 22 bytes

3,0,3,1,2,0,1,2,4,2,99

Fairly basic. IO boilerplate takes up most of the bytecount, given that the language has multiplication as a builtin (2,0,1,2 would be a valid answer, if snippets were allowed)

Pepe, 19 bytes

rEeeREeerEEEEeEreEE

Try it online!

Input is a,b. Change the "Separated by" box into , to work.

Explanation:

rEeeREee            # take 2 inputs (not in the same stack)
        rEEEEeE     # A*B -> stack r
               reEE # output as number
               

brainfuck, 29 bytes

,<,[>[>+>+<<-]>[<+>-]<<-]>>>.

Try it online!

Input and output as character codes. (Example: 5*7=35)

Code:

[Tape: Y, X, temp, solution]
,<,             input X and Y
[               while Y greater than 0
  >[>+>+<<-]    add X to temp and solution
  >[<+>-]       move temp back to X
  <<-           decrement Y
]
>>>.            print solution

√ å ı ¥ ® Ï Ø ¿, 4 bytes

II*o

Almost identical to my answer for the Add two numbers question.

Explanation

I    › Take input from the command line, evaluate and push to stack
 I   › Take another input
  *  › Times the two values together and push to stack
   o › Output the first value on the stack

3+ bytes in various methods of representing lambda calculus, taking numeral input as Church numerals.

19 Bytes, Untyped Lambda Calculus, using named arguments:

λx.λy.λz.x(y(z))

This is the most verbose version, . represents a lambda abstraction and parentheses represent an application

9 or 12 Bytes, Lambda Calculus, using De Brujin Indices:

λλλ3(2 1)

This uses De Brujin Indices instead of variable names, and function application is right-associative and implicit.

Replacing lambda symbols with backslashes (a pretty common form when Unicode is not available) yields us only 6 bytes

It's small, but we can go smaller. Using John Tromp's Binary Lambda Calculus representation, we get the binary representation 0000000111100111010, or separated into individual parts:

3 bytes, Untyped Lambda Calculus, using BLC representation

00 00 00 01 1110 01 110 10 xxxxx

Where the 5 xs are any padding bits.

Explanation

These implement the simple mult function for Church Numerals in the untyped lambda calculus.

In untyped lambda calculus, EVERYTHING is a function, including numbers. All these functions take a maximum of a single argument. So how do you represent arbitrary numbers? Church encodings!

In Church encoding, numbers are represented by repeated recursion. All numbers n are represented by a function taking an argument f, and returning a function taking an argument x, which returns f(x) called n times. For example:

0: lambda f: lambda x: x
1 = lambda f: lambda x: f(x)
2 = lambda f: lambda x: f(f(x))
3 = lambda f: lambda x: f(f(f(x)))

Etc etc.

All inputs and outputs in most lambda calculus systems are in the form of church numerals.

The multiplication function takes 3 arguments and returns the first argument called on the second called on the third:

mult = lambda m: lambda n: lambda x: m(n(x))

This in lambda calculus simply multiplies the numbers m and n together.

Calling mult(2)(3) using our previous definitions of 2 and 3 results in a function:

lambda f: lambda x: f(f(f(f(f(f(x))))))

Or 6, the result of our multiplication. All the "golfs" are really just more concise ways of representing untyped lambda calculus.

Intel 8080 machine code, MITS Altair 8800, 28 bytes

This implements binary multiplication on the Intel 8080 CPU (c. 1974) which did not have multiplication or division instructions. Inputs are 8-bit values and the product is a 16-bit value returned in the BC register pair.

Here is the machine code along with step-by-step instructions to load the program into an Altair 8800 using the front panel switches.

Step    Switches 0-7    Control Switch  Instruction Comment
1                       RESET
2       00 001 110      DEPOSIT         MVI  C, 5   Load multiplier into C
3       00 000 101      DEPOSIT NEXT                value is 5
4       00 010 110      DEPOSIT NEXT    MVI  D, 16  Load multiplicand into D
5       00 010 000      DEPOSIT NEXT                value is 16
6       00 000 110      DEPOSIT NEXT    MVI  B, 0   clear B register (high byte of result)
7       00 000 000      DEPOSIT NEXT
8       00 011 110      DEPOSIT NEXT    MVI  E, 9   set loop counter E multiplier size
9       00 001 001      DEPOSIT NEXT                (8 bits + 1 since loop ends in middle)
10      01 111 001      DEPOSIT NEXT    MOV  A, C   move multiplier into A for shift
11      00 011 111      DEPOSIT NEXT    RAR         shift right-most bit to CF
12      01 001 111      DEPOSIT NEXT    MOV  C, A   move back into C
13      00 011 101      DEPOSIT NEXT    DCR  E      decrement loop counter
14      11 001 010      DEPOSIT NEXT    JZ   19 00  loop until E=0, then go to step 27
15      00 011 001      DEPOSIT NEXT
16      00 000 000      DEPOSIT NEXT
17      01 111 000      DEPOSIT NEXT    MOV  A, B   move sum high byte into A
18      11 010 010      DEPOSIT NEXT    JNC  14 00  add if right-most bit of 
19      00 010 100      DEPOSIT NEXT                multiplier is 1, else go to 22
20      00 000 000      DEPOSIT NEXT
21      10 000 010      DEPOSIT NEXT    ADD  D      add shifted sums
22      00 011 111      DEPOSIT NEXT    RAR         shift right new multiplier/sum
23      01 000 111      DEPOSIT NEXT    MOV  B, A   move back into B
24      11 000 011      DEPOSIT NEXT    JMP  08 00  go to step 10
25      00 001 000      DEPOSIT NEXT
26      00 000 000      DEPOSIT NEXT
27      11 010 011      DEPOSIT NEXT    OUT  255    display contents of A on data panel
28      11 111 111      DEPOSIT NEXT
30      01 110 110      DEPOSIT NEXT    HLT         Halt CPU
31                      RESET                       Reset program counter to beginning
32                      RUN
33                      STOP

Try it online!

If you've entered it all correctly, on the machine state drawer in the simulator your RAM contents will look like:

0000    0e 05 16 10 06 00 1e 09 79 1f 4f 1d ca 19 00 78 
0010    d2 14 00 82 1f 47 c3 08 00 d3 ff 76

Input

Multiplier in C register, and multiplicand into D. The stock Altair has no STDIN so input is by front panel switches only.

Output

The result is displayed on the D7-D0 lights (top right row) in binary.

5 x 16 = 80 (0101 0000)

enter image description here

4 x 5 = 20 (0001 0100)

enter image description here

7 x 9 = 63 (0011 1111)

enter image description here

8 x -9 = -72 (1011 1000)

enter image description here

Compatibility note: this should also run on the IMSAI 8080, though currently untested.

GFortran, 51 27 bytes

Fulfils the rules, I suppose integer overflow error is to be expected.

-24 thanks to Ørjan Johansen

Try It Online!

read(*,*)i,j
print*,i*j
end

Beatnik, 888 bytes

k I
j k ZZZZX z
xw k C vp yQ KD xw z j k ZZZZX z
j k ZZZD z xw bZ ZX
k XX z qs xw vp xw xw vp xw vp vp vp k I Xj ZZD hd
xw yQ K k ZZZZX xo exx
qs yQ XA xw xw xw xw z xw bZ K
xw xw k I
j k ZZZZX z
xw k C vp yQ XA hd k I z j k ZZZZX z
j xw k A vp bZ ZX
k ZZZZX z qs xw vp xw xw vp xw vp vp vp k I Xj ZZD hd
xw yQ K k ZZZZX xo exx
qs yQ F k ZZZZK xo
vp
xw xw z qs xw bZ X xw k I z xw Xj K
qs xw bZ KA vp qs xw Xj C hd
qs z xw xw xw xw z qs
xw xw xw xw z qs k I qs k I z xw Xj ZC
qs bZ ZZZX qs xw yQ C hd xw
k I vp qs k I qs
xw Xj ZZC hd hd z Kz ZZD
k I z xw xw xw xw z qs k I qs k I Xj ZZZZF
z
xw xw z qs xw bZ X xw k I z xw Xj K
qs xw bZ KA vp qs xw Xj C hd
z qs xw
xw xw z qs xw bZ X xw k I z xw Xj K
qs xw bZ KA vp qs xw Xj C hd
z vp
xw xw z qs
xw xw z qs
k I qs
xw bZ ZZX k I z qs k I vp
xw k ZA z yQ ZA hd qs k I vp qs k I Xj ZZKD
qs xw Xj ZZK
hd qs xw Xj ZZZZ hd
k ZZZZKD vp xo xw Xj K

Try it online!

I'm using the C interpreter because the Python interpreter on TIO annoyingly executes the address if the condition for jumping backward isn't met. An easy workaround for the Python interpreter is to pad some nops to make the address nop. I believe neither is correct:

                                   C       Python  My interpretation
IP after skiping N words           IP+N+1  IP+N+2  IP+N+2
IP after skiping back N words      IP-N    IP-N+1  IP-N+2
IP after not skiping N words       IP+2    IP+2    IP+2
IP after not skiping back N words  IP+2    IP+1    IP+2

Input should be two integers separated by a space, without trailing newlines.

This answer works in theory for all integers, if each cell can store an arbitrarily large value, not limited to 0 - 255. But it overflows if |A|+|B| > 22. And it runs very slowly if |A|+|B| > 6. So there is not many cases you can actually test and an if-else solution for those cases might be even shorter.

The idea is to compute the triangular numbers T(N) = N(N+1)/2 by decrementing the value to 0 and summing up all the intermediate values. Then we can get the answer A*B = T(A+B) - T(A) - T(B).

But it is tricky to compute all the 3 values. It does this by firstly computing T(A+B) - A, leaving a copy of A in the stack to add back later, and using up the input B. Then recursively find the greatest triangular number smaller than that, which is T(A+B-1) except for the zero special cases. We can get back B = T(A+B) - A - T(A+B-1) and compute T(B) from there.

A number N is a triangular number iff it equals to the greatest triangular number smaller than N, plus the number of non-negative triangular numbers smaller than N. This runs in O(2^(T(A+B)-A)) and is the slowest part in the program.

k I                                         Push 1
j k ZZZZKAAA z                              Input and decrement by 48.
xw k AAA vp yQ (input_a_loop)               If the character was '-':
xw z j k ZZZZKAAA z                           Replace with 0 and input another.
input_a_loop:
j k ZZZAA z xw bZ (input_a_end)             Input and break if it is a space.
k ZKA z qs xw vp xw xw vp xw vp vp vp       Otherwise multiply the previous
                                              value by 10 and add.
k I Xj (input_a_loop)                       Continue the loop.
input_a_end: hd                             Discard the space.
xw yQ (check_sign) k ZZZZKAAA xo exx        If A=0, print 0 and exit.
                                            Stack: ?, A_is_positive, A
check_sign:
qs yQ (check_sign_else)                     If A is positive... or not,
xw xw xw xw z xw bZ (check_sign_end)          in either cases, push 2 copies
check_sign_else: xw xw k I                    of A and the negated flag back
check_sign_end:                               as a constant.
                                            Stack: A, A, A, A_is_negative
j k ZZZZKAAA z                              Similar for B.
xw k AAA vp yQ (input_b_loop)               If the character was '-':
hd k I z j k ZZZZKAAA z                       Decrement the flag and input another.
input_b_loop:
j xw k A vp bZ (input_b_end)                EOF is checked instead of a space.
k ZZZZKAAA z qs xw vp xw xw vp xw vp vp vp
k I Xj (input_b_loop)
input_b_end: hd
xw yQ (output_sign) k ZZZZKAAA xo exx       If B=0, print 0 and exit.
                                            Stack: A, A, A, A*B_is_negative, B
output_sign:
qs yQ (output_sign_end) k ZZZZK xo          If negative, output '-'.
output_sign_end:

vp                                          Add.        Stack: A, A, A+B
xw xw z qs                                  Insert a 0. Stack: A, A, 0, A+B.
xw bZ { xw k I z xw Xj }                    Copy and decrement while nonzero.
                                            Stack: A, A, 0, A+B, A+B-1, ..., 0
qs xw bZ { vp qs xw Xj } hd                 Add while the second value in the
                                              stack is nonzero.
                                            Stack: A, A, T(A+B)
qs z xw xw xw xw z qs                       Stack: A, C0=T(A+B)-A, C0, F0=0, C0

expand_loop:
xw xw xw xw z qs k I qs                     Stack: A, C0, C0, F0=0,
                                              ..., [P=C, P, S=0, F=1], C
dec_expand: k I z xw Xj (expand_loop)       Decrement and continue if nonzero.
                                            Stack: [P=1, P, S, F], C=0
                                            The last number 0 is assumed to
                                              be a triangular number.
test: qs bZ (extract_end)                   If F=0, break.
qs xw yQ (test_not_first) hd xw             If S=0, it's the first triangular
                                              number below previous C. Set S=C.
test_not_first: k I vp qs k I qs            S+=1 and restore F=1.
xw Xj (dec_expand)                          If C!=0, recursively expand from C-1.
hd hd z Kz (test)                           If S=P, P is a triangular number,
                                              return to the previous level.
k I z xw xw xw xw z qs k I qs               Otherwise, decrement P and try again.
k I Xj (dec_expand)
extract_end:                                Stack: A, C0, C0, T(A+B-1)

z                                           Subtract and get B.
xw xw z qs xw bZ { xw k I z xw Xj }         Computes T(B).
qs xw bZ { vp qs xw Xj } hd
                                            Stack: A, C0, T(B)
z qs xw                                     Stack: C0-T(B), A, A

xw xw z qs xw bZ { xw k I z xw Xj }         Computes T(A).
qs xw bZ { vp qs xw Xj } hd
z vp                                        Get A*B=(C0-T(B))+(A-T(A))
xw xw z qs                                  Stack: 0, X=A*B

divide: xw xw z qs                          Stack: 0, ..., Y=0, X
subtract: k I qs                            Stack: 0, ..., Y, Z=1, X
xw bZ {                                     While X!=0:
k I z qs k I vp                               X-=1, Z+=1.
xw k ZA z yQ (not_ten)                        But if Z=11:
hd qs k I vp qs k I Xj (subtract)               Y+=1, reset Z and restart the loop.
not_ten: qs xw Xj }
hd qs xw Xj (divide)                        Put Z under Y and make Y the new X,
                                              continue the loop if X!=0.
hd                                          Discard X.

print_loop:
k ZZZZKAA vp xo xw Xj (print_loop)          Add each cell by 47 and print.

Bourne-shell-based langs all look pretty similar:

Zsh, 11 bytes

<<<$[$1*$2]

Bash, 13 bytes

echo $[$1*$2]

Dash/POSIX sh, 15 bytes

echo $(($1*$2))

Commodore BASIC v2 (C64, VIC-20 and some PET models), 27 tokenized BASIC bytes

This version uses the limited DEF FN keyword, See description here

 0 DEFFNA(B)=A*B:INPUTA,B:PRINTFNA(B)

Commodore BASIC v2, 14 tokenized BASIC bytes

 0 INPUTA,B:PRINTA*B

Both methods are likely compatible with all 8 BIT BASIC variants on Commodore home computers, but are not tested.

Cubically, 8 7 bytes

$:7$*7%

Explanation:

$        read input
 :7      set notepad to input
   $     read input
    *7   multiply notepad by input
      %  print result

Try it online!

BitCycle -U, 68 bytes

  >    > v
 ?+ >  +
Bv ?^ v ~
 \  v<CB~\v
 Cv  ^  <\/
^ <@=!   <
0A^

Try it online!

Multiplying two numbers is not a trivial problem in BitCycle, especially when signs need to be handled! This is my second attempt; the first one (essentially same algorithm, different layout) was 81 bytes, so it's quite possible this one could be shortened too.

The program takes the two numbers as command-line arguments and outputs to stdout. The -U flag is to convert the decimal numbers to signed unary, since BitCycle knows only of 0's and 1's.

Explanation

This explanation assumes you understand the basics of BitCycle (see Esolangs or the GitHub readme). I'll base my explanation on this ungolfed version, seen here computing -2 times 3:

Signed multiplication in BitCycle

Overview

Signed unary numbers consist of the sign (0 for nonpositive, empty for positive) followed by the magnitude (a number of 1s equal to the number's absolute value). To multiply two of them, we need to XOR the signs (output a 0 if exactly one of them is 0, or nothing if both or neither are) and then multiply the magnitudes (and output that many 1s). We'll achieve the multiplication by repeated addition.

Sign bits

Starting from the two sources ?, we split off the signs from the magnitudes using +. 0s (sign bits) turn left and are directed along the top row, while 1s (magnitudes) turn right and end up in the two B collectors.

The section that handles the signs looks like this:

  v

  \  v
> \  /

! <

If both numbers are nonpositive, two 0 bits come in from the top v. The first one reflects off the top \, is sent southward, and reflects off the /. Meanwhile, the second bit passes through the deactivated top \ and reflects off the bottom \. The two bits pass each other, go straight through the now-deactivated splitters on the bottom row, and go off the playfield.

If only one of the numbers is nonpositive, one 0 comes in from the top. It bounces around all three splitters and ends up going northward again, until it hits the v and is once more sent south. This time, it passes through the deactivated splitters and reaches the <, which sends it into the sink !.

Loops to store the magnitudes

The magnitude of the first number goes into the B collector in this section:

B v
  \
  C v
^   <

0 A ^

Before the B collector opens, the A collector releases the single 0 that was placed in it, which then goes onto the end of the queue in B. We'll use it as a flag value to terminate the loop when all the 1 bits in B are gone.

Each time the B collectors open, the \ splitter peels off the first bit from the queue and sends it to the processing logic in the middle. The rest of the bits go into C, and when the C collectors open, they are sent back into B.

The magnitude of the second number goes into the B collector in this section:

v   ~
C B ~
    <

When the B collectors open, the bits go into the bottom dupneg ~. The original 1 bits turn right and are sent west into the processing logic in the middle. The negated copies (0s) turn left and immediately hit another dupneg. Here the 0s turn right and go off the playfield, while the (now doubly) negated 1s turn left and are sent into C. When C opens, they go back into B.

Repeated addition

The central processing logic is this part:

   v
   v


@  =  !

Bits from both loops (one from the western side, and everything from the eastern side) are sent south into the switch =. The timing has to be set up so that the bit from the western loop gets there first. If it is a 1, the switch changes to }, sending the following bits eastward into the sink ! to be output. Once all the 1s are gone, we get the 0, which changes the switch to {. This sends the following bits into the @, which terminates the program. In short, we output the (unary) magnitude of the second number as many times as there are 1s in the (unary) magnitude of the first number.

Flobnar, 4 bytes

&
*@

Try it online!

Brain-Flak, 56 54 52 bytes

2 bytes saved thanks to a mistake caught by Nitrodon

({}(<()>)<>)({<([{}({}())])><>([{}]([{}]))<>}<{}{}>)

Try it online!

Stack clean version, 62 60 bytes

({}(<()>)(<>))({<([{}({}())])><>([{}]([{}]))<>}<{}{}<>{}{}>)

Try it online!

Explanation

This explanation is more of an explanation of the algorithm involved and leaves out any actual code. It assumes that you know how to read Brain-Flak proficiently. If you need help understanding either the code or the algorithm I would be happy to edit or respond if you leave a comment.

This is a little bit of a strange one and uses some weird math that just barely works out. The first thing I did was to make a loop that would always terminate in O(n) steps. The normal way to do this is to put n and -n on opposite stacks and add one to each until one hits zero, however I did it in a slightly stranger way. In my method I put a counter underneath the input and each step I increment the counter add it to n and flip the sign of n.

Let's walk through an example. Say n = 7

7  -8   6  -9   5 -10   4 -11   3 -12   2 -13   1 -14   0
0   1   2   3   4   5   6   7   8   9  10  11  12  13  14

I won't prove it here but this will always terminate for any input and will do so in about 2n steps. In fact it will terminate in 2n steps if n is positive and 2n-1 steps if n is negative. You can test that out here.

Now we have about 2n steps in our loop how do we multiply by n? Well here have some math magic. Here's what we do: We make an accumulator, each step of the process we add the second input (m) to the accumulator and flip the sign of both of them, we then push the total over all the loops that occur, this is the product.

Why on earth is that the case?

Well lets walk through an example and hopefully it will become clear. In this example we are multiplying 5 by 3, I will show only the important values

total       -> 0  -5   5 -10  10 -15  15
accumulator -> 0  -5  10 -15  20 -25  30
m           -> 5  -5   5  -5   5  -5   5

Hopefully the mechanism is apparent here. We are stepping through all the multiples of m in order of their absolute values. You will then notice that the 2nth term is always m * n and the term before always -m * n. This makes it so that our looping perfectly lines up with the results we want. A bit of a happy coincidence ;)

Brainfuck, 76 bytes

Not the shortest but my own solution, written a long time ago.

Golfed

>[-]>[-]>[-]<<<<[->>>+<<<]>[->+>>+<<<]>[-<+>]>>[-<[-<+<<+>>>]<[->+<]>>]<<<<.

Explanation

x = x*y
(x)(y)(temp0)(xtemp)(ycount)
Own work! Convoluted solution

,               x
> +++           y=3 (or input)

>[-]>[-]>[-]    set cells to 0
<<<< [->>>+<<<] transfer x to xtemp
> [->+>>+<<<]   transfer y to temp0 and ycount
> [-<+>]        transfer temp0 to y
>>
[               while ycount != 0
 -               ycount decrement
 < [-<+<<+>>>]   transfer xtemp to x and temp0
 < [->+<]        transfer temp0 to xtemp
 >> 
]

<<<< .          x (might overflow)

T-SQL, 17 bytes

SELECT a*b FROM t

Per our IO rules, SQL can take input from a pre-existing table t with integer columns a and b.

This has the bonus of working on an unlimited* number of provided pairs, if they are included in the input table.

*Well, limited only by SQL storage bounds, which are pretty darn high, using enterprise versions.

JavaScript (Node.js), 39 36 bytes

-3 bytes thanks to @MartinEnder

f=(a,b)=>b?b>0?a+f(a,b-1):-f(a,-b):0

Try it online!

This is me having fun , it won't win any competitions but it uses recursion and doesn't use the * operator.

Explanation :

f = (a,b) => {
    if (b == 0) {
        return 0;
    }
    if (b > 0) {
        return(a + f(a , b-1))
    }
    else {
        return(-f(a , -b))
    }
};

FRACTRAN, 22 bytes

78/55 5/3 1/5 11/2 5/7

Take 7^a*11^b as input, return 11^b*13^(a*b).

Try it online!

This is a golfed version of the wikipedia example.

I'm not sure whether or not extra bytes should be added for input encoding and output decoding.

Red, 16 bytes

func[a b][a * b]

Try it online!

JavaScript (Node.js), 9 bytes

a=>b=>a*b

Try it online!

Forked, 5 bytes

$$*%&

Try it online!

Wumpus, 5 bytes

II*O@

Try it online!

Explanation

Straight-forward and boring:

I   Read the first integer.
I   Read the second integer.
*   Multiply them.
O   Output the result.
@   Terminate the program.

Java 8, 10 9 bytes

a->b->a*b

Try it here.

Java 7, 31 bytes

int c(int a,int b){return a*b;}

Try it here.

As full program (99 90 bytes):

interface M{static void main(String[]a){System.out.print(new Long(a[0])*new Long(a[1]));}}

Try it here.

Implicit, 1 byte

*

Implicit input of two integers, multiply them, implicit output. Try it online!

Pyth - 5 bytes

AQ*GH

Explanation:

AQ*GH
A     Set G and H to the first two elements of
 Q    Evaluated input
      Implicitly print
   G  G
  *   Times
    H H

Whispers, 35 bytes

> Input
> Input
>> 1×2
>> Output 3

Try it online!

Verbosity, 392 bytes

Include<Input>
Include<Output>
Include<Integer>
Include<MetaFunctions>
Input:DefineVariable<i; 0>
Output:DefineVariable<o; 0>
Integer:DefineVariable<f; Input:ReadEvaluatedLineFromInput<i>>
Integer:DefineVariable<s; Input:ReadEvaluatedLineFromInput<i>>
Integer:DefineVariable<r; Integer:Product<f; s>>
Output:DisplayAsText<o; r>
DefineMain<> [
MetaFunctions:ExecuteScript<MetaFunctions@FILE>
]

Try it online!

Hexagony, 9 bytes

?{?/*!@'/

Try it online!

This is actually fairly straightforward. Here is the unfolded version:

  ? { ?
 / * ! @
' / . . .
 . . . .
  . . .

The / just redirect the control flow to the second line to save bytes on the third. That reduces the code to this linear program:

?{?'*!@

This linear code on its own would actually be a valid solution if the input was limited to strictly positive numbers, but due to the possibility of non-positive results, this isn't guaranteed to terminate.

The program makes use of three memory edges in a Y-shape:

A   B
 \ /
  |
  C

The memory pointer starts on edge A pointing towards the centre.

?   Read first input into edge A.
{   Move forward to edge B.
?   Read second input into edge B.
'   Move backward to edge C.
*   Multiply edges A and B and store the result in C.
!   Print the result.
@   Terminate the program.

I ran a brute force search for 7-byte solutions (i.e. those that fit into side-length 2), and if I didn't make a mistake (or there's a busy-beaver-y solution that takes a long time to complete, which I doubt) then a 7-byte solution doesn't exist. There might be an 8-byte solution (e.g. by reusing the ? or using only one redirection command instead of two /), but that's beyond what my brute force search can do, and I haven't found one by hand yet.

x86_64 machine language (Linux), 5 4 bytes

0:       97                      xchg   %edi,%eax
1:       f7 ee                   imul   %esi
3:       c3                      retq

To Try it online!, compile and run the following C program.

#include<stdio.h>

int f(int a,int b){return a*b;}
const char g[]="\x97\xf7\xee\xc3";

int main(){
  for( int i = 0; i < 10; i++ ) {
    for( int j = 0; j < 10; j++ ) {
      printf( "%d %d %d %d\n", i, j, f(i,j), ((int(*)())g)(i,j) );
    }
  }
}

QBIC, 13 bytes

::[a|p=p+b}?p

Adapted my code from 'add two numbers'. This starts a loop and adds 'y' to itself 'x' times.

But seriously, a 6-byte solution is ::?a*b. : gets a cmd line parameter and class it 'a', the next : does the same for 'b', 'cause 'a' is already taken. * multiplies, and ? prints the result. This is virtually identical to this answer, only the operator is different.


Since some time now, QBIC can in-line the 'get var from cmd line'-command, and the above would be ?:*:, at 4 bytes.

><>, 5 Bytes

i|;n*

Takes input as an ascii character, outputs a number.

Explanation:

i                        | Get input.
 |                       | Mirror: Change the pointer's direction.
i                        | Get input again.
    *                    | Loop around to the right side. Multiply
   n                     | Print the value on the stack, as a number
  ;                      | End the program

You could also do

ii*n;

But I feel my solution is waaay cooler.

Another possibility is dropping the semicolon, which would result in the pointer bouncing off the mirror, hitting the print command, and throwing an error since the stack is empty.

Aceto, 6 bytes

riri*p

ri grabs input and converts to integer * multiplies them p prints it Try it online!

LOLCODE, 95 bytes

HAI 1.3
I HAS A J
GIMMEH J
I HAS A Q
GIMMEH Q
I HAS A T
T R PRODUKT OF J AN Q
VISIBLE T
KTHXBYE

Try it online!

C#, 27 bytes

delegate(a,b){return a*b;};

Excel VBA, 8 Bytes

Takes input from cells A1 and B1 and outputs to the VBA immediates window

?[A1*B1]

which is functionally equivalant to

Print ActiveSheet.Range("A1").Value * ActiveSheet.Range("B1").Value

Ruby, 10 bytes

:*.to_proc

Try it online!

I really thought this might be shorter...

Go, 28 bytes

func(a,b int)int{return a*b}

Try it online!

Go, 84 bytes

package main
import."fmt"
func main(){a,b:=0,0;Scanf("%d%d",&a,&b);Printf("%d",a*b)}

Try it online!

Worth mentioning:

Lua, 32 bytes

i=io.read
print(i("*n")*i("*n"))

Try it online!

Program reads 2 numbers from STDIN and prints the result to STDOUT.


"But shouldn't you use io.write?"

Well according to the documentation,

[...] write uses the current output file, whereas print always uses the standard output. Finally, print automatically applies tostring to its arguments, so it can also show tables, functions, and nil.

Falcon, 34 bytes

a=int(input())
b=int(input())
>a*b

Try it online!

Falcon uses a similar syntax to Python. Its output, however, has these awesome aliases called "fast-printing" (as per the documentation):

Batch File, 23 bytes

@set/ak=%1*%2
@echo %k%

Batch doesn't allow you to print the result of an operation; Thus, we are required to create a temporary variable k which contains the result of the multiplication between argument 1 and 2.

The @'s in front of the commands prevent the current path from being printed before each line on the command prompt.

Cubix, 6 bytes

OI|u*@

This is a slightly different algorithm than the "Add Two Numbers" Cubix solution. It would have been trivial to simply use that solution with a * instead of a + but the flow here is slightly different.

On a cube:

  O
I | u *
  @

rather than using the control flow \ or / and then duplicating I to read in the inputs, I opted to use | to pass over the I twice instead, which forced me to use u to get to the output commands.

The commands are:

Similarly to the addition solution, the cube's symmetry allows the following solution.

  @
I | U *
  O

Additionally, replacing | with < or T will work as well.

Try it online!

Perl 5, 7 bytes

6 bytes of code + 1 for -p flag

$_*=<>

Try it online!

[C64, BasicV2], 11 bytes

1rEA,B:?A*B

The input can be given like:

0dA45,45

QC 4 bytes

QQGN

Requires a newer version which must be compiled manually.

Q Read number from stdin and push to stack
Q Same as above
G Multiply two numbers from stack
N Pop and print number from stack

Whitespace, 4 bytes

	  

In some other languages, you could quote that as "\t \n". Expects two numbers on the stack and leaves the result on the stack.

As a complete program reading from standard input and writing to standard output, it would be 36 bytes:

   
 
 	
					   
 
 	
						  
	
 	

Try it online!

Tcl, 10 bytes

expr $a*$b

Try it online!


If one states

namespace path tcl::mathop

before then * acts like a procedure:

Tcl, 7 bytes

* $a $b

Try it online!

cQuents, 6 bytes

#|1:AB

I really need to implement a byte that simply shorthands #|1: because every "perform this operation once" challenge uses that as the beginning.

Try it online!

Explanation

#|1      Add a 1 to the end of the user's input, it will be n
   :     Mode : (sequence 1: given n, output the nth item in the sequence)
    AB   Each item in the sequence is the first input times the second input

Lean Mean Bean Machine, 12 bytes

OO
ii
 /
*
u

C, 48 bytes

main(a,b){scanf("%d%d",&a,&b);printf("%d",a*b);}

New to code golf, any suggestions are welcome.

Jellyfish, 6 bytes

P*i
 i

Try it online!

P denotes print, then * multiplies the two numbers below and to the right. At the start of execution, the two is are replaced with values from STDIN.

Carrot, 5 bytes

$^F*$

Takes the input separated by newlines.

Explanation:

$ //Set the string stack to the first line of the input
^ //Change to operations mode
F //Convert to float stack
* //Multiply the stack by
$ //The second line of the input
  //Implicitly output the result

Casio Basic, 6 bytes

a*b

No surprises there. 3 bytes for the program, and 3 bytes to add a,b as parameters.

Decimal, 12 bytes

81D81D43D301

Reads two integers (separated by a space or newline), multiplies them, and prints them to STDOUT.

Ungolfed:

81D  ; builtin 1 - read INT to stack
81D  ; builtin 1 - read INT to stack
43D  ; math, multiply (postfix *)
301  ; print from stack to standard output

Try it online!

CJam, 3 bytes

{*}

Try it online!

Triangular, 6 bytes

$.$%*<

Try it online!

Formats into this triangle;

  $
 . $
% * <

Without directionals/no-ops, this looks like: $$*%

Ruby, 10 bytes

->a,b{a*b}

and it would be great to learn if it is possible with fewer bytes

HEX, 69 bytes non-competing

GBL;
Listen("1");
Listen("2");
Breed("1" * "2");
Scuttle("1");
Write;

I have no idea when HEX was created, but I've listed this as non-competing as the language currently has no publicly-available functional interpreter.

MATLAB, 5 4 bytes

@dot

dot takes the dot product of two vectors of equal length. If we feed it with two scalars, it will simply multiply the two numbers.

prod takes the product of the values in all rows of each column of a matrix. If the matrix is one-dimensional (i.e. a vector), then it acts along the non-singleton dimension, taking the product of all elements in the vector.

dot is one byte shorter than prod which is one byte shorter than the even more obvious builtin times.

Call it as such:

@dot
ans(3,4)
ans = 
   12

C, 56 bytes

main(int i,char**a){printf("%d",atoi(*++a)*atoi(*++a));}

compile

> gcc source.c

usage

> a 8 7

or

> ./a.out 8 7

explanation

main(int i,char**a) {  /* Begin program and accept command-line arguments.    */
   printf("%d",        /* First argument prints the (final) decimal result.   */
         atoi(*++a)    /* Returns int of program's 2nd command-line argument. */
         *             /* Multiplies the values of the 1st & 2nd arguments.   */
         atoi(*++a)    /* Returns int of program's 1st command-line argument. */
   );
}

Alice, 7 6 bytes

*/
o@i

Try it online!

Follows the same pattern as my solution for addition.

ArnoldC, 152 bytes

HEY CHRISTMAS TREE c
YOU SET US UP 0
GET TO THE CHOPPER c
HERE IS MY INVITATION a
YOU'RE FIRED b
ENOUGH TALK
TALK TO THE HAND c
YOU HAVE BEEN TERMINATED

Try it online!

ZX80 BASIC ~39 bytes

 1 INPUT A
 2 INPUT B
 3 PRINT A;"X";B;"=";A*B

This program is so simple that it will very likely work on all variants on 8-bit BASIC. However, on the ZX80 (4K ROM) you are limited to integer maths with a signed 16-bit range; so if your answer is >32767 then it will error and you will not see a result.

To remedy this, install a new ROM onto your Sinclair ZX80 to allow 24-bit floating point maths, or upgrade to a Sinclair ZX81.

Save bytes by refactoring line 3 to:

 3 PRINT A*B

Taxi, 442 bytes

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:w 1 l 1 r.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 r 1 l.Pickup a passenger going to Post Office.Go to Post Office:e 1 l 1 r.

Formatted with line breaks for legibility:

Go to Post Office:w 1 l 1 r 1 l.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:w 1 l 1 r.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station:n 1 r 2 l.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery:s 1 r 1 l.
Pickup a passenger going to Post Office.
Go to Post Office:e 1 l 1 r.

AHK, 15 bytes

1*=%2%
Send,%1%

1 and 2 are, by default, the first two arguments passed in to a program. Sometimes you have to escape them with percent signs so it doesn't confuse the variable 1 with the number one.

><>, 3 + 3 = 6 bytes

*n;

Invoke as fish.py -c '*n;' -v 2 -8, which is why I only count the flag once.

Röda 0.11, 11 bytes

f&a,b{a*=b}

Try it online!

It modifies its first argument (which must be a variable).

Röda 0.12, 7 bytes (non-competing)

{[_*_]}

Try it online!

This kind of syntax was not supported at the time the challenge was posted. It's an anonymous function that reads to numbers from the stream

Maple, 3 bytes

`*`

Usage:

`*`(a,b);

Returns:

a*b

Using this notation, is it possible to supply any number of arguments to the multiplication operator and it will return the product of the sequence.

Forth, 1 bytes

*

* pops off the top 2 items from the stack, multiplies them and pushes the result.

Retina, 38 37 31 bytes

Completely new approach, the old one is below.

M!`-
*\)`-¶-

.* 
$*_
_
$'$*_
_

Try it online!

Explanation

First, we deal with the sign:

M!`-

matches all - in the string and returns them separated by newlines

*\)`-¶-

(with a following empty line)
*\) means the result of this and the previous stages should be printed without a newline, and then the string reverted to what it was before (the input string). The remaining part removes two - separated by a newline.

Then we convert the first number to unary:

.* 
$*_

(there's a space at the end of the first line). We use _ as our unary digit in this case, because the standard digit 1 can be present in the second number, and this would conflict later.

Now we get to the actual multiplication:

_
$'$*_

Each _ is replaced by the unary representation of everything following it (still using _ as the unary digit). Since conversion to unary ignores non-digit characters, this will repeat the unary representation of the second number for "first number" times. The second number will remain in decimal representation at the end of the string.

In the end, with a single _ we return the number of _ in the string, which will be the result of the multiplication.


Previous answer: (warning: outputs an empty string when it should output 0)

Retina,  45  42 41 bytes

Let's play a game! Multiply relative numbers with a language which has no arithmetic operators and limited support only for natural numbers... Sounds funny :)

O^`^|-
--

\d+
$*
1(?=1* (1*))?
$1
1+
$.&

Explanation

The first three lines deal with the sign:

O^`^|-

This sorts O and then reverses ^ all strings matching the regex ^|-. In practice this matches the empty string at the start, and the eventual minus sign before the second number, and reorders them placing the empty string in the place of the minus. After this, all - are at the beginning of the string, and a pair of them can be removed easily with the next two lines.

After that, we use a builtin to convert numbers to unary representation, and then comes the actual multiplication:

1(?=1* (1*))?
$1

We match any 1, and substitute each of them with all the 1 after a following space. Each digit of the first number will be replaced by the full second number, while each digit of the second number will be replaced by the empty string.

The last part is again a builtin to convert back from unary to decimal.

Try it online!

Retina, 39 35 bytes

Thanks to Leo for letting me use an idea of his that ended up saving 4 bytes.

[^-]

*\)`--

.+
$*
\G1
_
_|1+
$'
1

Input is linefeed-separated.

Try it online! (Space-separated test suite for convenience.)

Explanation

The first two stages print a minus sign if exactly one of the two inputs is negative. They do this without actually changing the input. This is done by grouping them in the second stage with ) and turning them into a dry-run with *. The \ option on the second stage prevents printing a trailing linefeed.

[^-]

First, we remove everything except the minus signs.

*\)`--

Then we cancel the minus signs if there are two of them left.

.+
$*

Now we convert each line to the unary representation of its absolute value. This will get rid of the minus sign because $* only looks for the first non-negative number in the match (i.e. it doesn't know about minus signs and ignores them).

\G1
_

The first line is converted to _, by matching individual 1s as long as their adjacent to the previous match (hence, we can't match the 1s on the second line, because the linefeed breaks this chain).

_|1+
$'

This performs the actual multiplication. We replace each _ (on the first line) as well as the entire second line everything after that match. The _ matches will therefore include the entire second line (multiplying it by the number of 0s in the first line), and the second line will be removed because there is nothing after that match. Of course the result will also include some junk in the form of _s and linefeeds, but that won't matter.

1

We finish by simply counting the number of 1s in the result.

Powershell, 17 Bytes

param($a,$b)$a*$b

takes 2 numbers, returns them multiplied out.

Brain-Flak, 56 bytes

([({}<([({})<>])<>>)<>]){({}[()]<(({})<({}{})>)>)<>}{}{}

This must be run as a full program as it is not stack clean and the inputs must be the only elements in either stack.

Try it online!


Explanation: (call the inputs x and y)

Part 1:

([({}<([({})<>])<>>)<>])

([                    ]) # Push negative x on top of:
      ([      ])         # negative y. After...
  ({}<            >)     # pushing x and...
        ({})             # y...
            <>  <>  <>   # on the other stack (and come back)

At this point we have [x,y] on one stack and [-x,-y] on the other.

Part 2:

{({}[()]<(({})<({}{})>)>)<>}{}{}
{                          }     # Loop until x (or -x) is 0
 ({}[()]<              >)        # Decrement x
         (({})<      >)          # Hold onto y
               ({}{})            # Add y and the number under it (initially 0)
                         <>      # Switch stacks
                            {}{} # Pop x and y leaving the sum

C (gcc), 98 bytes

m(i,j){i=(i&j)<0?m(O(~i,1),-j):i?O(m(i>>1,O(j,j)),i&1?j:0):0;}O(i,j){i^=j,j&=i^j;i=j?O(i,j<<1):i;}

I don't think I have much of a chance against the other entries.

Try it online!

R, 3 bytes

'*'

This is a function which takes exactly two arguments. Run as '*'(a,b).

See also prod which does the same thing but can take an arbitrary number of arguments.

Piet, 16 bytes

5bpiaibpikibptai

Online interpreter available here.

Explanation

To run, paste the code above in the text box on the right side of the linked page. Below is a graphical representation of this code with codel size 31. The grid is for readability and may interfere with traditional Piet interpreters.
The code runs linearly from left to right, going along the top of the image until the first green block, where program flow moves to the middle row of codels. The white lone white codel is necessary for program flow. It could be replaced with a codel of any color other than green or dark blue, but I have chosen white for readability.

Code Visualization

Instruction    Δ Hue    Δ Lightness    Stack
-----------    -----    -----------    -----
In (Number)    4        2              m
In (Number)    4        2              n, m
Multiply       1        2              m*n
Out (Number)   5        1              [Empty]
[Exit]         [N/A]    [N/A]          [Empty]

If you think that text is not the best way to represent a Piet program or have an issue with the byte size of Piet programs in general, please let your opinion be known in the discussion on meta.

Swift 3, 40 bytes

func f(_ a:Int,_ b:Int)->Int{return a*b}

Takes two parameter, return the two Ints multiplied. Called like this:

f(2, 4)

SmileBASIC, 13 bytes

INPUT A,B?A*B

Input should be given as two numbers, separated by a comma.

Batch, 57 bytes

set "a1=%1" && set "a2=%2" && set x=%a1%*%a2% && echo %x%

&&: execute another command.

First command: Set %a1% as the first argument

Second command: Set %a2% as the second argument

Third command: Set %x% as %a1% * %a2%.

Fourth command: Type in the value of %x%.

SimpleTemplate, 59 bytes

Since this language doesn't have math (yet), it requires a loop and an increment, to generate the result.

{@setx 0}{@for_ from1 toargv.0}{@incbyargv.1 x}{@/}{@echox}

Ungolfed, with whitespace:

{@set prod 0}
{@for _ from 1 to argv.0}
    {@inc by argv.1 prod}
{@/}
{@echo prod}

This answer was written to run on the commit 2166e6bdac44064ec5594d511528d1469ea3feef from 2017-01-07.

On the latest version (commit 9857e4277536555d0b06e8ef9c00ba0c7f23cf6d), one could do like this (50 bytes):

{@for_ from1 toargv.0}{@incbyargv.1 x}{@/}{@echox}

This will show a warning saying that the index 'x' doesn't exist.


With a new update (commit 552216290ec0d8cb9893e08d89601c4d67fcc3d1), the code can be written as (21 bytes):

{@set*_ argv}{@echo_}

Noodel, noncompeting 1 byte

Did not have a full complete version of Noodel until after this challenge, and did not even have multiplication with a single character until recently.

×

Try it:)

How it works

  # Input is implicitly pushed onto the stack with the first element (a) pushed first and the second last (b) making it the top.
× # Pops off two items producing => (b * a) and pushes on the result.
  # The top of the stack is popped off at the end of the program and pushed to stdout.

<div id="noodel" code="×" input="2,-4" cols="5" rows="5"></div>

<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>

Haskell, 3 bytes

(*)

Call it as a function: (*) a b

or as an operator: a * b .

Rust, 14

I haven't seen Rust quiet often so let's use it.

|a:u8,b:u8|a*b

This is a lambda expression that takes to 8 bit ints and multiplies them.

Loader, 124 bytes

~A:set B =@IN
~A:set A =@IN
B:~C:decr B
~C:set C =A
C:incr D
C:decr C
set G =0
B:incr G
C:incr G
G:load m
~B:print D
~B:exit

Run from m.ldr, or alternatively replace the m in the third line from the end with the name of the file.

ForceLang, 36 bytes

def n io.readnum()
io.write n.mult n

Another fun use of def.

Microscript, 4 bytes

isi*

Microscript II, also 4 bytes

FsF*

Math++, 3 bytes

?*?

(Why is there a 30 character minimum?)

C# - 11 bytes

(a,b)=>a*b;

Anonymous lambda.

C#, 112 63 bytes

Saved 49 bytes, thanks to milk

a=>b=>{int r=0,i=0,k=0<b?1:-1;for(;i!=b;i+=k)r+=a;return r*k;};

I've already posted an answer using the multiplication operator, but here I do it with a loop.

Owk, 11 bytes

λx.λy.x*y

This can be assigned to a function like this:

multiply:λx.λy.x*y

and called like this:

result<multiply(a,b)

Perl 6, 4 bytes

&[*]

This is just the ordinary infix multiplication operator *, expressed as an ordinary function. As a bonus, if given one number it returns that number, and if given no numbers it returns 1, the multiplicative identity.

Clojure, 1 byte

*

:P As a bonus this works on any number of arguments:

[(*)
 (* 2)
 (* 2 3)
 (* 2 3 4)
 (* 2 3 4 5)] => [1 2 6 24 120]

Interestingly you can easily get its source code:

(source *)
(defn *
  "Returns the product of nums. (*) returns 1. Does not auto-promote
  longs, will throw on overflow. See also: *'"
  {:inline (nary-inline 'multiply 'unchecked_multiply)
   :inline-arities >1?
   :added "1.2"}
  ([] 1)
  ([x] (cast Number x))
  ([x y] (. clojure.lang.Numbers (multiply x y)))
  ([x y & more]
     (reduce1 * (* x y) more)))

Ruby, 10 bytes

->a,b{a*b}

Answer is two characters too short without this text apparently.

Emacs Lisp, 3 bytes

This is just a function.

(*)

Usage:

(* num1 num2)

Japt, 1 byte

×

Here is a non-1 byte solution

U*V

Run it here

Dyalog APL, 1 byte

× takes one number on the left, and one on the right

× ... or even multiple numbers on the left or on the right or on both sides

×/ multiplies all numbers in a list

×/¨ multiplies the pairs in a given list

×/∊ mulitplies all numbers in an array

This applies to all arithmetic functions, arrays of all sizes and ranks, and numbers of all datatypes.

Befunge-93, 5 bytes

&&*.@

Try it online!

&& gets two integers and pushes them to the stack; * multiplies them (duh); . prints the numeric value of the top of the stack, and @ ends the program.

Mathematica, 4 bytes

1##&

Example usage: 1##&[7,9] returns 63. Indeed, this same function multplies any number of arguments of any type together.

As Mathematica codegolfers know, this works because ## refers to the entire sequence of arguments to a function, and concatenation in Mathematica (often) represents multiplication; so 1## refers to (1 times) the product of all the arguments of the function. The & is just short for the Function command that defines a pure (unnamed) function.

Inside other code, the common symbol * does act as multiplication. So does a space, so that 7 9 is interpreted as 7*9 (indeed, the current REPL version of Mathematica actually displays such spaces as multiplication signs!). Even better, though, if Mathematica can tell where one token starts and another ends, then no bytes at all are needed for a multiplication operator: 5y is automatically interpreted as 5*y, and 3.14Log[9] as 3.14*Log[9].

PHP, 21 bytes

<?=$argv[1]*$argv[2];

takes input from command line arguments. Also works with floats.

dc, 3

?*p

Try it online (wrapped in a shell script to run all given tests).

Note dc thinks underscores (_) are -ve signs.

PigeonScript, 1 byte

*

Explanation:
* looks to the stack to see if there is anything there. If not, it prompts for input and multiplies the inputs together

Pushy, 2 bytes

*#

Try it online!

As you might have guessed, * is the multiplication operator, and # prints the result.

Scratch, 1 byte

enter image description here

Usage: Place numbers in both sides of * sign

Note: Since Scratch is a visual language I could not figure out how many bytes it consumes until @mbomb007 noted me about a method for counting scratch bytes

FOG, 3 bytes

^^*

Takes input twice and multiplies. I can also just use * and call it a function, but for the sake of uniqueness I decided not to.

TI-Basic, 2 bytes

Very straightforward.

prod(Ans

Scala, 2 bytes

_*

This is a curried lambda / anonymous function. To use it, assign it to a variable:

val f:(Int=>Int=>Int)=_*
f(7)(9)                   //returns 63

How it works:

In Scala, the underscore can be used as a shorthand for the arguments.

_*_, for example, is syntactic sugar for (a,b)=>a*b.

Removing the second underscore is treating the method * of the first argument as a function, results in a curried function that multiplies its arguments.

OCaml, 4 bytes

( *)

The space after the first parenthesis is needed because (* starts a comment in OCaml.

Try it online!

Groovy, 10 bytes

{x,y->x*y}

This is an unnamed closure.

Try it here!

Python 3, 11 bytes

int.__mul__

Try it online!

Also works for integers under 2**32 in Python 2.

Pyth, 2 bytes

*E

Try it here!

Pyth's automatic evaluation gets in the way here. To get around it, I'm using explicit evaluation for one of the arguments

Pyth, 4 bytes

M*GH

Defines a function named g, can call it in this way - gn1 n2, where n1 and n2 are the numbers.

Try it here!

Previous solutions using 5 bytes.

*.).Q and *hQeQ.

Python 2, 14 bytes

lambda a,b:a*b

Try it online!

I feel like this is too much shorter than from operator import*;mul.

05AB1E, 1 byte

*

Try it online!

Jelly, 1 byte

×

Try it online!

Obligatory Jelly submission.

C#, 10 bytes

a=>b=>a*b;

It's just a simply multiplication.

C (GCC), 13 bytes

Doesn't work on all implementations, but that's OK.

f(a,b){a*=b;}

Try it on TIO!

JavaScript (ES6), 9 bytes

ES6 has a dedicated function for 32-bit integers, faster than the more generic * operator.

Math.imul

Incidentally, this is just as long as:

a=>b=>a*b

Labyrinth, 5 bytes

??*!@

Try it online!

Input format can be almost anything (this simply multiplies the first two decimal integers it finds in the input).