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.

• 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. – Stewie Griffin Dec 20 '16 at 10:10
• This could probably use a leaderboard. – Martin Ender Dec 20 '16 at 11:13
• @MrLister upvote how you want, but really you should look for creativity instead of code length. – FlipTack Dec 28 '16 at 20:13
• @FlipTack Oh, I thought it was codegolf. – Mr Lister Dec 28 '16 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 – FlipTack Dec 28 '16 at 20:25

FORTRAN 77, 87 bytes

      READ*,I
IF(I)1,2,3
1     PRINT*,-1
2     PRINT*,0
3     PRINT*,1
END


It is a nice use for the "harmful" arithmetic if statement. Unfortunately, this lovely feature was obsolete in Fortran 90 and posterior versions.

Curiously, gfortran can't handle with this arithmetic if, even if I save the file with .f extension. Therefore, I could not test this code.

Whitespace, 7372 68 bytes

[S S S T    N
_Push_1][S N
S _Duplicate_1][S N
S _Duplicate_1][T   N
T   T   _Read_as_integer][T T   T   _Retrieve][S N
S _Duplicate_input][S N
S _Duplicate_input][N
T   T   N
_If_negative_jump_to_Label_NEGATIVE][N
T   S S N
_If_0_jump_to_Label_ZERO][S N
T   _Swap_top_two][T    N
S T _Print_as_integer][N
N
N
_Exit][N
S S N
_Create_Label_NEGATIVE][S S T   T   N
_Push_-1][T N
S T _Print_as_integer][N
N
N
_Exit][N
S S S N
_Create_Label_ZERO][T   N
S T _Print_as_integer]


Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Example runs:

Positive:

Command    Explanation                   Stack           Heap     STDIN    STDOUT    STDERR

SSSN       Push 1                        [1]             {}
SNS        Duplicate top (1)             [1,1]           {}
SNS        Duplicate top (1)             [1,1,1]         {}
TNTT       Read STDIN as integer         [1,1]           {1:5}    5
TTT        Retrieve at heap 1            [1,5]           {1:5}
SNS        Duplicate top (5)             [1,5,5]         {1:5}
SNS        Duplicate top (5)             [1,5,5,5]       {1:5}
SNT        Swap top two                  [5,1]           {1:5}
TNST       Print top as integer          [5]             {1:5}             1
NNN        Exit                          [5]             {1:5}


Program stops with an error: Label does not exist
Try it online (with raw spaces, tabs and new-lines only).

Zero:

Command    Explanation                   Stack           Heap     STDIN    STDOUT    STDERR

SSSN       Push 1                        [1]             {}
SNS        Duplicate top (1)             [1,1]           {}
SNS        Duplicate top (1)             [1,1,1]         {}
TNTT       Read STDIN as integer         [1,1]           {1:0}    0
TTT        Retrieve at heap 1            [1,0]           {1:0}
SNS        Duplicate top (0)             [1,0,0]         {1:0}
SNS        Duplicate top (0)             [1,0,0,0]       {1:0}
NSSSN      Create Label_ZERO             [1,0]           {1:0}
TNST       Print top as integer          [1]             {1:0}              0
error


Program stops with an error: No exit defined
Try it online (with raw spaces, tabs and new-lines only).

Negative:

Command    Explanation                   Stack           Heap     STDIN    STDOUT    STDERR

SSSN       Push 1                        [1]             {}
SNS        Duplicate top (1)             [1,1]           {}
SNS        Duplicate top (1)             [1,1,1]         {}
TNTT       Read STDIN as integer         [1,1]           {1:-5}   -5
TTT        Retrieve at heap 1            [1,-5]          {1:-5}
SNS        Duplicate top (-5)            [1,-5,-5]       {1:-5}
SNS        Duplicate top (-5)            [1,-5,-5,-5]    {1:-5}
NSSN       Create Label_NEG              [1,-5,-5]       {1:-5}
SSTTN      Push -1                       [1,-5,-5,-1]    {1:-5}
TNST       Print top as integer          [1,-5,-5]       {1:-5}            -1
NNN        Exit                          [1,-5,-5]       {1:-5}


Program stops with an error: Label does not exist
Try it online (with raw spaces, tabs and new-lines only).

Brain-Flak, 40 38 bytes

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


Try it online!

A bit longer at 50 bytes, but here's a version that acts only on the top value of the stack, returning 0, -1 or 1 depending on the sign of the number.

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


How it Works:

{ If number is not 0
<>(())<> Push 1 to the other stack as the sign
{ While number != 0
(([{}[]])) Push -(number+stack height) twice
<>([{}])<> Negate sign, alternating it between -1 and 1
} end while
}<>({}) Switch to other stack and force a 0 if the stack is empty


TIS-n11, 57 bytes

