มันเป็นปีอธิกสุรทินหรือไม่


41

ความท้าทายนี้ค่อนข้างง่าย คุณจะรับอินพุตซึ่งจะเป็นปีตั้งแต่ 1801 ถึง 2400 และส่งออกถ้าเป็นปีอธิกสุรทินหรือไม่

ข้อมูลที่คุณป้อนจะไม่มีบรรทัดใหม่หรือช่องว่างต่อท้าย:

1954

คุณจะเอาท์พุทในแบบที่คุณชอบที่บอกผู้ใช้อย่างชัดเจนว่ามันเป็นหรือไม่ปีอธิกสุรทิน (ฉันจะยอมรับ y หรือ n สำหรับใช่ / ไม่ใช่)

คุณสามารถรับรายชื่อปีอธิกสุรทินได้ที่นี่: http://kalender-365.de/leap-years.php ฉันจะทราบว่าปีอธิกสุรทินไม่เคยมีสี่ปีเสมอไป 2439 เป็นปีอธิกสุรทิน แต่ไม่ใช่ 1900 ปีที่ติดตาม "ข้าม" นี้คือ:

1900
2100
2200
2300

กรณีทดสอบ:

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

แก้ไข: นี่เป็นพื้นฐานของปฏิทินเกรกอเรียน: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php


9
คุณควรมีความชัดเจนมากขึ้น: ปีที่ระบุคือปีอธิกสุรทินถ้าหากเป็น(divisible by 4)∧((divisible by 100)→(divisible by 400))เช่นนั้น
LegionMammal978

ข้อมูลที่คุณป้อนจะไม่มีบรรทัดใหม่หรือช่องว่างต่อท้าย แดงมันว่าจะมีการบันทึกผม 2 ไบต์ ...
เดนนิส

2
คุณควรขยายช่วงสัญญาณเข้าที่ยอมรับไปที่ AD 1601 ถึง 2400 ซึ่งครอบคลุมวงจรเกรโกเรียน 400 ปีสองรอบ (ซึ่งเริ่มตั้งแต่วันจันทร์)
David R Tribble

2
เท็จถ้าปีอธิกสุรทินและความจริงหากไม่นับปีอธิกสุรทินจะนับเป็น "บอกผู้ใช้อย่างชัดเจนว่าเป็นหรือไม่"
lirtosiast

@lirtosiast ฉันคิดอย่างนั้น ผู้ใช้จำนวนมากคิดเช่นนั้น
aloisdg พูดว่า Reinstate Monica

คำตอบ:


22

APL, 16 14 12 ตัวอักษร

ส่งคืน0สำหรับปีอธิกสุรทินสำหรับปี1ที่ไม่ก้าวกระโดด

≥/⌽×4 25 4⊤⎕

พยายามแก้ปัญหานี้ในtryapl.org โปรดทราบว่าฉันได้เปลี่ยนโซลูชันเป็น dfn {≥/⌽×4 25 4⊤⍵}เนื่องจาก tryapl.com ไม่รองรับ(รับข้อมูลจากผู้ใช้) โปรดทราบว่าเป็นกล่องเปล่าไม่ใช่ตัวอักษรที่ขาดหายไป

ทางออกเดียวกันใน J:

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

คำอธิบาย

Dyadic (encode) แสดงถึงอาร์กิวเมนต์ที่ถูกต้องในฐานที่ระบุโดยอาร์กิวเมนต์ซ้าย ฉันใช้ฐาน4 25 4ในโซลูชันนี้ นี่หมายถึงปีyเป็นพหุนาม

y mod 400 = 100 a + 4 b + c  โดยที่b <100 และc <4

ให้ข้อเสนอแอลฟา, β,และแกมมาแทนถ้าเป็น B,และCจะไม่ศูนย์: โจทย์γเป็นเท็จถ้าYเป็น dividable 4, βγเป็นเท็จถ้าYเป็น dividable โดย 100 และอัลฟ่าβγ มี false ถ้าyหารด้วย 400

