Welches Jahr ist es?


9

Es ist Dezember 2014 und 2015 hat fast begonnen. Es scheint jedoch, dass nicht jeder dies erkannt hat.

Jon: "2009 war sicher ein langes Jahr" |  Garfield schaut auf Kalender |  Garfield: "Wir müssen einen neuen Kalender bekommen"

Aber die Leute von PPCG kommen zur Rettung!

Eingang

Ihr Programm erhält ein Raster wie das an der Wand, wobei die Tage im Monat Dezember anders aussehen als im November und Januar. Jede Woche beginnt mit Sonntag und endet mit Samstag.

Tage innerhalb eines Monats werden durch a dargestellt #. Tage, die außerhalb des Monats liegen, werden durch ein (Leerzeichen, ASCII-Code 32) dargestellt. Jede Woche steht in einer separaten Zeile. Zeilen werden durch ein Zeilenumbruchzeichen ( \n) getrennt. Ihr Programm erfordert möglicherweise entweder die Inbetriebnahme oder die Aufnahme einer neuen Zeile am Ende der Eingabe.

Dies ist beispielsweise die Eingabe für Dezember 2009:

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

Der Kalender ist immer der Monat Dezember.

Aufgabe

Bei der Eingabe müssen Sie das mit dem Kalender verknüpfte Jahr finden. Da es mehrere Jahre gibt, für die ein Kalender übereinstimmt, müssen Sie das Jahr (vor 2015) zurückgeben, das dem Jahr 2015 am nächsten kommt. (Ausgenommen 2015 selbst.)

Ihr Programm muss für jedes Jahr <2015 die richtige Ausgabe liefern, mit Ausnahme derjenigen, deren Kalenderlayout für Dezember dem eines anderen Jahres (vor 2015) entspricht, das näher an 2015 liegt.

Wenn das Jahr <2014 ist, müssen Sie auch die Differenz des Jahres bis 2014 berechnen. Für 2012 beträgt die Differenz beispielsweise 2.

Ausgabe

Die Ausgabe Ihres Programms muss sein:

  • Der Text: Your calendar is for <year>.(Hinweis: Da dies ursprünglich als „Kalender“ geschrieben wurde, akzeptiere ich diese Schreibweise auch.)
  • Gefolgt von einem Zeilenumbruch ( \noder \r\n).
  • Gefolgt vom Text: It's almost 2015.
  • Wenn das Jahr <2014 ist, muss der folgende Text folgen: You're <difference> years behind.Dies muss in einer separaten Zeile stehen.
  • Gefolgt von einem Zeilenumbruch ( \noder \r\n).
  • Gefolgt vom Text: Go buy a new calendar!
  • Optional gefolgt von einem Zeilenumbruch ( \noder \r\n).

Regeln

  • Sie können wählen, ob Sie den Kalender als Befehlszeilenargument (z. B. yourprogram.exe <calendar>) oder als Eingabeaufforderung für den Benutzer erhalten möchten .
  • Sie können davon ausgehen, dass Ihr Programm keine ungültigen Eingaben erhält. Eine ungültige Eingabe enthält ein Kalenderlayout, für das kein Jahr vorhanden ist.
  • Der kürzeste Code (in Bytes, in jeder Sprache) gewinnt.
  • Alle nicht standardmäßigen Befehlszeilenargumente (Argumente, die normalerweise nicht zum Ausführen eines Skripts erforderlich sind) werden auf die Gesamtzeichenanzahl angerechnet.

  • Was Ihr Programm nicht tun darf :

    • Abhängig von externen Ressourcen.
    • Abhängig von einem bestimmten Dateinamen.
    • Geben Sie etwas anderes als die erforderliche Ausgabe aus.
    • Die Ausführung dauert außergewöhnlich lange. Wenn Ihr Programm auf dem Computer eines durchschnittlichen Heimanwenders länger als eine Minute läuft, ist es ungültig.
  • Ihr Programm darf nicht in einer Programmiersprache geschrieben sein, für die es keinen öffentlich verfügbaren Compiler / Interpreter gab, bevor diese Herausforderung veröffentlicht wurde.

Beispiele

Eingang:

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

Ausgabe:

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

Eingang:

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

Ausgabe:

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

Eingang:

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

Ausgabe:

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

