Is it a leap year?

41

4

This challenge is quite simple. You will take an input which will be a year from 1801 to 2400, and output if it is a leap year or not.

Your input will have no newlines or trailing spaces:

1954

You will output in any way that you like that clearly tells the user if it is or isn't a leap year (I will accept y or n for yes/no)

You can get a list of leap years here: http://kalender-365.de/leap-years.php I would note that leap years are not ever four years always. 1896 is a leap year, but 1900 is not. The years that follow this "skip" are:

1900
2100
2200
2300

Test cases:

1936 ->  y
1805 ->  n
1900 ->  n
2272 ->  y
2400 ->  y 

EDIT: This is based on a standard Gregorian calendar: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php

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 = 50798; // 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>

user40734

Posted 2015-05-26T10:36:04.493

Reputation:

9You should be more clear: A given year is a leap year if and only if it is (divisible by 4)∧((divisible by 100)→(divisible by 400)). – LegionMammal978 – 2015-05-26T11:34:22.453

Your input will have no newlines or trailing spaces. Dang it, that would have saved me 2 bytes... – Dennis – 2015-05-26T17:10:02.940

2You should extend the accepted input range to AD 1601 thru 2400. This covers two 400-year Gregorian cycles (which proleptically start on Monday). – David R Tribble – 2015-05-26T18:17:21.247

2Does falsy if leap year and truthy if not a leap year count as "clearly tells the user if it is or isn't"? – lirtosiast – 2015-05-28T21:27:12.357

@lirtosiast I think so. A lot of user assume so. – aloisdg moving to codidact.com – 2016-07-20T13:58:03.550

Answers

22

APL, 16 14 12 characters

Returns 0 for a leap year, 1 for a non-leap year.

≥/⌽×4 25 4⊤⎕

Try this solution on tryapl.org. Note that I have changed the solution to the dfn {≥/⌽×4 25 4⊤⍵} as tryapl.com does not support (take user input). Note that is an empty box, not a missing character.

The same solution in J:

4 25 4>:/@|.@:*@#:]

Explanation

Dyadic (encode) represents its right argument in the base specified by its left argument. I use base 4 25 4 in this solution. This represents the year y as a polynomial

y mod 400 = 100 a + 4 b + c where b < 100 and c < 4.

Let propositions α, β, and γ represent if a, b, and c are non-zero: Proposition γ is false if y is dividable by 4, βγ is false if y is dividable by 100 and αβγ is false if y is dividable by 400.

A truth table (* representing “don't care”) were proposition Δ represents if y is a leap-year obtains:

α β γ | Δ
0 0 0 | 1
1 0 0 | 0
* 1 0 | 1
* * 1 | 0

The following statement expresses Δ in α, β, and γ:

Δ = ¬((αβ) → γ)).

Due to the structure of this statement, one can express ¬Δ as the reduction ≥/⌽α β γ where &geq; implements ←. This leads to the answer I am explaining right now.

FUZxxl

Posted 2015-05-26T10:36:04.493

Reputation: 9 656

16

Pyth, 11 bytes

!%|F_jQ*TT4

This full program read from STDIN and prints True for leap years and False otherwise.

Thanks to @Jakube for suggesting Pyth and basically porting my CJam code.

Verify the test cases yourself in the Pyth Compiler/Executor.

How it works

     jQ*TT   Returns the evaluated input in base 10 × 10.
  |F_        Swaps the digit order and reduces using logical OR.
             So far, we've achieved 1954 -> [19, 54] -> 54 || 19.
!%        4  Returns the logical NOT of the result modulo 4.
             This prints True for multiples of 4 and False otherwise.

Dennis

Posted 2015-05-26T10:36:04.493

Reputation: 196 637

15

CJam, 12 bytes

rS+2m<~e|4%!

This full program read from STDIN and prints 1 for leap years and 0 otherwise.

Verify the test cases yourself in the CJam interpreter.

How it works

r   e# Read from STDIN.
S+  e# Append a space.
2m< e# Rotate two characters to the left.
~   e# Evaluate.
    e# So far, we achieved "1954" -> "54 19" -> 54 19.
e|  e# Logical OR; keep the leftmost non-zero integer.
4%! e# Logical NOT of the kept integer modulo 4.
    e# This pushes 1 for multiples of 4 and 0 otherwise.

Dennis

Posted 2015-05-26T10:36:04.493

Reputation: 196 637

I've got a few more 12 byte alternatives. Maybe you can find something in them to bring it down to 11? r2/~~\e|i4%!, r2/~~\~e|4%!, r2/:~~\e|4%!, r2/S*~\e|4%! and the 13 byte r2/:~W%:e|4%! – Martin Ender – 2015-05-26T18:40:18.400

