Який рік?


9

Це грудень 2014 року, а 2015 рік майже розпочався. Однак, здається, не всі усвідомили це.

Джон: "2009, безумовно, довгий рік" |  Гарфілд дивиться на календар |  Гарфілд: "Ми повинні отримати новий календар"

Але на допомогу приходять люди PPCG!

Вхідні дані

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

Дні протягом місяця представлені символом a #. Дні, які не виходять за місяць, представлені символом (пробіл, код 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!

Phew. Вдалося опублікувати його за 6 секунд до закінчення 2014 року в UTC (який використовується SE). Також з усім новим роком!
користувач2428118

Скажіть, гіпотетично, що 2016 та 2009 роки мають однакову форму. Тоді хто з них найближчий? (тобто ви маєте на увазі найближчу за абсолютною відстані чи найближчу, але раніше 2015 року?)
Sp3000

@ SP3000 Останнє. Я відредагував пост, щоб уточнити.
користувач2428118

2
Чи справді потрібно записати у календарі два різні способи у висновку?
feersum

3
Msgstr "Ви можете вибрати, чи хочете ви отримувати дріб як аргумент командного рядка (наприклад, 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!"

3

Пітон 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)))))

Проста таблиця пошуку на основі розташування першої #.

Розширено:

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

Перл - 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!":"")

"." та "-" мають однаковий пріоритет оператора, тому вам потрібні дужки навколо "2014- $ b".
nutki


@nutki Aah, я думав, що це вже виправив.
KSFT

2

Перл 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 <<<" ######"

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

Безумовно

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
Ваш клас та Main не повинні бути загальнодоступними. Крім того, ви можете легко перейменувати Programв P. Це повинно врятувати вас декількох персонажів :)
ProgramFOX

Дійсно 20 персонажів, дякую :)
Мануель Швайгерт

1
Ви можете зберегти кілька символів, змінивши спосіб yобчислення, якщо індексувати рядок, ви можете зберегти синтаксис, необхідний для опису масиву (тобто var y = "1054382"[index]-48( 0є ASCII 48)). yтакож можна вписати в zрозрахунок для подальшої економії.
VisualMelon

2

C #, 384 , 363 325 байт

C # Час, скажіть, будь ласка, якщо я пропустив якесь із правил тощо.

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

Немініфікований

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

Я ще не звик писати 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!`}

Немініфікований

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

Немініфікований

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

Немініфікований

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

Як у моїй відповіді 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!'

Немініфікований

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

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

Немініфікований

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

Немініфікований

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

Рубі, 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 байт

два переривання рядків за тегом закриття, оскільки 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 року) або пізнішої версії для індексації рядкового літералу.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.