Ebedi 2014 - PCG.SE Yeni Yıl Yapboz 2015


29

Şimdi, 2015 oldu ve geçen seneki bulmacanın cevaplarının bir kısmı şimdi geçersiz çıktılar üretmeye başlıyor, artık 2015 sayısını içeren bir soru sorma zamanı.

Dışında ... neden? Geçen seneki sorunun tarihine dayanan cevaplarının geçerli kalmasını ister miydin? Neden takvimimizi asla 2015 olmayacak şekilde değiştirmiyoruz ve sonsuza dek sonsuza dek yaşamaya devam ediyoruz.

Eternal 2014 notasyonu adı verilen yeni bir tarih notasyonunu şöyle tanımlayalım:

  • Tarihler 2014 ve öncesindeki tarihler proleptik Gregoryen takvimindeki ile aynı olacaktır .
  • Yıllar 2015 ve sonrası içinde tarihler için, yıl 2014 kalacak ve ay 2014 yılının aynı ay döngüsü sonsuza geçmiş ay 12. So devam etmek olsaydı olurdu sayı olacaktır 2015-02-08olacağını 2014-14-08ve 2020-12-31olacaktır 2014-85-02. Artık günlerin, artık yıl olmadığı için hesaplanmadığını unutmayın.

Göreviniz, bir Julian astronomik tarihini girdi olarak alacak bir program veya işlev oluşturmak ve Eternal 2014 notasyonundaki bu Julian tarihine karşılık gelen bir dize ya YYYY-MM-DDda DD/MM/YYYYbiçiminde bir dize döndürmektir .

Girilen Jülyen gününün her zaman 1721426(1 Ocak, 1) - 2914695(23 Ocak, 3268) arasındaki bir tam sayı olacağını varsayabilirsiniz . Yıllar, 4 haneye kadar kaydırmak için baştaki sıfırları içerebilir veya içermemelidir, ancak aylar ve günler her zaman iki haneye kadar sürmek için baştaki sıfırlara sahip olmalıdır (ve yıllar, 4 dışında herhangi bir sayıdaki hanelere basmak için baştaki sıfırları içermeyebilir).

İşte kabul edilebilir tüm biçimlerde bazı örnek girdiler ve çıktıları:

> 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

Kendi dilinizde yerleşik tarih işleme kitaplıklarını kullanamazsınız. Tüm hesaplamalar programın kaynak kodunun kendisinde algoritmik olarak yapılmalıdır.

Herhangi bir dilde bunu başarmak için en kısa program (bayt cinsinden) kazanır.


3
Haha, bu soru Winter Bash başladığında tam 25 oy alır.
Joe Z.

Yanıtlar:


12

Python 2, 166 bayt

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`

Bu, 1 Ocak 1 (1721426) 'dan belirtilen tarihe kadar her gün, geçerli gün, ay ve yılı arttıkça artar. Son test davası bilgisayarımda bir saniye sürüyor.

Çıktı ikinci formatta yazdırılır:

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

3

Devekuşu 0.5.0 , 197 bayt

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

Ben ... gerçekten Yeni Yılın mutluluğundan tamamen bıktım ve değil. Bu yüzden bu kadar çok golf oynamamıştım. Daha sonra daha iyi hale getirmek için geri gelebilir veya gelmeyebilirim.

Https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number adresinden algoritma


0

PHP (278)

Komut satırında kullanarak çalıştırın php -R '<code>'. (Bayrak bir karakter olarak sayılır.)

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

Daha okunabilir sürüm (dosya adı kullanarak ve olmadan çalıştırın -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 izin verir) 183

Standart olmama ve muhtemelen inanılmaz derecede avantajsızlık için birçok uyarı var, ancak bugün makinemde çalışıyor.

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 ile aynı algoritmayı kullanır: @grc

Derleme sonrası çıktı

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.