Năm nay là năm nào


9

Đó là tháng 12 năm 2014, và 2015 đã gần như bắt đầu. Tuy nhiên, có vẻ như không phải ai cũng nhận ra điều này.

Jon: Năm 2009 chắc chắn là một năm dài |  Garfield nhìn vào lịch |  Garfield: Triệu Chúng ta phải có một lịch mới

Nhưng người dân PPCG đến giải cứu!

Đầu vào

Chương trình của bạn được cung cấp một lưới giống như một bức tường, trong đó những ngày trong tháng 12 trông khác với những ngày trong tháng 11 và tháng 1. Mỗi tuần bắt đầu với Chủ nhật và kết thúc với Thứ Bảy.

Ngày trong tháng được đại diện bởi a #. Những ngày nằm ngoài tháng được biểu thị bằng (dấu cách, mã ASCII 32). Mỗi tuần là trên một dòng riêng biệt. Các dòng được phân tách bằng một ký tự dòng mới ( \n). Chương trình của bạn có thể yêu cầu thông báo hoặc đưa vào một dòng mới ở cuối đầu vào.

Ví dụ: đây là đầu vào cho tháng 12 năm 2009:

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

Lịch luôn luôn là của tháng mười hai.

Bài tập

Đưa ra đầu vào, bạn phải tìm năm liên quan đến lịch. Vì có nhiều năm mà lịch khớp với nhau, bạn phải trả lại năm (trước năm 2015) gần nhất với năm 2015. (Không bao gồm năm 2015.)

Chương trình của bạn phải tạo ra đầu ra chính xác cho bất kỳ năm nào <2015, ngoại trừ những chương trình có bố cục lịch cho tháng 12 bằng với năm khác (trước năm 2015) gần hơn với năm 2015.

Nếu năm <2014, bạn cũng phải tính chênh lệch của năm 2014. Ví dụ: năm 2012 chênh lệch là 2.

Đầu ra

Đầu ra của chương trình của bạn phải là:

  • Văn bản: Your calendar is for <year>.(Lưu ý: vì từ này ban đầu được đánh vần là cal calender, tôi cũng sẽ chấp nhận chính tả đó.)
  • Tiếp theo là một dòng mới ( \nhoặc \r\n).
  • Tiếp theo là văn bản: It's almost 2015.
  • Nếu năm là <2014, điều này phải được theo sau bởi văn bản: You're <difference> years behind.Điều này phải nằm trên một dòng riêng biệt.
  • Tiếp theo là một dòng mới ( \nhoặc \r\n).
  • Tiếp theo là văn bản: Go buy a new calendar!
  • Tùy chọn theo sau bởi một dòng mới ( \nhoặc \r\n).

Quy tắc

  • Bạn có thể chọn xem bạn muốn nhận lịch dưới dạng đối số dòng lệnh (ví dụ yourprogram.exe <calendar>) hoặc lời nhắc cho đầu vào của người dùng.
  • Bạn có thể cho rằng chương trình của bạn sẽ không nhận được đầu vào không hợp lệ. Đầu vào không hợp lệ bao gồm bố trí lịch mà không tồn tại năm.
  • Mã ngắn nhất (tính bằng byte, bằng bất kỳ ngôn ngữ nào) sẽ thắng.
  • Bất kỳ đối số dòng lệnh không chuẩn nào (đối số thường không được yêu cầu để chạy tập lệnh) đều được tính vào tổng số ký tự.

  • Những gì chương trình của bạn không được làm:

    • Phụ thuộc vào bất kỳ nguồn lực bên ngoài.
    • Phụ thuộc vào việc có một tên tập tin cụ thể.
    • Đầu ra bất cứ điều gì khác ngoài đầu ra cần thiết.
    • Mất nhiều thời gian để chạy. Nếu chương trình của bạn chạy hơn một phút trên máy tính của một người dùng gia đình trung bình, thì nó không hợp lệ.
  • Chương trình của bạn không được viết bằng ngôn ngữ lập trình mà không tồn tại trình biên dịch / trình thông dịch có sẵn công khai trước khi thử thách này được đăng.

