# 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. – 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

# Brain-Flak, 4846 40 bytes

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


Try it Online

## Explanation

{                                }{}({}) #Do nothing if zero
({}<([()])>)                          #Put a -1 under input
([            ]<>(()))                  #Put 1 and a negative copy of input on the off stack
{        }        #Until zero
({}())           #Increment
<>         #Swap


# Python 3, 20 bytes

Since Python 3 doesn't have access to cmp like Python 2 does, it's a little longer

lambda n:(n>0)-(n<0)

• Practically the same as this answer: codegolf.stackexchange.com/a/103831/41805 – user41805 Dec 21 '16 at 11:35
• @KritixiLithos practically but it's also an entirely different llanguage – Dillanm Dec 21 '16 at 11:37
• How about n//abs(n) for two bytes – Phlarx Dec 21 '16 at 21:28
• @Dillanm ah, right. Didn't catch that, obvious in hindsight :P – Phlarx Dec 22 '16 at 16:16
• @Dillanm You can, actually, but it's several bytes longer: n and n//abs(n) – Phlarx Dec 23 '16 at 16:19

# Befunge 93, 14 13 bytes

Golfed off a byte by combining the 2 1s

1~50p :0_.@.


Try it Online!

This one is interesting, as it takes the first character of the number and alters the code accordingly.

 ~50p         Stores the first character in the space (labeled <char> here)
1    <char>   If the number is negative, it performs subtraction, giving 1 - 0 == -1
If it is 0, 0 is on top. If it is positive, a positive # will be.

:0_         This checks the top number to see if it is positive.
.@       If it is <1, it is printed. (0 or -1)
1     @.      Otherwise, the IP loops back harmlessly, and prints 1


# 05AB1E, 3 bytes

0.S


Try it online!

• Oh wow! (I mean, how did you get it so long?) – user85052 Jan 26 at 23:38
• @a'_' Well, there wasn't any way of doing it shorter than this. – Emigna Jan 27 at 20:36
• Don't use the legacy version and you have 2 bytes – Steffan Mar 27 at 20:13
• 2 bytes is possible even on the legacy version – Grimmy Apr 24 at 9:59

## Labyrinth, 8 bytes

1,_47-%!


Try it online!

I'm posting this as a separate answer because my other Labyrinth answer is based on arithmetic on the actual numerical input value, whereas this mostly ignores the number and works with the character code of the first character instead.

### Explanation

So yeah, this reads the first character code which is either 45 (-, which should yield -1), 48 (0, which should yield 0) or 49 to 57 (1-9, which should yield 1). This mapping can be accomplished via the simple formula 1 % (x - 47). To see why this works, here is the breakdown of the code for 3 different examples:

Code    Comment             Example -5      Example 0       Example 5
1       Push 1.             [1]             [1]             [1]
,       Read character.     [1 45]          [1 48]          [1 53]
_47-    Subtract 47.        [1 -2]          [1 1]           [1 6]
%       Modulo.             [-1]            [0]             [1]
!       Print.              []              []              []


The instruction pointer then hits a dead end, turns around and terminates when % now attempts a division by zero.

Another simple computation that works:

x -= 46
x %= x-1


# Turing Machine code, 65 bytes

0 0 0 * halt
0 - - r 2
0 * 1 r 3
2 * 1 r 3
3 * _ r 3
3 _ _ * halt


Try it online.

• Could you link to an interpreter? – user45941 Dec 23 '16 at 15:00
• couldn't you output using halt state here :P – ASCII-only Apr 12 '19 at 7:19

# Hexagony, 13 bytes

?</!~/~@$\!@  Expanded:  ? < / ! ~  / ~ @$ \ !
@ . . .
. . .


Try it online!

Hexagony truthy/falsiness for numbers checks based on being positive or not. This makes singling out zero a bit tricky, so we check if a number and its negation are both non-positive to check for zero. Uses the unprintable character 0x01 to literally store 1 in a memory edge to save a byte zeroing the edge first. In the expanded version it is between the ~ and the / on the second line.

### Breakdown:

For positive numbers the code is very simple. We start at the top left moving eastward, then take the fork to the right. The rest of the program is "linear" along the surface of the code, giving: ?<0x01\.!@ where both \ and . are no-ops. 0x01 sets the current memory edge to 1 and then ! prints that and @ ends the program.

