¿Que año es?

9

Es diciembre de 2014 y 2015 casi ha comenzado. Sin embargo, parece que no todos se han dado cuenta de esto.

Jon: "2009 ha sido un año largo" |  Garfield mira el calendario |  Garfield: "Tenemos que conseguir un nuevo calendario"

¡Pero la gente de PPCG viene al rescate!

Entrada

Su programa recibe una cuadrícula como la del muro, donde los días que están en el mes de diciembre son diferentes de los de noviembre y enero. Cada semana comienza con el domingo y termina con el sábado.

Los días dentro del mes están representados por a #. Los días que quedan fuera del mes están representados por un (espacio, código ASCII 32). Cada semana está en una línea separada. Las líneas están separadas por un carácter de nueva línea ( \n). Su programa puede requerir la omisión o la inclusión de una nueva línea al final de la entrada.

Por ejemplo, esta es la entrada para diciembre de 2009:

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

El calendario es siempre del mes de diciembre.

Tarea

Dada la entrada, debe encontrar el año asociado con el calendario. Dado que hay varios años para los que coincide un calendario, debe devolver el año (antes de 2015) que sea el más cercano a 2015. (Excluyendo 2015 en sí).

Su programa debe producir el resultado correcto para cualquier año <2015, excluyendo aquellos que tienen un diseño de calendario para diciembre que es igual al de otro año (antes de 2015) más cercano a 2015.

Si el año es <2014, también debe calcular la diferencia del año a 2014. Por ejemplo, para 2012 la diferencia es 2.

Salida

La salida de su programa debe ser:

  • El texto: Your calendar is for <year>.(Nota: dado que esto originalmente se deletreaba como "calendario", también aceptaré esa ortografía).
  • Seguido de una nueva línea ( \no \r\n).
  • Seguido por el texto: It's almost 2015.
  • Si el año es <2014, esto debe ser seguido por el texto: You're <difference> years behind.Esto debe estar en una línea separada.
  • Seguido de una nueva línea ( \no \r\n).
  • Seguido por el texto: Go buy a new calendar!
  • Opcionalmente seguido de una nueva línea ( \no \r\n).

Reglas

  • Puede elegir si desea recibir el calendario como un argumento de línea de comandos (p yourprogram.exe <calendar>. Ej. ) O solicitar la entrada del usuario.
  • Puede suponer que su programa no recibirá entradas no válidas. La entrada no válida incluye el diseño del calendario para el que no existe ningún año.
  • El código más corto (en bytes, en cualquier idioma) gana.
  • Cualquier argumento de línea de comandos no estándar (argumentos que normalmente no se requieren para ejecutar un script) cuentan para el recuento total de caracteres.

  • Lo que su programa no debe hacer:

    • Depende de cualquier recurso externo.
    • Depende de tener un nombre de archivo específico.
    • Salida de cualquier cosa que no sea la salida requerida.
    • Tardar excepcionalmente en correr. Si su programa se ejecuta más de un minuto en la computadora de un usuario doméstico promedio, no es válido.
  • Su programa no debe estar escrito en un lenguaje de programación para el que no existía un compilador / intérprete disponible públicamente antes de que se publicara este desafío.

Ejemplos

Entrada:

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

Salida:

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

Entrada:

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

Salida:

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

Entrada:

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

Salida:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!
usuario2428118
fuente
Uf. Logré publicarlo 6 segundos antes de que 2014 terminara en UTC (que es utilizado por SE). Además, feliz año nuevo a todos!
user2428118
Digamos, hipotéticamente, que 2016 y 2009 tienen la misma forma. Entonces, ¿cuál es el más cercano? (es decir, ¿quiere decir más cercano por distancia absoluta, o más cercano pero anterior a 2015?)
Sp3000
@ SP3000 El último. He editado la publicación para aclarar.
user2428118
2
¿Es realmente necesario deletrear el calendario de dos maneras diferentes en la salida?
feersum el
3
"Puede elegir si desea recibir la fracción como un argumento de línea de comandos (por ejemplo, yourprogram.exe 2/5)" ... ¿Qué?
fiesta

Respuestas:

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

Una tabla de búsqueda simple basada en la ubicación de la primera #.

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
fuente
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
fuente
"." y "-" tienen la misma prioridad de operador, por lo que necesita paréntesis alrededor de "2014- $ b".
nutki
@nutki Aah, pensé que ya lo arreglé.
KSFT
2

Perl 5: 137143

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

Enfoque previo:

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

Calendario en entrada estándar (solo la primera línea es significativa, por supuesto)

perl 2014.pl <<<" ######"
nutki
fuente
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!");}}

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

Bueno, el lenguaje es detallado :)

Manuel Schweigert
fuente
1
Tu clase y Main no tienen que ser públicos. Además, se puede fácilmente cambiar el nombre Programa P. Eso debería ahorrarte algunos caracteres :)
ProgramFOX
20 personajes de hecho, gracias :)
Manuel Schweigert
1
Puede guardar algunos caracteres cambiando la forma en que yse calcula, si indexa una cadena puede guardar la sintaxis requerida para describir la matriz (es decir var y = "1054382"[index]-48( 0es ASCII 48)). yTambién se puede incluir en el zcálculo para obtener más ahorros.
VisualMelon
2

C #, 384 , 363 325 bytes

C # Time, por favor dime si me perdí una de las reglas, 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

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

Salida

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

Entrada 2

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

Salida 2

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

Editar: actualizado, logró eliminar algunos bytes

Darren Breen
fuente
Falta la puntuación de su salida.
Titus
2

Java, 243 bytes

Es un lenguaje detallado :-)

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

No minificado

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

JavaScript (ES6), 199 170 bytes

Todavía no estoy acostumbrado a escribir ES6, por lo que agradecería cualquier consejo:

Tabla de búsqueda, 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!`}

No minificado

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

También he incluido mi versión original a continuación

Matriz de búsqueda, 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!"}

No minificado

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

No minificado

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

CoffeeScript, 211 177 bytes

Similar a mi respuesta de PHP, pero CoffeeScript no tiene do-whilebucles ni tiene un operador ternario corto:

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

Sin minar

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

Acortado usando una tabla de búsqueda:

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

PHP, 215 181 bytes

Tabla de búsqueda, 181 bytes

Debido a la sintaxis de matriz corta, solo funciona en 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!";}

No minificado

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 con la mayoría (si no todas) las versiones 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!";}

No minificado

<?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
fuente
1

Rubí, 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
fuente
1

PHP, 145 bytes

dos saltos de línea detrás de la etiqueta de cierre porque PHP ignorará el primero

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!

toma datos del argumento de la línea de comando;

requiere PHP 5.6 (publicado el 18 de diciembre de 2014) o posterior para indexar el literal de cadena.

Tito
fuente
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
fuente