Eternal 2014 - PCG.SE New Year's Puzzle 2015


29

Teraz, kiedy jest rok 2015, a garść odpowiedzi z zeszłorocznej układanki zaczyna przynosić nieprawidłowe wyniki , czas na pytanie dotyczące liczby 2015.

Z wyjątkiem ... dlaczego? Czy nie spodobałoby Ci się, gdyby twoje oparte na dacie odpowiedzi na problem z zeszłego roku pozostały aktualne? Dlaczego nie zmienimy naszego kalendarza, aby nigdy nie był 2015, i po prostu nadal będziemy żyć w 2014 roku, na zawsze i na zawsze?

Zdefiniujmy nowy zapis daty, zwany zapisem Eternal 2014 , w następujący sposób:

  • W przypadku dat 2014 i wcześniejszych daty będą takie same, jak w proleptycznym kalendarzu gregoriańskim .
  • W przypadku dat w latach 2015 i później rok pozostanie 2014, a miesiąc będzie liczbą, która byłaby, gdyby ten sam cykl miesiąca w 2014 r. Trwałby wiecznie po 12. miesiącu. Tak też 2015-02-08będzie 2014-14-08i 2020-12-31będzie 2014-85-02. Należy pamiętać, że dni przestępne nie są uwzględniane, ponieważ rok 2014 nie jest rokiem przestępnym.

Twoim zadaniem jest zbudowanie programu lub funkcji, która przyjmie astronomiczną datę juliańską jako dane wejściowe i zwróci ciąg znaków z datą odpowiadającą dacie juliańskiej w zapisie Eternal 2014, w jednym YYYY-MM-DDlub w dowolnym DD/MM/YYYYformacie.

Możesz założyć, że wprowadzony dzień juliański będzie zawsze liczbą całkowitą od 1721426(1 stycznia 1) do 2914695(23 stycznia 3268) włącznie. Lata mogą zawierać wiodące zera do uzupełnienia do 4 cyfr lub nie, ale miesiące i dni muszą zawsze mieć zera wiodące do uzupełnienia do dwóch cyfr (a lata mogą nie zawierać zer wiodących do uzupełnienia do dowolnej liczby cyfr innej niż 4).

Oto kilka przykładowych danych wejściowych i ich danych wyjściowych we wszystkich dopuszczalnych formatach:

> 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

Nie możesz używać żadnych wbudowanych bibliotek przetwarzania danych w swoim języku. Wszystkie obliczenia muszą być wykonywane algorytmicznie w samym kodzie źródłowym programu.

Wygrywa najkrótszy program (w bajtach) do osiągnięcia tego w dowolnym języku.


3
Haha, to pytanie ma 25 pozytywnych opinii, gdy zaczyna się Winter Bash.
Joe Z.

Odpowiedzi:


12

Python 2, 166 bajtów

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`

Cykl ten odbywa się codziennie od 1 stycznia 1 (1721426) do określonej daty, zwiększając bieżący dzień, miesiąc i rok w miarę upływu czasu. Ostatni przypadek testowy zajmuje około sekundy na moim komputerze.

Dane wyjściowe są drukowane w drugim formacie:

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

3

Struś 0,5.0 , 197 bajtów

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

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

Jestem ... naprawdę wyczerpany całym szczęściem noworocznym, a co nie. Właśnie dlatego tak dużo nie grałem w golfa. Mogę, ale nie muszę wrócić, aby później to poprawić.

Algorytm z https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number


0

PHP (278)

Uruchom w linii poleceń za pomocą php -R '<code>'. (Flaga liczy się jako jeden znak.)

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

Bardziej czytelna wersja (uruchom przy użyciu nazwy pliku i bez -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 (rodzaj ... gcc na to pozwala) 183

Wiele ostrzeżeń za niestandardowość i prawdopodobnie niewiarygodne, ale dzisiaj działa na moim komputerze.

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

Używa tego samego algorytmu co odpowiedź Python 2 autorstwa @grc

Dane wyjściowe po kompilacji to

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.