For negative numbers and zero, we start the same but turn left at the <. This leads us back around to the \ but this time approaching from the southwest. This time it acts as a mirror and redirects the instruction pointer westward. The $ allows us to skip the program-ending @. Next we hit ~ which negates the value that we read in. If the number was negative it is now positive, and if it was zero it is still not positive. When hitting the edge of the hexagon we wrap to the right if the value was positive and to the left if the value was negative or zero. Negative numbers will then wrap to the right and begin moving westwards from the top right. Hitting some mirrors leads us to a familiar looking path starting with the edge being set to 1. Then ~ negates it and ! prints giving -1. We wrap around and hit the other @. Zero will instead wrap to the bottom, which has nothing but no-ops. Then it wraps back to the middle and is printed by !. Then some mirrors redirect us to the @ to end the program. # Excel, 8 bytes =Sign(n)  Pretty basic, but the only language I feel complete confidence in. Without a builtin! ## Excel, 23 bytes =If(n>0,1,If(n<0,-1,0))  not so confident ### Crystal Reports Formula (Noncompete), 24 bytes IIF(n>0,1,IIF(n<0,-1,0))  # Minecraft Functions (18w11a, 1.13 snapshots), 131 bytes Uses a function named a in the minecraft namespace execute if score @p n matches 0 run say 0 execute if score @p n matches 1.. run say 1 execute if score @p n matches ..-1 run say -1  "Takes input" from a scoreboard objective named n, create it with /scoreboard objectives add n dummy and then set it using /scoreboard players set @p n 8. Then call the function using /function a # Hexagony, 18 15 bytes ~.?>.)<<!!.&,.@  Try it online! n > 0  ~ . ? . . . . < . ! . . , . @ . . . .  n == 0  ~ . ? > . ) < < . ! . & . . @ . . . .  n < 0  ~ . ? > . ) < < ! . . . , . @ . . . .  Abuses the same EOF trick used in Jo Kings answer. Sadly I currently don't have access to these neat visual tools used in other solutions. # Mathematica, 28 bytes Limit[2ArcTan@x#/Pi,x->∞]&  # Mathematica, 30 bytes 2HeavisideTheta@#-1/._[_]->1/2&  # Mathematica, 76 bytes Round@Integrate[E^(2#+I t#)/(2+I t)/Pi,{t,-∞,∞},PrincipalValue->True]-1&  Just to be different :) • Median@{#,1,-1} and #~Min~1~Max~-1 if you want some more ideas ;) – Martin Ender Dec 20 '16 at 12:09 • Personal challenge to you: find an implementation that's longer than 76 bytes, but fully golfed for its algorithm (can you be turned to the dark side?!). – Greg Martin Dec 20 '16 at 18:43 • Can I take you up on this challenge? – Gabriel Benamy Dec 20 '16 at 23:29 • Of course! .. :) – Greg Martin Dec 21 '16 at 0:13 # Forth, 22 bytes Golfed : S dup 0< swap 0> - ;  Test : S dup 0< swap 0> - ; ok 0 S . 0 ok 1 S . 1 ok -1 S . -1 ok 12345 S . 1 ok -12345 S . -1 ok  Try It Online ! • Nice. I was going to post something similar that I wrote several months ago. – mbomb007 Dec 20 '16 at 22:38 # x86_64 machine language on Linux, 13 bytes  0: 31 c0 xor %eax,%eax 2: 85 ff test %edi,%edi 4: 0f 9f c0 setg %al 7: c1 ef 1f shr$0x1f,%edi
10:   29 f8                   sub    %edi,%eax
12:   c3                      retq


The input (first function parameter) is passed into %edi. To try it out, compile and run the following C program

#include<stdio.h>
#include<stdlib.h>
#define s(x) ((int(*)(int))"\x31\xc0\x85\xff\xf\x9f\xc0\xc1\xef\x1f\x29\xf8\xc3")(x)
int main(){
printf( "%d %d %d\n", s(-5), s(0), s(44) );
}

• I'm a bit surprised that x86 doesn't have a builtin for sign. – user45941 Dec 23 '16 at 15:00
• Casting a C string to a function pointer? That's nasty. – Fund Monica's Lawsuit Dec 26 '16 at 1:08
• @QPaysTaxes, that is also an elegant/horrifying way to make lambdas in C qsort(a,sizeof a/4,4,"\x8b\7+\6\xc3"); – ceilingcat Dec 29 '16 at 5:17
• I got virtually the same solution in a language I created that is based off of C lambdas. What C code did you use to generate this machine code? – MD XF Mar 27 '18 at 18:50

# Plain English101 81 bytes

To put a n number's sign into a s number:
Get the sign of the n returning the s.


Ungolfed version:

To put a number's sign into another number:
Get the sign of the number returning the other number.


Either version can be used to golf the client code -- and make the client code more readable. For example, the following line of code displays a Windows message box containing the number -1 in the message body:

Debug -456's sign.


The Plain English IDE is available at github.com/Folds/english. The IDE runs on Windows. It compiles to 32-bit x86 code.

• ... I don't think that the Ungolfed version was really necessary – Taylor Scott Aug 1 '17 at 18:36

