En quelle année sommes-nous?

9

Nous sommes en décembre 2014 et 2015 a presque commencé. Cependant, il semble que tout le monde ne s'en soit pas rendu compte.

Jon: «2009 a certainement été une longue année» |  Garfield regarde le calendrier |  Garfield: "Nous devons avoir un nouveau calendrier"

Mais les gens de PPCG viennent à la rescousse!

Contribution

Votre programme reçoit une grille comme celle du mur, où les jours du mois de décembre sont différents de ceux de novembre et janvier. Chaque semaine commence le dimanche et se termine le samedi.

Les jours du mois sont représentés par un #. Les jours qui ne font pas partie du mois sont représentés par un (espace, code ASCII 32). Chaque semaine est sur une ligne distincte. Les lignes sont séparées par un caractère de nouvelle ligne ( \n). Votre programme peut nécessiter la suppression ou l'inclusion d'une nouvelle ligne à la fin de l'entrée.

Par exemple, voici l'entrée pour décembre 2009:

  #####
#######
#######
#######
#####  

Le calendrier est toujours du mois de décembre.

Tâche

Compte tenu de l'entrée, vous devez trouver l'année associée au calendrier. Puisqu'il y a plusieurs années pour lesquelles un calendrier correspond, vous devez renvoyer l'année (avant 2015) qui est la plus proche de 2015. (Sauf 2015 elle-même.)

Votre programme doit produire la sortie correcte pour toute année <2015, à l'exclusion de celles dont le calendrier de décembre est égal à celui d'une autre année (avant 2015) plus proche de 2015.

Si l'année est <2014, vous devez également calculer la différence de l'année par rapport à 2014. Par exemple, pour 2012, la différence est 2.

Production

La sortie de votre programme doit être:

  • Le texte: Your calendar is for <year>.(Remarque: étant donné que cela était à l'origine orthographié comme «calendrier», j'accepte également cette orthographe.)
  • Suivi d'une nouvelle ligne ( \nou \r\n).
  • Suivi du texte: It's almost 2015.
  • Si l'année est <2014, ceci doit être suivi du texte: You're <difference> years behind.Cela doit être sur une ligne séparée.
  • Suivi d'une nouvelle ligne ( \nou \r\n).
  • Suivi du texte: Go buy a new calendar!
  • Facultativement suivi d'une nouvelle ligne ( \nou \r\n).

