Tahun berapa sekarang?

9

Ini adalah Desember 2014, dan 2015 sudah hampir dimulai. Namun, tampaknya tidak semua orang menyadari hal ini.

Jon: "2009 sudah pasti tahun yang panjang" |  Garfield melihat kalender |  Garfield: "Kita harus mendapatkan kalender baru"

Tetapi orang-orang PPCG datang untuk menyelamatkan!

Memasukkan

Program Anda diberi kotak seperti yang ada di dinding, di mana hari-hari di bulan Desember terlihat berbeda dari bulan November dan Januari. Setiap minggu dimulai dengan hari Minggu dan berakhir dengan hari Sabtu.

Hari dalam bulan diwakili oleh a #. Hari yang jatuh di luar bulan diwakili oleh (spasi, kode ASCII 32). Setiap minggu berada di jalur yang berbeda. Garis dipisahkan oleh karakter baris baru ( \n). Program Anda mungkin memerlukan penghentian atau penyertaan baris baru di akhir input.

Misalnya, ini adalah input untuk Desember 2009:

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

Kalender selalu dari bulan Desember.

Tugas

Diberikan input, Anda harus menemukan tahun yang terkait dengan kalender. Karena ada beberapa tahun yang cocok dengan kalender, Anda harus mengembalikan tahun (sebelum 2015) yang paling dekat dengan tahun 2015. (Tidak termasuk tahun 2015 itu sendiri.)

Program Anda harus menghasilkan output yang benar untuk setiap tahun <2015, tidak termasuk yang memiliki tata letak kalender untuk Desember yang sama dengan tahun lain (sebelum 2015) mendekati 2015.

Jika tahun ini <2014, Anda juga harus menghitung selisih tahun hingga 2014. Misalnya, untuk 2012 perbedaannya 2.

Keluaran

Output program Anda harus:

  • Teks: Your calendar is for <year>.(Catatan: karena ini awalnya dieja sebagai "kalender", saya akan menerima ejaan itu juga.)
  • Diikuti oleh baris baru ( \natau \r\n).
  • Diikuti oleh teks: It's almost 2015.
  • Jika tahun ini <2014, ini harus diikuti oleh teks: You're <difference> years behind.Ini harus pada baris terpisah.
  • Diikuti oleh baris baru ( \natau \r\n).
  • Diikuti oleh teks: Go buy a new calendar!
  • Opsional diikuti oleh baris baru ( \natau \r\n).

Aturan

  • Anda dapat memilih apakah Anda ingin menerima kalender sebagai argumen baris perintah (misalnya yourprogram.exe <calendar>) atau meminta input pengguna.
  • Anda dapat menganggap program Anda tidak akan menerima input yang tidak valid. Input yang tidak valid termasuk tata letak kalender yang tidak ada tahun.
  • Kode terpendek (dalam byte, dalam bahasa apa pun) menang.
  • Argumen baris perintah non-standar (argumen yang biasanya tidak diperlukan untuk menjalankan skrip) dihitung terhadap jumlah total karakter.

  • Apa yang tidak boleh dilakukan oleh program Anda :

    • Bergantung pada sumber daya eksternal apa pun.
    • Bergantung pada memiliki nama file tertentu.
    • Output apa pun selain output yang dibutuhkan.
    • Butuh waktu yang sangat lama untuk dijalankan. Jika program Anda berjalan lebih dari satu menit pada komputer pengguna rumahan rata-rata, itu tidak valid.
  • Program Anda tidak boleh ditulis dalam bahasa pemrograman yang tidak ada kompiler / juru bahasa yang tersedia untuk umum sebelum tantangan ini diposting.

Contohnya

Memasukkan:

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

Keluaran:

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

Memasukkan:

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

Keluaran:

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

Memasukkan:

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

Keluaran:

