สวัสดีปีใหม่ล่วงหน้า 2016!


40

ข้อมูลที่คุณป้อนจะเป็นจำนวนเต็มระหว่างปี 1970 ถึง 2090 (รวม) ซึ่งคิดเป็นปี โปรแกรมของคุณควรแสดงผลในปีถัดไปที่วันปีใหม่ตรงกับวันเดียวกันของสัปดาห์เป็นปีที่ป้อนเข้า

กรณีทดสอบ:

ด้านล่างนี้เป็นอินพุตและเอาต์พุตตัวอย่าง

2001 => 2007
2047 => 2058
2014 => 2020
1970 => 1976
1971 => 1982
1977 => 1983
2006 => 2012

โบนัส 20%:แสดงวันของสัปดาห์ในวันปีใหม่

2001 => 2007 (Mon)
2047 => 2058 (Tue)
2014 => 2020 (Wed)
1970 => 1976 (Thu)
1971 => 1982 (Fri)
1977 => 1983 (Sat)
2006 => 2012 (Sun)

โบนัส 30%:ผลผลิตAdvance Happy New Year, <year>

2010 => Advance Happy New Year, 2016

โบนัส 50%:ทำทั้งสองอย่างเหนือโบนัส

2010 => Advance Happy New Year, 2016 (Fri)

เขียนโปรแกรมที่อ่านอินพุตจาก STDIN หรือยอมรับอาร์กิวเมนต์บรรทัดคำสั่งหรือฟังก์ชันที่รับอาร์กิวเมนต์

หมายเหตุ:โปรดเพิ่มลิงค์เพื่อทดสอบรหัสของคุณถ้าเป็นไปได้

ลีดเดอร์บอร์ด:


6
ฉันรู้สึกเหมือนทุกวันที่ท้าทายต้องทำการคำนวณ leap ปีเป็น subproblem และเริ่มค้าง
xnor

ที่เกี่ยวข้อง: คำถามนี้
Addison Crump

@xnor หากไม่เป็นเช่นนั้นก็จะเป็นเพียงแค่ +7 คือ "กว้างเกินไป"
Erik the Outgolfer

@EriktheGolfer ไม่เมื่อฉันเขียนความคิดเห็นนั้นคำตอบของฉันคือคำตอบที่ได้รับการยอมรับ
Dennis

คำตอบ:


1

เยลลี่ขนาด 9 ไบต์

%4*3%7+5+

นี่คือเชน monadic ที่รับอาร์กิวเมนต์บรรทัดคำสั่งจำนวนเต็มเป็นอินพุต มันใช้(x+5+(x%4)**3%7)อัลกอริทึมของฉัน

ลองมันนี่ แม้ว่าจะเป็นเวอร์ชั่นปัจจุบันของเจลลี่ แต่ก็ใช้งานได้ในเวอร์ชันนี้ซึ่งมาก่อนการท้าทาย (ขอบคุณ @Dennis!)


มันอัศจรรย์มาก! ฉันสามารถยืนยันได้ว่ามันทำงานได้กับการแก้ไขล่ามเยลลี่ครั้งนี้ซึ่งถือเป็นการท้าทายก่อนหน้านี้
Dennis

31

Mathematica, 45 37 27 24 ไบต์

#+5[6,6,11][[#~Mod~4]]&

การปรับปรุงต้องขอบคุณ @ MartinBüttner (10 ไบต์) และ @ChipHurst (อีก 3 ไบต์)


7
โอ้ว้าว. ดูเหมือนว่าจะไม่มีใครสังเกตเห็นรูปแบบนี้ แต่มันได้ผล
ลินน์

4
นี่เป็นรุ่นที่สั้นกว่าเล็กน้อย:#+5[6,6,11][[#~Mod~4]]&
Chip Hurst

@ChipHurst ฉลาดมากด้วย5[6, 6, 11][[0]]:)
มาร์ติน

18

CJam, 21 12 11 bytes

{_9587Cb=+}

@martin พบวิธีที่ง่ายมาก!

ลองมันนี่

แก้ไข: ขอบคุณเดนนิส!


1
@Mauris คุณสามารถเพิ่มคำอธิบายได้ไหม
Vasu Adari

@Vasu: รหัสนี้เป็นฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เหมือนกัน5 6 6 11เคล็ดลับที่นำมาใช้ในคำตอบอื่น ๆ แต่รายการจะถูกเข้ารหัสเป็น"ตัวเลขของ 9587 ในฐาน 12"
Lynn

