Jaki jest rok


9

Jest grudzień 2014, a 2015 prawie się zaczął. Wydaje się jednak, że nie wszyscy zdali sobie z tego sprawę.

Jon: „Rok 2009 z pewnością był długim rokiem” |  Garfield patrzy na kalendarz |  Garfield: „Musimy dostać nowy kalendarz”

Ale ludzie PPCG przybywają na ratunek!

Wejście

Wasz program ma siatkę podobną do ściany, w której dni w grudniu wyglądają inaczej niż w listopadzie i styczniu. Każdy tydzień rozpoczyna się w niedzielę i kończy w sobotę.

Dni w ciągu miesiąca są reprezentowane przez #. Dni, które przypadają poza miesiącem, są reprezentowane przez (spacja, kod ASCII 32). Każdy tydzień jest na osobnej linii. Linie są oddzielone znakiem nowej linii ( \n). Twój program może wymagać wycofania lub włączenia nowego wiersza na końcu danych wejściowych.

Na przykład jest to dane wejściowe z grudnia 2009 r .:

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

Kalendarz jest zawsze z grudnia.

Zadanie

Biorąc pod uwagę dane wejściowe, musisz znaleźć rok związany z kalendarzem. Ponieważ kalendarz ma wiele lat, dla których kalendarz jest zgodny, musisz zwrócić rok (przed 2015 r.), Który jest najbliższy 2015 r. (Z wyłączeniem samego 2015 r.)

Twój program musi generować prawidłowe dane wyjściowe dla dowolnego roku <2015, z wyjątkiem tych, które mają układ kalendarza na grudzień, który jest taki sam jak dla innego roku (przed 2015) bliższego 2015.

Jeśli rok jest mniejszy niż 2014, należy również obliczyć różnicę między rokiem a 2014. Na przykład dla roku 2012 różnica wynosi 2.

Wynik

Wyjście twojego programu musi być:

  • Tekst: Your calendar is for <year>.(Uwaga: ponieważ pierwotnie został napisany jako „kalendarz”, zaakceptuję również tę pisownię).
  • Następnie następuje nowa linia ( \nlub \r\n).
  • Po tekście: It's almost 2015.
  • Jeśli rok jest <2014, po tym musi następować tekst: You're <difference> years behind.Musi być w osobnym wierszu.
  • Następnie następuje nowa linia ( \nlub \r\n).
  • Po tekście: Go buy a new calendar!
  • Opcjonalnie następuje nowa linia ( \nlub \r\n).

Zasady

  • Możesz wybrać, czy chcesz otrzymywać kalendarz jako argument wiersza poleceń (np. yourprogram.exe <calendar>), Czy monit o wprowadzenie danych przez użytkownika.
  • Możesz założyć, że twój program nie otrzyma nieprawidłowych danych wejściowych. Niepoprawne dane wejściowe obejmują układ kalendarza, dla którego nie istnieje rok.
  • Najkrótszy kod (w bajtach, w dowolnym języku) wygrywa.
  • Wszelkie niestandardowe argumenty wiersza polecenia (argumenty, które zwykle nie są wymagane do uruchomienia skryptu) są liczone do całkowitej liczby znaków.

  • Czego twój program nie może zrobić:

    • Zależy od wszelkich zasobów zewnętrznych.
    • Zależy od posiadania określonej nazwy pliku.
    • Wyprowadzaj cokolwiek innego niż wymagane wyjście.
    • Uruchomienie zajmuje wyjątkowo długo. Jeśli Twój program działa przez minutę na komputerze przeciętnego użytkownika domowego, jest nieprawidłowy.
  • Twój program nie może być napisany w języku programowania, dla którego nie istniał publicznie dostępny kompilator / tłumacz przed opublikowaniem tego wyzwania.

Przykłady

Wejście:

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

Wynik:

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

Wejście:

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

Wynik:

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

Wejście:

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

Wynik:

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

Uff Udało się go opublikować 6 sekund przed końcem 2014 roku w UTC (z którego korzysta SE). Ponadto, Szczęśliwego nowego roku wszystkim!
user2428118

Powiedz hipotetycznie, że 2016 i 2009 mają ten sam kształt. Który jest najbliższy? (tzn. czy masz na myśli najbliższy dystans bezwzględny, czy najbliższy, ale wcześniejszy niż 2015?)
Sp3000,

@ SP3000 Ten ostatni. Zredagowałem post, aby wyjaśnić.
user2428118

2
Czy naprawdę trzeba przeliterować kalendarz na dwa różne sposoby?
feersum

3
„Możesz wybrać, czy chcesz otrzymywać frakcję jako argument wiersza poleceń (np. Yourprogram.exe 2/5)” ... Co?
feersum

Odpowiedzi:


2

CJam, 126 bajtów

"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 bajtów

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

Prosta tabela przeglądowa oparta na lokalizacji pierwszego #.

Rozszerzony:

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

„.” i „-” mają ten sam priorytet dla operatora, więc potrzebujesz nawiasu wokół „2014- $ b”.
nutki


@nutki Aah, myślałem, że już to naprawiłem.
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!"

Poprzednie podejście:

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

Kalendarz na standardowym wejściu (oczywiście tylko pierwszy wiersz jest istotny)

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

2

C # 235

zminimalizowane:

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

Nie golfił

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

Cóż, język jest pełny :)


1
Twoja klasa i Main nie muszą być publiczne. Możesz także łatwo zmienić nazwę Programna P. To powinno uratować ci kilka znaków :)
ProgramFOX

Rzeczywiście 20 znaków, dzięki :)
Manuel Schweigert

1
Możesz zapisać kilka znaków, zmieniając sposób yobliczania, jeśli indeksujesz ciąg, możesz zapisać składnię wymaganą do opisania tablicy (tj. var y = "1054382"[index]-48( 0To ASCII 48)). ymożna również włączyć do zobliczeń w celu uzyskania dalszych oszczędności.
VisualMelon,

2

C #, 384 , 363 325 bajtów

Czas C #, proszę powiedz mi, czy przegapiłem jedną z zasad itp

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

Wejście

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

Wynik

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

Wejście 2

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

Wyjście 2

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

Edycja: zaktualizowano, udało się usunąć niektóre bajty


Brakuje interpunkcji na wydruku.
Tytus

2

Java, 243 bajty

To pełny język :-)

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

Unminified

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 bajtów

Nie jestem przyzwyczajony do pisania ES6, więc wszelkie wskazówki będą mile widziane:

Tabela przeglądowa, 170 bajtów

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

Oryginał, 199 bajtów

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

Unminified

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 bajtów

Poniżej zamieściłem również moją oryginalną wersję

Tablica wyszukiwania, 182 bajty

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

Unminified

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

Oryginalny, 212 bajtów

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

Unminified

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 bajtów

Podobnie do mojej odpowiedzi na PHP, ale CoffeeScript nie ma do-whilepętli ani krótkiego trójskładnikowego operatora:

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

Skrócony przy użyciu tabeli odnośników:

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 bajtów

Tabela przeglądowa, 181 bajtów

Ze względu na krótką składnię tablic działa tylko na 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!";}

Unminified

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

Oryginalny, 215 bajtów

Działa z większością (jeśli nie wszystkimi) wersjami 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!";}

Unminified

<?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 bajtów

dwa podziały wiersza za tagiem zamykającym, ponieważ PHP zignoruje pierwszy

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!

pobiera dane wejściowe z argumentu wiersza poleceń;

wymaga PHP 5.6 (wydanego 18 grudnia 2014 r.) lub nowszego do indeksowania literału ciągu.


1

SmileBASIC, 159 bajtów

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

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.