83
\$\begingroup\$

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>

\$\endgroup\$
12
  • 50
    \$\begingroup\$ 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. \$\endgroup\$ Dec 20, 2016 at 10:10
  • 9
    \$\begingroup\$ This could probably use a leaderboard. \$\endgroup\$ Dec 20, 2016 at 11:13
  • 3
    \$\begingroup\$ @MrLister upvote how you want, but really you should look for creativity instead of code length. \$\endgroup\$
    – FlipTack
    Dec 28, 2016 at 20:13
  • 3
    \$\begingroup\$ @FlipTack Oh, I thought it was codegolf. \$\endgroup\$
    – Mr Lister
    Dec 28, 2016 at 20:23
  • 4
    \$\begingroup\$ @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 \$\endgroup\$
    – FlipTack
    Dec 28, 2016 at 20:25

193 Answers 193

1
3 4
5
6 7
1
\$\begingroup\$

Yabasic, 16 bytes

Anonymous function that takes input as a number, n, and output to STDOUT

input""n
?sig(n)

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Perl 5, 9 + 1 (-p) = 10 bytes

$_=$_<=>0

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Pyt, 1 byte

±

Try it online!

Boring built-in answer (padding for body length)

\$\endgroup\$
1
\$\begingroup\$

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

\$\endgroup\$
1
  • \$\begingroup\$ 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 \$\endgroup\$
    – Jo King
    Feb 17, 2018 at 2:01
1
\$\begingroup\$

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

\$\endgroup\$
1
\$\begingroup\$

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
\$\endgroup\$
1
\$\begingroup\$

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!

\$\endgroup\$
1
\$\begingroup\$

Brain-Flueue, 40 bytes

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

Try it online!

Readable version

{
 ([({})])
 {
  ({}())<>
  ([{}()()])<>
 }
}
(<>[]{})
\$\endgroup\$
1
\$\begingroup\$

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.
\$\endgroup\$
1
\$\begingroup\$

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
\$\endgroup\$
1
  • 1
    \$\begingroup\$ 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 \$\endgroup\$
    – dzaima
    May 5, 2018 at 13:46
1
\$\begingroup\$

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?

\$\endgroup\$
1
\$\begingroup\$

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
\$\endgroup\$
1
\$\begingroup\$

Keg, -hr, 13 bytes

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

Try it online!

A very simple switch like comparison happening here.

\$\endgroup\$
1
\$\begingroup\$

05AB1E, 2 bytes

A signum built-in.

Try it online!

\$\endgroup\$
0
1
\$\begingroup\$

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
\$\endgroup\$
1
  • \$\begingroup\$ How about I:0)$0(-h for 9 bytes \$\endgroup\$
    – Jo King
    May 6, 2018 at 20:21
1
\$\begingroup\$

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!

\$\endgroup\$
2
  • \$\begingroup\$ "$args" saves a byte \$\endgroup\$
    – Veskah
    Mar 9, 2020 at 14:01
  • 1
    \$\begingroup\$ @Veskah I'm reasonably sure I wrote this answer before I knew that trick, hehe. :D \$\endgroup\$ Mar 9, 2020 at 16:02
1
\$\begingroup\$

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

enter image description here

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.

Try it not online but on Scratch

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

Io, 28 bytes

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

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

Try it online!

\$\endgroup\$
1
  • \$\begingroup\$ -6 bytes by using 2/(0**x+1)-1: Try it online! \$\endgroup\$
    – Deadcode
    Mar 22, 2023 at 11:34
1
\$\begingroup\$

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.

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

Python 3, 25 bytes

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

Try it online!

Uses a different approach from other python answers

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

dc, 7 bytes

?dd*v/p

Try it online!

Input on stdin, output on stdout. (There may also be spurious output to stderr, which should be ignored, as usual.)

This uses the formula $$\frac{\left\lfloor\sqrt{n^2}\right\rfloor}n$$

plus the fact that if you divide by 0 in dc, it leaves the 0 at the top of the stack.

(If you try this out, note that negative numbers are written in dc with an initial _ instead of -, since - is only used for the two-argument subtraction operation.)

\$\endgroup\$
1
\$\begingroup\$

Desmos, 12 bytes

f(x)=sign(x)

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

\$\endgroup\$
2
  • \$\begingroup\$ I would change "TIO" to something like "View the plot on desmos.com" not to cause confusion with tio.run. \$\endgroup\$ Mar 26, 2020 at 11:43
  • \$\begingroup\$ -1 Byte with sgn nstead of sign \$\endgroup\$
    – Dadsdy
    May 30, 2023 at 4:00
1
\$\begingroup\$

Haskell, 6 bytes

signum

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

\$\endgroup\$
1
\$\begingroup\$

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
\$\endgroup\$
1
\$\begingroup\$

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

\$\endgroup\$
1
\$\begingroup\$

R, 21 bytes, no builtin

x=scan();x/abs(x^!!x)

Try it online!

Takis input from STDIN. Avoids the builtin sign. This comes out 4 bytes shorter than JAD's solution with if. We cannot use directly x/abs(x) since we would divide by 0 when x=0.

After coercion to integer, !!x will be equal to 1 for all input except 0 (when it is equal to 0). Since 0^0=1, this trick allows to avoid dividing by 0:

  • For nonzero input, it is equivalent to x/abs(x^1), giving +1 or -1
  • For x=0, it is equivalent to x/1, giving 0
\$\endgroup\$
2
  • \$\begingroup\$ -5 bytes by using 2/(0^x+1)-1: Try it online! \$\endgroup\$
    – Deadcode
    Mar 22, 2023 at 11:24
  • 1
    \$\begingroup\$ @Deadcode Nice! That's significantly different; you should post it as a separate answer. \$\endgroup\$ Mar 23, 2023 at 12:40
1
\$\begingroup\$

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
\$\endgroup\$
1
  • \$\begingroup\$ this language is really cool \$\endgroup\$
    – Wasif
    Jun 1, 2021 at 8:30
1
\$\begingroup\$

Japt, 1 byte

g

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Python 3.8, 47 bytes

print(1if(n:=int(input()))>0else-1if n<0else 0)
\$\endgroup\$
1
\$\begingroup\$

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.

\$\endgroup\$
1
  • 2
    \$\begingroup\$ Not so--there are negative numbers, just not negative-number literals. (s 0 1) gives -1, for instance. \$\endgroup\$
    – DLosc
    Feb 5, 2022 at 4:45
1
3 4
5
6 7

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.