Règles

  • Vous pouvez choisir si vous souhaitez recevoir le calendrier en tant qu'argument de ligne de commande (par exemple yourprogram.exe <calendar>) ou inviter l'utilisateur à entrer.
  • Vous pouvez supposer que votre programme ne recevra aucune entrée invalide. L'entrée non valide inclut la disposition du calendrier pour laquelle il n'existe aucune année.
  • Le code le plus court (en octets, dans n'importe quelle langue) gagne.
  • Tous les arguments de ligne de commande non standard (arguments qui ne sont normalement pas requis pour exécuter un script) comptent pour le nombre total de caractères.

  • Ce que votre programme ne doit pas faire:

    • Dépendez de toutes les ressources externes.
    • Dépendre d'avoir un nom de fichier spécifique.
    • Sortie autre chose que la sortie requise.
    • Prenez exceptionnellement longtemps à courir. Si votre programme s'exécute sur une minute sur l'ordinateur d'un utilisateur à domicile moyen, il n'est pas valide.
  • Votre programme ne doit pas être écrit dans un langage de programmation pour lequel il n'existait pas de compilateur / interprète accessible au public avant la publication de ce défi.

Exemples

Contribution:

  #####
#######
#######
#######
#####  

Production:

Your calendar is for 2009.
It's almost 2015.
You're 5 years behind.
Go buy a new calendar!

Contribution:

 ######
#######
#######
#######
####   

Production:

Your calendar is for 2014.
It's almost 2015.
Go buy a new calendar!

Contribution:

      #
#######
#######
#######
#######
##     

Production:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!
user2428118
la source
Phew. J'ai réussi à le publier 6 secondes avant la fin de 2014 en UTC (qui est utilisé par SE). Et bonne année à tous!
user2428118
Disons, hypothétiquement, que 2016 et 2009 ont la même forme. Alors lequel est le plus proche? (c.-à-d. voulez-vous dire le plus proche par distance absolue, ou le plus proche mais avant 2015?)
Sp3000
@ SP3000 Ce dernier. J'ai édité le message pour clarifier.
user2428118
2
Est-il vraiment nécessaire d'épeler le calendrier de deux manières différentes dans la sortie?
feersum
3
"Vous pouvez choisir si vous souhaitez recevoir la fraction sous forme d'argument de ligne de commande (par exemple, yourprogram.exe 2/5)" ... Quoi?
feersum

Réponses:

2

CJam, 126 octets

"Your calendar is for "2e3q'##"DE9AB6C"=~+".
It's almost "2015_(".
You're 5 years behind"9@5$-:TtTg*".
Go buy a new calendar!"
jimmy23013
la source
3

Python 3, 178 octets

s=input();i=42157313>>s.index("#")*4&15;print("Your calendar is for %d.\nIt's almost 2015.\n%sGo buy a new calendar!"%(2014-i,(i>0)*("You're %d year%s behind.\n"%(i,"s"*(i>1)))))

Une table de recherche simple basée sur l'emplacement du premier #.

Étendu:

s=input()
i=42157313>>s.index("#")*4&15
print("Your calendar is for %d.\nIt's almost 2015.\n%sGo buy a new calendar!"\
    %(2014-i,(i>0)*("You're %d year%s behind.\n"%(i,"s"*(i>1)))))
Sp3000
la source
2

Perl - 187

$ARGV[0]=~/^( *)/;my@a=(7,8,3..5,0,6);my$b=($a[length$1]+2006);print"Your calendar is for $b.\nIt's almost 2015.\n".($b<2014?"You're ".2014-$b." years behind.\nGo buy a new calendar!":"")
KSFT
la source
"." et "-" ont la même priorité d'opérateur, vous avez donc besoin de parenthèses autour de "2014- $ b".
nutki
@nutki Aah, je pensais avoir déjà corrigé cela.
KSFT du
2

Perl 5: 137 143

#!perl -p
$_="Your calendar is for ".(2014-($%=w834506&s/#/?/r)).".
It's almost 2015.
".("You're $% years behind.
")x!!$%."Go buy a new calendar!"

Approche précédente:

#!perl -p
/#/;$_="Your calendar is for ".(2014-($b=1558279/9**"@-"%9)).".
It's almost 2015.
".("You're $b years behind.
")x!!$b."Go buy a new calendar!"

Calendrier sur entrée standard (seule la première ligne est bien sûr significative)

perl 2014.pl <<<" ######"
nutki
la source
2

C # 235

minifié:

class P{static void Main(string[] a){var y=new[]{1,0,5,4,3,8,2}[a[0].IndexOf('#')];var z=2014-y;System.Console.Write("Your calendar is for "+z+"\nIt's almost 2015.\n"+(z>0?"You're "+z+" years behind.":"")+"\nGo buy a new calendar!");}}

Non golfé

class P
{
    static void Main(string[] a)
    {
        var y = new[]{1,0,5,4,3,8,2}[a[0].IndexOf('#')];
        var z = 2014-y; 
        System.Console.Write("Your calendar is for "+z+"\nIt's almost 2015.\n"+(z>0 ? "You're "+z+" years behind.":"")+"\nGo buy a new calendar!");
    }
}

Eh bien, la langue est verbeuse :)

Manuel Schweigert
la source
1
Votre classe et Main n'ont pas à être publiques. , Vous pouvez renommer facilement aussi Programà P. Cela devrait vous faire économiser quelques personnages :)
ProgramFOX
20 personnages en effet, merci :)
Manuel Schweigert
1
Vous pouvez enregistrer quelques caractères en modifiant la façon dont yest calculé, si vous indexez une chaîne, vous pouvez enregistrer la syntaxe requise pour décrire le tableau (c'est-à-dire var y = "1054382"[index]-48( 0est ASCII 48)). ypeut également être intégré dans le zcalcul pour réaliser des économies supplémentaires.
VisualMelon
2

C #, 384 , 363 325 octets

C # Time, dites-moi si j'ai raté l'une des règles, etc.

string a(string s){var l=s.IndexOf('#');var x=(DayOfWeek)Enum.Parse(typeof(DayOfWeek),""+l);l=1;for(;;){var y=DateTime.Now.Year-l;var t=(new DateTime(y,12,1).DayOfWeek==x)?"Your calendar is for "+y+"\nIt's almost 2015\n"+((y < 2014)?"You're "+--l+"years behind\n":"")+"Go buy a new calendar":null;if(t!=null){return t;}l++;}}

Contribution

" ######" 
"#######"  
"#######" 
"#######" 
"#####  "

Production

"Your calendar is for 2014
 It's almost 2015
 Go buy a new calendar

Entrée 2

"  #####"
"#######"  
"#######"
"#######" 
"#####  "

Sortie 2

"Your calendar is for 2009
 It's almost 2015
 You're 5 years behind
 Go buy a new calendar"

Edit: mis à jour, réussi à supprimer certains octets

Darren Breen
la source
La ponctuation manque dans votre sortie.
Titus
2

Java, 243 octets

C'est une langue verbeuse :-)

class A{public static void main(String[]s){int y=2005+new int[]{8,9,4,5,0,6,7}[s[0].indexOf("#")],d=2014-y;System.out.print("Your calendar is for "+y+".\nIt's almost 2015.\n"+(d>0?"You're "+d+" years behind.\n":"")+"Go buy a new calendar!");}}

Non minifié

class A {
    public static void main(String[] s) {
        int y = 2005 + new int[]{8,9,4,5,0,6,7}[s[0].indexOf("#")],
            d = 2014 - y;
        System.out.print("Your calendar is for " + y + ".\nIt's almost 2015.\n"
            + (d > 0 ? "You're " + d + " years behind.\n" : "") + "Go buy a new calendar!");
    }
}
rink.attendant.6
la source
1

JavaScript (ES6), 199 170 octets

Je ne suis pas encore habitué à écrire ES6, donc des conseils seraient appréciés:

Table de recherche, 170 octets

a=(i)=>{y=[8,9,4,5,0,6,7][i.search('#')]+2005,f=2014-y;return`Your calendar is for ${y}.\nIt's almost 2015.\n${f?`You're ${f} years behind.\n`:''}Go buy a new calendar!`}

Original, 199 octets

a=i=>{y=2015,f=-1;do{f++;d=new Date(`${y--}-12-01`)}while(d.getDay()!=i.search('#'))return`Your calendar is for ${y}.\nIt's almost 2015.\n${f?`You're ${f} years behind.\n`:''}Go buy a new calendar!`}

Non minifié

a = i => {
    y = 2015;
    f = -1;
    do {
        f++;
        d = new Date(`${y--}-12-01`);
    } while (d.getDay() != i.search('#'));
    return `Your calendar is for ${y}.\nIt's almost 2015.\n${f ? `You're ${f} years behind.\n` : ''}Go buy a new calendar!`;
}

JavaScript (ES5), 212 182 octets

J'ai également inclus ma version originale ci-dessous

Tableau de recherche, 182 octets

function a(i){y=[8,9,4,5,0,6,7][i.indexOf('#')]+2005,f=2014-y;return"Your calendar is for "+y+".\nIt's almost 2015.\n"+(f?"You're "+f+" years behind.\n":'')+"Go buy a new calendar!"}

Non minifié

function a(i) {
    y = [8,9,4,5,0,6,7][i.indexOf('#')] + 2005;
    f = 2014 - y;
    return "Your calendar is for " + y + ".\nIt's almost 2015.\n" + (f ? "You're " + f + " years behind.\n" : '') + "Go buy a new calendar!";
}

Original, 212 octets

function a(i){y=2015,f=-1;do{f++;d=new Date(y--+"-12-01")}while(d.getDay()!=i.indexOf('#'));return"Your calendar is for "+y+".\nIt's almost 2015.\n"+(f?"You're "+f+" years behind.\n":'')+"Go buy a new calendar!"}

Non minifié

function a(i) {
    y = 2015;
    f = -1;
    do {
        f++;
        d = new Date(y-- + "-12-01");
    } while (d.getDay() != i.indexOf('#'));
    return "Your calendar is for "+y+".\nIt's almost 2015.\n" + (f ? "You're "+f+" years behind.\n" : '') + "Go buy a new calendar!";
}
rink.attendant.6
la source
1

CoffeeScript, 211 177 octets

Similaire à ma réponse PHP, mais CoffeeScript n'a pas de do-whileboucles ni d'opérateur ternaire court:

a=(i)->y=2015;f=-1;loop(f++;d=new Date y--+"-12-01";break if d.getDay()==i.indexOf '#');"Your calendar is for "+y+".\nIt's almost 2015.\n"+(if f then"You're "+f+" years behind.\n"else'')+'Go buy a new calendar!'

Unminifed

a = (i)->
    y = 2015
    f = -1
    loop
        f++
        d = new Date y-- + "-12-01"
        break if d.getDay() == i.indexOf '#'
    "Your calendar is for " + y + ".\nIt's almost 2015.\n" + (if f then "You're " + f + " years behind.\n" else '') + 'Go buy a new calendar!'

Raccourci à l'aide d'une table de recherche:

a=(i)->y=[8,9,4,5,0,6,7][i.indexOf '#']+2005;f=2014-y;"Your calendar is for "+y+".\nIt's almost 2015.\n"+(if f then"You're "+f+" years behind.\n"else'')+'Go buy a new calendar!'
rink.attendant.6
la source
1

PHP, 215 181 octets

Table de recherche, 181 octets

En raison de la courte syntaxe du tableau, ne fonctionne que sur PHP 5.4+:

function a($i){$y=2005+[8,9,4,5,0,6,7][strpos($i,'#')];$f=2014-$y;echo "Your calendar is for $y.\nIt's almost 2015.\n".($f?"You're $f years behind.\n":'')."Go buy a new calendar!";}

Non minifié

function a($input) {
    $year = 2005 + [8,9,4,5,0,6,7][strpos($input, '#')];
    $difference = 2014 - $year;
    echo "Your calendar is for $year.\nIt's almost 2015.\n" . ($difference ? "You're $difference years behind.\n" : '') . "Go buy a new calendar!";
}

Original, 215 octets

Fonctionne avec la plupart (sinon toutes) les versions de PHP 5:

<?function a($c){$y=2015;$f=-1;do{$f++;$d=strtotime(--$y."-12-1");}while(date(w,$d)!=strpos($c,'#'));echo"Your calendar is for $y.\nIt's almost 2015.\n".($f?"You're $f years behind.\n":'')."Go buy a new calendar!";}

Non minifié

<?php

function a($input) {
    $year = 2015;
    $difference = -1;
    do {
        $difference++;
        $date = strtotime(--$year . "-12-1");
    } while (date('w', $date) != strpos($input, '#'));
    echo "Your calendar is for $year.\nIt's almost 2015.\n" . ($difference ? "You're $difference years behind.\n" : '') . "Go buy a new calendar!";
}
rink.attendant.6
la source
1

Rubis, 174

def a(i)y=2005+[8,9,4,5,0,6,7][i.index('#')];d=2014-y;puts"Your calendar is for #{y}.\nIt's almost 2015.\n"+(d>0?"You're #{d} years behind.\n":'')+"Go buy a new calendar!"end
rink.attendant.6
la source
1

PHP, 145 octets

deux sauts de ligne derrière la balise de fermeture, car PHP ignorera le premier

Your calendar is for <?=2014-$y=_1054382[1+strspn($argv[1]," ")],".
It´s almost 2015.",$y?"
You're $y years behind.":""?>

Go buy a new calendar!

prend l'entrée de l'argument de la ligne de commande;

nécessite PHP 5.6 (publié le 18 décembre 2014) ou une version ultérieure pour l'indexation du littéral de chaîne.

Titus
la source
1

SmileBASIC, 159 octets

DEF C C
Y=VAL("2834501"[INSTR(C,"#")])?"Your calender is for ";2014-Y;".
?"It's almost 2015.
IF Y THEN?"You're ";Y;" years behind.
?"Go buy a new calendar!
END
12Me21
la source
1

C # (Visual C # Interactive Compiler) , 178 175 172 octets

s=>{int p=2014,a=p-"1054382"[s.IndexOf("#")]+48;Write($"Your calendar is for {a}.\nIt's almost 2015.{(p-a>0?$"\nYou're {p-a} years behind.":"")}\nGo buy a new calendar!");}

Essayez-le en ligne!

Incarnation de l'ignorance
la source