ตารางความจริง ( *หมายถึง“ ไม่สนใจ”) เป็นข้อเสนอΔหมายถึงถ้าyเป็นปีอธิกสุรทิน:

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

คำสั่งต่อไปนี้แสดงΔในα , βและγ :

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

เนื่องจากโครงสร้างของคำสั่งนี้หนึ่งสามารถแสดง express เป็นการลด≥/⌽α β γที่reduction ดำเนินการ← นี่นำไปสู่คำตอบที่ฉันอธิบายตอนนี้


16

Pyth, 11 ไบต์

!%|F_jQ*TT4

โปรแกรมเต็มรูปแบบนี้อ่านจาก STDIN และพิมพ์Trueเป็นปีอธิกสุรทินและFalse เป็นอย่างอื่น

ขอบคุณ @Jakube สำหรับการแนะนำ Pyth และทำการเปลี่ยนรหัส CJam ของฉัน

ตรวจสอบกรณีการทดสอบตัวเองในPyth คอมไพเลอร์

มันทำงานอย่างไร

     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.

15

CJam, 12 ไบต์

rS+2m<~e|4%!

โปรแกรมเต็มรูปแบบนี้อ่านจาก STDIN และพิมพ์ 1 สำหรับ leap ปีและ 0 เป็นอย่างอื่น

ตรวจสอบกรณีการทดสอบตัวเองในล่าม CJam

มันทำงานอย่างไร

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.

ฉันมีทางเลือกอีก 12 ไบต์ บางทีคุณสามารถหาบางอย่างในพวกเขาเพื่อนำมาลงที่ 11? r2/~~\e|i4%!, r2/~~\~e|4%!, r2/:~~\e|4%!, r2/S*~\e|4%!และ 13 ไบต์r2/:~W%:e|4%!
มาร์ตินเอนเดอร์

