Che anno è?


9

È dicembre 2014 e il 2015 è quasi iniziato. Tuttavia, sembra che non tutti lo abbiano capito.

Jon: "Il 2009 è stato sicuramente un lungo anno" |  Garfield guarda il calendario |  Garfield: "Dobbiamo ottenere un nuovo calendario"

Ma la gente di PPCG viene in soccorso!

Ingresso

Al tuo programma viene assegnata una griglia come quella del muro, in cui i giorni del mese di dicembre sembrano diversi da quelli di novembre e gennaio. Ogni settimana inizia con la domenica e termina con il sabato.

I giorni all'interno del mese sono rappresentati da a #. I giorni che non rientrano nel mese sono rappresentati da un (spazio, codice ASCII 32). Ogni settimana è su una linea separata. Le linee sono separate da un carattere di nuova riga ( \n). Il tuo programma potrebbe richiedere l'ommissione o l'inclusione di una nuova riga alla fine dell'input.

Ad esempio, questo è l'input per dicembre 2009:

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

Il calendario è sempre del mese di dicembre.

Compito

Dato l'input, è necessario trovare l'anno associato al calendario. Poiché vi sono più anni per i quali un calendario corrisponde, è necessario restituire l'anno (prima del 2015) che è il più vicino al 2015. (Escluso il 2015 stesso.)

Il tuo programma deve produrre l'output corretto per qualsiasi anno <2015, esclusi quelli che hanno un layout di calendario per dicembre uguale a quello di un altro anno (prima del 2015) più vicino al 2015.

Se l'anno è <2014, è necessario calcolare anche la differenza dell'anno rispetto al 2014. Ad esempio, per il 2012 la differenza è 2.

Produzione

L'output del tuo programma deve essere:

  • Il testo: Your calendar is for <year>.(Nota: poiché questo è stato scritto originariamente come "calendario", accetterò anche quell'ortografia.)
  • Seguito da una nuova riga ( \no \r\n).
  • Seguito dal testo: It's almost 2015.
  • Se l'anno è <2014, questo deve essere seguito dal testo: You're <difference> years behind.deve essere su una riga separata.
  • Seguito da una nuova riga ( \no \r\n).
  • Seguito dal testo: Go buy a new calendar!
  • Facoltativamente seguito da una nuova riga ( \no \r\n).

Regole

  • È possibile scegliere se si desidera ricevere il calendario come argomento della riga di comando (ad esempio yourprogram.exe <calendar>) o richiedere l'input dell'utente.
  • Puoi presumere che il tuo programma non riceverà input non validi. L'input non valido include il layout del calendario per il quale non esiste un anno.
  • Vince il codice più breve (in byte, in qualsiasi lingua).
  • Qualsiasi argomento non standard della riga di comando (argomenti che normalmente non sono richiesti per eseguire uno script) conta per il conteggio totale dei caratteri.

  • Cosa non deve fare il tuo programma :

    • Dipende da qualsiasi risorsa esterna.
    • Dipende dall'avere un nome file specifico.
    • Invia qualcosa di diverso da quello richiesto.
    • Ci vuole molto tempo per correre. Se il tuo programma dura più di un minuto sul computer di un utente medio, non è valido.
  • Il tuo programma non deve essere scritto in un linguaggio di programmazione per il quale non esisteva un compilatore / interprete disponibile pubblicamente prima che questa sfida fosse pubblicata.

Esempi

Ingresso:

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

Produzione:

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

Ingresso:

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

Produzione:

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

Ingresso:

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

Produzione:

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

Uff. Gestito per pubblicarlo 6 secondi prima che il 2014 finisse in UTC (che viene utilizzato da SE). Inoltre, buon anno a tutti!
user2428118

Supponiamo, ipoteticamente, che il 2016 e il 2009 abbiano la stessa forma. Allora qual è il più vicino? (cioè intendi il più vicino per distanza assoluta o il più vicino ma prima del 2015?)
Sp3000

@ SP3000 Quest'ultimo. Ho modificato il post per chiarire.
user2428118

2
È davvero necessario scrivere il calendario in due modi diversi nell'output?
feersum

3
"Puoi scegliere se desideri ricevere la frazione come argomento della riga di comando (ad esempio yourprogram.exe 2/5)" ... Cosa?
feersum

Risposte:


2

CJam, 126 byte

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

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 semplice tabella di ricerca basata sulla posizione del primo #.

Allargato:

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

"" e "-" hanno la stessa precedenza di operatore, quindi è necessaria la parentesi intorno a "2014- $ b".
Nutki,


@nutki Aah, pensavo di averlo già risolto.
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!"

Approccio precedente:

#!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 su input standard (ovviamente solo la prima riga è significativa)

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

2

C # 235

minified:

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

Bene, la lingua è verbosa :)


1
La tua classe e il Main non devono essere pubblici. Inoltre, si può facilmente cambiare titolo Programal P. Ciò dovrebbe farti risparmiare alcuni personaggi :)
ProgramFOX

20 personaggi davvero, grazie :)
Manuel Schweigert,

1
È possibile salvare alcuni caratteri modificando il modo in cui yviene calcolato, se si indicizza una stringa è possibile salvare la sintassi richiesta per descrivere l'array (ovvero var y = "1054382"[index]-48( 0è ASCII 48)). ypuò anche essere inserito nel zcalcolo per ulteriori risparmi.
VisualMelon

2

C #, 384 , 363 325 byte

C # Time, per favore dimmi se mi sono perso una delle regole, ecc.

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

Ingresso

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

Produzione

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

Ingresso 2

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

Uscita 2

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

Modifica: aggiornato, gestito per rimuovere alcuni byte


La punteggiatura manca nell'output.
Tito,

2

Java, 243 byte

È un linguaggio dettagliato :-)

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 byte

Non sono ancora abituato a scrivere ES6, quindi eventuali suggerimenti sarebbero apprezzati:

Tabella di ricerca, 170 byte

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

Originale, 199 byte

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 byte

Ho anche incluso la mia versione originale di seguito

Matrice di ricerca, 182 byte

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

Originale, 212 byte

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 byte

Simile alla mia risposta PHP, ma CoffeeScript non ha do-whileloop né ha un breve operatore ternario:

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

Abbreviato utilizzando una tabella di ricerca:

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 byte

Tabella di ricerca, 181 byte

A causa della breve sintassi dell'array, funziona solo su 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!";
}

Originale, 215 byte

Funziona con la maggior parte (se non tutte) le versioni di 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 byte

due interruzioni di riga dietro il tag di chiusura perché PHP ignorerà il primo

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!

accetta input dall'argomento della riga di comando;

richiede PHP 5.6 (rilasciato il 18 dicembre 2014) o successivo per l'indicizzazione del valore letterale della stringa.


1

SmileBASIC, 159 byte

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.