Ví dụ

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Phù. Quản lý để đăng nó 6 giây trước khi 2014 kết thúc bằng UTC (được sử dụng bởi SE). Ngoài ra, chúc mừng năm mới mọi người!
dùng2428118

Giả sử, năm 2016 và 2009 có hình dạng giống nhau. Vậy thì cái nào gần nhất? (tức là bạn có nghĩa là gần nhất theo khoảng cách tuyệt đối, hoặc gần nhất nhưng sớm hơn năm 2015?)
Sp3000

@ SP3000 Cái sau. Tôi đã chỉnh sửa bài viết để làm rõ.
dùng2428118

2
Có thực sự cần thiết phải đánh vần lịch hai cách khác nhau trong đầu ra?
frageum

3
"Bạn có thể chọn xem bạn có muốn nhận phân số dưới dạng đối số dòng lệnh hay không (ví dụ: yourprogram.exe 2/5)" ... Cái gì?
frageum

Câu trả lời:


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

Một bảng tra cứu đơn giản dựa trên vị trí của đầu tiên #.

Mở rộng:

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

"." và "-" có cùng mức ưu tiên của toán tử, vì vậy bạn cần dấu ngoặc đơn trong khoảng "2014- $ b".
nutki


@nutki Aah, tôi nghĩ tôi đã sửa nó rồi.
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!"

Cách tiếp cận trước:

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

Lịch trên đầu vào tiêu chuẩn (tất nhiên chỉ có dòng đầu tiên là quan trọng)

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

2

C # 235

rút gọn:

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

Ung dung

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

Chà, ngôn ngữ thật dài dòng :)


1
Lớp của bạn và Main không phải công khai. Ngoài ra, bạn có thể dễ dàng đổi tên Programthành P. Điều đó sẽ giúp bạn tiết kiệm một số ký tự :)
Chương trìnhFOX

20 nhân vật thực sự, cảm ơn :)
Manuel Schweigert

1
Bạn có thể lưu một vài ký tự bằng cách thay đổi cách ytính toán, nếu bạn lập chỉ mục một chuỗi, bạn có thể lưu cú pháp cần thiết để mô tả mảng (nghĩa là var y = "1054382"[index]-48( 0là ASCII 48)). ycũng có thể được đưa vào ztính toán để tiết kiệm hơn nữa.
VisualMelon

2

C #, 384 , 363 325 byte

C # Thời gian, xin vui lòng cho tôi biết nếu tôi bỏ lỡ một trong các quy tắc, vv

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

Đầu vào

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

Đầu ra

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

Đầu vào 2

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

Đầu ra 2

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

Chỉnh sửa: Đã cập nhật, quản lý để xóa một số byte


Dấu câu bị thiếu trong đầu ra của bạn.
Tít

2

Java, 243 byte

Đó là một ngôn ngữ dài dòng :-)

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

Chưa hoàn thành

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

Tôi chưa quen viết ES6 nên mọi lời khuyên đều được đánh giá cao:

Bảng tra cứu, 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!`}

Bản gốc, 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!`}

Chưa hoàn thành

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

Tôi cũng đã bao gồm phiên bản gốc của mình bên dưới

Mảng tra cứu, 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!"}

Chưa hoàn thành

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

Bản gốc, 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!"}

Chưa hoàn thành

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

Tương tự như câu trả lời PHP của tôi, nhưng CoffeeScript không có do-whilevòng lặp cũng như không có toán tử tạm thời ngắn:

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

Vô song

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

Rút ngắn bằng cách sử dụng bảng tra cứu:

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

Bảng tra cứu, 181 byte

Do cú pháp mảng ngắn, chỉ hoạt động trên 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!";}

Chưa hoàn thành

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

Bản gốc, 215 byte

Hoạt động với hầu hết (nếu không phải tất cả) các phiên bản 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!";}

Chưa hoàn thành

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

hai ngắt dòng đằng sau thẻ đóng vì PHP sẽ bỏ qua cái đầu tiên

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!

lấy đầu vào từ đối số dòng lệnh;

yêu cầu PHP 5.6 (phát hành ngày 18 tháng 12 năm 2014) trở lên để lập chỉ mục chuỗi ký tự.


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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.