Em que ano estamos?

9

É dezembro de 2014 e 2015 já começou. No entanto, parece que nem todo mundo percebeu isso.

Jon: “2009 com certeza foi um ano longo” |  Garfield olha para o calendário |  Garfield: "Temos que ter um novo calendário"

Mas o pessoal do PPCG vem em socorro!

Entrada

Seu programa recebe uma grade como a da parede, onde os dias do mês de dezembro parecem diferentes dos de novembro e janeiro. Cada semana começa no domingo e termina no sábado.

Os dias do mês são representados por a #. Os dias que ficam fora do mês são representados por um (espaço, código ASCII 32). Cada semana é em uma linha separada. As linhas são separadas por um caractere de nova linha ( \n). Seu programa pode exigir a omissão ou inclusão de uma nova linha no final da entrada.

Por exemplo, esta é a entrada para dezembro de 2009:

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

O calendário é sempre do mês de dezembro.

Tarefa

Dada a entrada, você deve encontrar o ano associado ao calendário. Como há vários anos para os quais um calendário corresponde, você deve retornar o ano (antes de 2015) o mais próximo de 2015. (Excluindo o próprio 2015).

Seu programa deve produzir a saída correta para qualquer ano <2015, excluindo aqueles que possuem um layout de calendário para dezembro igual ao de outro ano (antes de 2015) mais próximo de 2015.

Se o ano for <2014, você também deve calcular a diferença do ano para 2014. Por exemplo, para 2012, a diferença é 2.

Resultado

A saída do seu programa deve ser:

  • O texto: Your calendar is for <year>.(Observação: como esse foi originalmente escrito como "calendário", também aceito a ortografia.)
  • Seguido por uma nova linha ( \nou \r\n).
  • Seguido pelo texto: It's almost 2015.
  • Se o ano for <2014, isso deve ser seguido pelo texto: You're <difference> years behind.Isso deve estar em uma linha separada.
  • Seguido por uma nova linha ( \nou \r\n).
  • Seguido pelo texto: Go buy a new calendar!
  • Opcionalmente seguido por uma nova linha ( \nou \r\n).

Regras

  • Você pode escolher se deseja receber o calendário como argumento da linha de comando (por exemplo yourprogram.exe <calendar>) ou solicitar a entrada do usuário.
  • Você pode assumir que seu programa não receberá entrada inválida. Entrada inválida inclui layout de calendário para o qual não existe ano.
  • O código mais curto (em bytes, em qualquer idioma) vence.
  • Quaisquer argumentos de linha de comando não padrão (argumentos que normalmente não são necessários para executar um script) contam para a contagem total de caracteres.

  • O que seu programa não deve fazer:

    • Depende de quaisquer recursos externos.
    • Depende de ter um nome de arquivo específico.
    • Saída qualquer coisa que não seja a saída necessária.
    • Demore excepcionalmente para executar. Se o seu programa for executado mais de um minuto no computador de um usuário doméstico comum, é inválido.
  • Seu programa não deve ser escrito em uma linguagem de programação para a qual não existia um compilador / intérprete publicamente disponível antes que esse desafio fosse lançado.

Exemplos

Entrada:

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

Resultado:

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

Entrada:

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

Resultado:

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

Entrada:

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

Resultado:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!
user2428118
fonte
Ufa. Conseguiu publicá-lo 6 segundos antes do final de 2014 no UTC (que é usado pelo SE). Além disso, o ano novo todo mundo feliz!
User2428118
Digamos, hipoteticamente, que 2016 e 2009 tenham a mesma forma. Então qual é o mais próximo? (ou seja, você quer dizer mais próximo de distância absoluta, ou mais próximo, mas mais cedo do que 2015?)
SP3000
@ SP3000 O último. Eu editei a postagem para esclarecer.
precisa saber é o seguinte
2
É realmente necessário escrever o calendário de duas maneiras diferentes na saída?
feersum
3
"Você pode escolher se deseja receber a fração como argumento da linha de comando (por exemplo, yourprogram.exe 2/5)" ... O que?
feersum

Respostas:

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!"
jimmy23013
fonte
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)))))

Uma tabela de pesquisa simples com base na localização da primeira #.

Expandido:

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
fonte
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
fonte
"." e "-" têm a mesma precedência de operador, então você precisa de parênteses em torno de "2014- $ b".
nutki
A saída para pelo menos 2014 está incorreta .
precisa saber é o seguinte
@ Nutki Aah, eu pensei que já corrigi isso.
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!"

Abordagem anterior:

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

Calendário na entrada padrão (apenas a primeira linha é significativa, é claro)

perl 2014.pl <<<" ######"
nutki
fonte
2

C # 235

minificado:

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

Bem, a linguagem é detalhada :)

Manuel Schweigert
fonte
11
Sua turma e Main não precisam ser públicas. Além disso, você pode renomear facilmente Programpara P. Isso deve poupar alguns personagens :)
ProgramFOX
20 caracteres Na verdade, graças :)
Manuel Schweigert
11
Você pode salvar alguns caracteres alterando como yé calculado. Se você indexar uma string, poderá salvar a sintaxe necessária para descrever a matriz (ou seja var y = "1054382"[index]-48( 0é ASCII 48)). yTambém pode ser incorporado no zcálculo para obter mais economias.
VisualMelon
2

C #, 384 , 363 325 bytes

C # Time, por favor me diga se eu perdi uma das regras, 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++;}}

Entrada

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

Resultado

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

Entrada 2

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

Saída 2

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

Editar: atualizado, conseguiu remover alguns bytes

Darren Breen
fonte
A pontuação está faltando na sua saída.
Titus
2

Java, 243 bytes

É uma linguagem detalhada :-)

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

Desminificado

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
fonte
1

JavaScript (ES6), 199 170 bytes

Ainda não estou acostumado a escrever o ES6, portanto, qualquer dica seria apreciada:

Tabela de pesquisa, 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!`}

Desminificado

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 bytes

Eu também incluí minha versão original abaixo

Matriz de pesquisa, 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!"}

Desminificado

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

Desminificado

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
fonte
1

CoffeeScript, 211 177 bytes

Semelhante à minha resposta PHP, mas o CoffeeScript não possui do-whileloops nem um operador ternário curto:

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

Não minificado

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

Encurtado usando uma tabela de pesquisa:

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
fonte
1

PHP, 215 181 bytes

Tabela de pesquisa, 181 bytes

Devido à sintaxe de matriz curta, funciona apenas no 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!";}

Desminificado

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

Funciona com a maioria das versões (se não todas) do 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!";}

Desminificado

<?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
fonte
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
rink.attendant.6
fonte
1

PHP, 145 bytes

duas quebras de linha atrás da tag de fechamento, porque o PHP ignorará a primeira

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!

recebe entrada do argumento da linha de comando;

requer o PHP 5.6 (lançado em 18 de dezembro de 2014) ou posterior para indexar a string literal.

Titus
fonte
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
12Me21
fonte
1

C # (Compilador interativo do Visual C #) , 178 175 172 bytes

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

Experimente online!

Modalidade de ignorância
fonte