@0
MOV UP ACC
SUB 998
SUB 998
MOV ACC ANY


Try it online!

The integral data type supported by TIS ranges from -999 to 999. Any value in input, code, or calculations is silently coerced (clamped) into that range (instead of truncation, overflowing, etc.).

So, by adding 998 to any number, then subtracting the same amount, it becomes 1 is it was positive, and stays untouched otherwise. We then do the same to coerce all negative numbers to -1.

We need to subtract across two separate operations, due to the coercion mentioned above.

If you are familiar with TIS-100, you will be used to a 3x4 array of computational nodes, however, this solutions only uses one such node, nominally taking input from above and giving it below.

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. – pmbanka Dec 21 '16 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. – Mego Dec 23 '16 at 14:47

Go, 49 bytes

func s(x int)int{return(x>>63)|int(uint(-x)>>63)}


Note: this won't work on the playground until Go 1.8 is released due to this bug: https://github.com/golang/go/issues/16203

• Possibly doesn't work for the minimum integer (-1<<63)? – Neil Dec 21 '16 at 10:30
• @Neil nope! Should work for all 64 bit integers. – Eric Lagergren Dec 21 '16 at 16:12
• Oh, I see now, you just get -1|1 in that case, which is still -1. – Neil Dec 21 '16 at 20:13

OCaml, 4 bytes

sign


Didn't even know there was a built-in for this. Alternative 18 bytes solution:

fun x->compare x 0


Stacked, 4 bytes

sign


Takes input from top of stack. Bonafide function:

a/sqrta*a
0>$0  • Could you link to an interpreter? – Mego Dec 23 '16 at 15:01 Python 2, 26 Bytes b=input() print(b>0)-(b<0)  Factor, 71 bytes Expects a string. [ 0 swap nth { { CHAR: - [ -1 ] } { CHAR: 0 [ 0 ] } [ drop 1 ] } case ]  ungolfed: : sign-of ( x -- y ) 0 swap nth { { CHAR: - [ -1 ] } { CHAR: 0 [ 0 ] } [ drop 1 ] } case ;  Python 3, 29 bytes lambda a:(a>>31)|a  Tested--it works. EDIT: Sigh...8 more bytes because the previous solution was taken. EDIT 2: Fixed a bug. EDIT 3: Knocked 10 bytes off. Now this is shorter than the one that was already taken! • This solution already exists – Mego Dec 23 '16 at 21:39 • Darn it! Should I change my solution? – python-b5 Dec 23 '16 at 21:43 • Yes, please. Either delete it, or edit it to be distinct. – Mego Dec 23 '16 at 21:43 • You can keep your original answer if you wish, duplicate answers are allowed. – xnor Dec 25 '16 at 8:54 • This fails on positive inputs. – isaacg Jan 11 '17 at 8:12 MS Excel, 9 Bytes Takes Input from cell A1. =SIGN(A1)  Symbolic Python, 24 bytes Like many other solutions, this uses the formula s(x) = (x > 0) - (x < 0). Note that this solution is non-competing as the language postdates the challenge. __={}>{} _=(_>__)-(_<__)  Symbolic Python is a restricted source version of Python: all alphanumeric characters are banned. The interpreter automatically puts input in the variable _. From there, the code works like so: • {}>{} generates the value False. This is then assigned to the variable __. Although it's technically a boolean, we use this as the integer 0: • (_>__) checks whether the input is greater than 0. (_<__) checks whether the input is smaller than 0. These booleans are then interpreted as integers, and the first is subtracted from the second. • The result of this is put in the variable _, which is automatically printed after execution. Ruby, 19 bytes Not quite as golfy as my other answer. ->n{("%+b"%n)[0,2]}  Outputs -1, +0, +1 Japt, 1 byte (non-competing) g  Try it online! 8th, 40 bytes The following code 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  tcl 24 23 puts [expr$n<0?-1:$n>0]  Thanks to http://wiki.tcl.tk/819 page authors! UPDATE: based on the C answer https://codegolf.stackexchange.com/a/103831/29325 puts [expr !!$n|\$n>>31]


can be run on http://rextester.com/live/BKGZ8868 where i tested with -9,0,9

Fourier, 18 17 bytes

I~A<0{1}{-}A/Ao


Try it on FourIDE!

Explanation pseudocode:

A = Input
If A<0 Then
Print "-"
End If
Print A/A


MY, 3 bytes

Hex:

 1A #Input integer
2A #Sign function
27 #Output (trailing newline)


Excel VBA, 10 Bytes

Anonymous VBE immediate window function that takes input from cell [A1] and outputs -1,0 or 1 to the VBE immediate window

?Sgn([A1])


Common Lisp, 39 bytes

(defun f(x)(if(= x 0)0(if(> x 0)1 -1)))


Try it online!