76
\$\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
  • 49
    \$\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

167 Answers 167

1 2 3 4 5
6
0
\$\begingroup\$

MY, 3 bytes

Hex:

 1A #Input integer
 2A #Sign function
 27 #Output (trailing newline)
\$\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])
\$\endgroup\$
0
\$\begingroup\$

Common Lisp, 39 bytes

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

Try it online!

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

Braingolf, 1 byte

s

Try it online!

Yep.

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

T-SQL, 36 bytes

CREATE PROC s @ INT AS PRINT SIGN(@)

Usage:

EXECUTE s -5464
\$\endgroup\$
0
\$\begingroup\$

Husk, 1 byte

±

Try it online!

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

Implicit, 1 byte

±

Try it online!

After implicits, this program looks like:

$±%
$    read integer input
 ±   push sign
  %  print
\$\endgroup\$
0
\$\begingroup\$

REXX, 16 bytes

say sign(arg(1))
\$\endgroup\$
0
\$\begingroup\$

Add++, 9 bytes

L,d0<@0>_

Try it online!

How it works

L,  - Create a lambda.
           Example argument: -8
  d - Duplicate;    STACK = [-8 -8]
  0 - Push 0;       STACK = [-8 -8 0]
  < - Less than;    STACK = [-8  0]
  @ - Reverse;      STACK = [ 0 -8]
  0 - Push 0;       STACK = [ 0 -8 0]
  > - Greater than; STACK = [ 0  1]
  _ - Subtract;     STACK = [-1]
      Implicitly return      -1
\$\endgroup\$
0
\$\begingroup\$

Deorst, 11 bytes

i:l0<@l0>@-

Try it online!

Boring (n>0)-(n<0) solution

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

Desmos, 12 bytes

f(x)=sign(x)

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

\$\endgroup\$
1
  • \$\begingroup\$ I would change "TIO" to something like "View the plot on desmos.com" not to cause confusion with tio.run. \$\endgroup\$ – Jonathan Frech Mar 26 '20 at 11:43
0
\$\begingroup\$

Haskell, 6 bytes

signum

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

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

Pxem, Filename: 33 bytes + Contents: 0 bytes = 33 bytes

  • Filename: ._.c.w.c00.-.-.z-1.p.d.a1.o.d.a.n
  • Contenr: empty.

Usage

Give an integer from STDIN. The result is output from stdout, with no LF termination.

How it works

._          # push(get_integer())
.c          # dup()
.w          # while(pop()!=0){
  .c          # dup()
  00.-          # push('0');push('0');push(abs(pop()-pop()))  # i.e. push(0)
  .-               # push(abs(pop()-pop()))
  .z            # while(pop()!=pop()){
    -1.p      # push('1');push('-');while(!empty()){putchar(pop())}
   .d          # exit
  .a          # }
  1.o       # push('1');putchar(pop())
  .d        # exit
.a          # }
.n          # printf("%d",pop())
\$\endgroup\$
0
\$\begingroup\$

x86_64 machine code - 26 24 bytes

This is callable function, input in r8 output in rax.

-3 bytes using cbw instruction is 2 bytes instead of movzx rax, al is 4 bytes.

0000000000400080 <output_the_sign>:
  400080:   48 31 c0                xor    rax,rax
  400083:   4d 85 c0                test   r8,r8
  400086:   74 11                   je     400099 <output_the_sign.done>
  400088:   0f 95 c0                setne  al
  40008b:   66 98                   cbw
  40008f:   4c 89 c2                mov    rdx,r8
  400092:   48 c1 fa 1f             sar    rdx,0x1f
  400096:   48 09 d0                or     rax,rdx

0000000000400099 <output_the_sign.done>:
  400099:   c3                      ret    

Try it online!

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

Lua, 38 bytes

function(n)return n//math.abs(n-.1)end

Try it online!

This version works properly on all integer values.

Lua, 46 45 bytes

Here is a version that works on floating point values:

function(n)return n/math.abs(n+#{[n+1]=0})end

Try it online!

Previous 46 byte versions:

function(n)return n>0 and 1 or#{[n+1]=0}-1 end

Try it online!

function(n)return n<0 and-1 or 1-#{[n+1]=0}end

Try it online!

These use a tip I have explained here, which is a basically a workaround for Lua's strong typing. Without that trick it would be 48-49 bytes:

function(n)return n==0 and 0 or n/math.abs(n)end
function(n)return n~=0 and n/math.abs(n)or 0 end
function(n)return n/math.abs(n+0^math.abs(n))end
function(n)return n>0 and 1 or n<0 and-1 or 0 end
function(n)return n<0 and-1 or n>0 and 1 or 0 end
\$\endgroup\$
0
\$\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\$
1 2 3 4 5
6

Your Answer

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