# LOLCODE, 191 bytes

HAI 1.3
I HAS A J ITZ A NUMBR
GIMMEH J
BIGGR OF J AN 0, O RLY?
YA RLY
VISIBLE "1"
NO WAI
BOTH SAEM "0" AN J, O RLY?
YA RLY
VISIBLE "0"
NO WAI
VISIBLE "-1"
OIC
OIC
KTHXBYE


Try it online!

• This is surprisingly readable. – Reinstate Monica -- notmaynard Nov 21 '17 at 18:17
• @iamnotmaynard funny right? – FantaC Nov 21 '17 at 19:31

# Befunge-93 (PyFunge), 12 bytes

~"1"%90p1X.@


Try it online!

Note that the X can be anything (except a new line), as it gets written over during run-time. It's just easier for explanation

Similar to my other Befunge answer, but this time it mods the first character by the ASCII for 1 first, so that a positive first digit will turn into a no-op, leaving the 1 on the top of the stack:

~               Read the first *character* of input - either a digit or "-"
"1"%           Mod the character by the ASCII value of 1. After this step, the character
is a '-' for negative numbers, '0' for 0, and small, unprintable
characters for positive numbers

90p        Puts the character in the space with the X.
1       Pushes a 1

X      3 different options based on the character that was put here:
-      Negative: Subtract the 1 from the implicit 0 to get -1
0      Zero:     Push 0
Positive: A no-op, which leaves the 1 on top

.     Prints out the top of the stack
@    Ends the program


# Hexagony, 16 bytes

...!/~.?.<.!1@.,


Try it online!

Not much smaller than the previous answer, but strangely elegant in comparison.

Expanded:

   . . .
! / ~ .
? . < . !
1 @ . ,
. . .


# 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.

# Python 3, 30 bytes

Just here to share another solution.

lambda x:eval(f'x and {x}**0')


Try it online!

## Explanation

lambda x:                      # Lambda function with the variable x
eval(f'      {x}**0') # Raise x to the power of 0
x and          # Since 0 ** 0 = 1, we prevent that
# by using logical and.


# Python 3, 26 25 bytes

An interesting way to approach this problem using the irregularity of Python 3 hash function.

lambda x:x/abs(~hash(~x))


Try it online!

## Explanation

The big idea is to return x/abs(x). However, this causes division by 0 if x is 0.

hash(i) (where $$\i\$$ is an integer) returns $$\i\$$ most of the time, with the exception of hash(-1) returning $$\-2\$$. Thus ~hash(~x) (where ~ denotes bitwise negation) evaluates to:

• If x != 0: ~hash(~x) == ~~x == x
• If x == 0: ~hash(~0) == ~hash(-1) == ~(-2) == 1

Thus instead of dividing by abs(x), we divides by abs(~hash(~x)) which can never be 0.

Note: This will not work for large integers ($$\\ge2^{61}\$$), since hash of long integer is calculated differently.

# Mornington Crescent, 20602054 1246 bytes

The improved solution is here!

Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take District Line to Acton Town
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Central Line to Holborn
Take Central Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take District Line to Parsons Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Central Line to Holborn
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Leicester Square
Take Northern Line to Leicester Square
Take Northern Line to Mornington Crescent


Try it online!

The algorithm:

1. Parse an integer out of the string provided as input at Parsons Green.
2. Take the two's complement of the result of step 1 at Notting Hill Gate.
3. Compute the value of 1 by dividing the result of step 2 by itself.
4. Take the two's complement of 1 to get -2.
5. Take the greater of -2 and the result of 2.
6. Take the two's complement of the result of step 5.
7. Parse an integer out of a string that contains no integer at Parsons Green, yielding 0.
8. Take the two's complement of 0 to get -1.
9. Take the greater of -1 and the result of step 6.
10. Output the result. In conclusion, the program clamps the integer between the values of -1 and 1, similarly to other solutions.

Old solution:
Took me the better part of two days to figure it out, but I think I have it. The program does not function correctly if faced with -0 or 03 as inputs, so its preconditions are such that there are no leading zeros in the input and that -0 is invalid as well.

Take Northern Line to Charing Cross
Take Northern Line to Charing Cross
Take Northern Line to Bank
Take Circle Line to Bank
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Green Park
Take Victoria Line to Green Park
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Upney
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Cannon Street
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Upminster
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Upney
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Acton Town
Take District Line to Upney
Take District Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take Piccadilly Line to Bounds Green
Take Piccadilly Line to Acton Town
Take District Line to Acton Town
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take District Line to Barking
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Barking
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent


Try it online!

The algorithm:

1. Get the first character of the input, which should be - if negative, 0 if zero, or any other digit 1 through 9 if positive.
2. Convert to ASCII. Now the program should have 45 if the input was negative, 48 if the input was zero, and an integer between 49 and 57 if the input was positive.
3. Take the bitwise NOT of the ASCII integer. Now the program should have -46 if the input was negative, -49 if the input was zero, and an integer between -50 and -58 if the input was positive.
4. Add 49 to the previous integer. Now the program should have 3 if the input was negative, 0 if the input was zero, and an integer between -1 and -9 if the input was positive.
5. Complete integer division by 3. Now the program should have 1 if the input was negative, 0 if the input was zero, and an integer between -1 and -3 if the input was positive.
6. Take the maximum function of the previous integer and -1 (taking whichever is larger). Now the program should have 1 if the input was negative, 0 if the input was zero, and -1 if the input was positive.
7. Take the bitwise NOT of the previous integer. Now the program should have -2 if the input was negative, -1 if the input was zero, and 0 if the input was positive.
8. Add one to the previous integer. Now the program should have -1 if the input was negative, 0 if the input was zero, and 1 if the input was positive. We are done.

Overall, a very rewarding but tiring experience.

EDIT, -6 bytes: Changed Embankment to the shorter Barking.

• Just realized there is a much better algorithm to do this. You can use max, bitwise not, max again, and bitwise not again. Oops... that's work for tomorrow. – Cloudy7 Apr 23 at 1:51

# Clojure, 14 bytes

#(compare % 0)


This uses the built-in compare function of clojure: it returns a 1 if the first arg is greater than the second arg, 0 if it's equal, and -1 if it's smaller.

Usage:

(#(...) {number})


signum


Just a boring built-in.

# Perl 6, 9 bytes

+(*cmp 0)


Try it online!

## Explanation:

+(     # turn into a number

*    # Whatever (input)
cmp  # compared to
0    # 0

)


## CJam, 1 byte

g


Try it online!

Another built-in, just for the sake of completeness.

# Wonder, 4 bytes

sign


Usage:

sign 1


Builtin.

# Bonus solution (no builtin), 7 bytes

tt cmp0


Usage:

(tt cmp0)5


Uses a compare function with 0.

# Javascript, 18 bytes

x=>x/Math.abs(x)|0


x/Math.abs(x) is always 1 if x is positive and -1 if x is negative. If x is 0, it returns Nan, which we transform to 0 with the |0 bit.

# Gema, 9 characters

Just a rewrite of Jordan's Sed solution.

0=0
<D>=1


Sample run:

bash-4.3$gema '0=0;<D>=1' <<<$'-303\n-12\n-5\n0\n1\n20\n404'
-1
-1
-1
0
1
1
1


# Gema, 19 characters

*=@cmpn{*;0;-1;0;1}


Posted just because Gema has a nice function for this task:

@cmpn{number;number;less-value;equal-value;greater-value}
Compare numbers.

Sample run:

bash-4.3$gema '*=@cmpn{*;0;-1;0;1}' <<< -303 -1 bash-4.3$ gema '*=@cmpn{*;0;-1;0;1}' <<< 0
0

bash-4.3\$ gema '*=@cmpn{*;0;-1;0;1}' <<< 404
1


## Batch, 23 bytes

@cmd/cset/a"%1>>31|!!%1


>>31 evaluates to -1 if the input is negative and 0 if it is positive, while !! evaluates to 1 if it is nonzero and 0 if it is zero, so we just have to bitwise OR the two results together.

# Java 1.8, 11 bytes

Math.signum


In the comments, some people pointed out that this might not technically be valid, if so, here's another version at 12 bytes:

Math::signum

• This is not a full program neither an (anonymous) function, but rather just a code excerpt, which can not be reused directly, so I guess this does not qualify. – zeppelin Dec 20 '16 at 21:29
• It is technically a function, just referencing an already existing one, you can call it the same way as an anonymous function, but I don't know if such solutions are/should be allowed. – nyuszika7h Dec 20 '16 at 22:15
• @zeppelin From everything I've seen, this is as acceptable as a loose anonymous function. – Carcigenicate Dec 20 '16 at 22:22
• It would be acceptable in a language like Javascript, where evaluating the expression like "Math.sign" will evaluate to a function reference, which you can then invoke or assign to a variable. But (AFAIK) 'Math.signum' does not make a valid standalone expression in Java. Probably you can replace it with a "method reference" (i.e. Math::signum) which will produce a Function<>, which can then be assigned to a variable and invoked, to make it qualify. – zeppelin Dec 21 '16 at 9:17
• @nyuszika7h "you can call it the same way as an anonymous function" I don't think you can, w/o changing it to Math.signum(yourArgument), which involves rewriting the program text, and that is clearly not acceptable. (and you will still have to pass an argument in somehow). – zeppelin Dec 21 '16 at 9:18