Eternal 2014 - ปริศนา PCG.SE ปีใหม่ 2558


29

ดังนั้นตอนนี้ถึงปี 2015 และคำตอบมากมาย จากปริศนาของปีที่แล้ว กำลังเริ่ม สร้างผลลัพธ์ที่ไม่ถูกต้องตอนนี้เป็นเวลาสำหรับคำถามที่เกี่ยวข้องกับหมายเลข 2015

ยกเว้น ... ทำไม คุณไม่ชอบหรือไม่ถ้าคำตอบตามปัญหาของปีที่แล้วของคุณถูกต้อง? ทำไมเราไม่เปลี่ยนปฏิทินของเราเพื่อที่จะไม่เคยมีมาก่อนในปี 2015 และเราเพียงแค่อยู่ต่อในปี 2014 ตลอดไปและตลอดไป?

มากำหนดสัญกรณ์วันใหม่ที่เรียกว่าสัญกรณ์ Eternal 2014ดังต่อไปนี้:

  • สำหรับวันปี 2014 และก่อนวันที่จะเป็นเช่นเดียวกับในปฏิทินเกรโกเรียน
  • สำหรับวันที่ในปี 2015 เป็นต้นไปปีจะอยู่ที่ 2014 และเดือนที่จะเป็นหมายเลขที่มันจะถ้ารอบเดือนเดียวกันในปี 2014 จะยังคงอยู่ตลอดไป 12 เดือนที่ผ่านมาดังนั้น2015-02-08จะเป็น2014-14-08และจะเป็น2020-12-31 2014-85-02โปรดทราบว่าวันอธิกสุรทินนั้นไม่นับเพราะปี 2014 ไม่ใช่ปีอธิกสุรทิน

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่จะใช้วันที่ทางดาราศาสตร์ของจูเลียนเป็นอินพุตและส่งคืนสตริงที่มีวันที่ตรงกับวันที่จูเลียนนั้นใน Eternal 2014 ในรูปแบบYYYY-MM-DDหรือDD/MM/YYYYรูปแบบ

คุณอาจคิดว่าวัน Julian ที่ป้อนจะเป็นจำนวนเต็มตั้งแต่1721426(1 มกราคม 1) ถึง2914695(23 มกราคม 3268) รวม ปีอาจมีเลขศูนย์นำหน้าไปที่ตัวเลข 4 หลักหรือไม่ แต่เดือนและวันจะต้องนำเลขศูนย์ไปยังเลขสองหลักเสมอ (และปีอาจไม่มีเลขศูนย์นำหน้าไปยังจำนวนใดก็ได้ที่ไม่ใช่ 4)

นี่คือตัวอย่างอินพุตและเอาต์พุตในรูปแบบที่ยอมรับได้ทั้งหมด:

> 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

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

โปรแกรมที่สั้นที่สุด (เป็นไบต์) เพื่อให้ได้สิ่งนี้ในภาษาใดก็ตามที่ชนะ


3
ฮ่าฮ่าคำถามนี้จะเพิ่มขึ้น 25 เสียงทันทีเมื่อ Winter Bash เริ่มขึ้น
Joe Z.

คำตอบ:


12

Python 2, 166 ไบต์

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`

สิ่งนี้จะวนไปเรื่อย ๆ ทุกวันตั้งแต่วันที่ 1 มกราคม 1 (1721426) จนถึงวันที่กำหนดเพิ่มวันปัจจุบันเดือนและปีตามที่ไป กรณีทดสอบล่าสุดใช้เวลาประมาณหนึ่งวินาทีบนคอมพิวเตอร์ของฉัน

เอาต์พุตถูกพิมพ์ในรูปแบบที่สอง:

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

3

นกกระจอกเทศ 0.5.0 , 197 ไบต์

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 (ฮ่า):

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

ฉัน ... แค่เหนื่อยจากความสุขในวันขึ้นปีใหม่และไม่ได้อะไร นั่นเป็นเหตุผลที่ฉันไม่ได้เล่นกอล์ฟมากนัก ฉันอาจจะหรืออาจไม่กลับมาทำให้ดีขึ้นในภายหลัง

อัลกอริทึมจากhttps://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number


0

PHP (278)

php -R '<code>'ทำงานบนบรรทัดคำสั่งโดยใช้ (การตั้งค่าสถานะนับเป็นหนึ่งอักขระ)

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);

รุ่นที่อ่านได้มากกว่า (เรียกใช้โดยใช้ชื่อไฟล์และไม่มี-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 (ประเภทของ ... gcc อนุญาต) 183

คำเตือนมากมายสำหรับความไม่ได้มาตรฐานและอาจไม่สามารถถอดได้อย่างไม่น่าเชื่อ แต่มันสามารถใช้ได้กับเครื่องของฉันในวันนี้

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

มันใช้อัลกอริทึมเช่นเดียวกับคำตอบ Python 2 โดย @grc

ผลลัพธ์หลังจากการคอมไพล์คือ

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