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.

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

## 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 ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.

/* App */

var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;

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

function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}

function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}

function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}

getAnswers();

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

var OVERRIDE_REG = /^Override\s*header:\s*/i;

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

function process() {
var valid = [];

answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
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],
link: a.share_link,
});
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;

var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);

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)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}

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

#answer-list {
padding: 10px;
width: 290px;
float: left;
}

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

table thead {
font-weight: bold;
}

table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">

</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">

</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</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

MATLAB + Octave, 15bytes

There are a few other Octave/MATLAB answers, but two of the others are simply using a built in, and the other is significantly longer.

The anonymous function:

@(a)(a>0)-(a<0)


Quite simple. If a>0, the answer will be (1-0)=1. If a<0, the answer will be (0-1)=-1. If a==0 the answer will be (0-0)=0.

You can try online here. Simply run the above code and then try with ans(input).

Java 8, 33, 17, 14 bytes

i->i>0?1:i>>31


Does not rely on any questionable code constructs or fragments. This is a complete functional interface implementation.

• You can reduce to (int i)->i<0?-1:i>0?1:0 (or even further to i->i<0?-1:i>0?1:0) which are all accepted solutions here on codegolf (codegolf.stackexchange.com/a/16100/16236). – Olivier Grégoire Dec 24 '16 at 0:23
• @OlivierGrégoire thanks, for some reason I was not thinking "this is a single expression, so the lambda can be reduced." – user18932 Dec 24 '16 at 19:12
• It can be reduced to this: i->i>0?1:i>>31 (14 bytes) – Kevin Cruijssen Jan 10 '17 at 10:49

Scala, 16 bytes

n=>n compareTo 0


Common Lisp, 21 6 bytes

signum


Try it online!

dc, 22 bytes

[pq]sqd0=qdd*vr1-d*v-p


Try it online!

I don't like that 10 bytes of this is eaten up testing for zero, will continue to mull over that. The second half, dd*vr1-d*v-p uses the square root of the square to calculate the absolute value of both our value to test and that value less one. Subtracting the latter from the former yields 1 for a positive value, -1 for a negative.

Aceto, 4 bytes

riyp

ri reads input as integer
y puts sign on stack
p prints it


Try it online!

Functoid, 30 28 bytes

In functoid there is no support for negative integers since numbers are handled as Church numerals. This solution redefines numbers in a way that supports negative numbers (please refer to the explanation):

