ปีอะไร


9

มันคือเดือนธันวาคม 2014 และ 2015 เกือบจะเริ่มแล้ว อย่างไรก็ตามดูเหมือนว่าทุกคนจะไม่ได้ตระหนักถึงสิ่งนี้

จอน:“ ปี 2009 เป็นปีที่ยาวนานอย่างแน่นอน” |  Garfield ดูที่ปฏิทิน  Garfield:“ เราต้องรับปฏิทินใหม่”

แต่ผู้คนใน PPCG ก็มาช่วยด้วย!

อินพุต

โปรแกรมของคุณได้รับกริดเช่นเดียวกับกำแพงซึ่งวันที่ในเดือนธันวาคมนั้นดูแตกต่างจากเดือนพฤศจิกายนและมกราคม แต่ละสัปดาห์เริ่มต้นด้วยวันอาทิตย์และสิ้นสุดด้วยวันเสาร์

#วันภายในเดือนที่มีการแสดงโดย วันที่อยู่นอกเดือนนั้นจะถูกแทนด้วย(ช่องว่างรหัส ASCII 32) แต่ละสัปดาห์อยู่บนบรรทัดแยก บรรทัดถูกคั่นด้วยอักขระบรรทัดใหม่ ( \n) โปรแกรมของคุณอาจต้องการ ommission หรือการขึ้นบรรทัดใหม่เมื่อสิ้นสุดการป้อนข้อมูล

ตัวอย่างเช่นนี่คืออินพุตสำหรับเดือนธันวาคม 2009:

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

ปฏิทินอยู่ในเดือนธันวาคมเสมอ

งาน

เมื่อป้อนข้อมูลคุณจะต้องค้นหาปีที่เกี่ยวข้องกับปฏิทิน เนื่องจากมีหลายปีที่การจับคู่ปฏิทินคุณต้องส่งคืนปี (ก่อนปี 2015) ที่ใกล้เคียงกับปี 2015 มากที่สุด (ไม่รวมปี 2015 เอง)

โปรแกรมของคุณจะต้องสร้างผลลัพธ์ที่ถูกต้องสำหรับปีใด ๆ <2015 ไม่รวมรายการที่มีรูปแบบปฏิทินสำหรับเดือนธันวาคมซึ่งเท่ากับปีถัดไป (ก่อน 2015) ใกล้กับปี 2558

ถ้าปีนี้เป็น <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!

วุ้ย. จัดการเพื่อโพสต์มัน 6 วินาทีก่อนที่ 2014 จะสิ้นสุดใน UTC (ซึ่งใช้โดย SE) นอกจากนี้สวัสดีปีใหม่ทุกคน!
2428118

สมมติว่าในปี 2559 และ 2552 มีรูปร่างเหมือนกัน แล้วอันไหนที่ใกล้เคียงที่สุด? (เช่นคุณหมายถึงใกล้เคียงที่สุดโดยระยะทางที่แน่นอนหรือใกล้เคียงที่สุด แต่เร็วกว่า 2015?)
Sp3000

@ SP3000 หลัง ฉันแก้ไขโพสต์เพื่อชี้แจง
2428118

2
จำเป็นหรือไม่ที่จะต้องสะกดปฏิทินในสองวิธีที่แตกต่างกันในผลลัพธ์
feersum

3
"คุณสามารถเลือกได้ว่าคุณต้องการรับเศษส่วนเป็นอาร์กิวเมนต์บรรทัดคำสั่ง (เช่น yourprogram.exe 2/5)" ... คืออะไร
feersum

คำตอบ:



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

#ตารางการค้นหาง่ายขึ้นอยู่กับสถานที่ตั้งของแรก

ขยาย:

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

"" และ "-" มีตัวดำเนินการที่มีความสำคัญเหมือนกันดังนั้นคุณจึงจำเป็นต้องใส่เครื่องหมายวงเล็บ "2014- $ b"
nutki


@ nutki Aah ฉันคิดว่าฉันได้แก้ไขแล้ว
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 <<<" ######"

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

ภาษานั้นดีมาก :)


1
คลาสและ Main ของคุณไม่จำเป็นต้องเปิดเผยต่อสาธารณะ นอกจากนี้คุณยังสามารถเปลี่ยนชื่อไปProgram Pที่ควรช่วยคุณตัวละคร :)
ProgramFOX

แน่นอน 20 ตัวอักษรขอบคุณ :)
Manuel Schweigert

1
คุณสามารถบันทึกอักขระได้สองสามตัวโดยเปลี่ยนวิธีyคำนวณถ้าคุณทำดัชนีสตริงคุณสามารถบันทึกไวยากรณ์ที่ต้องการเพื่ออธิบายอาร์เรย์ (เช่นvar y = "1054382"[index]-48( 0คือ ASCII 48)) yสามารถอินไลน์เข้าสู่การzคำนวณเพื่อการประหยัดต่อไป
VisualMelon

2

C #, 384 , 363 325 Bytes

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 ไบต์

มันเป็นภาษา verbose :-)

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 ไบต์

ฉันยังไม่คุ้นเคยกับการเขียน 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!";
}

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

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

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 ไบต์

linebreaks สองอันที่อยู่ด้านหลังแท็กปิดเพราะ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.