เข้าใจแล้ว ฉันต้องการให้คุณเพิ่มคำอธิบายเพื่อให้คนที่ตรวจสอบคำตอบของคุณสามารถเข้าใจว่ามันใช้ภาษา wrt อย่างไร
Vasu Adari

10

gs2, 12 ไบต์

V@¶4☻s%☺♀i50

แปลคำตอบ CJam ของฉัน เข้ารหัสใน CP437 ตามปกติ ลองออนไลน์ !


ลิงค์ไปยังโค้ดที่สร้าง 2spooky4me และถ้าฉันตัดและวางรหัสด้านบนฉันได้รับปีที่ผิด: imgur.com/VAkXT0k (โดย "ผิดปี" ฉันหมายถึงฉันได้รับหนึ่งปีเร็วกว่าปีที่ตั้งใจ)
question_asker

ฉันลืมไบต์ ลองตอนนี้.
Lynn

ฉันแก้ไขลิงค์ด้วย
Lynn

เยี่ยมเลยมันใช้ได้แล้วตอนนี้
question_asker

8

JavaScript (ES6), 50 49 20 ไบต์ (ไม่มีโบนัส)

a=>a+[5,6,6,11][a%4]

อัลกอริทึมโดย @martin พิสูจน์ได้ว่ามีขนาดเล็กลงมากดังนั้นฉันจึงไปกับมัน

ฉันเลือกวิธีการทางคณิตศาสตร์เพราะ JavaScript มีแนวโน้มที่จะ verbose รหัสสั้นพอที่โบนัสจะทำให้รหัสยาวขึ้นเท่านั้น

นี่คือคำตอบก่อนหน้าของฉัน (49 ไบต์) และคำตอบดั้งเดิมของฉัน (50 ไบต์):

F=(a,b=a)=>((a+--a/4|0)-(b++/4+b|0))%7?F(++a,b):b

F=(a,b=a)=>(f=c=>(c--+c/4|0)%7)(a)-f(++b)?F(a,b):b

พวกเขาทำงานโดยรับปีและคำนวณตัวเลข (0-6) เพื่อเป็นตัวแทนของ "วันเริ่มต้นปี" เนื่องจากช่วงวันที่สำหรับการท้าทายนี้อยู่ในช่วงของปีที่เป็นไปตามกฎปีอธิกสุรทินแบบง่าย ๆ (ไม่ข้ามในปี 2000) จึงเป็นเรื่องง่ายที่จะคำนวณ จากนั้นเป็นเพียงเรื่องของการเปรียบเทียบไปข้างหน้าเพื่อค้นหาปีที่เริ่มต้นด้วยค่าเดียวกัน การเรียกซ้ำเป็นวิธีที่รัดกุมที่สุดในการทำสิ่งนี้


7

Pyth, 14 12 11 ไบต์

+QC@"♣♠♠♂"Q

05 06 06 0Bสี่ไบต์ในสตริงที่ควรจะเป็น

แก้ไข: ขอบคุณ FryAmTheEggman!

แก้ไข: ขอบคุณเดนนิส!


6

JavaScript (ES6), 104 ไบต์ - โบนัส 50% = 52

y=>eval('for(a=0;a!=(b=(new Date(""+y++)+"").slice(0,3));a=a||b)`Advance Happy New Year, ${y} (`')+b+")"

คำอธิบาย

y=>
  eval(`                  // eval enables for loop without {} or return
    for(
      a=0;                // a = first day of input year
      a!=                 // check if the day of the current year is equal to the first
        (b=(new Date(     // b = day of current year
          ""+y++)+"")     // cast everything as strings!
            .slice(0,3)); // the first 3 letters of the date string are the day name
      a=a||b              // set a to the day on the first iteration
    )

      // return the string
      \`Advance Happy New Year, \${y} (\`
  `)+b+")"

ทดสอบ


6

รหัสเครื่อง Z80 ขนาด 12 ไบต์

โพรซีเดอร์ Z80 ที่จะจัดเก็บที่0000hเรียกใช้โดยมีอินพุตHLและรีจิสเตอร์อื่นทั้งหมดชัดเจน:

.org 0000h
              ; Bytes   ; Explanation
  ;---------------------------------------------------------------
  DEC B       ; 05      ; 
  LD B, 6     ; 06 06   ;   
  DEC BC      ; 0B      ;
  LD A, 3     ; 3E 03   ;   A = 3
  AND L       ; A5      ;   A = input & 3
  LD E, A     ; 5F      ;   A = input & 3     DE = input & 3
  LD A, (DE)  ; 1A      ;   A = [input & 3]   DE = input & 3
  LD E, A     ; 5F      ;   A = [input & 3]   DE = [input & 3]
  ADD HL, DE  ; 19      ;   HL = input + offset
  RET         ; C9      ;

คำแนะนำสามคำแรกคือ "NOP" แต่ถูกจัดทำดัชนีเป็นข้อมูลในรหัสต่อไป HLเมื่อกลับมาส่งออกที่อยู่ใน


ใช่ฉันได้เพิ่มลงในโพสต์
Lynn

ดูไม่เหมาะสำหรับปี 2097 และ 2098 ซึ่งต้องการการเพิ่ม 7 และ 12 ตามลำดับ
Toby Speight

1
OP กล่าวว่าปีที่เข้ารับประกันจะอยู่ในช่วง 1970-2090
Lynn

6
ฉันไม่ชอบคำถามที่เปลี่ยนไปหลังจากฉันตอบแล้ว!
Toby Speight

2
คุณได้รับอนุญาตให้ระบุว่าอินพุทนั้นอยู่DEและคุณสามารถใช้ได้LD A, 3; AND E; LD L, A; LD L, (HL);หรือไม่?
Neil

5

Python 3, 140 100 102 84.5 154 * 0.5 = 77 ไบต์

ฉันอาจจะเขียนทางออกที่ดีขึ้นด้วยอัลกอริทึมของ Sakamoto แต่ตอนนี้จะทำ

ฉันถูก. นี่คือการใช้งานโดยใช้อัลกอริทึมของ Sakamoto

def s(y):
 d=lambda j:(j+j//4)%7
 for i in range(y,y+15):
  if d(i)==d(y-1):return"Advance Happy New Year, %d (%s)"%(-~i,"SMTWTFSuouehranneduit"[d(i)::7])

คำอธิบาย:

def day_of_the_week(year):
    return (year + year//4 - 1 + 0 + 1) % 7
    # The month code for January is 0, and you add 1 from January *1*.
    # The -1 is to correct for starting on Saturday 
    # and so that it cancels out the 1 from January 1.

def new_years(this_year):
# But in Sakamoto's algorithm, if the month is January or February, we must subtract 1.
    weekdays = "SunMonTueWedThuFriSat"
    for item in range(this_year, this_year + 15):
        if day_of_the_week(this_year - 1) == day_of_the_week(item):
            day = weekdays[day_of_the_week(item)*3 : day_of_the_week(item)*3+3]
            return "Advance Happy New Year, %d (%s)"%(item + 1, day)
        # So we subtract from every year we check, including this_year
        # And add 1 back in at the end
        # And print the greeting, the year, and the corresponding day of the week

ฉันได้อัปเดตคำถามแล้ว คุณไม่จำเป็นต้องตรวจสอบมานานหลายศตวรรษ
Vasu Adari

1
วิธีการเกี่ยวกับw="SMTWTFSuouehranneduit"แล้วพิมพ์w[d(i)::7]?
Lynn

4

อย่างจริงจัง35 17 ไบต์

[5,6,6,11] เคล็ดลับช่วยให้วัน

4,;)%[5,6,6,11]E+

ลองออนไลน์

คำอธิบาย:

4,;)%[5,6,6,11]E+
4,;)%              push input, input % 4
     [5,6,6,11]E   push (input % 4)th element of [5,6,6,11]
                +  add to the input

เวอร์ชั่นเก่า:

,;;D`45/*≈7@%`;╝ƒ╗35*r+`╛ƒ╜=`M1@íu+

ลองออนไลน์

คำอธิบาย:

,;;D`45/*≈7@%`;╝ƒ╗35*r+`╛ƒ╜=`M1@íu+
,;;                                  push 3 copies of the input (n)
   D                                 decrement the top copy of n
    `45/*≈7@%`;╝                     push Sakamoto's algorithm as a function and save a copy in register 1
                ƒ╗                   call Sakamoto's algorithm function and save result in register 0
                  35*r+              push [n, n+1, ..., n+14]
                       `    `M       map the function:
                        ╛ƒ╜=           push Sakamoto's algorithm, call, push 1 if equal to value in register 0 else 0
                              1@í    get the index of the first 1
                                 u+  increment and add n

