Ewiges 2014 - PCG.SE das Puzzlespiel 2015 des neuen Jahres


29

Nun, da es 2015 ist und eine Reihe von Antworten aus dem letzten Jahr zu ungültigen Ergebnissen führen , ist es Zeit für eine Frage mit der Nummer 2015.

Außer ... warum? Würde es Ihnen nicht gefallen, wenn Ihre datumsbasierten Antworten auf das letztjährige Problem weiterhin gültig wären? Warum ändern wir unseren Kalender nicht so, dass es nie 2015 ist und wir einfach weiterhin für immer und ewig in 2014 leben?

Definieren wir eine neue Datumsnotation, die Ewige 2014-Notation , wie folgt:

  • Für Daten von 2014 und früher gelten dieselben Daten wie im proleptischen gregorianischen Kalender .
  • Die Termine in den Jahren 2015 und weiter, wird das Jahr bleiben 2014 und der Monat wird die Zahl es im Jahr 2014 , wenn die gleichen Monats - Zyklus wäre waren für immer vergangenen Monat 12. So fortsetzen 2015-02-08würde 2014-14-08, und 2020-12-31wäre 2014-85-02. Beachten Sie, dass Schalttage nicht berücksichtigt werden, da 2014 kein Schaltjahr ist.

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die ein julianisches astronomisches Datum als Eingabe verwendet und eine Zeichenfolge mit dem Datum zurückgibt, das diesem julianischen Datum in der Notation Eternal 2014 (entweder YYYY-MM-DDoder im DD/MM/YYYYFormat) entspricht.

Sie können davon ausgehen, dass der eingegebene julianische Tag immer eine ganze Zahl von 1721426(1. Januar, 1. Januar) bis 2914695(23. Januar, 3268) einschließlich ist. Jahre können führende Nullen zum Auffüllen von 4 Ziffern enthalten oder nicht, Monate und Tage müssen jedoch immer führende Nullen zum Auffüllen von zwei Ziffern enthalten (und Jahre dürfen keine führenden Nullen zum Auffüllen einer anderen Anzahl von Ziffern als 4 enthalten).

Hier sind einige Beispieleingaben und ihre Ausgaben in allen akzeptablen Formaten:

> 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

Sie dürfen keine eingebauten Datumsverarbeitungsbibliotheken in Ihrer Sprache verwenden. Alle Berechnungen müssen algorithmisch im Quellcode des Programms selbst durchgeführt werden.

Das kürzeste Programm (in Bytes), um dies in einer Sprache zu erreichen, gewinnt.


3
Haha, diese Frage erhält 25 positive Stimmen, wenn der Winter Bash beginnt.
Joe Z.

Antworten:


12

Python 2, 166 Bytes

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`

Dies durchläuft jeden Tag vom 1. Januar 1 (1721426) bis zum angegebenen Datum und erhöht den aktuellen Tag, Monat und das aktuelle Jahr. Der letzte Testfall dauert auf meinem Computer ungefähr eine Sekunde.

Die Ausgabe erfolgt im zweiten Format:

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

3

Strauß 0.5.0 , 197 Bytes

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

Ich bin wirklich nur erschöpft von all dem Neujahrsglück und was nicht. Deshalb habe ich so wenig Golf gespielt. Ich kann oder kann nicht zurückkommen, um es später besser zu machen.

Algorithmus von https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number


0

PHP (278)

Führen Sie in der Befehlszeile mit php -R '<code>'. (Die Flagge zählt als ein Zeichen.)

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

Mehr lesbare Version (mit und ohne Dateinamen ausführen -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 (irgendwie ... gcc erlaubt es) 183

Viele Warnungen wegen Nichtstandardität und wahrscheinlich unglaublich unportierbar, aber es funktioniert heute auf meinem Computer.

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

Es verwendet denselben Algorithmus wie die Python 2-Antwort von @grc

Die Ausgabe nach dem Übersetzen ist

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.