<|12K0K$BbB r<@.1,"-" )<@.([  Try it online! (Here is an input generator) Explanation The definition of negative numbers extends the Church numerals by simply introducing another lambda abstraction that encodes the sign of a number (the first argument, ie. x3). Here is how the numbers -2,-1,0,1,2 would look like in this notation: Decimal number | extended Church numerals | absolute value as Church numeral ---------------+--------------------------+--------------------------------- -2 | λλλ(x3 (x2 (x2 x1))) | λλ(x2 (x2 x1)) -1 | λλλ(x3 (x2 x1)) | λλ(x2 x1) 0 | λλλ(x1) | λλ(x1) 1 | λλλ(x2 x1) | λλ(x2 x1) 2 | λλλ(x2 (x2 x1)) | λλ(x2 (x2 x1))  Now for the explanation of the above code: The characters < will change the direction to left, this saves us four bytes but makes it more difficult to read.. Here's how the code would look like without doing this: BbB$K0K21|
@.1,"-"r<
@.([)<


The combinator BbB ensures that K0 and K2 get grouped as one expression each, here's the more verbose code:

$(K0)(K2)1| @.1,"-"r< @.([)<  Okay now it's quite readable: First $ will apply the input so we'll have a sign-extended Church numeral as current expression. Applying K0 (constant 0) will evaluate to KK0 (which will "swallow" the next two arguments) in the case of a negative number, in the case of a non-negative number it simply vanishes. In the case of a positive number we'll have K2 which will swallow the argument 1 and else we'll finally get 1.

Summing up the function $(K0)(K2)1 gives the following numbers (regular Church numerals): if input < 0: return 0 elif input > 0: return 2 else: return 1  The command | will set the direction down iff the current expression evaluates to 0 and up in the other case. • The second line is thus only relevant if the input was negative and it simply prints -1 and terminates • In the other case (ie. hitting the third line) it applies the current expression to [ which decrements it by 1, prints the expression (as a numeral) and terminates Disclaimer It might look like the above extension was done just to make this task easier, however this is not the case. In fact most definitions in the untyped (or rather uni-typed) lambda calculus are made because they simplify a lot of operations that one could be interested (such as Booleans or the Church numerals themselves). As an example the function abs could be "implemented" by just applying the identity function to such an extended numeral which will get rid of one lambda abstraction (and in case of a negative number, keep the absolute value as is). If you're interested, here is an article that talks more about this definition which is worth a read. Yabasic, 16 bytes Anonymous function that takes input as a number, n, and output to STDOUT input""n ?sig(n)  Try it online! Perl 5, 9 + 1 (-p) = 10 bytes $_=$_<=>0  Try it online! Pyt, 1 byte ±  Try it online! Boring built-in answer (padding for body length) Lua (51 Bytes) n=tonumber(...) print(n<0 and -1 or n>0 and 1 or 0)  ... is the variable that represents arguments in lua, tonumber(...) converts the first argument to a number. also in lua a and b or c is a structure that returns b if a is truthy or c if a is falsy, you can nest this structure as well • Answers should be either functions or full programs. This doesn't seem to be able to take input. N is also guaranteed to be an integer – Jo King Feb 17 '18 at 2:01 Stax, 2 bytes :+  Run and debug online! Explanation Added for completeness. It is a builtin, but all built-ins starting with a colon in Stax is actually a macro defined using other Stax operations. Internally it is defined as c0>s0<-, which is simply (x>0)-(x<0). SHELL ( 20 Bytes ) sed s/[1-9][0-9]*/1/  tests: echo "789" | sed s/[1-9][0-9]*/1/ 1 echo "-789" | sed s/[1-9][0-9]*/1/ -1 echo "0" | sed s/[1-9][0-9]*/1/ 0  Swift, 44 bytes func s(i:Int)->Int{return i>0 ?1:i<0 ? -1:0}  Strange spacing around the ternary options, I know, but this was the shortest way. Try it online! Brain-Flueue, 40 bytes {([({})]){({}())<>([{}()()])<>}}(<>[]{})  Try it online! Readable version { ([({})]) { ({}())<> ([{}()()])<> } } (<>[]{})  MachineCode, 26 bytes 31c085ff0f9fc0c1ef1f29f8c3  Requires the i flag for integer output. Input must be appended to the code on a separate line. This is equivalent to the C code (n>0)-(n<0). Try it online! Alternatives with the same bytecount: • 31c085ff0f95c0c1ff1f09f8c3 - Try it online! Equivalent to the highest voted C submission. • 89f8c1ff1ff7d8c1e81f01f8c3 - Try it online! Equivalent to this C code. Canvas, 3 2 bytes ⤢÷  Try it here! This might be the shortest solution without a builtin that does the problem for you (I'm looking at you, Jelly.) Explanation: ⤢÷ | *Full code* ÷ | Divide | The input (implicit) ⤢ | By its absolute value  • Canvas doesn't interpret 0/0 as 0, it actually errors & removes the 2 items without pushing anything (though I'm about to change that as 0 makes much more sense than nothing). The reason that 0 is outputted is that the stack contains an infinite amount of the inputs. And because of that you can actually remove the ： for 2 bytes – dzaima May 5 '18 at 13:46 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" + Add top two 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 – Veskah Mar 9 '20 at 14:01
• @Veskah I'm reasonably sure I wrote this answer before I knew that trick, hehe. :D – AdmBorkBork Mar 9 '20 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 '20 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.

Answer History

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 '20 at 2:29
• Wait, why is my edit history not showing? – Lyxal Mar 26 '20 at 2:30
• @a'_' I added the 29 byter – Lyxal Mar 26 '20 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]. – Jonathan Frech Mar 26 '20 at 11:45

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. – Razetime Sep 2 '20 at 2:26

J, 2 bytes

%|


Explanation

It's a hook, so I'll explain it as y%(|y).

  (|y) NB. Magnitude of y.
y%     NB. y/abs(y)


Oh, yes, I am learning J. I want to golf in android and building my own golfing language is hard, so I started learning J.

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.