Vĩnh cửu 2014 - Câu đố năm mới PCG.SE 2015


29

Vì vậy, bây giờ là năm 2015 và một loạt các câu trả lời từ câu đố năm ngoái hiện đang bắt đầu tạo ra kết quả không hợp lệ , đã đến lúc cho một câu hỏi liên quan đến số 2015.

Ngoại trừ ... tại sao? Bạn có muốn nó không nếu câu trả lời dựa trên ngày của bạn cho vấn đề năm ngoái vẫn còn hiệu lực? Tại sao chúng ta không thay đổi lịch của mình để không bao giờ là năm 2015 và chúng ta chỉ đơn giản là tiếp tục sống trong năm 2014, mãi mãi?

Hãy xác định một ký hiệu ngày mới, được gọi là ký hiệu Vĩnh cửu 2014 , như sau:

  • Đối với ngày 2014 và trước đó, ngày sẽ giống như trong lịch Gregorian proleptic .
  • Cho những ngày trong những năm 2015 và trở đi, năm nay sẽ ở lại năm 2014, và tháng sẽ là số nó sẽ là nếu chu kỳ tháng cùng trong năm 2014 là tiếp tục mãi mãi tháng qua 12. Vì vậy, 2015-02-08sẽ là 2014-14-08, và 2020-12-31sẽ là 2014-85-02. Lưu ý rằng ngày nhuận không được tính vì năm 2014 không phải là năm nhuận.

Nhiệm vụ của bạn là xây dựng một chương trình hoặc chức năng sẽ lấy ngày thiên văn học Julian làm đầu vào và trả về một chuỗi có ngày tương ứng với ngày Julian đó trong ký hiệu Eternal 2014, theo định dạng YYYY-MM-DDhoặc DD/MM/YYYYđịnh dạng.

Bạn có thể cho rằng ngày Julian được nhập sẽ luôn là một số nguyên từ 1721426(ngày 1 tháng 1, 1) đến 2914695(ngày 23 tháng 1 năm 3268). Năm có thể chứa các số 0 đứng đầu đến 4 chữ số hoặc không, nhưng tháng và ngày phải luôn có các số 0 đầu để đệm thành hai chữ số (và năm có thể không chứa các số 0 đầu để đệm cho bất kỳ số nào ngoài 4 chữ số).

Dưới đây là một số ví dụ đầu vào và đầu ra của chúng, trong tất cả các định dạng có thể chấp nhận:

> 1721426
1-01-01
01/01/1
0001-01-01
01/01/0001

> 2086302
999-12-31
31/12/999
0999-12-31
31/12/0999

> 2456659
2014-01-01
01/01/2014

> 2456789
2014-05-11
11/05/2014

> 2457024
2014-13-01
01/13/2014

> 2457389
2014-25-01
01/25/2014

> 2469134
2014-411-07
07/411/2014

> 2567890
2014-3657-29
29/3657/2014

> 2914695
2014-15059-23
23/15059/2014

Bạn không được sử dụng bất kỳ thư viện xử lý ngày tích hợp nào trong ngôn ngữ của mình. Tất cả các tính toán phải được thực hiện bằng thuật toán trong chính mã nguồn của chương trình.

Chương trình ngắn nhất (tính bằng byte) để đạt được điều này trong bất kỳ ngôn ngữ nào sẽ thắng.


3
Haha, câu hỏi này nhận được 25 câu trả lời ngay khi Winter Bash bắt đầu.
Joe Z.

Câu trả lời:


12

Python 2, 166 byte

n=input()
d=m=y=1
M=([3]+[3,2]*3)*2
while n>1721426:
 n-=1;d+=1;M[2]=y%400<1or y%4<1<y%100
 if d>M[m%12]+28:m+=1;d=1
 if m>12<2014>y:y+=1;m=1
print'%02d/'*2%(d,m)+`y`

Điều này diễn ra theo từng ngày từ ngày 1 tháng 1 năm 1721 đến ngày đã cho, tăng dần ngày, tháng và năm hiện tại. Trường hợp thử nghiệm cuối cùng mất khoảng một giây trên máy tính của tôi.

Đầu ra được in ở định dạng thứ hai:

01/01/1
31/12/999
23/15059/2014

