# Output the sign

Given a number N, output the sign of N:

• If N is positive, output 1
• If N is negative, output -1
• If N is 0, output 0

N will be an integer within the representable range of integers in your chosen language.

## The Catalogue

The Stack Snippet at the bottom of this post generates the catalogue from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.

## Language Name, N bytes


where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

## Ruby, <s>104</s> <s>101</s> 96 bytes


If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

## Perl, 43 + 2 (-p flag) = 45 bytes


You can also make the language name a link which will then show up in the snippet:

## [><>](https://esolangs.org/wiki/Fish), 121 bytes


/* Configuration */

var QUESTION_ID = 103822; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.

/* App */

return "https://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(a) {
});
comment_page = 1;
}
});
}

jQuery.ajax({
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
});
else process();
}
});
}

var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;

function getAuthorName(a) {
return a.owner.display_name;
}

function process() {
var valid = [];

var body = a.body;
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});

var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
});
else console.log(body);
});

valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});

var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;

.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)

var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();

languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});

var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);

langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});

for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
language = jQuery(language);
jQuery("#languages").append(language);
}

}
body {
text-align: left !important;
display: block !important;
}

width: 290px;
float: left;
}

#language-list {
width: 500px;
float: left;
}

font-weight: bold;
}

table td {
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<tr><td>Language</td><td>User</td><td>Score</td></tr>
<tbody id="languages">

</tbody>
</table>
</div>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>

</tbody>
</table>
</div>
<table style="display: none">
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
</tbody>
</table>

• This is a trivial challenge with a lot of trivial solutions. There are however some non-trivial solutions too. To voters: Please read the first sentence of this meta post before upvoting builtin functions. Dec 20, 2016 at 10:10
• This could probably use a leaderboard. Dec 20, 2016 at 11:13
• @MrLister upvote how you want, but really you should look for creativity instead of code length. Dec 28, 2016 at 20:13
• @FlipTack Oh, I thought it was codegolf. Dec 28, 2016 at 20:23
• @MrLister that's the objective winning criterion. but does it really take more effort to type s for a sign builtin, or use some clever bitshifting/maths to work it out? Have a look at this meta post Dec 28, 2016 at 20:25

## F#, 140 bytes

open Checked
let s n=
if n=0 then 0
else
try
let mutable p=n
while p<>0 do
p<-p+1
-1
with| :? System.OverflowException->1


Try it online!

Basically, if the number is non-zero, keep adding 1 to it until you get either 0 (so the original value was negative) or an overflow (so the original value was positive).

That's all right, isn't it?

# naz, 64 bytes

9a5m2x1v3a2x2v1x1f1o0m1a1o0x1x2f1o0x1x3f1r3x1v1e3x2v2e0m1a1o0x3f


Explanation (with 0x commands removed)

9a5m2x1v                 # Set variable 1 equal to 45 ("-")
3a2x2v                   # Set variable 2 equal to 48 ("0")
1x1f1o0m1a1o             # Function 1
# Output once, set the register equal to 1, and output again
1x2f1o                   # Function 2
# Output once
1x3f                     # Function 3
1r                   # Read a byte of input
3x1v1e             # Jump to function 1 if the register equals variable 1
3x2v2e       # Jump to function 2 if the register equals variable 2
0m1a1o # Otherwise, set the register equal to 1 and output
3f                       # Call function 3


# Keg, -hr, 13 bytes

:0<[0;|0>[1|0


Try it online!

A very simple switch like comparison happening here.

# 05AB1E, 2 bytes

A signum built-in.

.±


Try it online!

# Gol><>, 8 bytes

I:SA:?,h


Try it online!

### How it works

I:SA:?,h
I         Input as number; [n]
:        Duplicate; [n n]
SA      Absolute value; [n abs(n)]
:     Duplicate again; [n abs(n) abs(n)]
?    Pop one; if it is zero, skip next command
,   Nonzero n: Divide n by abs(n)
h  Print top as number and exit


# Gol><>, 11 bytes

I:0(qm$0)+h  Try it online! ### How it works I:0(qm$0)+h

I            Input as number
:           Duplicate top
0(         Change top to "top < 0"
q        If top is true...
m$Push -1 and swap top two; the stack is [-1 x] Otherwise, skip two commands (m$); the stack is [x]
0)    Change top to "top > 0"
h  Print top as number and halt


## PowerShell, 22 21 bytes

[math]::sign("$args")  Boring built-in, calls the .NET function that does exactly what it says on the tin. Ho-hum. Try it online! -1 byte thanks to Veskah. For 26 bytes however, we get the classic greater-than less-than equation param($b)($b-gt0)-($b-lt0)


This, at least, has a little bit of logic and thought put into it. Try it online!

Best yet, though is 44 bytes, where we roll our own solution.

param($b)if("$b".indexof('-')){+!!$b;exit}-1  Here we take input $b, stringify it, take the .IndexOf('-') on it, and use it in an if clause. If the negative sign isn't found, this returns -1, which is truthy in PowerShell, so we turn $b into a Boolean with !, invert the Boolean with another !, cast it as an int with +, leave it on the pipeline, and exit. This turns a positive integer (which is truthy) into $false, then $true, then 1, while turning 0 into $true, then $false, then 0. Otherwise, the .IndexOf returned 0 (meaning it was the first character in the string), which is falsey, so we skip the if and just place a -1 on the pipeline. In either case, output via implicit Write-Output happens at program completion. Try it online! • "$args" saves a byte Mar 9, 2020 at 14:01
• @Veskah I'm reasonably sure I wrote this answer before I knew that trick, hehe. :D Mar 9, 2020 at 16:02

# Scratch 3.0, 9 blocks/44 bytes

For those who are tired of the old way of introducing these answers [I'm looking at you a'_' ...(ಠ ͟ʖಠ)], I'll put the ScratchBlocks Syntax first:

define f(n
set[r v]to(<(n)>(0)>-<(n)<(0
say(r


I decided to use a function instead of the old when gf clicked approach because that means I don't have to deal with having an ask() and wait next.

• Always remember to abuse the bool type conversion!
– user85052
Jan 27, 2020 at 10:58

# Io, 28 bytes

Does a conditional checking over x/abs(x).

method(x,if(x!=0,x/x abs,0))


Try it online!

# Symja, 29 26 bytes

f(x_):=If(x==0,0,x/Abs(x))


Try It Online!

-3 bytes to due porting the idea behind the Io answer.

### 29 bytes

f(x_):=If(x<0,-1,If(x>0,1,0))


For some reason, my edit history didn't save this old approach.

• I'd be interested to know what approach you used for the 29 bytes solution
– user92069
Mar 26, 2020 at 2:29
• Wait, why is my edit history not showing? Mar 26, 2020 at 2:30
• @a'_' I added the 29 byter Mar 26, 2020 at 2:31

# Python 3, 25 bytes

lambda x:x and(1,-1)[x<0]


Try it online!

Uses a different approach from other python answers

• You could use (x>0)*2-1 instead of (1,-1)[x<0]. Mar 26, 2020 at 11:45

## Desmos, 12 bytes

f(x)=sign(x)


or $$f\left(x\right)=\operatorname{sign}\left(x\right)$$ Try It On Desmos!

• I would change "TIO" to something like "View the plot on desmos.com" not to cause confusion with tio.run. Mar 26, 2020 at 11:43

# ArnoldC, 498 bytes

IT'S SHOWTIME
HEY CHRISTMAS TREE n
YOU SET US UP 0
GET YOUR ASS TO MARS n
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
HEY CHRISTMAS TREE m
YOU SET US UP 0
GET TO THE CHOPPER m
HERE IS MY INVITATION n
GET UP n
GET UP 1
ENOUGH TALK
GET TO THE CHOPPER m
HERE IS MY INVITATION m
GET DOWN 1
I LET HIM GO m
GET DOWN 1
ENOUGH TALK
GET TO THE CHOPPER m
HERE IS MY INVITATION m
GET UP 1
I LET HIM GO m
ENOUGH TALK
TALK TO THE HAND m
YOU HAVE BEEN TERMINATED


Try it online!

### Explanation

IT'S SHOWTIME

# n = 0
HEY CHRISTMAS TREE n
YOU SET US UP 0

# n = input
GET YOUR ASS TO MARS n
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY

# m = 0
HEY CHRISTMAS TREE m
YOU SET US UP 0

# m = n + n + 1
GET TO THE CHOPPER m
HERE IS MY INVITATION n
GET UP n
GET UP 1
ENOUGH TALK

# m = ((m - 1) % m) - 1
GET TO THE CHOPPER m
HERE IS MY INVITATION m
GET DOWN 1
I LET HIM GO m
GET DOWN 1
ENOUGH TALK

# m = (m + 1) % m
GET TO THE CHOPPER m
HERE IS MY INVITATION m
GET UP 1
I LET HIM GO m
ENOUGH TALK

# print m
TALK TO THE HAND m

YOU HAVE BEEN TERMINATED

• Sorry, skynet got my computer before I could read the explanation. Sep 2, 2020 at 2:26

signum


It's a function belonging to the Num typeclass, so every number works.

# 8th, 40 3 bytes

With 8th is quite simple to get the sign of N, which is left on TOS

sgn


Testing and Output

ok> 42 sgn .
1
ok> -42 sgn .
-1
ok> 0 sgn .
0


The following code, as an alternative, has the same behaviour of 8th's builtin word n:sgn

: f dup 0; 0 n:> if 1 else -1 then nip ;


Explanation of word f

: f \ n -- -1|0|1
dup     \ Duplicate input
0;      \ Check if number is 0. If true, leave 0 on TOS and exit from word
0 n:>   \ Check if positive
if 1    \ Return 1 if positive
else -1 \ Return -1 if negative
then
nip     \ Get rid of input
;


Testing and Output

ok> 42 f .
1
ok> -42 f .
-1
ok> 0 f .
0


# COW, 153 75 bytes

oomMMMmoOMoOmoOMMMMOOmoOOOOMOomOoMoOmOomOoMOOMOomoOmoOMMMOOOmooMMMmoomoOOOM


Try it online!

COW can't compare numbers so N is stored in two cells, (if N is not 0) in turns one will be increased and the other decreased. When eventually one of them reaches 0, the loop will stop.
The sign will be in the next cell.

## Detailed Explanation:

[0]: N to be incr   [1] = -1   [2]: N to be decr   [3] = 1

i=>+>=          ;   Read N in [0], set [1] = 1 and copy it to [2]
[               ;       Loop while [2] is non-zero
>°-<+<<     ;       Set [3] = -1, increase [2] then point to [0]
[           ;           Loop while [0] is non-zero
->>=°   ;           Decrease [0], point to [2] copy in register and set it to 0 (to exit)
]           ;
=           ;       Paste from register to [2]
]               ;   When exiting the poited cell could be [0] or [1], in either case...
>o              ;   ...move one right and it would contain the correct output

moo ]    mOo <    MOo -    OOO °    OOM i
MOO [    moO >    MoO +    MMM =    oom o


I've tried other permutations of memory cells but this seems the best.
Setting [3] (a constant) inside the loop is needed to manage the case N=0.

# Stax, 2 bytes

:+


Run and debug it

Stax has a sign builtin. Kind of boring. Here's a solution that uses clamp instead

# Stax, 4 bytes

U1:c


Run and debug it

U    push -1 to stack
1   push 1 to stack
:c clamp input between -1 and 1


# Python - 23 bytes

print((n>0)*2+(n==0)-1)


This checks if n is greater than 0 (in which case it outputs 2 for the next step), then if it is equal to 0 (in which case it outputs 1) and then subtracts 1, leaving us with -1 if n < 0, 0 if n == 0, and 1 otherwise.

(Yes, the double brackets are necessary, I have checked.)

# Lua, 38 bytes

function(n)return n//math.abs(n-.1)end


Try it online!

This version works properly on all integer values, as asked for by this challenge. Which is a shame, because it's not very interesting, nor is it unique within the answers to this challenge.

# Lua, 46 45 bytes

This version works on floating point input (in particular, positive inputs $$\\le 0.1\$$, unlike the above solution). The likely best solution brings in a golf optimization likely unique to Lua. There's no challenge asking for the sign to be outputted for floating point inputs, so the best place to put it is here:

function(n)return n/math.abs(n+#{[n+1]=0})end


Try it online!

Previous 46 byte versions:

function(n)return n>0 and 1 or#{[n+1]=0}-1 end


Try it online!

function(n)return n<0 and-1 or 1-#{[n+1]=0}end


Try it online!

These use a tip I have explained here, which is a basically a workaround for Lua's strong typing. Without that trick it would be 48-49 bytes:

function(n)return n==0 and 0 or n/math.abs(n)end
function(n)return n~=0 and n/math.abs(n)or 0 end
function(n)return n/math.abs(n+0^math.abs(n))end
function(n)return n>0 and 1 or n<0 and-1 or 0 end
function(n)return n<0 and-1 or n>0 and 1 or 0 end


# Pxem, Contents: 0 bytes + Filename: 33 25 bytes

• Filename(unprintables are escaped): 1._.c.w\001.r.yXX-.a.p.d.a.n
• Content is empty.

Try it online!

## Usage

Give an integer from STDIN. The result is output from stdout, with no LF termination.

## How it works

XX.z
# Prepare character 1 at this point
.aXX1.z
# integer input is pushed
.a._XX.z
# duplicate, and is it non-zero?
.a.c.wXX.z
# then come here
# also \001.r is an idiom to push zero:
# actually "n=pop;push(int(random()*n))"
# where 0<=random()<1
# because filename cannot have null character
# don't be afraid of such binary for code golf
.a\001.rXX.z
# is input less than zero?
# DOT-y to DOT-a is:
# while size<2 OR pop>pop; do something; done
.a.yXX.z
# if so, push hyphen so string "-1" is made
.aXXXX-.z
.a.aXX.z
# at this point DOT-y popped two items: zero and input integer
# so no worry about garbages
# print the string and exit
# .p is actually: while !empty; do printf "%c", pop; done
.a.p.dXX.z
# if input is zero, come here
# .n is printf "%d", pop
# OBTW the "1" will on stack, but it's not matter,
# because it is ignored when program ends
.a.a.n


## Previously

• 33bytes of filename: ._.c.w.c00.-.-.z-1.p.d.a1.o.d.a.n
• this language is really cool Jun 1, 2021 at 8:30

# Japt, 1 byte

g


Try it online!

# Alice, 19 13 bytes

-6 bytes thanks to Martin Ender

1i4/o
-% \7@/


## Explanation

1                     - Push 1                          [1]
i                    - Take input from STDIN           [1,x]
4/7                 - Push 47 while going to Ordinal  [1,n,47]
/                - Back to Cardinal, wrap around.  [1,n,47]
-               - Subtract 47 from n              [1,n]
%              - 1 mod n                         [n]
\o@           - Go to Ordinal, print and terminate.



Try it online!

• It's normally not necessary to use " to push numbers onto the stack. A simpler way is to push the 4 in Cardinal mode and then append the 7 in Ordinal mode. You can then also save a few bytes by interleaving the two segments in Ordinal mode: tio.run/##S8zJTE79/98w00Q/n0tXVSHG3EH//39dQyNjAA (I also push the 1 at the start to avoid the ~ but it doesn't really make a difference for the byte count) Jun 4, 2021 at 13:15
• Ah, I somehow didn't see appending numbers in Ordinal while checking the command list. Thanks for the advice! Jun 4, 2021 at 13:25

# Python 3.8, 47 bytes

print(1if(n:=int(input()))>0else-1if n<0else 0)


# tinylisp, 32 bytes

(d F(q((X)(i X(i(l X 0)(q -1)1)0


Try it online!

Since there are no negative number literals in tinylisp, they have to be passed in using subtraction.

• Not so--there are negative numbers, just not negative-number literals. (s 0 1) gives -1, for instance. Feb 5 at 4:45

## Pyke, 5 bytes

0'<>-


Try it here!

0'<>  - 0<input, 0>input
- - ^-^


### Main module, 61 bytes

readline 0
set B =48
set B =45
set K -1
print 1


### Module a, 44 bytes

decr B
decr *0
~*0:print K
~*0:exit


# PARI/GP, 4 bytes

sign


Another boring built-in.

# GameMaker Language, 22 bytes

return sign(argument0)


Alternative solutions:

return median(1,argument0,-1)
a=argument0 return (a>0)-(a<0)
a=argument0 return max(-1,min(a,1))
a=argument0 if a return a/abs(a)return 0


## Clojure, 24 bytes

#(cond(> % 0)1(< % 0)-1 0 0)


An anonymous function that checks for being greater than 0, less than 0, then defaults on 0 if neither is true. cond acts as (and is a macro resulting in) an if-else tree. Unfortunately, it requires an even number of arguments, so I had to waste 2 bytes by adding an extra number to mean true to default on.

Ungolfed:

(defn sign [n]
(cond
(> n 0) 1
(< n 0) -1
:else 0))


# BotEngine, 7x17=119

v #  #0123456789
>Ie~>SSSSSSSSSSS
^ <<<<<<<<<<P
PeeS-        1e
Pe1-S0123456789
0  > SSSSSSSSS
>>>>>>>>>^


## F#, 31 9 bytes

Math.Sign


(Saved 22 bytes thanks to @pmbanka's advice :))

fun(i:int)->System.Math.Sign(i)


I was about to post a C# solution.. but it already exists :(

So I decided to have some fun with F#!!

//a solution with 24 bytes, but you have to put open System into the file.
//Not sure if that would be valid...

fun(i:int)->Math.Sign(i)

• I think you don't need to wrap a function inside a lambda. The answer could be as simple as System.Math.Sign, with example usage System.Math.Sign 2 BTW, in F# you don't need to wrap a single argument in a parentheses, saving a byte. And as a side note, I think that C# not counting using System; is a bit weird, but maybe these are the rules here... In such case, assume open System is there as well. Dec 21, 2016 at 11:19
• I'm not very familiar with F#, but unless System is imported by default, you have to use the fully-qualified name System.Math.Sign.
– user45941
Dec 23, 2016 at 14:47