Eternal 2014 - Puzzle du Nouvel An PCG.SE 2015


29

Donc, maintenant que nous sommes en 2015, et un tas de réponses du puzzle de l'année dernière commencent maintenant à produire une sortie invalide , il est temps de poser une question concernant le numéro 2015.

Sauf ... pourquoi? N'aimeriez-vous pas que vos réponses basées sur la date au problème de l'an dernier restent valables? Pourquoi ne changeons-nous pas notre calendrier pour que ce ne soit jamais 2015 et que nous continuions simplement à vivre en 2014, pour toujours et à jamais?

Définissons une nouvelle notation de date, appelée notation Eternal 2014 , comme suit:

  • Pour les dates 2014 et antérieures, les dates seront les mêmes que dans le calendrier grégorien proleptique .
  • Pour les dates des années 2015 et suivantes, l'année restera 2014 et le mois sera le nombre qu'il serait si le même cycle de mois en 2014 devait se poursuivre indéfiniment au cours du mois 12. Il en 2015-02-08serait de même 2014-14-08et le 2020-12-31serait 2014-85-02. Notez que les jours bissextiles ne sont pas pris en compte car 2014 n'est pas une année bissextile.

Votre tâche consiste à créer un programme ou une fonction qui prendra en entrée une date astronomique julienne et renverra une chaîne avec la date correspondant à cette date julienne en notation Eternal 2014, au format YYYY-MM-DDou DD/MM/YYYY.

Vous pouvez supposer que le jour julien entré sera toujours un entier du 1721426(1er janvier 1) au 2914695(23 janvier 3268) inclus. Les années peuvent contenir des zéros non significatifs pour remplir à 4 chiffres ou non, mais les mois et les jours doivent toujours avoir des zéros non significatifs pour remplir à deux chiffres (et les années ne peuvent pas contenir de zéros non significatifs pour remplir à n'importe quel nombre de chiffres autres que 4).

Voici quelques exemples d'entrées et leurs sorties, dans tous les formats acceptables:

> 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

Vous ne pouvez utiliser aucune bibliothèque de traitement de date intégrée dans votre langue. Tous les calculs doivent être effectués de manière algorithmique dans le code source du programme lui-même.

Le programme le plus court (en octets) pour y parvenir dans n'importe quelle langue gagne.


3
Haha, cette question obtient 25 votes positifs au début du Winter Bash.
Joe Z.

Réponses:


12

Python 2, 166 octets

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`

Cela passe tous les jours du 1er janvier 1 (1721426) à la date donnée, en incrémentant le jour, le mois et l'année en cours au fur et à mesure. Le dernier cas de test prend environ une seconde sur mon ordinateur.

La sortie est imprimée dans le deuxième format:

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

3

Autruche 0.5.0 , 197 octets

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

Non golfé (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

Je suis ... vraiment juste épuisé de tout le bonheur du Nouvel An et pas. C'est pourquoi je n'ai pas beaucoup joué au golf. Je pourrai ou non revenir pour l'améliorer plus tard.

Algorithme de https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number


0

PHP (278)

Exécutez sur la ligne de commande en utilisant php -R '<code>'. (Le drapeau compte pour un caractère.)

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

Version plus lisible (exécutez en utilisant le nom de fichier et sans -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 (sorte de ... gcc le permet) 183

Beaucoup d'avertissements pour non-standardité et probablement incroyablement non portable, mais cela fonctionne sur ma machine aujourd'hui.

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

Il utilise le même algorithme que la réponse Python 2 par @grc

La sortie après la compilation est

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.