@ MartinBüttner: นอกจากนี้ยังมีr2/:i:\e|4%!(12) และr2/:i(fe|~4%!(13) ฉันได้ลอง GolfScript (ซึ่งไม่ต้องการr) แต่or4ถูกตีความว่าเป็นโทเค็นเดียว ถ้ามีเพียงอินพุตที่มีบรรทัดขึ้นบรรทัดใหม่ ...
Dennis

14

Javascript (ES6), 21 ตัวอักษร

กฎมาตรฐานคือว่าyเป็นปีอธิกสุรทินถ้าแบ่ง 4 yและถ้าทั้ง 100 ไม่ได้แบ่งหรือไม่แบ่งy 400 yในรหัส

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

ไม่จำเป็นสำหรับ 100 และ 400 นั่นคือแทนที่จะพอเพียงเพื่อตรวจสอบว่า 16 หรือ 4 หาร y กับ 16 เลือกถ้า 25 หาร y หรือ 4 เป็นอย่างอื่น Golfed นี้จะกลายเป็น

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

ฟังก์ชั่นจาวาสคริปต์ที่ใช้งานนี้มีความยาว 21 ตัวอักษร:

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


Perl, 28 26 ตัวอักษร

แนวคิดเดียวกัน แต่ใน perl

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

รันโดยใช้-lpตัวเลือก ตัวอย่างเช่น,

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

ด้วยชุดทดสอบเป็นอินพุตสิ่งนี้จะสร้าง

1936
y
1805
n
1900
n
2272
y
2400
y

ฉันใช้คำแนะนำของคุณในคำตอบของฉันไม่เห็นคุณ ตอนนี้ฉันย้อนกลับ หมายเหตุ: คุณควรระบุ EcmaScript 6 มิฉะนั้นจะมีคนบ่นว่า 'ไม่ทำงานใน Chrome'
edc65

@ edc65: เขาควรระบุ EcmaScript 6 เพราะเป็น EcmaScript 6 เครื่องหมายฟังก์ชันลูกศร ( y=>...) เป็นคุณสมบัติ ES6
ทิม Sepas

นี่ไม่ควรเป็นสองคำตอบใช่ไหม
dfeuer

9

Pipขนาด 13 ไบต์

อันนี้น่าสนใจมากกว่าที่ปรากฏตัวครั้งแรก มันใช้เวลานานมาก แต่ในที่สุดฉันก็สามารถแทนที่การอ้างอิงที่มีความยาวเหล่านั้น400ด้วย4และhตัวแปร (= 100)

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

ผลผลิต1สำหรับปีอธิกสุรทินสำหรับปีที่0ไม่เผ่น คำอธิบาย:

               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

9

Pyth, 19 15 14 ไบต์

xFm!%Q^d2[2TyT

วิธีง่ายเกินไป ลองใช้งานออนไลน์: การสาธิตหรือชุดทดสอบ

แก้ไข: พลาดที่คุณสามารถพิมพ์ค่า Truthy / Falsy n/yแทน -4 ไบต์

แก้ไข 2: ใช้แนวคิดรากที่สองของ Martin -1 ไบต์

คำอธิบาย

                 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

9

Regex, 83 62 38

ขอบคุณ Toby สำหรับเคล็ดลับเกี่ยวกับการรวมครึ่งทั้งสองของ regex

หากเรามุ่งเน้นไปที่ช่วง 1801..2400 เท่านั้นและสมมติว่าอินพุตเป็นจำนวนเต็ม:

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

ทดสอบใน Ruby ( ^= \Aและ$= \Zเพราะ Ruby) สำหรับช่วงที่ต้องการ:

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

(โบนัส) สำหรับสิ่งที่ควรทำงานไม่เพียง แต่กับ 1801..2400 แต่สำหรับปีที่ไม่เป็นลบ:

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

ทดสอบใน Ruby ( ^= \Aและ$= \Zเพราะ Ruby) สำหรับ 100,000 ปีแรก:

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

1
หากคุณมี(?!)คุณสามารถรวมครึ่งทั้งสอง: (?!00)([02468][048]|[13579][26])(00)?$- สำหรับ 38. ที่จะไม่ทำงานสำหรับปีหนึ่งหลักแม้ว่า
Toby Speight

9

JavaScript ( ES6 ) 27

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

Golfed: !(y%100<1&&y%400||y%4)(ส่วนใหญ่ใช้กฎของ De Morgans )

ฟังก์ชั่นการใช้กฎ:

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

การทดสอบ (เรียกใช้ใน Firefox) เพียงเพื่อให้แน่ใจว่า:

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>


3
คุณสามารถลดนี้โดยหกตัวอักษรถ้าคุณใช้แทน!(y%(y%25?4:16)) !(y%100<1&&y%400||y%4)สำหรับผู้ที่ใส่ใจผู้ประกอบการคุณสามารถใช้!(y%(4<<2*!(y%25)))และยังคงบันทึกอักขระสามตัว !(y%100<1&&y%400||y%4)ได้
David Hammen

1
คำแนะนำของ David Hammen นั้นเหมือนกับคำตอบของเขาดังนั้นฉันคิดว่าคุณควรรักษาความยาวไว้ที่ 27
lirtosiast

9

TI-BASIC, 20 17 16 13

เนื่องจากเป็นโทเค็น TI-BASIC จึงมักจะแข่งขันกับความท้าทายทางคณิตศาสตร์อย่างง่าย แต่ไม่ใช่เพราะนี่ไม่มีคำสั่ง "หารได้" อาจจะเป็นหลังจากทั้งหมด แต่นี่ยังคงนานกว่า CJam และ Pyth

วิธีนี้ใช้วิธีของ David Hammond

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

รหัสเก่าที่ 16 ไบต์:

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(คือ "ส่วนที่เป็นเศษส่วน"; การยกกำลังมีความสำคัญสูงกว่าการหาร ใน TI-BASIC จะมีตัวเลือกโคลสอัพเป็นตัวเลือก

ฉันใช้พฤติกรรมที่ไม่มีเอกสารของsub(คำสั่งซึ่งมักใช้เพื่อรับ substring: เมื่ออาร์กิวเมนต์ของมันเป็นตัวเลขแทนที่จะเป็นสตริงมันจะหารจำนวนด้วย 100 มันจะทำงานกับเครื่องคิดเลข TI-83 หรือ 84

20 -> 17 โดยการจัดเรียงโค้ดใหม่เพื่ออนุญาตให้ลบ Parens แบบใกล้ชิด; 17 -> 16 โดยแทนที่ 400 ด้วย 16; 16 -> 13 โดยใช้ความคิดของ David Hammond


9

Stackylogic 226 ไบต์ (ไม่ใช่การแข่งขัน)

ใช่ถูกต้องแล้ว ฉันทำโปรแกรมใน Stackylogic (Non-TC) ซึ่งถูกคิดค้นโดย Helka Homba สำหรับความท้าทายที่พบที่นี่ สิ่งนี้เกิดขึ้นหลังจากการท้าทายดังนั้นจึงไม่ใช่การแข่งขัน

Stackylogic มีอินพุตแบบไบนารี่เท่านั้นดังนั้น 10 (หรือมากกว่านั้นจะต้องละเว้นเลขเพิ่มเติมใด ๆ ) บิตไบนารี่บิตต้องใช้ (บิตบิตสำคัญที่ป้อนก่อน) วันที่ใดก็ตามที่อยู่นอกช่วงที่ระบุอาจล้มเหลวเนื่องจากตรวจสอบว่าหมายเลขที่ป้อนคืออะไร: มันไม่ครอบคลุมวันที่ที่ไม่จำเป็น

นี่ไม่ใช่แค่ความท้าทายครั้งแรกของฉันกับ stackylogic แต่ความท้าทายครั้งแรกกับ stackylogic เลย

เตรียมตัวให้พร้อมสำหรับความยุ่งเหยิงนี้:

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

สิ่งนี้ใช้เวลานานมากในการทำเพราะ Stackylogic เป็นภาษาที่สับสนที่สุดที่ฉันพบและไม่สามารถอ่านได้มาก: คุณต้องรู้ว่าส่วนที่เหลือของโปรแกรมได้ถูกดำเนินการอย่างไรก่อนที่คุณจะสามารถอ่านส่วนปัจจุบันที่กำลังแก้ไข ฉันต้องเพิ่มช่องว่างเพื่อให้สามารถอ่านได้ในขณะที่สร้าง

คำอธิบายน้อย

นี่เป็นคำอธิบายง่ายๆว่ามันทำอะไร

Stackylogic ไม่มีฟังก์ชั่นทางคณิตศาสตร์ใด ๆ ดังนั้นจึงทำให้ยากขึ้น ฉันต้องฮาร์ดโค้ดส่วนใหญ่เพื่อตรวจสอบว่าเป็นหมายเลขเฉพาะหรือไม่

ครั้งแรกโปรแกรมนี้จะทำ NOR ของบิตที่สำคัญน้อยที่สุดทิ้งพวกเขาในกระบวนการ นี่หมายความว่าถ้ามันหารด้วย 4 มันจะไปยังส่วนหลักของโปรแกรมมิฉะนั้นเอาต์พุต 0

ประการที่สองตัวชี้ถูกส่งไปยังเขาวงกตของ stackylogic จากที่นี่ถ้าสองบิตถัดไปเป็นศูนย์มันจะส่งออกทันที 1 (จากนั้นหารด้วย 16 และปีอธิกสุรทินแม้จะมีเงื่อนไขอื่น ๆ ) อื่น ๆ ฉลาดจะตรวจสอบว่ามันไม่ใช่ตัวเลขที่หารด้วย 4 แต่ไม่ใช่ปีอธิกสุรทินระหว่างปี 1801 ถึง 2400

หากต้องการอธิบายอย่างละเอียดจะเกี่ยวข้องกับการทำให้โพสต์นี้ยาวเกินกว่าที่เป็นอยู่หลายเท่า


8

แอสเซมเบลอร์ IBM System Z - 56 ไบต์

(แหล่งกำเนิด 96 ไบต์ก่อนหน้านี้712 384 202 ไบต์แหล่งที่มาปฏิบัติการ 168 ไบต์)

ยังรุ่นเล็ก ไม่บันทึกการลงทะเบียนของผู้โทรอีกต่อไปการเปลี่ยนแปลงที่เก็บข้อมูลตามตัวอักษรโหมดการเปลี่ยนที่อยู่

 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 

เวอร์ชั่นใหม่. สิ่งนี้จะเป็นการขัดกับ S0C1 ถ้าเป็นปีอธิกสุรทินและวนซ้ำถ้าไม่ใช่ หวังว่าจะตอบสนองความต้องการในการระบุผลลัพธ์

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  

ตกลงดังนั้นไม่ใช่สั้นที่สุด (แม้ว่าอาจเป็นเมื่อเราดูโค้ดที่เรียกใช้งานจริงบวกกับขนาดของล่าม ... )

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  

เอาท์พุท:

ABEND S0C1 สำหรับปีอธิกสุรทิน S222 (เมื่อเวลา CPU หมด) ถ้าไม่

1936 Y 1805 N 1900 N 2272 Y 2400 Y

(เมื่อเรียกใช้หลายครั้ง)


ลงไปที่ 376 ไบต์โดยทำให้ขนาดพื้นที่จัดเก็บต่ำสุด (13 ไบต์) ลบพื้นที่การจัดเตรียม 'leapflag' และรวมเฉพาะปีเดียว (มากกว่า 5) ในโปรแกรม
Steve Ives

384 ไบต์โดยการจัดรูปแบบผลลัพธ์เล็กน้อย:
Steve Ives

1
+1 สำหรับตัวเลือกภาษาที่น่าสนใจและให้ความรู้ :-)
Toby Speight

ฉันสามารถบันทึกไม่กี่ไบต์โดยละทิ้งการประชุมและไม่รบกวนการบันทึกผู้โทรที่เริ่มต้นเนื่องจากโปรแกรมไม่กลับไปที่ผู้โทร นี่คือฟอร์มที่แย่มาก
Steve Ives

7

CJam, 18 16 ไบต์

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

ให้1(ความจริง) สำหรับปีอธิกสุรทินและ0(เป็นเท็จ) เป็นอย่างอื่น

เรียกใช้กรณีทดสอบทั้งหมดที่นี่

คำอธิบาย

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.

6

Mathematica, 40 27 ไบต์, 17 ตัวอักษร

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

ใช้ 17 ตัวอักษร แต่ 27 ไบต์ ขอบคุณ @alephalpha สำหรับคำแนะนำ โปรดทราบว่าจริง ๆ แล้วแถบแนวตั้งนั้นเป็น U + 2223 สำหรับการหาร <U+F523>ควรจะถูกแทนที่ด้วยตัวอักษรที่สอดคล้องกัน


2
นี่เป็นหนึ่งในปริศนาที่ Mathematica เสนอวิธีแก้ปัญหาที่ให้ความรู้สึกเหมือนโกง: LeapYearQ [#] &
zeldredge

1
คุณสามารถใช้เพื่อแสดงDivisible: #∣4&&(!#∣100||#∣400)&, 21 ตัวอักษร, 27 UTF-8 ไบต์
alephalpha

@zeldredge ยังคงไม่สั้นกว่าโซลูชัน APL
FUZxxl

@alephalpha อีกวิธีหนึ่งคุณสามารถใช้U+F523( \[Implies]) เพื่อทำ#∣4&&(#∣100<U+F523>#∣400)&19 ตัวอักษร (แต่ยังคง 27 ไบต์)
LegionMammal978

นี่คือช่องโหว่มาตรฐาน คุณกำลังใช้ฟังก์ชั่นที่ทำหน้าที่ตรงตามความต้องการ นี่คือ verboten
FUZxxl

6

R, 29

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

ทดสอบการทำงาน

> !(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

5

C, 81

ฉันสามารถทำให้สั้นลง แต่อันนี้อย่างยึดติดกับประเภท 'char' โดยไม่ต้องแยกอาร์กิวเมนต์ (เช่นกับatoi):

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

มันจะต้องถูกเรียกใช้ที่มีความยาวชื่อ 4 ตัวเพราะมันทำให้สมมติฐานมาตรฐานที่ขัดแย้งตามชื่อโปรแกรมทันทีคั่นด้วย NULs ยิ่งไปกว่านั้นสมมติว่าอาร์กิวเมนต์เดียวถูกเข้ารหัสใน ASCII และไม่มีพื้นที่นำหน้า

คำอธิบาย:

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คือตำแหน่งของหลัก 'นับ' v[1]+2ใน

หากอักขระ 'หน่วยสิบ' และ 'หน่วย' เพิ่มเป็น 96 เราจะสิ้นสุด00ดังนั้นสำรองอักขระสองตัวเพื่อให้ 'หน่วยสิบ' และ 'หน่วย' ชี้ไปที่หมายเลขศตวรรษ

ตอนนี้หน่วยของ xor ที่มีสองเท่าคือ 'ten', mod 4 มันใช้งานได้10==±2 mod 4ดังนั้นบิตที่ต่ำกว่าของ 'ten' ก็สามารถสลับ bit 1 ของ 'units' ได้ เราใช้ผลลัพธ์เป็นดัชนีในตารางส่วนที่เหลือของเราพิมพ์yเฉพาะในกรณีที่ผลลัพธ์แบบแยกส่วนเป็นศูนย์



4

sed, 55

s/00$//
y/0123456789/yNnNyNnNyN/
/N.$/y/ny/yn/
s/.\B//g
  • บรรทัดแรกหารศตวรรษที่แน่นอนด้วย 100
  • บรรทัดที่สองให้ตัวเลข 'N' เป็นเลขคี่ 'y' ถึง 4s และ 'n' ถึงไม่ใช่ 4s
  • การสลับบรรทัดที่สาม 'y' และ 'n' หากมีตัวเลขหลักสุดท้ายแปลก (เพราะ 10 คือ 2 mod 4)
  • บรรทัดสุดท้ายจะลบทั้งหมดยกเว้นอักขระตัวสุดท้าย

โปรดทราบว่าปีที่ไม่ได้ก้าวกระโดดอาจถูกพิมพ์เป็นnหรือNขึ้นอยู่กับว่าพวกเขาจะคู่หรือคี่ ฉันคิดว่านี่เป็นการตีความที่สร้างสรรค์ของกฎที่อนุญาตให้มีตัวเลือกอื่น ๆ เพื่อ 'ใช่' และ 'ไม่' โดยไม่ได้ระบุว่าต้องสอดคล้อง


4

Python2 - 37

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

โปรดทราบว่าถ้าaเป็นติดลบแล้วเป็นวิธีที่สั้นของการเขียนa<1 not bool(a)สุดท้าย<1จึงแปลงนิพจน์ในวงเล็บให้เป็นบูลีนและลบล้างผลลัพธ์อย่างมีประสิทธิภาพ

การใช้ฟังก์ชันgกับจำนวนเต็มnระหว่าง 1801 ถึง 2400 จะส่งคืนTrueถ้าnเป็นปีอธิกสุรทินและFalseอื่น ๆ


3

KDB (Q), 27 ไบต์

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

คำอธิบาย

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

ทดสอบ

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

3

Julia, 30 28 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่ยอมรับอาร์กิวเมนต์จำนวนเต็มและส่งกลับค่าบูลีน f=y->...เรียกว่าให้มันชื่อเช่น

Ungolfed:

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

ตัวอย่าง:

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


3

C #, 23 ไบต์

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

ลองออนไลน์!

แหล่งที่มาเต็มรูปแบบรวมถึงกรณีทดสอบ:

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
        }
    }
}


3

T-SQL 37 22 ไบต์

บันทึก 15 ไบต์ขอบคุณที่แสดงความคิดเห็นของ BradC

ตัวแปร hardcoded stdinปกติสำหรับการขาด

เช่น

DECLARE @ NVARCHAR(4) = '2016'

จากนั้นวิธีแก้คือ:

PRINT ISDATE(@+'0229')

1
ถ้าฉันอ่านความท้าทายที่เหมาะสมผมคิดว่าคุณสามารถบันทึกพวงของไบต์โดยเพียงแค่กลับมา1หรือ0โดยตรง:PRINT ISDATE(@+'0229')
BradC

3

Java 8, 49 45 22 20 ไบต์

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

-2 ไบต์ขอบคุณที่@ OlivierGrégoire

ลองออนไลน์

โซลูชันขนาด 22 ไบต์บางส่วน:

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

ลองออนไลน์

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

ลองออนไลน์

java.time.Year::isLeap

ลองออนไลน์

คำอธิบาย:

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

อีก 22 java.time.Year::isLeapไบต์ทางเลือก:
Olivier Grégoire

2
และวิธีแก้ปัญหา 20 ไบต์:n->n%(n%25<1?16:4)<1
Olivier Grégoire

@ OlivierGrégoire Nice 20-byter! และไม่ทราบว่าในตัวมีขนาด 22 ไบต์ :)
Kevin Cruijssen


2

Javascript ES6, 32, 29, 26

บรรทัดต่อไปนี้ใช้ได้:

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)

