Какой сейчас год?

9

Это декабрь 2014 года, а 2015 год почти начался. Однако, похоже, не все это осознали.

Джон: «2009 год был долгим» |  Гарфилд смотрит на календарь |  Гарфилд: «Нам нужен новый календарь»

Но люди PPCG приходят на помощь!

вход

Ваша программа имеет сетку, похожую на сетку, где дни в декабре месяце выглядят иначе, чем в ноябре и январе. Каждая неделя начинается с воскресенья и заканчивается субботой.

Дни в месяце представлены как #. Дни, выходящие за пределы месяца, обозначаются как (пробел, код ASCII 32). Каждая неделя на отдельной строке. Строки разделяются символом новой строки ( \n). Ваша программа может потребовать пропуска или включения новой строки в конце ввода.

Например, это входные данные за декабрь 2009 года:

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

Календарь всегда месяц декабрь.

задача

Учитывая данные, вы должны найти год, связанный с календарем. Поскольку существует несколько лет, для которых совпадает календарь, необходимо указать год (до 2015 года), ближайший к 2015 году. (За исключением самого 2015 года.)

Ваша программа должна производить правильные выходные данные для любого года <2015, за исключением тех, которые имеют календарный план на декабрь, который соответствует календарному плану другого года (до 2015 года) ближе к 2015 году.

Если год <2014, вы также должны рассчитать разницу между годом и 2014 годом. Например, для 2012 года разница равна 2.

Вывод

Вывод вашей программы должен быть:

  • Текст: Your calendar is for <year>.(Примечание: так как это изначально было написано как «календарь», я также приму это написание.)
  • Далее следует перевод строки ( \nили \r\n).
  • Далее следует текст: It's almost 2015.
  • Если год <2014, за ним должен следовать текст: You're <difference> years behind.это должно быть в отдельной строке.
  • Далее следует перевод строки ( \nили \r\n).
  • Далее следует текст: Go buy a new calendar!
  • При желании следует символ новой строки ( \nили \r\n).

правила

  • Вы можете выбрать, хотите ли вы получать календарь в качестве аргумента командной строки (например yourprogram.exe <calendar>) или запросить ввод данных пользователем.
  • Вы можете предположить, что ваша программа не получит неверный ввод. Неверный ввод включает в себя макет календаря, для которого не существует года.
  • Самый короткий код (в байтах, на любом языке) выигрывает.
  • Любые нестандартные аргументы командной строки (аргументы, которые обычно не требуются для запуска скрипта) учитываются в общем количестве символов.

  • Что ваша программа не должна делать:

    • Зависит от любых внешних ресурсов.
    • Зависит от наличия определенного имени файла.
    • Выведите что-нибудь кроме требуемого вывода.
    • Возьми исключительно долго бегать. Если ваша программа выполняется более минуты на компьютере обычного домашнего пользователя, она недействительна.
  • Ваша программа не должна быть написана на языке программирования, для которого не было общедоступного компилятора / интерпретатора до того, как был опубликован этот вызов.

Примеры

Входные данные:

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

Вывод:

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

Входные данные:

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

Вывод:

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

Входные данные:

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

Вывод:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!
user2428118
источник
Уф. Удалось опубликовать его за 6 секунд до того, как 2014 год был закончен в UTC (который используется SE). Также с новым годом всех!
user2428118
Предположим, что 2016 и 2009 годы имеют одинаковую форму. Тогда какой из них самый близкий? (то есть вы имеете в виду самое близкое по абсолютному расстоянию или
самое
@ SP3000 Последний. Я отредактировал пост, чтобы уточнить.
user2428118
2
Действительно ли необходимо записывать календарь двумя разными способами в выводе?
feersum
3
«Вы можете выбрать, хотите ли вы получать дробь в качестве аргумента командной строки (например, yourprogram.exe 2/5)» ... Что?
feersum

Ответы:

2

CJam, 126 байт

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

Python 3, 178 байт

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

Простая справочная таблица, основанная на расположении первого #.

Expanded:

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
источник
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
источник
"" и "-" имеют одинаковый приоритет оператора, поэтому вам нужно заключить в скобки "2014- $ b".
Nutki
@nutki Ага, я думал, что уже исправил это.
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!"

Предыдущий подход:

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

Календарь на стандартном вводе (конечно, важна только первая строка)

perl 2014.pl <<<" ######"
nutki
источник
2

C # 235

уменьшенная:

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

Ну, язык многословен :)

Мануэль Швайгерт
источник
1
Ваш класс и Майн не должны быть публичными. Кроме того, вы можете легко переименовать Programв P. Это должно спасти вас некоторых персонажей :)
ProgramFOX
20 символов действительно, спасибо :)
Мануэль Швайгерт
1
Вы можете сохранить несколько символов, изменив способ yвычисления. Если вы индексируете строку, вы можете сохранить синтаксис, необходимый для описания массива (т. Е. var y = "1054382"[index]-48( 0ASCII 48)). yтакже могут быть включены в zрасчет для дальнейшей экономии.
VisualMelon
2

C #, 384 , 363 325 байт

C # Time, пожалуйста, скажите мне, если я пропустил одно из правил и т. Д.

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

вход

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

Вывод

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

Вход 2

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

Выход 2

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

Редактировать: обновлено, удалось удалить некоторые байты

Даррен Брин
источник
Пунктуация отсутствует в вашем выводе.
Тит
2

Java, 243 байта

Это многословный язык :-)

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!");
    }
}
rink.attendant.6
источник
1

JavaScript (ES6), 199 170 байт

Я еще не привык писать ES6, поэтому любые советы будут оценены:

Таблица поиска, 170 байт

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

Оригинал, 199 байт

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 байта

Я также включил мою оригинальную версию ниже

Массив поиска, 182 байта

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

Оригинал, 212 байт

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!";
}
rink.attendant.6
источник
1

CoffeeScript, 211 177 байт

Аналогично моему PHP-ответу, но у CoffeeScript нет do-whileциклов и нет короткого троичного оператора:

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

Укорочено с помощью справочной таблицы:

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
источник
1

PHP, 215 181 байт

Таблица поиска, 181 байт

Из-за короткого синтаксиса массива, работает только на 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!";
}

Оригинал, 215 байт

Работает с большинством (если не со всеми) версиями 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!";
}
rink.attendant.6
источник
1

Руби, 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
источник
1

PHP, 145 байт

два разрыва строки за закрывающим тегом, потому что PHP будет игнорировать первый

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!

принимает входные данные из аргумента командной строки;

требуется PHP 5.6 (выпущен 18 декабря 2014 г.) или более поздней версии для индексации строкового литерала.

Titus
источник
1

SmileBASIC, 159 байт

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
источник