@MartinBüttner: There's also r2/:i:\e|4%! (12) and r2/:i(fe|~4%! (13). I've even tried GolfScript (which doesn't require r), but or4 is interpreted as a single token. If only the input had a trailing newline... – Dennis – 2015-05-26T19:00:53.323

14

Javascript (ES6), 21 characters

The standard rule is that y is a leap year if 4 divides y and if either 100 doesn't divide y or 400 does divide y. In code,

y%4 == 0 && (y%100 != 0 || y%400 == 0)

There's no need for that 100 and 400. Instead it suffices to check whether 16 or 4 divides y, with 16 chosen if 25 divides y, 4 otherwise. Golfed, this becomes

!(y%(y%25?4:16))

A javascript function that implements this is 21 characters long:

l=y=>!(y%(y%25?4:16))


Perl, 28 26 characters

Same idea, but in perl.

$_=$_%($_%25?4:16)?"n":"y"

Run using the -lp options. For example,

perl -lpe '$_=$_%($_%25?4:16)?"n":"y"'

With the test set as input, this produces

1936
y
1805
n
1900
n
2272
y
2400
y

David Hammen

Posted 2015-05-26T10:36:04.493

Reputation: 241

I had used your suggestion in my answer, did not see yours. Now I have rolled back. Note: You should specify EcmaScript 6, or else someone will complain 'not working in Chrome' – edc65 – 2015-05-28T21:59:36.630

@edc65: Well, he should specify EcmaScript 6 because it is EcmaScript 6. Arrow function notation (y=>...) is an ES6 feature. – Tim Čas – 2016-09-05T11:50:17.387

Shouldn't this be two answers? – dfeuer – 2019-03-01T18:31:06.443

9

Pyth, 19 15 14 bytes

xFm!%Q^d2[2TyT

Way too easy. Try it online: Demonstration or Test harness

edit: Missed, that you can print Truthy/Falsy values, instead of n/y. -4 byte

edit 2: Used the square root idea of Martin. -1 byte

Explanation

                 implicit: Q = input number
         [         generate a list with the numbers:
          2          2
           T         10
            yT       2*10 = 20
  m              map each number d to:
   !%Q^d2          not(Q mod d^2) // True if Q % d^2 == 0 otherwise False
xF               fold by xor

Jakube

Posted 2015-05-26T10:36:04.493

Reputation: 21 462

9

JavaScript (ES6) 27

The rule: (y%4==0) && (y%100!=0 || y%400==0)

Golfed: !(y%100<1&&y%400||y%4) (mainly using De Morgans's law)

A function implementing the rule:

l=y=>!(y%100<1&&y%400||y%4)

A test (run in Firefox) just to be sure:

l=y=>!(y%100<1&&y%400||y%4)

for(o=[],i=0;i<700;i++)
  y=i+1800,
  x=l(y),
  o[i/100|0]=(o[i/100|0]||'')+y+(x?' <b>Y</b>':' <i>N</i>')+'\n'
    
R.innerHTML='<td>'+o.join('</td><td>')+'</td>'
console.log(o[1])
td { white-space: pre; font-family: monospace; padding: 8px}

b { color: red; }
i { color: blue; }
<table>
  <tr id=R></tr>
</table>

edc65

Posted 2015-05-26T10:36:04.493

Reputation: 31 086

3You can reduce this by six characters if you use !(y%(y%25?4:16)) instead of !(y%100<1&&y%400||y%4). For those bothered by the ternary operator, you could use !(y%(4<<2*!(y%25))) and still save three characters over !(y%100<1&&y%400||y%4). – David Hammen – 2015-05-28T20:48:20.747

1David Hammen's suggestion is identical to his answer, so I think you should keep the length as 27. – lirtosiast – 2015-05-28T21:52:26.187

9

TI-BASIC, 20 17 16 13

Because it is tokenized, TI-BASIC is often competitive at simple math challenges, but not this one since there is no "divisible" command. Maybe it is after all, but this is still longer than CJam and Pyth.

This uses David Hammond's method.

not(fPart(Ans/4/4^not(fPart(sub(Ans

Old code at 16 bytes:

not(fPart(Ans/16not(fPart(sub(Ansnot(fPart(Ans/4

Ungolfed:

not(fPart(Ans/16) and not(fPart(Ans/100) and not(fPart(Ans/4))))

fPart( is "fractional part"; exponentiation has higher precedence than division. In TI-BASIC, close-parens are optional.

I use undocumented behavior of the sub( command, usually used to get a substring: when its argument is a number instead of a string, it divides the number by 100. It will work on a TI-83 or 84 series calculator.

20 -> 17 by rearranging code to allow removal of close-parens; 17 -> 16 by replacing 400 with 16; 16 -> 13 by using David Hammond's idea.

lirtosiast

Posted 2015-05-26T10:36:04.493

Reputation: 20 331

9

Pip, 13 bytes

This one was more interesting than it at first appeared. It took some finagling, but I was finally able to replace those lengthy references to 400 with 4 and the h variable (=100).

!(a%h?aa/h)%4

Outputs 1 for leap year, 0 for non-leap year. Explanation:

               a is command-line argument (implicit)
  a%h?aa/h     If a is divisible by 100, divide it by 100; otherwise, leave it alone
 (        )%4  The result mod 4 is 0 if it's a leap year, nonzero otherwise
!              Negate and (implicitly) print

DLosc

Posted 2015-05-26T10:36:04.493

Reputation: 21 213

9

Regex, 83 62 38

Thanks to Toby for tips about combining both halves of the regex.

If we focus on 1801..2400 range only and assume input are integers:

(?!00)([02468][048]|[13579][26])(00)?$

Test in Ruby (^ = \A and $ = \Z because Ruby) for the desired range:

r = /(?!00)([02468][048]|[13579][26])(00)?\Z/
(1801..2401).each do |year|
  leap = year % 4 == 0 && ((year % 100 != 0) || (year % 400 == 0))
  leap_regex = !year.to_s[r].nil?
  if leap != leap_regex
    print 'Assertion broken:', year, " ", leap, " ", leap_regex, "\n"
  end
end

(Bonus) for something that should work not only for 1801..2400, but for any non-negative year:

^\d*(0000|(?!00)([13579][26]|(^|[02468])[048])(00)?)$

Test in Ruby (^ = \A and $ = \Z because Ruby) for first 100000 years:

r = /\A\d*(0000|(?!00)([13579][26]|(\A|[02468])[048])(00)?)\Z/
100000.times do |year|
  leap = year % 4 == 0 && ((year % 100 != 0) || (year % 400 == 0))
  leap_regex = !year.to_s[r].nil?
  if leap != leap_regex
    print 'Assertion broken:', year, " ", leap, " ", leap_regex, "\n"
  end
end

rr-

Posted 2015-05-26T10:36:04.493

Reputation: 273

1If you have (?!) you can combine the two halves: (?!00)([02468][048]|[13579][26])(00)?$ - for 38. That won't work for one-digit years, though. – Toby Speight – 2015-05-27T16:45:22.230

9

Stackylogic, 226 bytes (non-competing)

Yes, that is right. I made a program in Stackylogic (non-TC), which was invented by Helka Homba, for the challenge found here. This is made after the challenge, so non-competing.

Stackylogic has only binary input, so 10 (or more, any more digits will be ignored) bit binary must be used (least significant bit inputted first). Any dates outside the specified range might fail, as it simply checks what the inputted number is: it doesn't cover unnecessary dates

Not only is this my first challenge with stackylogic, but the first challenge with stackylogic at all.

Get ready for this mess:

1
0
1?
010
1?0
010
1?10
?1010
001010
?1010
?1010
?010
?10
?0
0
?
110
?10
11010
?010
11010
?1010
001010
?1010
?1010
?1010
?1010
?010
?0
110
?10
11010
?010
1010
01010
01010
?010
?0
110
?0
110
?0
110
1?0
?10
0?10
?10
?0
01
?
?<
0

This took me so long to make, because Stackylogic is the most confusing language I have encountered, and extremely unreadable: you have to know how the rest of the program has executed before you can read the current section being edited. I even had to add spaces for readability while creating it.

Meagre explanation

This is a simple explanation of what it does.

Stackylogic does not have any mathematical functions, so that made this harder. I had to hardcode most of it, to check if it was a specific number.

First, this program will do a NOR of the least significant bits, discarding them in the process. this means that if it is divisible by 4, it will proceed to the main part of the program, otherwise output 0.

Second, the pointer is carried over to the labyrinth of stackylogic, from here, if the next two bits are zero, it will instantly output 1 (as then it is divisible by 16, and so a leap year despite any other conditions), other wise it will check if it is not any of the numbers that is divisible by 4 but not a leap year, between 1801 and 2400.

To explain in detail, would involve making this post many times longer than it already is

Destructible Lemon

Posted 2015-05-26T10:36:04.493

Reputation: 5 908

8

IBM System Z assembler - 56 bytes.

(96 bytes of source. Previously 712 384 202 bytes of source, 168 byte executable).

Smaller version still. No longer saves caller's registers, changes to literal storage, changed addressing mode.

 l        CSECT      
         using l,15 
         l  5,y     
         n 5,f      
         bnz r      
         xr 4,4     
         l 5,y      
         d 4,c      
         ch 4,i     
         bne i      
         n 5,f      
         bnz r      
i        dc h'0'    
r        b  *       
y        dc f'2004' 
f        dc f'3'    
c        dc f'100'  
         end 

New version. This will ABEND with a S0C1 if it's a leap year, and loop if it isn't. Hopefully that fulfils the requirement of indicating the result.

l        CSECT             
         ASMDREG           
         SYSSTATE archlvl=2
         IEABRCX  DEFINE   
         save  (14,12)     
         larl  r9,s        
         using s,r9        
         st 13,w+4         
         la 13,w           
         st 13,w+8         
         la 5,2004         
         st 5,y            
         n 5,=f'3'         
         bnz r             
         xr r4,r4          
         l 5,y             
         d r4,=f'100'      
         ch r4,=h'0'       
         bne i             
         n 5,=f'3'         
         bnz r             
i        dc h'0'           
r        b  0              
s        dc 0d'0'          
y        ds f              
w        ds 18f            
         ltorg             
         end  

OK, so not the shortest (although it might be once we look at the actual executed code plus the interpreter size...)

leapyear CSECT                                                
         ASMDREG                                              
         SYSSTATE archlvl=2                                   
         IEABRCX  DEFINE                                      

         save  (14,12)                                        

         larl  r9,staticArea                                  
         using staticArea,r9                                  
         st r13,w_savea+4       .Save callers savearea        
         la r13,w_savea         .Address my savearea          
         st r13,w_savea+8         . and save it               

         open  (O,OUTPUT)             .open file              

         la r5,1936             .r5 = input year              
         st r5,years            .Save year                    

         cvd r5,double          .Convert year to p-decimal    
         mvc edarea,=xl8'4020202020202120' .Move in edit mask 
         ed edarea,double+4      .Make packed decimal year printable                              
         mvc outrec(4),edarea+4  .Move year string to output area                             
         bas r10,isitleap       .Call leap year routine       

         close (O)              .Close files            
         b return               .Branch to finish

isitleap ds 0h                                                      
         mvi outrec+5,c'N'      .Set default value                                   
         n r5,=f'3'             .Are last 2 bits 0 (Divisible by 4)?
         bnz notleap            .No - not leap                      
         xr r4,r4               .Clear R4                           
         l r5,years             .Reload r5 with year                
         d r4,=f'100'           .divide r4/r5 pair by 100           
         ch r4,=h'0'            .Remainder 0?                       
         bne isleap             .No - leap year                     
         n r5,=f'3'             .Quotient divisible by 4?           
         bnz notleap            .No - not leap                      

isleap   ds    0h                                                   
         mvi outrec+5,c'Y'      .Move in leap year indicator                                    

notleap  ds    0h                                                   
         put O,outrec           .Print output record                                    
         br r10                 .Return to caller                   

* Program termination                                               
return   ds 0h                                                      
         l r13,w_savea+4         .Restore callers savearea          
         return (14,12),,rc=0    .Restore registers and return    
* storage areas                                                     
staticarea  dc 0d'0'                                                
outrec      ds cl10                                                 
years       ds f                                                    
w_savea     ds 18f                save area                         
edarea      ds cl8                    .edit area                    
double      ds d                                                    
* Macros and literals                                               
         print nogen                                                
O        dcb   recfm=F,lrecl=6,dsorg=PS,ddname=O,macrf=PM           
         print gen                                                  
*                                                                   
         ltorg                         literal storage              
         end  

Output:

ABEND S0C1 for a leap year, S222 (when the CPU time has run out) if not.

1936 Y 1805 N 1900 N 2272 Y 2400 Y

(when run multiple times)

Steve Ives

Posted 2015-05-26T10:36:04.493

Reputation: 179

Down to 376 bytes by making storage areas minimum size (13 bytes), removing staging area 'leapflag' and only including a single year (rather than 5) in the program. – Steve Ives – 2015-05-27T10:08:29.290

384 bytes by providing a slightly formatted output: – Steve Ives – 2015-05-27T10:29:23.603

1+1 for interesting and educational choice of language. :-) – Toby Speight – 2015-05-27T17:02:19.577

I could save a few bytes by abandoning convention and not bothering to save the callers registers at the start, seeing as the program never returns to the caller. This is Very Bad Form. – Steve Ives – 2015-05-29T12:47:37.137

7

CJam, 18 16 bytes

q~[YAK]f{2#%!}:^

Gives 1 (truthy) for leap years and 0 (falsy) otherwise.

Run all test cases here.

Explanation

q~                 e# Read and eval input.
  [YAK]            e# Push an array containing 2, 10, 20 (the square roots of the
                   e# relevant divisors).
       f{    }     e# Map this block onto that array, also passing in the input year.
         2#        e# Square the divisor.
           %!      e# Modulo followed by logical negation. Gives 1 if the year is divisible
                   e# by the given divisor and 0 otherwise.
                   e# At this point we have one of the following arrays:
                   e#   [0 0 0] - not a leap year
                   e#   [1 0 0] - a leap year
                   e#   [1 1 0] - not a leap year
                   e#   [1 1 1] - a leap year
              :^   e# Reduce XOR onto this array, which gives 1 if there is an odd number
                   e# of 1s and 0 if there's an even number.

Martin Ender

Posted 2015-05-26T10:36:04.493

Reputation: 184 808

6

Mathematica, 40 27 bytes, 17 chars

#∣4∧(#∣100<U+F523>#∣400)

Uses 17 chars, but 27 bytes. Thanks to @alephalpha for the tip. Note that the vertical bars are actually U+2223 for divides. The <U+F523> should be replaced with the corresponding character.

LegionMammal978

Posted 2015-05-26T10:36:04.493

Reputation: 15 731

2This is one of those puzzles where Mathematica offers a solution that feels kind of cheaty: LeapYearQ[#]& – zeldredge – 2015-05-26T13:23:14.197

1You can use to represent Divisible : #∣4&&(!#∣100||#∣400)&, 21 characters, 27 UTF-8 bytes. – alephalpha – 2015-05-26T13:54:16.067

@zeldredge Still, that's not shorter than the APL solution. – FUZxxl – 2015-05-26T14:10:52.603

@alephalpha Alternatively, you could use U+F523 (\[Implies]) to make it #∣4&&(#∣100<U+F523>#∣400)& for 19 chars (but still 27 bytes). – LegionMammal978 – 2015-05-26T15:15:30.300

This is a standard loophole; you're using a function that does exactly the required functionality. This is verboten. – FUZxxl – 2015-05-26T15:33:23.323

@FUZxxl Thanks, it's been a long time since I've read them. – LegionMammal978 – 2015-05-26T16:18:52.953

6

R, 29

!(Y=scan())%%4&Y%%100|!Y%%400

Test run

> !(Y=scan())%%4&Y%%100|!Y%%400
1: 1936
2: 1805
3: 1900
4: 2272
5: 2400
6: 2200
7: 
Read 6 items
[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

MickyT

Posted 2015-05-26T10:36:04.493

Reputation: 11 735

5

C, 81

I can do shorter, but this one neatly sticks to 'char' types, without parsing the argument (e.g. with atoi):

main(c,v)char**v;{char*p=*v+9;p-=2*(96==*p+p[1]);putchar("ynnn"[(2**p^p[1])&3]);}

It must be invoked with a name 4 characters long, because it makes the standard assumption that arguments immediately follow the program name, separated by NULs. Furthermore, it assumes that the single argument is encoded in ASCII and has no leading space.

Explanation:

main(c,v)
char**v;
{
    char *p = *v+9;
    if (p[0] + p[1] == '0'+'0')
        p -= 2;
    putchar("ynnn"[((*p << 1) ^ p[1])&3]);
}

*v+9 is the position of the 'tens' digit in v[1]+2.

If the 'tens' and 'units' characters add to 96, we end in 00, so back up two characters, so that 'tens' and 'units' point to the century number.

Now xor 'units' with twice the 'tens', mod 4. This works because 10==±2 mod 4, so the lower bit of the 'tens' can just toggle bit 1 of the 'units'. We use the result as an index into our remainders table, printing y only if the modular result is zero.

Toby Speight

Posted 2015-05-26T10:36:04.493

Reputation: 5 058

4

Befunge-98, (41 bytes)

&:4%#v_:aa*%#v_28*%|
"y",;<;@,"n";>;  ;#[

Simplicity is awesome.

MegaTom

Posted 2015-05-26T10:36:04.493

Reputation: 3 787

4

sed, 55

s/00$//
y/0123456789/yNnNyNnNyN/
/N.$/y/ny/yn/
s/.\B//g
  • First line divides exact centuries by 100.
  • Second line gives 'N' to odd digits, 'y' to 4s, and 'n' to non-4s.
  • Third line swaps 'y' and 'n' if there's an odd penultimate digit (because 10 is 2 mod 4)
  • Final line deletes all but the last character

Note that non-leap years may be printed as n or N depending on whether they are even or odd. I consider this a creative interpretation of the rule which allows alternatives to 'yes' and 'no' without specifying that they have to be consistent.

Toby Speight

Posted 2015-05-26T10:36:04.493

Reputation: 5 058

4

Python2 - 37

g=lambda x:(x%4or x%400and x%100<1)<1

Note that if a is a nonnegative integer, then a<1 is a short way of writing not bool(a). The last <1 thus effectively converts the expression in the parentheses to a boolean and negates the result.

Applying the function g to an integer n between 1801 and 2400 will return True if n is a leap year, and False otherwise.

mathmandan

Posted 2015-05-26T10:36:04.493

Reputation: 943

3

Haskell, 19 bytes

f i=gcd 80i>gcd 50i

Try it online!

primo

Posted 2015-05-26T10:36:04.493

Reputation: 30 891

3

KDB(Q), 27 bytes

{0=x mod(4 400)0=x mod 100}

Explanation

               0=x mod 100      / boolean of 100 divisibility
        (4 400)                 / 0b -> 4, 1b -> 400
 0=x mod                        / boolean of 4/400 divisibility
{                         }     / lambda

Test

q){0=x mod(4 400)0=x mod 100}1936 1805 1900 2272 2400
10011b

WooiKent Lee

Posted 2015-05-26T10:36:04.493

Reputation: 413

3

Julia, 30 28 bytes

y->(y%4<1&&y%100>0)||y%400<1

This creates an unnamed function that accepts an integer argument and returns a boolean value. To call it, give it a name, e.g. f=y->....

Ungolfed:

function f(y)
    (y % 4 == 0 && y % 100 != 0) || y % 400 == 0
end

Example:

julia> for y in [1936, 1805, 1900, 2272, 2400] println(f(y)) end
true
false
false
true
true
true

Alex A.

Posted 2015-05-26T10:36:04.493

Reputation: 23 761

3

PHP - 45 bytes

$b=$argv[1]%400;echo !$b|!($b%4)&!!($b%100);

Nothing that special really, just abusing type-juggling.

NorthBridge

Posted 2015-05-26T10:36:04.493

Reputation: 191

3

C, 37 34 30 bytes

l(y){y=y%(y%25?4:16)?110:121;}

Wandbox

o79y

Posted 2015-05-26T10:36:04.493

Reputation: 509

3

Java 8, 49 45 22 20 bytes

n->n%(n%25<1?16:4)<1

-2 bytes thanks to @OlivierGrégoire.

Try it online.

Some 22 bytes solutions:

n->n%25<1?n%16<1:n%4<1

Try it online.

n->(n%25<1?n%16:n%4)<1

Try it online.

java.time.Year::isLeap

Try it online.

Explanation:

n->                // Method with integer parameter and boolean return-type
   n%          <1  //  Return whether the integer is divisible by:
     (n%25<1?      //   If the input is divisible by 25:
             16    //    Check if its divisible by 16
            :      //   Else:
             4)    //    Check if its divisible by 4 instead

Kevin Cruijssen

Posted 2015-05-26T10:36:04.493

Reputation: 67 575

Another 22 bytes alternative: java.time.Year::isLeap.

– Olivier Grégoire – 2019-01-10T09:35:00.983

2

And a 20 bytes solution: n->n%(n%25<1?16:4)<1

– Olivier Grégoire – 2019-01-10T09:37:45.473

@OlivierGrégoire Nice 20-byter! And didn't realize that the builtin was also 22 bytes. :) – Kevin Cruijssen – 2019-01-10T10:13:50.033

3

C#, 23 bytes

y=>y%25<1?y%16<1:y%4<1;

Try it online!

Full source, including test cases:

using System;

namespace CountingLeapYears
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,bool>s=y=>y%25<1?y%16<1:y%4<1;
            Console.WriteLine(s(1936)); //y
            Console.WriteLine(s(1805)); //n
            Console.WriteLine(s(1900)); //n
            Console.WriteLine(s(2272)); //y
            Console.WriteLine(s(2400)); //y
        }
    }
}

adrianmp

Posted 2015-05-26T10:36:04.493

Reputation: 1 592

3

T-SQL 37 22 bytes

Saved 15 bytes thanks to BradC's comment.

The usual hardcoded variable for lack of a stdin.

e.g.

DECLARE @ NVARCHAR(4) = '2016'

Then the solution is:

PRINT ISDATE(@+'0229')

S.Karras

Posted 2015-05-26T10:36:04.493

Reputation: 241

1If I'm reading the challenge right, I think you can save a bunch of bytes by just returning the 1 or 0 directly: PRINT ISDATE(@+'0229') – BradC – 2019-01-08T14:40:56.600

2

Mathematica, 15 bytes

LeapYearQ@*List

Mathematica has a built-in for everything. List is there to make the integer input into a compact DateList object. Returns True or False.

JungHwan Min

Posted 2015-05-26T10:36:04.493

Reputation: 13 290

LeapYearQ@{#}& for 14 – attinat – 2019-08-15T06:39:22.093

2

PHP, 28 bytes

Why calculate when there´s a builtin?

<?=checkdate(2,29,$argv[1]);

prints 1 for leap year, empty string for no leap year.
Add + after <?= for 1/0.

Titus

Posted 2015-05-26T10:36:04.493

Reputation: 13 814

2

SmileBASIC, 40 bytes

INPUT Y?0DTREAD STR$(Y)+"/02/29"OUT,,,?1

Prints 0 1 if it's a leap year, otherwise prints 0 and errors.

DTREAD parses a date string in the form of YYYY/MM/DD and gives the year, month, and day. It can also return the day of the week, and trying to get the day of the week of a day that doesn't exist (Feb. 29 of a non-leap year) will cause an error.

This is shorter than the obvious answer using mod, because SB uses MOD instead of %, which takes up 3-5 characters.

12Me21

Posted 2015-05-26T10:36:04.493

Reputation: 6 110

2

Jelly, 7 bytes

ọ4,25>/

Try it online!

How it works

ọ4,25>/  Main link. Argument: n (1801 - 2400)

ọ4,25    Test how many times n is divisible by 4 and 25.
     >/  Verify that the order of 4 is higher than the order of 25.

Dennis

Posted 2015-05-26T10:36:04.493

Reputation: 196 637

2

x86 machine code, 14 bytes

00000000: adfd ad2d 3030 74fa 86c4 d50a a803       ...-00t.......

Unassembled

AD         LODSW           ; SI += 2 to start with last two digits
FD         STD             ; set direction for LODSW to decrement
AD         LODSW           ; load two ASCII digit chars into AX
2D 3030    SUB  AX, '00'   ; convert to decimal, test if year ends in 00?
74 FA      JZ   -6         ; if so, look at the first two digits instead
86 C4      XCHG AL, AH     ; endian convert
D5 0A      AAD             ; base convert from 10 to binary
A8 03      TEST AL, 3      ; mod 4 = 0?

Input string in SI, output is ZF if is a leap year.

Explanation

If the year does not end in 00, it is a leap year if last two digits mod 4 is 0. If it does end in 00, it will be a leap year if the first two digits mod 4 is 0. Example:

Leap year:

  • 1936: 36 mod 4 == 0
  • 2400: 24 mod 4 == 0

NOT leap year:

  • 1805: 05 mod 4 == 1
  • 1900: 19 mod 4 == 3

Test Program Output

LEAP.COM test output

Download and test LEAP.COM.

640KB

Posted 2015-05-26T10:36:04.493

Reputation: 7 149

2

Excel, 30 bytes

David Hammen's method (A1 serves as input):

=MOD(A1,IF(MOD(A1,25),4,16))=0

Built-in functions can get you down to 23 bytes. However, this approach doesn't work on 1900 because of bug compatibility with Lotus 1-2-3:

=MONTH(DATE(A1,2,29))=2

You could even save two more bytes by using Portugese locale:

=MÊS(DATA(A1;2;29))=2

orthoplex

Posted 2015-05-26T10:36:04.493

Reputation: 339

2

Javascript ES6, 32, 29, 26

Any of following lines works:

f=y=>new Date(y,2,0).getDate()&1
g=y=>!(y&3)^!(y%100)>!(y%400)
h=y=>!(y&3|y%100<1&&y%400)

Qwertiy

Posted 2015-05-26T10:36:04.493

Reputation: 2 697

2

C, 57 bytes

Takes the input from stdin, with or without trailing spaces/newline. Only works on little endian machines (yeah, like everyone is on BE these days). Outputs Y or N.

main(y){scanf("%d",&y);y=y%(y%100?4:400)?78:89;puts(&y);}

Explanation

Ungolfed:

int main(int y) {
   scanf("%d", &y);
   y = y % (y % 100 ? 4 : 400) ? 'N' : 'Y';
   puts(&y);
}

First, scanf reads the year as an integer in y. Then, y is modulo'ed with 4 or 400 depending on whether the year is divisible by 100. If the remainder is zero, the ASCII code for Y is assigned to y, otherwise it gets the ASCII code for N. The value of y is now 0x000000??, where 0x?? is the assigned character. Being on a little-endian machine, in memory this is stored as ?? 00 00 00. This is a NULL-terminated C string, containing only the assigned characters. The address of y is passed to puts and the char is printed (with a trailing newline).

Andrea Biondo

Posted 2015-05-26T10:36:04.493

Reputation: 1 452

1"You will output in any way that you like that clearly tells the user if it is or isn't a leap year." Can you save a couple bytes by returning 1 or 0 rather than 'Y' or 'N'? (I don't really know C at all, just guessing.) – Alex A. – 2015-05-28T18:54:15.200

@AlexA. Thanks for the edit - now I know how to highlight syntax :) I considered it. The ASCII codes are both two digits, so no gain from that (by the way, I'm using uppercase Y and N to save 2 bytes, since lowercases have 3 digits). They are sequential, so that could be useful. Unfortunately, due to operator precedence, I get the same byte count: main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}. I can go down to 48 bytes if I can output an empty line for leap years and any character (ASCII 1-99) otherwise, but I feel like it's a bit bending the rules. What do you think? – Andrea Biondo – 2015-05-28T20:19:07.480

I must have done something wrong when counting chars. It's 57, not 59 :) – Andrea Biondo – 2015-05-28T20:21:18.470

1

Yeah, I'd say that's bending the rules, but you could comment on the question and ask the OP for confirmation. A good tool for counting bytes is this--I think a lot of the folks here use it.

– Alex A. – 2015-05-28T20:22:41.137

Nah, I'll leave it as it is :) – Andrea Biondo – 2015-05-28T20:36:15.633

2

Haskell, 43 41 39 bytes

l x=mod x(if mod x 25<1then 16else 4)<1

If x is divisible by 25, check if it is also divisible by 16, making it divisible by the least common multiple of 25 and 16, which is 400.
If x is not divisible by 25, check if it is divisible by 4.

Inspired by @David Hammen's answer in JavaScript.

AplusKminus

Posted 2015-05-26T10:36:04.493

Reputation: 171

I don't know Haskell, but can ==0 be <1? – lirtosiast – 2015-05-28T21:13:49.237

You are right, it can. – AplusKminus – 2015-05-29T09:04:25.403

1You can drop the spaces before then and else. – dfeuer – 2019-03-01T07:38:38.667

1

The conditional can be equivalently expressed as (4+sum[12|mod x 25<1]) for a total of 33 bytes: Try it online!

– Laikoni – 2019-03-03T09:24:13.993

2

PHP, 34 30 bytes

echo+!($argn%($argn%25?4:16));

I'm using the + sign to convert false (which would normally be converted to an empty string) to 0, because that seems to comply closer to the "clearness" requirement (maybe not?). With standard truthy/falsy rules, 1 byte can be saved.

Note: I shamelessly implemented the divisibility by 25 trick from @David Hammen. Without his algorithm it would be 37 bytes:

<?=+!(($b=$argv[1])%400^$b%100^$b%4);

Run like this:

echo 1900 | php -nR 'echo+!($argn%($argn%25?4:16));';echo

Tweaks

  • Saved 4 bytes by using $argn

aross

Posted 2015-05-26T10:36:04.493

Reputation: 1 583

1Save one more byte on standard truthy/falsy with <1 instead of !() – Titus – 2017-02-02T02:45:27.890

2

PowerShell, 31 bytes

I am excited to say that I golfed this shorter than the builtin!

param($a)!($a%(4,16)[!($a%25)])

Outputs true for leap years and false otherwise.

Builtin:

[datetime]::IsLeapYear($args[0])

Though, if I wanted to stretch the statement 'clearly tells the user if it is or isn't a leap year' and do something non-standard, I could save 3 bytes and use:

param($a)$a%(4,16)[!($a%25)]

This outputs 0 for leap years and 1 or higher for non-leap years, which I don't like since I'd prefer to return a more standard truthy value for leap years.

ThePoShWolf

Posted 2015-05-26T10:36:04.493

Reputation: 171

2

LOLCODE, 228 202 159 bytes

HOW IZ I f YR a
MOD OF a AN 100
O RLY?
YA RLY
MOD OF a AN 4
O RLY?
YA RLY
b R 1
OIC
NO WAI
MOD OF a AN 400
O RLY?
YA RLY
b R 0
NO WAI
b R 1
OIC
OIC
IF U SAY SO

Ungolfed:

HAI 1.3 BTW "HAI" does nothing functionally in current versions and does not throw an error if you omit it.
HOW IZ I leap YR input
    I HAS A output
    DIFFRINT MOD OF input AN 100 AN 0 BTW Thanks @LeakyNun, In LOLCODE any non-empty values, i.e. 0, "", etc. default to WIN.
    O RLY?
        YA RLY
            BOTH SAEM MOD OF a AN 4 AN 0
            O RLY?
                YA RLY
                    output R WIN BTW "WIN" is true, but in the actual program I used 1 as a truthy value because it's shorter.
            OIC
        NO WAI
            DIFFRINT MOD OF a AN 400 AN 0
            O RLY?
                YA RLY
                    output R FAIL BTW "Fail" is false, but in the actual program I used 0 as a falsy value.
                NO WAI
                    output R WIN
            OIC
    OIC
    FOUND YR output BTW This statement is implied in the golfed version.
IF U SAY SO BTW "KTHXBYE", just like "HAI" has no functional purpose and throws no error on omission.
KTHXBYE

In Python ungolfed, because LOLCODE is confusing:

def leap:
    if(year % 100 != 0):
        if(year % 4 == 0):
            output = true
    else:
        if(year % 400 != 0):
            output = false
        else:
            output = true
    return(output)

OldBunny2800

Posted 2015-05-26T10:36:04.493

Reputation: 1 379

Would it be shorter to define a function? – Leaky Nun – 2016-07-22T16:55:19.507

probably, but I will edit it later. – OldBunny2800 – 2016-07-22T16:59:20.633

You have updated the main code to be a function, but not the ungolfed code? – Destructible Lemon – 2016-07-23T02:25:06.377

I thought LOLCODE has automatic type coercion, meaning that any non-zero value is equivalent to WIN.. – Leaky Nun – 2016-07-23T02:38:55.890

It is, but how could I use that? I don't think I am doing any casting. – OldBunny2800 – 2016-07-23T02:41:31.423

Instead of comparing year%400 with 0, you can use it directly – Leaky Nun – 2016-07-23T03:29:05.440

Oh yeah! Thanks. – OldBunny2800 – 2016-07-23T20:34:01.557

Fixed bytecount that I don't know how was wrong – OldBunny2800 – 2016-07-23T23:41:10.167

1

Retina, 24 bytes

[^04]00$

.+
$*
....

^$

Try it online!

Martin Ender

Posted 2015-05-26T10:36:04.493

Reputation: 184 808

1

PHP, 45 bytes

<?=date_create($argv[1].'-1-1')->format('L');

Not the shortest, but using built in functions. Totally not code-golf.

Dexa

Posted 2015-05-26T10:36:04.493

Reputation: 236

1

Jelly, 8 bytes

ȷ2*ḍ¥×4ḍ

Try it online!

Erik the Outgolfer

Posted 2015-05-26T10:36:04.493

Reputation: 38 134

1

Bash, 14 bytes

date -d$1/2/29

Try it online!

Outputs via exit code, 0 for leap year and 1 otherwise.

date -d STRING will display the date indicated by STRING. $1/2/29 represents February 29th of $1, the argument. If STRING is not valid, i.e. Feb 29 does not exist, then date errors out.

user41805

Posted 2015-05-26T10:36:04.493

Reputation: 16 320

1

C++, 50 43 bytes

-7 bytes thanks to Zacharý

int l(int y){return!(y%4)&&y%100+!(y%400);}

And the test code is :

auto t = {
    1936,1805,1900,2272,2400
};

for (auto&a : t) {
    std::cout << "Year : " << a << " is " << (l(a) ? "" : "NOT") << " a leap year\n";
}

HatsuPointerKun

Posted 2015-05-26T10:36:04.493

Reputation: 1 891

You can make it int l(int y){return(y%4==0&&y%100)+(y%400==0);} to save a few bytes – Zacharý – 2018-03-29T13:49:02.567

I think making +(y%400==0) +!(y%400) might work as well. – Zacharý – 2018-04-01T18:54:57.373

int l(int y){return!(y%4)&&y%100+!(y%400);} – Zacharý – 2018-11-10T20:21:43.783

1

Ruby, 22 bytes

->n{1>n%(n%25<1?16:4)}

Try it online!

The challenge is quite old, but I noticed there was no valid Ruby answer yet. Nothing particularly original, anyway.

G B

Posted 2015-05-26T10:36:04.493

Reputation: 11 099

1

D, 43 42 bytes

T l(T)(T y){return!(y%4)&&y%100+!(y%400);}

Try it online!

Another port of @HatsuPointerKun's C++ answer.

Zacharý

Posted 2015-05-26T10:36:04.493

Reputation: 5 710

1

Kotlin, 30 bytes

{it%4<1&&(it%100>0||it%400>0)}

Try it online!

snail_

Posted 2015-05-26T10:36:04.493

Reputation: 1 982

1

Common Lisp, 46 bytes

(=(mod(setq x(read))(if(>(mod x 25)0)4 16))0)

Try it online!

Based on the David Hammen’s method.

Renzo

Posted 2015-05-26T10:36:04.493

Reputation: 2 260

1

Clam, 33 31 bytes

=a*rp|e%a*"400"0&%a*"100"e%a*40

Try it online!

-2 bytes thanks to ASCII-only

Outputs true for leap years. Outputs false for other years

Explanation

=a*rp|e%a*"400"0&%a*"100"e%a*40
=a*r                             read input and store in a*
    p                            Print..
       %a*"400"                    a* % 400
      e                            ==
               0                   0
     |                             OR
                 %a*"100"            a* % 100
                &                    AND
                          %a*4       a* % 4
                         e           ==
                              0      0

Very awkward explanation, but basically what it does is this:

print(year % 400 == 0 || (year % 100 && year % 4 == 0))

Clam follows JS rules for truthy and falsey values, meaning year % 100 is true if it does not equal 0 (and it's shorter than adding an e before it and an 0 after it)

Resulting JS:

myVar = read();
console.log(year % 400 == 0 || (year % 100 && year % 4 == 0));

Skidsdev

Posted 2015-05-26T10:36:04.493

Reputation: 9 656

ew 8552. use something nicer like 4545 pls – ASCII-only – 2019-01-08T06:18:29.230

jk, 31

– ASCII-only – 2019-01-08T06:19:21.097

also pls fix your indentation in the explanation :| – ASCII-only – 2019-01-08T06:27:13.793

fixed that year % 100 thing – ASCII-only – 2019-01-08T06:42:39.650

1

MathGolf, 9 bytes

4♀`*]÷~≤*

Try it online!

Explanation

4         Push 4
 ♀        Push 100
  `*      Duplicate top two elements of stack and multiply (400)
    ]     Wrap stack in array ([4, 100, 400])
     ÷    Check input for divisibility with all array items
      ~   Dump array onto stack
       ≤  Check if divisibility by 100 is <= than divisibility with 400
        * Multiply with the divisibility bool for 4, works like logical and

The trick is that ensures that if a number is divisible by 100, it must also be divisible by 400, but if it's not divisible by 100, anything goes.

maxb

Posted 2015-05-26T10:36:04.493

Reputation: 5 754

1

Japt -!, 8 5 bytes

Locale dependent.

ÐUT k

Try it

Shaggy

Posted 2015-05-26T10:36:04.493

Reputation: 24 623

You can do ÐUT91 Îv to output 1 for leap year and 0 for non-leap year.

– Oliver – 2019-01-08T17:56:33.500

@Oliver, yeah, I suppose it would be clearer if I reversed the output. Updated. I came up with a few other similar alternatives, all relying on new Date rolling over. – Shaggy – 2019-01-08T18:05:27.740

@Oliver, found a shorter way. – Shaggy – 2019-01-08T18:31:22.980

1Every test case is returning false for me. – Oliver – 2019-01-08T19:35:18.190

@Oliver, it's locale dependent. – Shaggy – 2019-01-08T19:36:37.860

1Why would a leap year be locale dependent? – Oliver – 2019-01-08T19:41:18.130

@Oliver, its the timezone offset that's the key; in my locale it's GMT+0000 for leap years and GMT-0025 for other years. – Shaggy – 2019-01-08T19:50:36.020

1

Japt -h!, 8 bytes

Input is taken as a string.

k0 ò o%4

Try it online!

Oliver

Posted 2015-05-26T10:36:04.493

Reputation: 7 160

1

Haskell, 35 bytes

l x|x!25<1=x!16<1
l x=x!4<1
(!)=mod

Try it online!

dfeuer

Posted 2015-05-26T10:36:04.493

Reputation: 1 016

1

PHP, 35 34 bytes

-1 byte thanks to 640KB

<?=date(L,strtotime($argv[1].-1));

Try it online!

Came across the L option in the PHP date formatter, which returns if the year of the date is a leap year. After that, it was just a matter of trying to get the timestamp of the year in the shortest way (though I'm not too confident this is the shortest)

Jo King

Posted 2015-05-26T10:36:04.493

Reputation: 38 234

Well, strtotime($argv[1].-1) is 1 byte shorter at least https://tio.run/##K8go@P/fxt42JbEkVcNHp7ikqCS/JDM3VUMlsSi9LNowVk/XUFPT@v///0ZG5kYA

– 640KB – 2019-04-02T16:30:35.143

1

Reg, 14 bytes

1¿:%[4|]%[;]

Try it online!

How it works (because it contains unprintable characters)

user85052

Posted 2015-05-26T10:36:04.493

Reputation:

Maybe leave a note as to why you've spelt it Reg when the link goes to Keg, so people like me don't think you've just made a typo. – Jo King – 2019-08-15T07:20:17.030

Okay. We have decided to rename "Unofficial Keg" as "Reg." – None – 2019-08-15T07:33:06.967

1

W d, 10 8 bytes

Ö♦Ç⌂╬`§Γ

Explanation:

Uncompressed:

25m4&16|m!
25m        % If the input is modulo-able by 25:
   4&      % Return 4
     16|   % Otherwise, return 16
        m! % Modulo input by the value. Negate the value.

user85052

Posted 2015-05-26T10:36:04.493

Reputation:

1

SpecBAS - 77

Not the shortest (but not the longest either).

1 INPUT y: PRINT y;"->";"ny"((y MOD 4=0 AND (y MOD 100<>0) OR y MOD 400=0)+1)

Uses the standard formula, then prints "n" or "y" based on return value (the final +1 at the end is due to strings being 1-based).

Brian

Posted 2015-05-26T10:36:04.493

Reputation: 1 209

I don't know the language, but based the fact that there are no booleans, you may be able to save some characters by using something like y MOD (4+12*(y MOD 100=0))=0. – lirtosiast – 2015-05-28T22:49:22.780

1

Python, 37 bytes

def c(s):return s%16*(s%25<1)<(s%4<1)

Destructible Lemon

Posted 2015-05-26T10:36:04.493

Reputation: 5 908

1

Python, 50 48 bytes

import calendar as y
def a(b):print(y.isleap(b))

Daniel

Posted 2015-05-26T10:36:04.493

Reputation: 1 808

1

C#, 26 bytes

y=>DateTime.IsLeapYear(y);

C# lambda (Predicate) where the input is a int and the output is a bool. I use a builtin.

aloisdg moving to codidact.com

Posted 2015-05-26T10:36:04.493

Reputation: 1 767

You don't really need the lambda here, and I would argue the answer is more valid without it. – VisualMelon – 2017-01-13T09:26:28.347

@VisualMelon In the meta section, they ask for a function. (If I remember) – aloisdg moving to codidact.com – 2017-01-14T15:24:28.617

4

Aye, but DateTime.IsLeapYear is a function ;) generally the rule is that it has to evaluate to a function if it isn't named, and strictly your current submission is meaningless (join the argument here!), while System.DateTime.IsLeapYear is fully typed (System.Func<int,bool>A=System.DateTime.IsLeapYear compiles fine) without demanding any user inference (or indeed the text in your answer which specifies the input and output types).

– VisualMelon – 2017-01-14T17:22:17.753

1

Java 8, 17 bytes

y->y%4<1&y%100>0;

It almost looks like a golfing language lol

Shaun Wild

Posted 2015-05-26T10:36:04.493

Reputation: 2 329

Fails for input 2400... – Olivier Grégoire – 2019-01-10T09:39:31.753

The last 3 years of my life has been a lie – Shaun Wild – 2019-01-11T12:10:27.010

1

BASH, 68 bytes

((!(y % 4) && ( y % 100 || !(y % 400)))) &&  echo "leap" || echo "no"

michael501

Posted 2015-05-26T10:36:04.493

Reputation: 191

0

MATLAB + Aerospace Toolbox, 9 bytes

@leapyear

Anonymous function that determines if the passed year is a leap year, returning 1 for leap and 0 for not.

Ok so MATLAB has a built-in... But there we are.


Octave, 13 bytes

@is_leap_year

Try it online!

Octave also has a built-in... cost's 4 more bytes than MATLAB though.

Tom Carpenter

Posted 2015-05-26T10:36:04.493

Reputation: 3 990

0

Whitespace, 103 bytes

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve][S N
S _Duplicate_input][S S S T T   S S T   N
_Push_25][T S T T   _Modulo][N
T   S T N
_If_0_jump_to_Label_TRUE][S S S T   S S N
_Push_4][T  S T T   _Modulo][N
T   S S N
_If_0_jump_to_Label_LEAP][N
S N
N
_Jump_to_Label_PRINT][N
S S T   N
_Create_Label_TRUE][S S S T S S S S N
_Push_16][T S T T   _Modulo][N
T   S S N
_If_0_jump_to_Label_LEAP][N
S N
N
_Jump_to_Label_PRINT][N
S S S N
_Create_Label_LEAP][S S S T N
_Push_1][N
S S N
_Create_Label_PRINT][T  N
S T _Print_as_integer]

Letters S (space), T (tab), and N (new-line) added as highlighting only.
[..._some_action] added as explanation only.

Explanation in pseudo-code:

Integer i = STDIN-input as integer
If i modulo-25 is 0:
  If i modulo-16 is 0:
    Print 1
  Else:
    Print 0
Else-if i modulo-4 is 0:
  Print 1
Else:
  Print 0

Example runs:

Input: 1936

Command     Explanation                Stack            Heap       STDIN    STDOUT   STDERR

SSSN        Push 0                     [0]              {}
SNS         Duplicate top (0)          [0,0]            {}
SNS         Duplicate top (0)          [0,0,0]          {}
TNTT        Read STDIN as integer      [0,0]            {0:1936}   1936
TTT         Retrieve at heap 0         [0,1936]         {0:1936}
SNS         Duplicate top (1936)       [1936,1936]      {0:1936}
SSSTTSSTN   Push 25                    [1936,1936,25]   {0:1936}
TSTT        Modulo                     [1936,11]        {0:1936}
NTSTN       If 0: Jump to Label_TRUE   [1936]           {0:1936}
SSSTSSN     Push 4                     [1936,4]         {0:1936}
TSTT        Modulo                     [0]              {0:1936}
NTSSN       if 0: Jump to Label_LEAP   []               {0:1936}
NSSSN       Create Label_LEAP          []               {0:1936}
SSSTN       Push 1                     [1]              {0:1936}
NSSN        Create Label_PRINT         [1]              {0:1936}
TNST        Print top as integer       []               {0:1936}            1
                                                                                     error

Program stops with an error: No exit defined.
Try it online (with raw spaces, tabs and new-lines only).

Input: 2400

Command     Explanation                Stack            Heap       STDIN    STDOUT   STDERR

SSSN        Push 0                     [0]              {}
SNS         Duplicate top (0)          [0,0]            {}
SNS         Duplicate top (0)          [0,0,0]          {}
TNTT        Read STDIN as integer      [0,0]            {0:2400}   2400
TTT         Retrieve at heap 0         [0,2400]         {0:2400}
SNS         Duplicate top (2400)       [2400,2400]      {0:2400}
SSSTTSSTN   Push 25                    [2400,2400,25]   {0:2400}
TSTT        Modulo                     [2400,0]         {0:2400}
NTSTN       If 0: Jump to Label_TRUE   [2400]           {0:2400}
NSSTN       Create Label_TRUE          [2400]           {0:2400}
SSSTSSSSN   Push 16                    [2400,16]        {0:2400}
TSTT        Modulo                     [0]              {0:2400}
NTSSN       If 0: Jump to Label_LEAP   []               {0:2400}
NSSSN       Create Label_LEAP          []               {0:2400}
SSSTN       Push 1                     [1]              {0:2400}
NSSN        Create Label_PRINT         [1]              {0:2400}
TNST        Print top as integer       []               {0:2400}            1
                                                                                     error

Program stops with an error: No exit defined.
Try it online (with raw spaces, tabs and new-lines only).

Input: 1991

Command     Explanation                Stack            Heap       STDIN    STDOUT   STDERR

SSSN        Push 0                     [0]              {}
SNS         Duplicate top (0)          [0,0]            {}
SNS         Duplicate top (0)          [0,0,0]          {}
TNTT        Read STDIN as integer      [0,0]            {0:1991}   1991
TTT         Retrieve at heap 0         [0,1991]         {0:1991}
SNS         Duplicate top (1991)       [0,1991,1991]    {0:1991}
SSSTTSSTN   Push 25                    [0,1991,1991,25] {0:1991}
TSTT        Modulo                     [0,1991,16]      {0:1991}
NTSTN       If 0: Jump to Label_TRUE   [0,1991]         {0:1991}
SSSTSSN     Push 4                     [0,1991,4]       {0:1991}
TSTT        Modulo                     [0,3]            {0:1991}
NTSSN       if 0: Jump to Label_LEAP   [0]              {0:1991}
NSSN        Create Label_PRINT         [0]              {0:1991}
TNST        Print top as integer       []               {0:1991}            0
                                                                                     error

Program stops with an error: No exit defined.
Try it online (with raw spaces, tabs and new-lines only).

Kevin Cruijssen

Posted 2015-05-26T10:36:04.493

Reputation: 67 575

0

ActionScript 2.0, 49 bytes

function a(b){trace(!(b%4)&&b%100+!(b%400)?1:0);}
function a(b){                                  } - define a function
              trace(                          );  - that outputs
                                          ?       - if
                    !(b%4)                        - the input divides by 4
                          &&                      - and
                            b%100                 - doesn't divide by 100
                                 +                - plus
                                  !(b%400)        - does divide by 400
                                           1:0    - 1, else 0

Not a very good explanation, and I might have swapped some stuff, but this still confuses me, so this is the best you're going to get.

Jhynjhiruu Rekrap

Posted 2015-05-26T10:36:04.493

Reputation: 61

0

C (gcc), 33 bytes

f(i,a){a=!(i%4|!(i%100)&&i%400);}

Try it online!

bznein

Posted 2015-05-26T10:36:04.493

Reputation: 121

0

05AB1E, 9 7 bytes

т‰0Kθ4Ö

Try it online or verify all test cases.

Explanation:

т‰         # Divmod the (implicit) input by 100
           #  i.e. 1900 → [19,00]
           #  i.e. 1936 → [19,36]
           #  i.e. 1991 → [19,91]
           #  i.e. 2000 → [20,00]
  0K       # Remove all 0s
           #  i.e. [19,00] → [19]
           #  i.e. [19,36] → [19,36]
           #  i.e. [19,91] → [19,91]
           #  i.e. [20,00] → [20]
    θ      # Pop and get the last item
           #  i.e. [19] → 19
           #  i.e. [19,36] → 36
           #  i.e. [19,91] → 91
           #  i.e. [20] → 20
     4Ö    # Check if it's divisible by 4 (and output the result implicitly)
           #  i.e. 19 → 0 (falsey)
           #  i.e. 36 → 1 (truthy)
           #  i.e. 91 → 0 (falsey)
           #  i.e. 20 → 1 (truthy)

Kevin Cruijssen

Posted 2015-05-26T10:36:04.493

Reputation: 67 575

0

JavaScript, 19 bytes

y=>!(y%25?y%4:y%16)

Try it online!

Oliver

Posted 2015-05-26T10:36:04.493

Reputation: 7 160

0

Swift, 82 bytes

func l(y:Int){y%4==0 && (y%100 != 0 || y%400==0) ?print("Y"):print("N")}
l(y:1936)

Try it online!

onnoweb

Posted 2015-05-26T10:36:04.493

Reputation: 211

-2

Reality, 1 byte

L

input via stdinput


The language was made after the challenge

Muhammad Salman

Posted 2015-05-26T10:36:04.493

Reputation: 2 361