2

C, 57 ไบต์

รับอินพุตจาก stdin โดยมีหรือไม่มีช่องว่างต่อท้าย / ขึ้นบรรทัดใหม่ ใช้งานได้กับเครื่องจักร endian เล็ก ๆ น้อย ๆ เท่านั้น (ใช่แล้วเหมือนกับทุกคนในวันนี้ เอาต์พุต Y หรือ N

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

คำอธิบาย

Ungolfed:

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

ก่อนอื่นให้scanfอ่านปีเป็นจำนวนเต็มใน y จากนั้น y เป็นโมดูโลที่มี 4 หรือ 400 ขึ้นอยู่กับว่าปีหารด้วย 100 หรือไม่ถ้าส่วนที่เหลือเป็นศูนย์รหัส ASCII สำหรับ Y จะถูกกำหนดให้กับ y มิฉะนั้นจะได้รับรหัส ASCII สำหรับ N ค่าของ y คือตอนนี้0x000000??ที่0x??เป็นตัวละครที่ได้รับมอบหมาย เป็นบนเครื่องน้อย endian ?? 00 00 00ในความทรงจำนี้จะถูกเก็บไว้เป็น นี่คือสตริง C ที่สิ้นสุดด้วย NULL ซึ่งมีเฉพาะอักขระที่กำหนด ที่อยู่ของ y ถูกส่งผ่านไปยัง put และ char ถูกพิมพ์ (พร้อมขึ้นบรรทัดใหม่)


1
"คุณจะแสดงผลในแบบที่คุณชอบซึ่งจะแจ้งให้ผู้ใช้ทราบอย่างชัดเจนว่าเป็นปีที่ผ่านมาหรือไม่ คุณสามารถบันทึกสองสามไบต์โดยส่งคืน 1 หรือ 0 แทนที่จะเป็น 'Y' หรือ 'N' ได้ไหม (ฉันไม่รู้จัก C เลยเพียงแค่เดา)
Alex A.

@AlexA ขอบคุณสำหรับการแก้ไข - ตอนนี้ฉันรู้วิธีเน้นไวยากรณ์แล้ว :) ฉันพิจารณาแล้ว รหัส ASCII มีทั้งสองหลักดังนั้นจึงไม่ได้รับประโยชน์จากสิ่งนั้น (โดยวิธีการฉันใช้ตัวพิมพ์ใหญ่ Y และ N เพื่อบันทึก 2 ไบต์เนื่องจากตัวพิมพ์เล็กมี 3 หลัก) พวกมันเรียงตามลำดับดังนั้นอาจมีประโยชน์ main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}แต่เนื่องจากผู้ประกอบการมีความสำคัญฉันได้รับการนับไบต์เดียวกัน ฉันสามารถลงไปที่ 48 ไบต์ถ้าฉันสามารถส่งออกบรรทัดว่างสำหรับปีอธิกสุรทินและตัวละครใด ๆ (ASCII 1-99) เป็นอย่างอื่น แต่ฉันรู้สึกเหมือนมันเป็นกฎการดัดเล็กน้อย คุณคิดอย่างไร?
Andrea Biondo

