| Bytes | Lang | Time | Link |
|---|---|---|---|
| 030 | SAKO | 250318T153714Z | Acrimori |
| 043 | Bespoke | 250307T220815Z | Josiah W |
| 020 | Swift | 230723T224214Z | macOSist |
| 058 | ReRegex | 231001T220651Z | ATaco |
| nan | Piet + asciipiet | 220724T031957Z | naffetS |
| 005 | Desmoslang Assembly | 230529T162228Z | Dadsdy |
| 001 | Thunno 2 | 230528T185345Z | The Thon |
| 001 | Brachylog V1 | 170109T081250Z | Fatalize |
| 007 | HP‑41C series | 230513T113001Z | Kai Burg |
| 003 | ARBLE | 230411T222238Z | ATaco |
| nan | 230409T232842Z | RARE Kpo | |
| 013 | awk | 230204T012537Z | gildux |
| 014 | shell | 230204T011634Z | gildux |
| 033 | BitCycle | 190326T092406Z | Jo King |
| 001 | Braingolf | 170602T084944Z | Mayube |
| 004 | Z80 machine code | 220724T111840Z | kevidryo |
| 002 | rusty_deque | 220408T223042Z | bigyihsu |
| 009 | Piet | 220406T193223Z | Seggan |
| 077 | LOLCODE | 220202T083017Z | CreaZyp1 |
| 001 | Factor | 220201T230740Z | chunes |
| 070 | In Floop | 220201T215736Z | rydwolf |
| 028 | A0A0 | 210706T141341Z | stefvans |
| 006 | Starry | 210706T133510Z | Jay Ryan |
| 139 | MashedPotatoes | 210706T105627Z | cnamejj |
| 010 | Foam | 200621T171458Z | PkmnQ |
| 257 | Brainetry | 200614T003200Z | RGS |
| 004 | International Phonetic Esoteric Language | 191001T025458Z | bigyihsu |
| 014 | Python 3 | 191224T042204Z | Sagittar |
| 022 | Intcode | 191224T014558Z | The Fift |
| 019 | Pepe | 180826T091131Z | u-ndefin |
| 029 | brainfuck | 191001T094500Z | Dorian |
| 004 | √ å ı ¥ ® Ï Ø ¿ | 170315T164705Z | caird co |
| nan | 3+ bytes in various methods of representing lambda calculus | 190401T211127Z | ThePlasm |
| 028 | Intel 8080 machine code | 190328T190108Z | 640KB |
| 027 | GFortran | 190327T165359Z | roblogic |
| 888 | Beatnik | 180413T180909Z | jimmy230 |
| nan | 190327T120224Z | GammaFun | |
| 027 | Commodore BASIC v2 C64 | 190327T103434Z | Shaun Be |
| 007 | Cubically | 170801T221745Z | MD XF |
| 068 | BitCycle U | 180822T042851Z | DLosc |
| 004 | Flobnar | 180812T075355Z | Esolangi |
| 052 | BrainFlak | 170913T063502Z | Wheat Wi |
| 076 | Brainfuck | 180420T200043Z | qwr |
| 017 | TSQL | 180420T194320Z | BradC |
| 036 | JavaScript Node.js | 180414T131613Z | user7985 |
| 022 | FRACTRAN | 180416T162420Z | Vincent |
| 016 | Red | 180416T114031Z | Galen Iv |
| 009 | JavaScript Node.js | 180414T085747Z | Muhammad |
| 005 | Forked | 180212T050729Z | MD XF |
| 005 | Wumpus | 180210T203750Z | Martin E |
| 009 | Java 8 | 170109T120745Z | Kevin Cr |
| 001 | Implicit | 170905T232329Z | MD XF |
| 005 | Pyth | 171211T192929Z | Tornado5 |
| 035 | Whispers | 171210T144350Z | caird co |
| 392 | Verbosity | 171210T141438Z | caird co |
| 009 | Hexagony | 170109T121729Z | Martin E |
| 004 | x86_64 machine language Linux | 170906T184413Z | ceilingc |
| 013 | QBIC | 170109T104410Z | steenber |
| 005 | ><> | 171118T195139Z | Bolce Bu |
| 006 | Aceto | 171118T145355Z | qqq |
| 095 | LOLCODE | 171107T201955Z | qqq |
| 027 | C# | 171102T002757Z | Zaphyk |
| 008 | Excel VBA | 170110T175605Z | Taylor R |
| 010 | Ruby | 171007T060848Z | totallyh |
| 028 | Go | 171007T055454Z | totallyh |
| 084 | Go | 171007T041032Z | Matheus |
| 032 | Lua | 171007T043002Z | Matheus |
| 034 | Falcon | 171007T044245Z | Matheus |
| 023 | Batch File | 171007T035938Z | Matheus |
| 006 | Cubix | 170703T151415Z | Giuseppe |
| 007 | Perl 5 | 170913T200023Z | Xcali |
| 011 | [C64 | 170913T174119Z | peterh |
| 004 | QC | 170219T123101Z | user6333 |
| 004 | Whitespace | 170801T224222Z | ascheple |
| 010 | Tcl | 170801T223733Z | sergiol |
| 006 | cQuents | 170719T140855Z | Stephen |
| 012 | Lean Mean Bean Machine | 170719T131959Z | Mayube |
| 048 | C | 170719T120023Z | Agent_Me |
| 006 | Jellyfish | 170719T092913Z | space ju |
| 005 | Carrot | 170719T092804Z | TheLetha |
| 006 | Casio Basic | 170516T073459Z | numberma |
| 012 | Decimal | 170605T022516Z | MD XF |
| 003 | CJam | 170109T152750Z | Erik the |
| 006 | Triangular | 170614T161455Z | MD XF |
| 010 | Ruby | 170516T102601Z | marmelad |
| 069 | HEX | 170516T081257Z | Mayube |
| 004 | MATLAB | 170109T105428Z | Stewie G |
| 056 | C | 170222T221550Z | veganaiZ |
| 006 | Alice | 170411T112942Z | Martin E |
| 152 | ArnoldC | 170329T070017Z | Tom291 |
| 8039 | ZX80 BASIC ~39 bytes | 170328T191124Z | Shaun Be |
| 442 | Taxi | 170328T181557Z | Engineer |
| 015 | AHK | 170328T180556Z | Engineer |
| 336 | ><> | 170315T201828Z | PidgeyUs |
| 011 | Röda 0.11 | 170315T170003Z | fergusq |
| 003 | Maple | 170222T003832Z | DSkoog |
| 001 | Forth | 170217T182915Z | 2xsaiko |
| 031 | Retina | 170217T182816Z | Leo |
| 035 | Retina | 170220T155427Z | Martin E |
| 017 | Powershell | 170220T152118Z | colsw |
| 056 | BrainFlak | 170109T143938Z | Riley |
| 098 | C gcc | 170220T140554Z | Ahemone |
| 003 | R | 170110T150828Z | rturnbul |
| 016 | Piet | 170109T184139Z | Mike Buf |
| 040 | Swift 3 | 170124T234514Z | Tom Shen |
| 013 | SmileBASIC | 170124T184635Z | 12Me21 |
| 057 | Batch | 170124T113439Z | 180Five |
| 059 | SimpleTemplate | 170110T123850Z | Ismael M |
| 001 | Noodel | 170116T032533Z | tkellehe |
| 003 | Haskell | 170109T142248Z | corvus_1 |
| 014 | Rust | 170118T130152Z | Christop |
| 124 | Loader | 170118T031615Z | SuperJed |
| 036 | ForceLang | 170118T024212Z | SuperJed |
| 004 | Microscript | 170116T143001Z | SuperJed |
| 003 | Math++ | 170116T033152Z | SuperJed |
| 011 | C# | 170111T105942Z | Carra |
| 063 | C# | 170110T183856Z | Horv |
| 011 | Owk | 170110T182418Z | Conor O& |
| 004 | Perl 6 | 170110T181815Z | Sean |
| 001 | Clojure | 170109T151429Z | NikoNyrh |
| 010 | Ruby | 170110T055439Z | anna328p |
| 003 | Emacs Lisp | 170110T015922Z | Aryaman |
| 001 | Japt | 170109T141122Z | Oliver |
| 001 | Dyalog APL | 170109T085634Z | Adá |
| 005 | Befunge93 | 170110T011505Z | osuka_ |
| 004 | Mathematica | 170109T080315Z | Greg Mar |
| 021 | PHP | 170109T175735Z | Titus |
| 003 | dc | 170109T173321Z | Digital |
| 001 | PigeonScript | 170109T081441Z | TrojanBy |
| 002 | Pushy | 170109T170834Z | FlipTack |
| 001 | Scratch | 170109T111921Z | rahnema1 |
| 003 | FOG | 170109T152229Z | Riker |
| 002 | TIBasic | 170109T152037Z | Timtech |
| 002 | Scala | 170109T143911Z | corvus_1 |
| 004 | OCaml | 170109T140620Z | Dada |
| 010 | Groovy | 170109T123949Z | Gurupad |
| 011 | Python 3 | 170109T123146Z | Blue |
| 002 | Pyth | 170109T122849Z | Blue |
| 004 | Pyth | 170109T120621Z | Gurupad |
| 014 | Python 2 | 170109T115628Z | Erik the |
| 001 | 05AB1E | 170109T115201Z | Erik the |
| 001 | Jelly | 170109T115027Z | Erik the |
| 010 | C# | 170109T113326Z | Horv |
| 013 | C GCC | 170109T090350Z | betseg |
| 009 | JavaScript ES6 | 170109T084151Z | Arnauld |
| 005 | Labyrinth | 170109T081126Z | Martin 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
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
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
Desmoslang Assembly, 5 Bytes
I*IOT
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:
- stack arithmetic:
Result is inST∗ Y 2 Bytes Rₙ ≔ Rₙ × XYnow. Necessary keystrokes:STO×.×(for the letterY). - statistics functions:
IfCLΣ 1 Byte clear statistics registers Σ+ 1 Byte accumulate statistics valuesΣREG?= 11 (the default), result is in R15. - Furthermore, there’s
%(1 Byte), but it will require scaling the result back by a factor of 100.
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^
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
*
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->[.]&+
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
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!
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:
- Outer part:
r+s[r-]r[-n?o?s+]r+s-[A]r[B]s+(based off of my add-two-numbers program) A:@[-r-n+]r[s-o-[r-]r[-@;]](copies@1ton,1at a time)B:n[-r@+r-@+]r[-s+](copiesnto@1and adds it to@1,1at a time)
This forms a loop, until o- is 0 after A runs. Then, @0 is printed.
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
;# ;# * .#
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
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
,<,[>[>+>+<<-]>[<+>-]<<-]>>>.
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
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)
4 x 5 = 20 (0001 0100)
7 x 9 = 63 (0011 1111)
8 x -9 = -72 (1011 1000)
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
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
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
BitCycle -U, 68 bytes
> > v
?+ > +
Bv ?^ v ~
\ v<CB~\v
Cv ^ <\/
^ <@=! <
0A^
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:
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.
Brain-Flak, 56 54 52 bytes
2 bytes saved thanks to a mistake caught by Nitrodon
({}(<()>)<>)({<([{}({}())])><>([{}]([{}]))<>}<{}{}>)
Stack clean version, 62 60 bytes
({}(<()>)(<>))({<([{}({}())])><>([{}]([{}]))<>}<{}{}<>{}{}>)
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
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).
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.
Forked, 5 bytes
$$*%&
$$- read two integers*- multiply top two stack values%- print top of stack as integer&- "terminate", prevent IP from wrapping
Wumpus, 5 bytes
II*O@
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
Java 7, 31 bytes
int c(int a,int b){return a*b;}
As full program (99 90 bytes):
interface M{static void main(String[]a){System.out.print(new Long(a[0])*new Long(a[1]));}}
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
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>
]
Hexagony, 9 bytes
?{?/*!@'/
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
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
Go, 84 bytes
package main
import."fmt"
func main(){a,b:=0,0;Scanf("%d%d",&a,&b);Printf("%d",a*b)}
Worth mentioning:
We import the
fmtpackage to the global namespace by usingimport.. That way, we can refer toScanfandPrintfas global functions.aandbare assigned to0, as that is shorter than doingvar a,b int.
Lua, 32 bytes
i=io.read
print(i("*n")*i("*n"))
Program reads 2 numbers from STDIN and prints the result to STDOUT.
"But shouldn't you use io.write?"
Well according to the documentation,
[...]
writeuses the current output file, whereastostringto its arguments, so it can also show tables, functions, andnil.
Falcon, 34 bytes
a=int(input())
b=int(input())
>a*b
Falcon uses a similar syntax to Python. Its output, however, has these awesome aliases called "fast-printing" (as per the documentation):
printl()can be written as>print()can be written as>>
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:
I: read in input|: reflect IP left-rightI: read in input*: multiplyu: do a right-hand u-turn (i.e., two right turns)O: output as a number. the IP is now facing North, and has a right turn to make, which takes it to*: multiply the top two numbers (essentially a no-op)@: terminate program.
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.
[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:
Tcl, 10 bytes
expr $a*$b
If one states
namespace path tcl::mathop
before then * acts like a procedure:
Tcl, 7 bytes
* $a $b
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.
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
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
Triangular, 6 bytes
$.$%*<
Formats into this triangle;
$
. $
% * <
Without directionals/no-ops, this looks like: $$*%
$- read input as integer*- multiply%- print as integer
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. */
);
}
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
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}
It modifies its first argument (which must be a variable).
Röda 0.12, 7 bytes (non-competing)
{[_*_]}
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!`-
*\)`-¶-
.*
$*_
_
$'$*_
_
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.
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.
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.
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.
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.
×
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)
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
&&*.@
&& 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.
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
*#
As you might have guessed, * is the multiplication operator, and # prints the result.
Scratch, 1 byte
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.
Pyth, 2 bytes
*E
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.
Previous solutions using 5 bytes.
*.).Q and *hQeQ.
Python 2, 14 bytes
lambda a,b:a*b
I feel like this is too much shorter than from operator import*;mul.
C#, 10 bytes
a=>b=>a*b;
It's just a simply multiplication.
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
??*!@
Input format can be almost anything (this simply multiplies the first two decimal integers it finds in the input).