อัลกอริทึมของ Sakamoto:

45/*≈7@%
45/*      multiply by 5/4
    ≈     floor
     7@%  mod 7

4

C, 31 ไบต์

หลังจากแก้ไขคำถามที่ จำกัด ช่วงอินพุตเป็น 1970-2090 สิ่งนี้จะกลายเป็นเรื่องเล็กน้อย:

f(x){return"\5\6\6\13"[x%4]+x;}

หากไม่มีศตวรรษที่ไม่ก้าวกระโดดก็มีช่วงเวลา 5,6,6,11 อย่างง่ายสำหรับการทำซ้ำครั้งแรกของวันเดียวกัน

วิธีแก้ไขปัญหาดั้งเดิมอย่างสมบูรณ์ (ไม่ จำกัด ถึง 2090), 90 ไบต์:

f(x){return(x-1)%100>89&&(x+9)/100%4?"\6\14\5\6\6\6\6\7\14\6"[x%10]+x:"\5\6\6\13"[x%4]+x;}

โปรแกรมทดสอบ:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    while (*++argv)
        printf("Advance Happy New Year, %d\n", f(atoi(*argv)));
    return !argc;
}

ทดสอบการทำงาน:

$ ./66656 2001 2047 2014 1970 1971 1977 2006
Advance Happy New Year, 2007
Advance Happy New Year, 2058
Advance Happy New Year, 2020
Advance Happy New Year, 1976
Advance Happy New Year, 1982
Advance Happy New Year, 1983
Advance Happy New Year, 2012

4

R, 143 136 * 0.5 = 68 ไบต์

G=function(y)strftime(paste(y,1,1,sep='-'),'%a')
d=seq(y<-scan(),y+14);sprintf("Advance Happy New Year, %i (%s)",d[G(d)==(w=G(y))][2],w)

ใช้%Aสำหรับชื่อเต็มวันแทนที่จะเป็น `% a ขึ้นอยู่กับสถานะที่ต้องการ

R, 120 * 0.7 = 84 ไบต์

G=function(y)as.POSIXlt(paste(y,1),,"%Y %j")$wday
d=seq(y<-scan(),y+14);cat("Advance Happy New Year,",d[G(d)==G(y)][2])

R, 90 ไบต์

G=function(y)as.POSIXlt(paste(y,1),,"%Y %j")$wday
d=seq(y<-scan(),y+14);d[G(d)==G(y)][2]

คำตอบทั้งหมดข้างต้นเป็นงานดัดแปลงจาก @plannapus answer การใช้;ตัวคั่นเพื่อหลีกเลี่ยงการต้องการsourceไฟล์หรือรันเป็นสคริปต์บนบรรทัดคำสั่ง


1
+1 ฉันลืมไปweekdaysแล้วดี
plannapus

@plannapus ขอบคุณ :) (ฉันนับจำนวนการขึ้นบรรทัดใหม่ขอให้ระบบไฟล์ในความเป็นจริงเพราะฉันอยู่ภายใต้ windows มันเป็น 2 ไบต์ แต่ฉันไม่ได้ขึ้นบรรทัดใหม่ในตอนท้ายที่ควรจะมีไฟล์ POSIX ดังนั้นมันยุติธรรมที่จะเก็บไว้เช่นนี้ จริง)
Tensibai

3

R, 145 ไบต์ -50% -> 72.5

y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))

ตัวอย่าง:

> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 2006
2: 
Read 1 item
[1] "Advance Happy New Year, 2012 (Sun)"
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 1977
2: 
Read 1 item
[1] "Advance Happy New Year, 1983 (Sat)"
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%a");x=y+1;while(F(x)!=F(y))x=x+1;sprintf("Advance Happy New Year, %i (%s)",x,F(x))
1: 2014
2: 
Read 1 item
[1] "Advance Happy New Year, 2020 (Wed)"

R, 97 ไบต์ (ไม่รวมโบนัส)

y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x

เยื้องกับบรรทัดใหม่:

y = scan() #Takes input from stdin
F = function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w") #Year to Weekday
x = y+1
while(F(x) != F(y)) x = x+1
x

กรณีทดสอบ:

> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 1977
2: 
Read 1 item
[1] 1983
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 2006
2: 
Read 1 item
[1] 2012
> y=scan();F=function(y)format(as.POSIXct(paste(y,1),,"%Y %j"),"%w");x=y+1;while(F(x)!=F(y))x=x+1;x
1: 2016
2: 
Read 1 item
[1] 2021

ฉันไม่เข้าใจความต้องการของการขึ้นบรรทัดที่น่าเกลียดการคืนรถกลับไม่ใช่ค่าใช้จ่ายที่สูงที่สุด;...
Tensibai

คุณสามารถประหยัด 1 ถ่านโดยการลบครั้งแรกy=scan;และใช้x=y<-scan()+1ฉันคิดว่า
Tensibai

และคุณสามารถประหยัดอีกเจ็ดโดยใช้as.POSIXlt(paste(y,1),,"%Y %j")$wdayเป็นฟังก์ชันการทำงานของคุณ
Tensibai

@ Tensibai ถ้าคุณไม่ใส่มันในหนึ่งบรรทัดและวางลงในคอนโซลโดยตรงscanจะอ่านในบรรทัดที่สองเป็นอินพุต x=y<-scan()+1กับ 2014 เป็น stdin จะทำให้คุณ x = 2015 y = 2015 (คือได้รับมอบหมายเป็นy <- scan()+1) และหากคุณพยายามที่จะทำ x=1+y<-scan()มันจะทำให้คุณมีข้อผิดพลาด ( Error in 1 + y <- scan() : target of assignment expands to non-language object) เพราะมันพยายามที่จะกำหนดไปscan() 1+y
plannapus

@Tensibai สำหรับคำแนะนำสุดท้ายของคุณผลลัพธ์ของ...$wdayคือหมายเลขวันทำงาน: แต่ที่นี่ฉันต้องการชื่อวันธรรมดาเพื่อให้ฉันสามารถพิมพ์ได้Advance Happy New Year, 2012 (Sun)
plannapus

3

VBA, 130 * 0.50 = 65 ไบต์

Sub k(y)
i=1
Do While Weekday(y+i)<>Weekday(y)
i=i+1
Loop
MsgBox "Advance Happy New Year," &y+i &WeekdayName(Weekday(y+i))
End Sub

VBA ทำให้การค้นหาวันในสัปดาห์เป็นเรื่องง่ายมาก .... ถ้าเพียง แต่มันไม่ได้เป็นอย่างนั้น


3

PHP, 120 139ไบต์ - 50% = 60 ไบต์

วิธีการทำงาน:

$s=strtotime;for($d=date(D,$s(($y=$argv[1]).$_="-1-1"));$d!=date(D,$s(++$y.$_)););echo"Advance Happy New Year, $y ($d)";

รับหนึ่งอินพุตจากบรรทัดรับคำสั่งเช่น:

$ php ahny.php 2001

ดูเหมือนว่าวิธี OOP จะนานขึ้นเช่นเคย (143 ไบต์):

$s=strtotime;for($d=date(D,$s($x=($y=$argv[1])."-1-1"));$d!=date(D,$s(++$y."-1-1")););echo"Advance Happy New Year, $y ($d)";

การแก้ไข

  • ที่บันทึกไว้ 18 ไบต์ แทนที่จะเพิ่มหนึ่งปีโดยใช้ตัวแก้ไข PHP +1yearตอนนี้ฉันแค่เพิ่มปีที่กำหนด
  • บันทึก 1 ไบต์โดยเก็บไว้-1-1ในตัวแปร

3

C, คะแนน53 52 (104 ไบต์)

f(x){x+="0116"[x%4];printf("Advance Happy New Year, %d (%.3s)",x-43,"MonTueWedThuFriSatSun"+x*5/4%7*3);}

แนวคิดที่ยืมมาจากToby Speight ; เพิ่มการแสดงโบนัสของวันทำงาน

ทำให้สตริงสั้นลงโดยเลื่อนโค้ดอักขระไปเป็นช่วงที่สบาย มีให้เลือกจำนวนขยับที่เหมาะสม (เช่น 43) ที่จะทำให้วันทำงานสั้นรหัสการคำนวณx*5/4%7การทำงาน


ฉันคิดว่าสิ่งที่รหัสตัวละครของคุณ จำกัด สิ่งนี้ไว้ที่การเข้ารหัสที่เข้ากันได้กับ ASCII หรือไม่?
Toby Speight

ใช่. รหัสควรมากกว่า 31 ดังนั้นจำนวนที่น้อยที่สุดที่จะเพิ่มรหัสจะเป็น 27 " !!&"ให้สตริง
anatolyg

2

Mathematica, 145 * 50% = 74 73.5 72.5 ไบต์

d=DateValue;StringForm["Advance Happy New Year, `` (``)",NestWhile[#+1&,(a=#)+1,#!=#2&@@DateObject@{{a},{#}}~d~"DayName"&],{a}~d~"DayNameShort"]&

ใช้ฟังก์ชั่นวันที่มาตรฐาน


2

Pyth, 23 ไบต์

L%+/b4b7.VQIqyby-Q1+1bB

ไม่มีสิทธิ์รับโบนัสใด ๆ เลย

ลองมันนี่

คล้ายกับคำตอบของงูหลามบริสุทธิ์

                        - Q = eval(input()) (autoassigned)
L                       - y = lambda b:
   /b4                  - b floordiv 4
  +   b                 - + b
 %     7                - mod 7


        .VQ             - for b in range(Q, infinate):
           Iqyby-Q1     - if y(b) == y(Q-1):
                   +1b  - print b+1
                      B - break

2

Java, (1-.2) * 323 (1-.5) * 350 348 339 = 258.4 175 174 169.5 ไบต์

import java.text.*;class D{public static void main(String[]a){long y=new Long(a[0]);int i=0;for(;!s(y).equals(s(y+(++i))););System.out.printf("Advance Happy New Year, %d (%s)",y+i,s(y+i));}static String s(long y){try{return new SimpleDateFormat("E").format(new SimpleDateFormat("d/M/yyyy").parse("1/1/"+y));}catch(Exception e){}return"";}}

ฮึ.

Ungolfed:

import java.text.*;
class D{
    public static void main(String[]a){
        long y=new Long(a[0]);
        int i=0;
        for(;!s(y).equals(s(y+(++i))););
        System.out.printf("Advance Happy New Year, %i (%s)",y+i,s(y+i));
    }
    static String s(long y){
        try{
            return new SimpleDateFormat("E").format(new SimpleDateFormat("d/M/yyyy").parse("1/1/"+y));
        }catch(Exception e){}
        return"";
    }
}

ลองออนไลน์!

ขอบคุณ @Kenney ที่ชี้ให้เห็นว่าฉันสามารถย่อnew Longและด้วยprintf! : D


long y=new Long(a[0])บันทึก 6 (12) ไบต์และใช้printfบันทึกอีก 3 (6)
Kenney

2

coreutils ของ GNU, 52 51 49 ไบต์

(โปรแกรม 98 bytes - โบนัส 50%)

seq -f$1-1-1\ %gyear 28|date -f- +'Advance Happy New Year, %Y (%a)'|sed /`date -d$1-1-1 +%a`/!d\;q

อินพุตมาจากอาร์กิวเมนต์บรรทัดคำสั่งและเอาต์พุตคือ stdout

คำอธิบาย

# generate 28 input years from $1 + 1 onwards (28 is always enough)
seq -f '$1-1-1 %g year' 28
|
# convert all of these as potential outputs
date -f- +'Advance Happy New Year, %Y (%a)'
|
 # Select the first one where the dayname matches that of input year
sed "/`date -d$1-1-1 +%a`/!d;q"

ทดสอบการทำงาน:

ตั้งค่าสถานที่ทุกคนสามารถเป็นหรือCPOSIX

$ for i in 2001 2047 2014 1970 1971 1977 2006; do ./66656.sh $i; done
Advance Happy New Year, 2007 (Mon)
Advance Happy New Year, 2058 (Tue)
Advance Happy New Year, 2020 (Wed)
Advance Happy New Year, 1976 (Thu)
Advance Happy New Year, 1982 (Fri)
Advance Happy New Year, 1983 (Sat)
Advance Happy New Year, 2012 (Sun)

ข้อ จำกัด : ใช้งานได้จนถึงปี 2147485519 เท่านั้น (แม้ว่าตอนนี้คำถามจะเปลี่ยนเพื่อให้มีขีด จำกัด ต่ำกว่า)


2

MATL , 28 ไบต์

i0:14+t1tI$YO8H$XO!st1)=f2))

ตัวอย่าง

>> matl i0:14+t1tI$YO8H$XO!st1)=f2))
> 1970
1976

รหัสอธิบาย

i           % input year
0:14+       % vector with that year and the next 14
t1tI$YO     % first day of each year
8H$XO       % transform into three letters specifying weekday
!s          % sum those three letters to reduce to unique numbers
t1)         % get first of those numbers (corresponding to input year)
=f2)        % find index of second matching
)           % index with that to obtain output year

2

Perl 6 ,  70   23 ไบต์

{($^a+1...{[==] ($a,$_).map: {Date.new(:year($_)).day-of-week}})[*-1]} # 70 bytes

{($_ X+5,6,6,11)[$_%4]} # 23 bytes

การใช้งาน:

for «2001 2047 2014 1970 1971 1977 2006 2010» {
  printf "%d => %d\n", $_, {($_ X+5,6,6,11)[$_%4]}( $_ )
}
2001 => 2007
2047 => 2058
2014 => 2020
1970 => 1976
1971 => 1982
1977 => 1983
2006 => 2012
2010 => 2016


2

Japt, 12 ไบต์

U+"♣♠♠♂"cU%4

เช่นเดียวกับคำตอบที่ Pyth 05 06 06 0Bสี่ไบต์ในสตริงที่ควรจะเป็น ลองออนไลน์!

U+"♣♠♠♂"cU%4  // Implicit: U = input integer
  "♣♠♠♂"      // Take this string.
        cU%4  // Take the char code at U%4.
U+            // Add U.
              // Implicit: output last expression

2
ขอบคุณสำหรับของขวัญคริสมาสต์แห่งค่าหัว! แต่มีคนบอกฉันได้อย่างไรว่าฉันได้รับมา?
ETHproductions

ฉันดูประวัติ เห็นได้ชัดว่า OP พยายามที่จะตอบคำถาม แต่ลืมที่จะมอบรางวัลให้ดังนั้นชุมชนจึงเลือกที่จะส่งต่อชื่อเสียงครึ่งหนึ่งให้กับคำตอบนี้

2

เยลลี่ขนาด 14 ไบต์

%4=0,3×-,5S++6

ลองออนไลน์!

จนถึงทุกวันนี้ Jelly ไม่มีการจัดทำดัชนีอาร์เรย์ดังนั้นสิ่งที่กล่าวมาข้างต้นจะต้องทำ ตั้งแต่การคอมมิชชันล่าสุดการจัดทำดัชนีอาร์เรย์ได้ถูกนำไปใช้เป็นโดยให้โซลูชันต่อไปนี้ ( 10 ไบต์ )

ị6,6,11,5+

ลองออนไลน์!


1
ฉันคิดว่า Jelly สามารถสำรอง 7 ตัวอักษรสำหรับค่าคงที่ 10 ~ 16
lirtosiast


1

C # (6.0) .Net Framework 4.6 173 ไบต์ - 30% = 121.1 ไบต์

void n(int y)=>Console.Write($"Advance Happy New Year, {Enumerable.Range(1,15).Select(i=>new DateTime(y+i,1,1)).First(x=>x.DayOfWeek==new DateTime(y,1,1).DayOfWeek).Year}");

1

Javascript ES7, 17 ไบต์

a=>a+5+(a%4)**3%7

นี่เป็นครั้งแรกที่ฉันใช้ JS ฉันพบสิ่งนี้โดยใช้สคริปต์ Python และฉันเชื่อว่าเป็นสิ่งที่ดีที่สุด มันทำงานได้เพราะ0**3เป็น 0 mod 7 1**3และ2**3เป็นทั้ง 1 และ3**3เป็น 6


1
ผู้ประกอบ**การการยกกำลังเป็นคุณสมบัติES7ไม่ใช่หรือ หรือว่าคุณกำลังใช้บาเบล ?
insertusernamehere

@insertusername ที่นี่คงที่
lirtosiast


1

Pyth , 12 ไบต์

++5%^%Q4 3 7

ลองออนไลน์! หรือตรวจสอบชุดทดสอบ

Pyth , 18 ไบต์

วิธีที่สองนี้เป็นส่วนใหญ่กอล์ฟ@ wizzwizz4 คำตอบของ

J%Q4+?q3J11?qJZ5 6

ลองออนไลน์! หรือตรวจสอบชุดทดสอบ


คำอธิบาย

++ 5% ^% Q4 3 7Q - Q หมายถึงอินพุตที่ได้รับการประเมินและมีความหมายโดยนัยในตอนท้าย

     % Q4 - อินพุต mod 4
    ^ 3 - คีบ
   % 7 - Mod 7
 +5 - บวก 5
+ Q - บวกอินพุต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.