74
\$\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>

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

158 Answers 158

0
\$\begingroup\$

Loader, 61+44+1=106 bytes

Main module, 61 bytes

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

Module a, 44 bytes

decr B
decr *0
B:load a
~*0:print K
~*0:exit
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

PARI/GP, 4 bytes

sign

Another boring built-in.

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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))
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

BotEngine, 7x17=119

v #  #0123456789
>Ie~>SSSSSSSSSSS
    ^ <<<<<<<<<<P
  PeeS-        1e
 Pe1-S0123456789
  0  > SSSSSSSSS
       >>>>>>>>>^
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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)
| improve this answer | | | | |
\$\endgroup\$
  • \$\begingroup\$ 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. \$\endgroup\$ – pmbanka Dec 21 '16 at 11:19
  • \$\begingroup\$ 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. \$\endgroup\$ – Mego Dec 23 '16 at 14:47
0
\$\begingroup\$

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

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

OCaml, 4 bytes

sign

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

fun x->compare x 0
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Stacked, 4 bytes

sign

Takes input from top of stack. Bonafide function:

$sign

Shortest non-builtin so far:

:0>\0<-

Which does:

:0>\0<-                        stack: [..., n]
:        duplicate TOS         stack: [..., n, n]
 0       push 0                stack: [..., n, n, 0]
  >      pop n,0 and push n>0  stack: [..., n, n>0]
   \     switch top two        stack: [..., n>0, n]
    0    push 0                stack: [..., n>0, n, 0]
     <   pop n,0 and push n<0  stack: [..., n>0, n<0]
      -  subtract top two      stack: [..., (n>0)-(n<0)]

Surround with [] to be a function.

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

TI-Basic, 11 bytes

:Input A
:A>0
:Ans-A<0

Reads from variable A.

:A>0            // Reads from A, returns 0 or 1
:Ans-A<0.   // Computes A<0 first, then subtracts from previous result. Implicit print.
| improve this answer | | | | |
\$\endgroup\$
  • \$\begingroup\$ To be fair, the other TI-Basic Answer used Ans for input, which decreases his code by 3 bytes. You could add 3 bytes to both of ours through Input A: then use the same metric. \$\endgroup\$ – Julian Lachniet Dec 23 '16 at 13:30
0
\$\begingroup\$

JavaScript (ES6), 14 bytes

No conditionals, no Math lib usage

x=>(x>0)-(x<0)

Explanation

x > 0 is true/false for positives/non-positives and cast to number (1/0) in case for subtraction. x < 0 is analogous for negatives, so we end up with 1-0 for positives, 0-0 for zero and 0-1 for negatives.

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Math++, 28 bytes

?>a
3+2*!a>$
a/sqrta*a
0>$
0
| improve this answer | | | | |
\$\endgroup\$
  • \$\begingroup\$ Could you link to an interpreter? \$\endgroup\$ – Mego Dec 23 '16 at 15:01
0
\$\begingroup\$

Python 2, 26 Bytes

b=input()
print(b>0)-(b<0)
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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 ;
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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!

| improve this answer | | | | |
\$\endgroup\$
  • \$\begingroup\$ This solution already exists \$\endgroup\$ – Mego Dec 23 '16 at 21:39
  • \$\begingroup\$ Darn it! Should I change my solution? \$\endgroup\$ – python-b5 Dec 23 '16 at 21:43
  • \$\begingroup\$ Yes, please. Either delete it, or edit it to be distinct. \$\endgroup\$ – Mego Dec 23 '16 at 21:43
  • \$\begingroup\$ You can keep your original answer if you wish, duplicate answers are allowed. \$\endgroup\$ – xnor Dec 25 '16 at 8:54
  • \$\begingroup\$ This fails on positive inputs. \$\endgroup\$ – isaacg Jan 11 '17 at 8:12
0
\$\begingroup\$

MS Excel, 9 Bytes

Takes Input from cell A1.

=SIGN(A1)
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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.
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Ruby, 19 bytes

Not quite as golfy as my other answer.

->n{("%+b"%n)[0,2]}

Outputs -1, +0, +1

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Japt, 1 byte (non-competing)

g

Try it online!

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

MY, 3 bytes

Hex:

 1A #Input integer
 2A #Sign function
 27 #Output (trailing newline)
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

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])
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Common Lisp, 39 bytes

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

Try it online!

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Braingolf, 1 byte

s

Try it online!

Yep.

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

T-SQL, 36 bytes

CREATE PROC s @ INT AS PRINT SIGN(@)

Usage:

EXECUTE s -5464
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

dc, 15 bytes

[_1*]sa?dd0>a/p

Try it online!

Explanation

This (ab)uses the fact that dc keeps the stack as is, if you're trying to divide by 0 which really helps for this challenge:

[_1*]sa          # store the macro in register a (macro negates the top)
       ?         # push input to stack
        d        # duplicate top
         d0>a    # if top is negative, execute macro
             /   # divides top two values
              p  # print the top of the stack
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Husk, 1 byte

±

Try it online!

| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

Implicit, 1 byte

±

Try it online!

After implicits, this program looks like:

$±%
$    read integer input
 ±   push sign
  %  print
| improve this answer | | | | |
\$\endgroup\$
0
\$\begingroup\$

REXX, 16 bytes

say sign(arg(1))
| improve this answer | | | | |
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.