3

Đà điểu 0,5.0 , 197 byte

G~:J1401+4J*274227+146097/F3*4/F+38~+:f4*3+:e1461:p%4/F:g5*2+:h153:s%5/F1+:D;hs/F2+12:n%1+:M;ep/F4716-n2+M-n/F+:Y;{2014:Y;D365+:D;{M1-12%[31:x28x 30:yxyxxyxyx]=:dD<.{Dd-:D;M1+:M;}*}(}Y2014-*D"/M"/Y

Ungolfed (ha):

G~:J;
4716:y;1401:j;2:m;12:n;4:r;1461:p;3:v;5:u;153:s;2:w;274277:B;38~:C;
Jj+4J*B+146097/F3*4/F+C+:f;
rf*v+:e;
ep%r/F:g;
ug*w+:h;
hs%u/F1+:D;
hs/Fm+n%1+:M;
ep/Fy-nm+M-n/F+:Y;
{
2014:Y;
D365+:D;
{
M1-12%[31 28 31 30 31 30 31 31 30 31 30 31]=:d
D<.{Dd-:D;M1+:M;}*
}(
}Y2014-*
D"/M"/Y

Tôi ... thực sự đã kiệt sức từ tất cả hạnh phúc của năm mới và những gì không. Đó là lý do tại sao tôi không chơi golf này rất nhiều. Tôi có thể hoặc không thể quay lại để làm cho nó tốt hơn sau này.

Thuật toán từ https://en.wikipedia.org/wiki/Julian_day#Gregorian_calWiki_from_Julian_day_number


0

PHP (278)

Chạy trên dòng lệnh bằng cách sử dụng php -R '<code>'. (Cờ được tính là một ký tự.)

if(0<$N=($n=$argn-1721426)-735233){$n=$N%365+735233;$o=12*($N/365|0);}for($y=1+400*($n/146097|0)+100*(($n%=146097)/36524|0)+(($n%=36524)/1461<<2)+(($n%=1461)/365|0);($n%=365)>=$d=@++$m-2?30+($m+($m>>3)&1):29-($y%4||!($y%100)&&$y%400);)$n-=$d;printf("$y-%02d-%02d",$m+@$o,$n+1);

Phiên bản dễ đọc hơn (chạy bằng tên tệp và không có -R):

<?php

// step 1: read the input and fix up 2014 dates
if (0 < $N = ($n = fgets(STDIN) - 1721426) - 735233) {
    $n = $N % 365 + 735233; // wrap around to 2014-01-01
    $o = 12 * ($N / 365 | 0); // compute month offset
}

for (

// step 2: extract year
$y = 1
    + 400 * ($n / 146097 | 0)
    + 100 * (($n %= 146097) / 36524 | 0)
    + (($n %= 36524) / 1461 << 2)
    + (($n %= 1461) / 365 | 0);

// step 3: extract month and day
($n %= 365) >= $d = @++$m - 2
    ? 30 + ($m + ($m >> 3) & 1)
    : 29 - ($y % 4 || !($y % 100) && $y % 400);

) $n -= $d;

// step 4: print date string, adding the month offset
// previously computed in step 1.
printf("$y-%02d-%02d", $m + @$o, $n + 1);

0

C (loại ... gcc cho phép) 183

Rất nhiều cảnh báo cho sự không chuẩn và có thể không thể tin được, nhưng nó hoạt động trên máy của tôi ngày hôm nay.

y=1;m;d;main(n,a){for(n=atoi(a[1]);n-->1721426;)++d>((m%12<7?m%2==0:m%2!=0)?30:m%12-1?29:y%(y%100?4:400)?27:28)&&(++m,d=0,m>11&&y<2014)&&(++y,m=0);printf("%d-%02d-%02d\n",y,m+1,d+1);}

Nó sử dụng thuật toán tương tự như câu trả lời Python 2 của @grc

Đầu ra sau khi biên dịch là

test2014 2086302
999-12-31

test2014 2456659
2014-01-01

test2014 2456789
2014-05-11

test2014 2457024
2014-13-01

test2014 2457389
2014-25-01

test2014 2469134
2014-411-07

test2014 2567890
2014-3657-29

test2014 2914695
2014-15059-23
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.