Your calendar is for 2012.
It's almost 2015.
You're 2 years behind.
Go buy a new calendar!
pengguna2428118
sumber
Fiuh. Berhasil mempostingnya 6 detik sebelum 2014 berakhir di UTC (yang digunakan oleh SE). Juga, Selamat tahun baru semuanya!
user2428118
Katakan, secara hipotesis, bahwa 2016 dan 2009 memiliki bentuk yang sama. Lalu yang mana yang paling dekat? (yaitu maksud Anda paling dekat dengan jarak absolut, atau terdekat tetapi lebih awal dari 2015?)
Sp3000
@ SP3000 Yang terakhir. Saya telah mengedit pos untuk mengklarifikasi.
user2428118
2
Apakah benar-benar perlu mengeja kalender dua cara berbeda dalam output?
feersum
3
"Anda dapat memilih apakah Anda ingin menerima fraksi sebagai argumen baris perintah (mis. Program Anda 2/5)" ... Apa?
feersum

Jawaban:

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

Tabel pencarian sederhana berdasarkan lokasi yang pertama #.

Diperluas:

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
sumber
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
sumber
"." dan "-" memiliki prioritas operator yang sama, jadi Anda perlu tanda kurung sekitar "2014- $ b".
nutki
@nutki Aah, saya pikir saya sudah memperbaikinya.
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!"

Pendekatan sebelumnya:

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

Kalender pada input standar (tentu saja hanya baris pertama yang signifikan)

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

C # 235

diperkecil:

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

Tidak disatukan

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

Nah, bahasanya verbose :)

Manuel Schweigert
sumber
1
Kelas dan Utama Anda tidak harus bersifat publik. Anda juga dapat dengan mudah mengganti nama Programmenjadi P. Itu akan menyelamatkan Anda beberapa karakter :)
ProgramFOX
20 karakter, terima kasih :)
Manuel Schweigert
1
Anda dapat menyimpan beberapa karakter dengan mengubah cara ydikomputasi, jika Anda mengindeks string Anda dapat menyimpan sintaks yang diperlukan untuk menggambarkan array (yaitu var y = "1054382"[index]-48( 0adalah ASCII 48)). ydapat juga dimasukkan ke dalam zperhitungan untuk penghematan lebih lanjut.
VisualMelon
2

C #, 384 , 363 325 Bytes

C # Waktu, tolong beri tahu saya jika saya melewatkan salah satu aturan dll.

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

Memasukkan

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

Keluaran

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

Input 2

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

Keluaran 2

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

Sunting: Diperbarui, berhasil menghapus beberapa byte

Darren Breen
sumber
Tanda baca tidak ada pada output Anda.
Titus
2

Java, 243 byte

Ini bahasa lisan :-)

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

Tidak ditambang

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

JavaScript (ES6), 199 170 byte

Saya belum terbiasa menulis ES6 sehingga tips apa pun akan dihargai:

Tabel pencarian, 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!`}

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

Tidak ditambang

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

Saya juga menyertakan versi asli saya di bawah ini

Array pencarian, 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!"}

Tidak ditambang

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

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

Tidak ditambang

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

CoffeeScript, 211 177 byte

Mirip dengan jawaban PHP saya, tetapi CoffeeScript tidak memiliki do-whileloop juga tidak memiliki operator ternary pendek:

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

Tidak diperkecil

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

Dipersingkat dengan menggunakan tabel pencarian:

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

PHP, 215 181 byte

Tabel pencarian, 181 byte

Karena sintaks array pendek, hanya berfungsi pada 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!";}

Tidak ditambang

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

Asli, 215 byte

Bekerja dengan sebagian besar (jika tidak semua) versi 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!";}

Tidak ditambang

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

PHP, 145 byte

dua linebreak di belakang tag penutup karena PHP akan mengabaikan yang pertama

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!

mengambil input dari argumen baris perintah;

membutuhkan PHP 5.6 (dirilis 18 Desember 2014) atau lebih baru untuk mengindeks string literal.

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

C # (Visual C # Interactive Compiler) , 178 175 172 byte

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

Cobalah online!

Perwujudan Ketidaktahuan
sumber