ฉันต้องทำอะไรผิดเมื่อนับตัวอักษร มันคือ 57 ไม่ใช่ 59 :)
Andrea Biondo

1
ใช่ฉันจะบอกว่ามันเป็นไปตามกฎ แต่คุณสามารถแสดงความคิดเห็นในคำถามและขอ OP เพื่อยืนยัน เครื่องมือที่ดีสำหรับการนับไบต์นี้ --I คิดว่ามาก folks ที่นี่จะใช้มัน
Alex A.

ไม่ฉันจะทิ้งมันไว้ตามเดิม :)
Andrea Biondo

2

PowerShell, 31 ไบต์

ฉันตื่นเต้นที่จะบอกว่าฉันเล่นกอล์ฟนี้สั้นกว่าตัวใน!

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

ผลลัพธ์จริงสำหรับปีอธิกสุรทินและเท็จอย่างอื่น

builtin:

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

แม้ว่าถ้าฉันต้องการที่จะขยายคำสั่ง 'อย่างชัดเจนบอกผู้ใช้ว่ามันเป็นหรือไม่เป็นปีอธิกสุรทิน' และทำสิ่งที่ไม่ได้มาตรฐานฉันสามารถบันทึก 3 ไบต์และใช้:

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

ผลลัพธ์นี้0สำหรับปีอธิกสุรทินและ 1 หรือสูงกว่าสำหรับปีอธิกสุรทินซึ่งฉันไม่ชอบเนื่องจากฉันต้องการคืนค่าความจริงที่เป็นมาตรฐานมากขึ้นสำหรับปีอธิกสุรทิน


2

LOLCODE, 228 202 159 ไบต์

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

ใน Python ungolfed เนื่องจาก LOLCODE สับสน:

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

มันจะสั้นลงเพื่อกำหนดฟังก์ชั่นหรือไม่?
Leun Nun

อาจเป็นไปได้ แต่ฉันจะแก้ไขในภายหลัง
OldBunny2800

คุณได้อัปเดตรหัสหลักเป็นฟังก์ชั่น แต่ไม่ใช่รหัสที่ไม่ได้แต่งหรือไม่?
เลมอนที่ถูกทำลายได้

ฉันคิดว่า LOLCODE มีประเภทการข่มขู่โดยอัตโนมัติหมายความว่าค่าใด ๆ ที่ไม่ใช่ศูนย์เทียบเท่ากับWIN..
รั่วนูน

มันเป็น แต่ฉันจะใช้มันได้อย่างไร ฉันไม่คิดว่าฉันกำลังทำการคัดเลือกนักแสดง
OldBunny2800
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.