Puh. Es ist gelungen, es 6 Sekunden vor dem Ende von 2014 in UTC (das von SE verwendet wird) zu veröffentlichen. Auch ein frohes neues Jahr allerseits!
user2428118

Nehmen wir hypothetisch an, dass 2016 und 2009 dieselbe Form haben. Welches ist dann das nächste? (dh meinst du am nächsten durch absolute Entfernung oder am nächsten, aber früher als 2015?)
Sp3000

@ SP3000 Letzteres. Ich habe den Beitrag zur Verdeutlichung bearbeitet.
user2428118

2
Ist es wirklich notwendig, den Kalender in der Ausgabe auf zwei verschiedene Arten zu buchstabieren?
Feersum

3
"Sie können wählen, ob Sie den Bruch als Befehlszeilenargument erhalten möchten (z. B. yourprogram.exe 2/5)" ... Was?
Feersum

Antworten:


2

CJam, 126 Bytes

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

3

Python 3, 178 Bytes

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

Eine einfache Nachschlagetabelle basierend auf dem Speicherort der ersten #.

Erweitert:

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

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!":"")

"." und "-" haben dieselbe Operatorpriorität, daher benötigen Sie Klammern um "2014- $ b".
Nutki


@nutki Aah, ich dachte, ich habe das schon behoben.
KSFT

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!"

Bisheriger Ansatz:

#!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!"

Kalender bei Standardeingabe (natürlich ist nur die erste Zeile von Bedeutung)

perl 2014.pl <<<" ######"

2

C # 235

minimiert:

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

Ungolfed

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

Nun, die Sprache ist ausführlich :)


1
Ihre Klasse und Ihr Main müssen nicht öffentlich sein. Sie können aber auch einfach umbenennen Programzu P. Das sollte Ihnen einige Zeichen ersparen :)
ProgramFOX

20 Zeichen in der Tat, danke :)
Manuel Schweigert

1
Sie können einige Zeichen speichern, indem Sie die yBerechnungsweise ändern . Wenn Sie eine Zeichenfolge indizieren, können Sie die zur Beschreibung des Arrays erforderliche Syntax speichern (dh var y = "1054382"[index]-48( 0ist ASCII 48)). ykann auch in die zBerechnung einbezogen werden , um weitere Einsparungen zu erzielen .
VisualMelon

2

C #, 384 , 363, 325 Bytes

C # Time, bitte sag mir, ob ich eine der Regeln usw. verpasst habe.

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

Eingang

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

Ausgabe

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

Eingabe 2

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

Ausgabe 2

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

Bearbeiten: Aktualisiert, einige Bytes konnten entfernt werden


Die Interpunktion fehlt in Ihrer Ausgabe.
Titus

2

Java, 243 Bytes

Es ist eine ausführliche Sprache :-)

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

Nicht minimiert

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

1

JavaScript (ES6), 199 170 Byte

Ich bin es noch nicht gewohnt, ES6 zu schreiben, daher wären Tipps willkommen:

Nachschlagetabelle, 170 Bytes

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 Bytes

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!`}

Nicht minimiert

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 Byte

Ich habe auch meine Originalversion unten aufgenommen

Sucharray, 182 Bytes

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!"}

Nicht minimiert

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 Bytes

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!"}

Nicht minimiert

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!";
}

1

CoffeeScript, 211 177 Bytes

Ähnlich wie meine PHP-Antwort, aber CoffeeScript hat weder do-whileSchleifen noch einen kurzen ternären Operator:

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!'

Nicht minimiert

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!'

Verkürzt durch Verwendung einer Nachschlagetabelle:

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!'

1

PHP, 215 181 Bytes

Nachschlagetabelle, 181 Bytes

Funktioniert aufgrund der kurzen Array-Syntax nur unter 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!";}

Nicht minimiert

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 Bytes

Funktioniert mit den meisten (wenn nicht allen) Versionen von 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!";}

Nicht minimiert

<?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!";
}

1

Ruby, 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

1

PHP, 145 Bytes

zwei Zeilenumbrüche hinter dem schließenden Tag, da PHP den ersten ignoriert

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!

Nimmt Eingaben vom Befehlszeilenargument entgegen.

erfordert PHP 5.6 (veröffentlicht am 18. Dezember 2014) oder höher zum Indizieren des String-Literal.


1

SmileBASIC, 159 Bytes

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

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.