Khi nào đến lễ tạ ơn?


38

Lý lịch

Một số ngày lễ có ngày cố định, dễ nhớ, như ngày 31 tháng 10, ngày 25 tháng 12, v.v ... Tuy nhiên, một số người muốn gây rắc rối. Chúng được chỉ định là những thứ như "Thứ Hai đầu tiên của tháng Chín" hoặc "Thứ Năm thứ tư trong tháng 11". Làm thế nào tôi phải biết khi đó là?

Tất cả những gì tôi biết là Lễ Tạ ơn đang đến rất nhanh, vì vậy tôi cần một chương trình để giúp tôi tìm ra khi nào có. Một số người thậm chí nói rằng đó là ngày mai , vì vậy chương trình của bạn cần phải ngắn nhất có thể để đảm bảo tôi có thể nhập lại kịp thời.

Các thách thức

Tạo một chương trình hoặc chức năng, được đưa ra một năm có bốn chữ số (ví dụ 2015 hoặc 1984), xuất hoặc trả về ngày Lễ Tạ ơn của Hoa Kỳ trong năm đó. Lễ Tạ ơn được định nghĩa là thứ Năm thứ tư của tháng 11 theo trang Wikipedia . (Gợi ý: trang đó cũng bao gồm một số thông tin thú vị về mẫu ngày.)

Đầu vào : một số thập phân có tối đa bốn chữ số biểu thị một năm trong Kỷ nguyên chung (CE). Ví dụ: 987, 1984, 2101

Đầu ra : ngày, bao gồm cả tháng và ngày, trong đó Lễ Tạ ơn rơi, hoặc sẽ rơi nếu nó tồn tại, trong năm đó. Điều này có thể ở bất kỳ định dạng hợp lý; sử dụng phán đoán tốt nhất của bạn. Sử dụng Lịch Gregorian trong mọi trường hợp, ngay cả khi nó không được sử dụng tại thời điểm đó.

(Lưu ý: Đảm bảo xử lý năm nhuận một cách chính xác!)

Các trường hợp kiểm tra Đầu vào 1:

2015

Đầu ra 1:

Nov 26

Đầu vào 2:

1917

Đầu ra 2:

Nov 22

Chấm điểm

Đệ trình sẽ được tính bằng byte . Tôi khuyên bạn nên trang web này để theo dõi số byte của bạn, mặc dù bạn có thể sử dụng bất kỳ bộ đếm nào bạn muốn.

Tiền thưởng

-25% số điểm của bạn nếu bạn xử lý ngày BCE dưới dạng số âm (ví dụ -480 sẽ là năm của trận chiến Thermopylae).

Đầu vào trường hợp thử nghiệm âm tính:

-480

Đầu ra tương ứng:

Nov 25

Đây là , vì vậy điểm thấp nhất sẽ thắng!

Chỉnh sửa: Tôi đánh dấu bài nộp TI-BASIC của Thomas Kwa là được chấp nhận. Đừng để điều này ngăn cản bạn gửi bài mới!

Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


25
Đối với bất cứ ai đang tự hỏi khi nào Lễ Tạ ơn sẽ đến trong năm nay: Lễ Tạ ơn sẽ là vào ngày mai.
TheNumberOne

6
Nhưng tôi đã tạ ơn vào ngày 10 tháng 10? Tôi rất tiếc phải nói câu hỏi của bạn là muộn.
JimmyJazzx

5
@Downgoat Sử dụng bất kỳ bộ đếm byte nào bạn muốn. Đó chỉ là thứ tôi sử dụng cá nhân và muốn giới thiệu.
bkul

22
"Một số ngày lễ có ngày cố định, dễ nhớ, như ngày 31 tháng 10, ngày 25 tháng 12" Những ví dụ đó rất dễ nhớ vì chúng thực sự là cùng một ngày: bát phân 31 == thập phân 25 .;-)
Adrian McCarthy

7
Đối với câu trả lời có thưởng không, có nên có một năm 0 giữa -1 và 1 hay không?
frageum

Câu trả lời:


40

TI-BASIC, 15 byte * 0,75 = 11,25

Đã thử nghiệm trên máy tính TI-84 + của tôi

1129-dayOfWk(Ans+ᴇ4,9,1

Lễ Tạ ơn là ngày 29 tháng 11, trừ ngày trong tuần của ngày 1 tháng 9, trong đó 1 là Chủ nhật và 7 là Thứ bảy. Điều này đầu ra ở định dạng MMDD.

Các trường hợp thử nghiệm: 2015-> 1126, 1917-> 1122, -480-> 1125đã được xác minh. TI-BASIC dường như sử dụng lịch Gregorian cho tất cả các ngày.

TI-BASIC không hỗ trợ năm âm, nhưng điều này nhận được tiền thưởng vì chúng tôi thêm 10000 vào đầu vào. Bởi vì lịch Gregorian có thời gian 400 năm, điều này không thay đổi ngày trong tuần.


5
Thánh lồn xD Tôi chưa bao giờ nghĩ rằng nó sẽ hoạt động như thế này, +1.
Addison Crump

Ý tưởng tốt để thêm 10000. Đẹp.
bất cứ lúc nào

Tôi đếm 23 chữ cái. Làm thế nào điều này có thể là 15 byte?
Stephan Schinkel

1
@StephanSchinkel TI-BASIC sử dụng các mã thông báo được lưu trữ trong bộ nhớ máy tính, tôi tin rằng tất cả các ký tự ở đây là 1 byte ngoại trừ các mã thông báo dayofWK(và mỗi mã Anscó 2 và 1 byte.
FryAmTheEggman

Bạn đã thử nó trên một máy tính? ồ

23

PHP, 65 48 42 41 36 (+2 cho -F) = 38 byte

<?date(Md,strtotime("4thuXI$argn"));

Lấy đầu vào làm đối số dòng lệnh đầu tiên. Chạy với cảnh báo, được chấp nhận bởi các quy tắc của chúng tôi. In NovDD, đâu DDlà ngày Lễ Tạ ơn.

Không có liên kết trực tuyến vì ideone không hỗ trợ dòng lệnh lập luận và tôi không biết về trình thông dịch trực tuyến.

Cảm ơn Alexander O'Mara đã dạy cho tôi một mẹo mới và nguyên thủy để giảm đáng kể


2
Điều này là buồn cười hơn Mathicala.
lirtosiast

2
@Tryth Thậm chí ngắn hơn : "4thuXI". Bạn thậm chí có thể thả không gian giữa năm "4thuXI2015".
Alexander O'Mara

1
Sử dụng tùy chọn dòng lệnh -F, đầu vào có thể được rút ngắn thành "4thuXI$argn".
primo

3
Đợi đã, điều này thực sự hoạt động? Đó là ... đó chỉ là ... tôi thậm chí không ...
Sản phẩm ETH

1
Làm việc cho tôi . Trong khi tôi đang ở đó, Mdkhông cần báo giá, với E_NOTICEngười khuyết tật.
primo

18

Toán học, 59 38 byte

DayRange[{#,11},{#,12},Thursday][[4]]&

+1 thông minh. Cũng có WolframAlpha["Thanksgiving " <> #] &nơi ngày được nhập dưới dạng chuỗi.
DavidC

WolframAlpha trả lại ngày Lễ Tạ ơn của Hoa Kỳ kể từ năm 1863 (khi Lincoln tuyên bố nó sẽ vào Thứ Năm cuối cùng của tháng 11) trở đi. Hoa Kỳ đã quan sát Lễ Tạ ơn từ năm 1789.
DavidC

@DavidCarraher Tuy nhiên, OP tuyên bố rằng chương trình phải hoạt động ít nhất 0 - 9999 CE
LegionMammal978

17

JavaScript (ES6), 42 40 31 byte - 25% = 23,25

a=>28.11-new Date(a,8).getDay()

Vì ngày "có thể ở bất kỳ định dạng hợp lý nào", nên hàm này sử dụng DD.MM. Tôi đã viết một câu trả lời TeaScript bằng một kỹ thuật khác, nhưng công thức này ngắn hơn.

Giải trình

Vì các tháng là không dựa trên, new Date(a,10)trả về một Dateđối tượng đại diện cho ngày 1 tháng 11 của năm được chỉ định.

getDay()trả về một số đại diện cho ngày trong tuần từ 0..6chúng tôi muốn lập bản đồ từ

Su Mo Tu We Th Fr Sa 
0  1  2  3  4  5  6  
to to to to to to to
4  3  2  1  0  6  5  

sau đó thêm 22. Hóa ra nó (11 - new Date(a,10).getDay()) % 7sẽ thực hiện thủ thuật. Như @Thomas Kwa đã chỉ ra, điều này giống như 28-new Date(a,8).getDay()là 28 trừ đi ngày trong tuần của ngày 1 tháng 9.


Giải pháp tuyệt vời, tôi thích nó ngắn như thế nào và nó vẫn dễ hiểu hơn hầu hết các mục.
Marko Grešak

16

Japt , 43 37 36 35 29 byte - 25% = 21,75

Japt là phiên bản rút gọn của Ja vaScri pt .

`{28.11-?w D?e(U,8).getDay()}

Hahaha, tôi đã tìm thấy một mẹo rất gian lận: trình thông dịch bỏ qua mọi dấu ngoặc trong chuỗi (được sử dụng để chèn mã) trong khi giải nén chúng, vì vậy chúng tôi có thể nén toàn bộ mã nguồn để lưu một byte>: D

Hai ?s phải là Unicode không thể in được lần lượt là U + 0098 và U + 0085. Hãy thử trực tuyến!

Sau khi giải nén, mã đánh giá điều này:

"{28.11-new Date(U,8).getDay()}"

Mà đánh giá:

""+(28.11-new Date(U,8).getDay())+""

Mà cho đầu ra thích hợp.

Sử dụng kỹ thuật của intrepidcoder , xuất ra ở định dạng dd.mm. Hỗ trợ đúng năm tiêu cực. Gợi ý chào mừng!

Chỉnh sửa: Kể từ ngày 2 tháng 12, bây giờ bạn có thể sử dụng mã 11 byte này (đạt 8,25 điểm ):

28.11-ÐU8 e

(Tôi rất mong tôi đã thực hiện điều này sớm hơn!)


Hoàn thành rất tốt.
bkul

Điều này bây giờ dài hơn JavaScript vanilla. Thomas Kwa có một công thức ngắn hơn nhiều .
intrepidcoder

@intrepidcoder Cảm ơn, đã sửa.
Sản xuất ETH

12

Vitsy , 44 byte

Tôi đang tính toán với toán học thuần túy !

Chơi gôn

Ve2 * V2-V41m + Vaa * DV1m-Vv4 * 1m + 7M-baa * / + N
/ D1M-

Ungolfed (đã chuyển cuộc gọi phương thức sang dòng đầu tiên để có thể đọc được):

Ve2 * V2-V4 / D1M- + Vaa * DV / D1M - Vv4 * / D1M- + 7M-baa * / + N

V Lưu đầu vào dưới dạng biến cuối cùng.
 e2 * Đẩy 28 vào ngăn xếp.
    V Đẩy đầu vào vào ngăn xếp.
     2- Trừ hai.
       V4 / D1M- Nhận sàn (đầu vào / 4).
              + Thêm nó vào tổng số.
               Vaa * DV / D1M- Nhận sàn (đầu vào / 100) và lưu 100 dưới dạng tạm thời
                                    biến trong quá trình.
                          - Trừ nó khỏi tổng số.
                           Vv4 * / D1M- Nhận sàn (đầu vào / 400).
                                    + Thêm nó vào tổng số.
                                     Modulo 7 giây.
                                       - Trừ kết quả từ 28.
                                        baa * / + Thêm .11
                                              N Đầu ra dưới dạng số.

Có lẽ có một thuật toán tốt hơn cho điều này (và điều này có thể rất đáng sợ), nhưng đối với những người thắc mắc, thuật toán của tôi đến từ đây .

Hãy thử trực tuyến!

Tôi có nhận được điểm thưởng khi tính toán và có chính xác 42 byte không? Giấc mơ tan nát.

Cảm ơn @ Hosch250 đã chỉ ra rằng tôi đã làm sai. : D Đã sửa.


2
Không, nhưng bạn nhận được +1 từ tôi;)
Conor O'Brien

Nó nói rằng Lễ Tạ ơn năm 2016 là ngày 28 tháng 11. Thực sự là ngày 24 tháng 11
Hosch250

@ Hosch250 Bạn đúng - đã sửa bây giờ.
Addison Crump

10

Python, 38 * 0,75 = 28,5 byte

lambda x:28.11-(x-2+x/4-x/100+x/400)%7

Điều này hoạt động với các năm tiêu cực theo cách được chỉ định trong câu hỏi, mặc dù tôi nhận thấy rằng không có năm 0 trong lịch Gregorian nên hành vi này là một chút nghi ngờ.


1
Bạn có thể thả f=.
frageum

1
Làm thế nào để làm việc này cho ngày tiêu cực? Modulo trong Python có áp dụng cho phủ định không? : O
Addison Crump

Nó nên ngắn hơn để sử dụng đại diện chuỗi,"Nov "+`...`
xnor

@VoteToC Đóng Python modulo đưa ra câu trả lời có cùng dấu với đối số thứ hai. Như vậy -40%7==2nhưng-40%-7==-5
quintopia

@quintopia Chờ đã, chờ đã, tôi là một thằng ngốc. Đuợc. Điều đó có ý nghĩa.
Addison Crump

10

JavaScript (ES6), 43,5

Số byte thực tế là 58. Phần thưởng áp dụng -25% => 58 * 0,75 = 43,5

s=>new Date(s,10,(a=new Date(s,10).getDay())<5?26-a:a+21)

Cách khá thẳng và ngớ ngẩn như nó có thể, mà không có bất kỳ cách giải quyết hay tính toán phức tạp nào.

De-golf (ES5) + bản demo:

function t(s) {
    a = new Date(s, 10).getDay();
    alert(new Date(s,10,a<=4?26-a:a+21))
}

t(prompt())

Lưu ý, việc nhập năm 0-100 tạo ra 1900-2000 năm. Mặc dù, có vẻ như 0-100 năm đưa ra cùng một ngày với 1900-2000, đánh giá từ các câu trả lời khác.


Thay thế a+18bằng 22, bởi vì nó chỉ được gọi trong "other" và "other" chỉ xảy ra nếu a không lớn hơn hoặc nhỏ hơn 4, tức là chính xác 4.


Thay thế a<4?26-a:a>4?a+21:22bằnga<=4?26-a:a+21


2
Xin lỗi nếu tôi sai, nhưng không a<4?x:a>4?y:a+18tương đương a<4?x:a>4?y:22?
Sản phẩm ETH

BTW, nó cho tôi biết năm sai cho bất kỳ đầu vào nào từ 0 đến 99. Tuy nhiên, không chắc chắn nếu điều này có vấn đề.
Sản xuất ETH

@Eth LOL tất nhiên là bạn đúng, không nghĩ rằng đó luôn là 4 + 18: D
nicael

@Eth hm, 0 đến 99 quả thực là sai, hãy để tôi thử sửa nó.
nicael

@Eth Có vẻ như 0-100 đưa ra cùng ngày 1900-2000, đánh giá từ các câu trả lời khác.
nicael

8

TeaScript, 35 33 24 byte - 25% = 18

28.11-new D(x,8).getDay¡

Đây là phương pháp tương tự như câu trả lời JavaScript của tôi , sử dụng công thức thông minh của Thomas Kwa .

Phiên bản thay thế với Giải thích

r(22,28)F(#/h/t(new D(x,10,l)))+'-11'

r(22,28)    // Range from 22 to 28
        F(    // filter, keeps elements for which the function returns true. 
          #    // Expands to function(l,i,a,b)
           /h/    // RegExp literal, Thursday is the only day with an 'h'.
              t(    // test, true if date string contains an 'h'.
                new D(x,10,l) // Create date object
                             ))+'-11' // Append '-11' for the month.

Đó là 35 ký tự, nhưng 36 byte do ¡:)
nicael

@nicael Không phải bởi trang web này , nó không phải;)
ETHproductions

Hừm, nhận 36 với mẹeff.in / .
nicael

@Downgoat thường sử dụng định dạng này , trong đó tất cả các ký tự lên đến U + 00FF là 1 byte.
Sản phẩm ETH

5

Jython, 141 155 byte

Sử dụng các lớp Lịch và Trình quét Java với cú pháp Python.

import java.util.Scanner as s;import java.util.Calendar as c
d=c.getInstance();k=s(System.in);d.set(c.YEAR,k.nextInt());d.set(c.DAY_OF_WEEK,c.THURSDAY)

Chỉnh sửa: Các vấn đề cú pháp nhỏ, thêm 14 byte.

Cũng xem phiên bản Brainfuck của tôi .


5

Python, 83 81 78 byte

from datetime import*
lambda a:'Nov '+`((10-datetime(a,11,1).weekday())%7)+22`
  • -2 byte: đã thêm tên để nhập (cảm ơn @ ΚρΚρτ Λίθ)
  • -1 byte: đã thay đổi thành * nhập ** (cảm ơn @FryAmTheEggman)
  • -2 byte: đã thay đổi thành repr để chuyển đổi ngày (cảm ơn @willem)

1
Chỉ cần một gợi ý để giảm số byte: sử dụng import datetime as dvà sau đó bạn có thể sử dụng dcho mỗi lần bạn sử dụng datetimetrong chương trình của mình.
Kritixi Lithos

2
Bạn cũng có thể thử gấu trúc. import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
Willem

@ Κρτκσ nhưng sau đó datetime.datetime sẽ chỉ là d.datetime, phải không?
TanMath

2
from datetime import*thậm chí còn ngắn hơn một chút, vì bạn sẽ không cần d.thêm nữa
FryAmTheEggman

5

Excel, 367 154 53 - 25% = 39,75 byte

Giả sử năm được tổ chức trong ô A1, ở định dạng Ngày. Trả về số nguyên của ngày trong tháng 11 mà Lễ Tạ ơn được tổ chức.

Điều này chỉ chiếm năm nhuận bình thường. Nó không tính đến thực tế là các năm, 2100, 2200, 2300 không phải là năm nhuận.

Điều này chỉ được thiết kế để hoạt động cho năm 1621 trở đi - tức là kể từ Lễ Tạ ơn bắt đầu được tổ chức. (Mặc dù nó chắc chắn sẽ hoạt động hoàn toàn trở về 0 AD).

=IF(MOD(YEAR(A1),4)=0,IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

In đẹp:

=IF(MOD(YEAR(A1),4)=0,
    IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),
    IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

Trời ạ! Thay vì tính toán dựa trên ngày 1 tháng 1, sau đó thực hiện nhiều phép tính năm nhuận để đối phó với ngày 29 tháng 2, tôi nên dựa trên các tính toán vào ngày 1 tháng 11. , nhưng làm cho việc triển khai phụ thuộc vào định dạng ngày mặc định của cài đặt Excel của bạn. Phiên bản này được thiết kế cho dd / mm / yyyy:

 =IF(WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy"))))<6,  
     1127-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))),
     1134-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))))

Và bây giờ tôi đã thực hiện việc sắp xếp để có được một phép tính ngắn gọn trong Smalltalk, đưa nó vào kết quả Excel trong:

=DATE(A1,11,MOD(12-WEEKDAY(DATE(9600+A1,11,1)),7)+22)

(với năm vẫn ở A1, nhưng là một số nguyên). Điều này hoạt động ngay cả trong các năm 2100, 2200 và 2300, cho tất cả các ngày từ 7700BC / E trở đi, sử dụng thủ thuật lặp lại ngày của Thomas Kwa.


1
Khi tôi thử điều này với các ngày trước năm 1900, nó không hoạt động trong bản sao excel của tôi.
Fuchs

Phiên bản dài không hoạt động tốt.
Fuchs

Đối với ngày cũ, hãy sử dụng sổ làm việc trước ngày 1900 của Người dùng Excel. < exceluser.com/doads/examples/post_900_123/index.html >
Euan M

Các câu hỏi về việc này có hoạt động sang một bên không, tôi không nghĩ rằng bạn được phép xuất ra chỉ vào ngày tháng 11; bạn cần một "tháng 11" hoặc "11" dưới một hình thức nào đó.
lirtosiast

@Thomas Kwa Đầu vào ngày là năm, ở định dạng ngày. Tính toán sau đó tính ra ngày trong tuần mà ngày 1 tháng 11 rơi vào, sau đó tính ngày thứ năm thứ tư trong tháng 11 là ngày nào.
Euan M

4

PowerShell, 67 64 84 72 58 45 byte

param($a)'Nov';28-(date "00$a/9/1").DayOfWeek

Chúng tôi lấy số nguyên đầu vào của chúng tôi $a, và ngay lập tức đầu ra Novvà một dòng mới. Sau đó, chúng tôi thực hiện $avà chuẩn bị nó với số không và ngày 1 tháng 9 00$a/9/1trước khi tạo mới datevà xác định DayOfWeekđó là gì . Nếu ngày 1 tháng 9 là vào Chủ nhật ( .DayOfWeekbằng 0), Lễ Tạ ơn là vào ngày 28. Nếu ngày 1 tháng 9 là vào thứ Hai ( .DayOfWeekbằng 1), Lễ Tạ ơn là vào ngày 27. Và như vậy. Vì vậy, chúng tôi trừ đi ngày đó trong tuần 28để đưa ra câu trả lời của chúng tôi.

Chuẩn bị với các số không hai số cho các năm một và hai chữ số mà không làm gián đoạn phân tích cú pháp trong ba hoặc bốn chữ số. Không hoạt động đối với các số âm, vì .NET datetimekhông hỗ trợ ít hơn nhiều năm 0.

Cảm ơn TessellatingHecklerToby Speight đã hỗ trợ về vấn đề này.


"{0:D3}/Nov/$_" -f $angắn hơn "$($a.ToString("000"))/Nov/$_"và tạo ra kết quả tương tự, và tôi nghĩ rằng bạn có thể sử dụng 11thay vìNov
n0rd

@ n0rd À, tuyệt vời! Vâng - đó Novlà tàn dư từ khi tôi đang cố gắng để nó nhận ra hai năm một cách chính xác, vì vậy tôi cũng sẽ trao đổi nó. Cảm ơn!
admBorkBork

@TessellatingHeckler Cách tiếp cận này hiệu quả, nhưng bạn cần phải trả trước hai số không để tính đến một năm, nếu không bạn sẽ quay lại 20XX mà tôi gặp phải. Cảm ơn sự giúp đỡ - Tôi đã cập nhật câu trả lời.
AdmBorkBork

1
@TessellatingHeckler Trên hệ thống của tôi, ít nhất, đưa các năm có một chữ số vào date "11/1/$a"kết quả Thursday, November 1, 2007 12:00:00 AM. Điều này là do chúng tôi không chỉnh sửa thuộc tính Calendar.TwoDigitYearMax , vì vậy khi phân tích cú pháp , chúng tôi bị mắc kẹt với bộ đệm đôi không để khắc phục điều đó.
admBorkBork

Đúng đúng. Đôi đệm nó là.
TessellatingHeckler

3

Golf, 25 * 0,75 = 18,75 byte

~.4/.25/.4/2---+7%28\--11

Điều này sử dụng công thức của Sakamoto cho ngày trong tuần. Vì có những người làm điều này, đầu ra ở dạng dd-mm. Trình trước đây của tôi có thể được tìm thấy dưới đây:

~.4/.25/.4/2---+7%"Nov "28@-

3

TSQL, 478 296 byte

Chỉ để cho vui Thông thường, bạn có một bảng thứ nguyên ngày để đơn giản hóa select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'nhưng không có ...

create function a(@y varchar(4))returns date as begin declare @d date,@i int=0 set @d=convert(date,@y+'-11-01')declare @t table(d date,c int identity)while @i<28 begin if datepart(weekday,@d)=5 insert @t(d) select @d select @d=dateadd(d,1,@d),@i+=1 end select @d=d from @t where c=4 return @d end

Ung dung:

if exists(select * from sys.objects where name='a' and [type]='FN') drop function a
go

create function a(@y varchar(4))returns date
-- select dbo.a('2015')
as
begin
    declare @d date,@i int=0;

    set @d=convert(date,@y+'-11-01'); -- cannot golf out dashes for dates <year 1000

    declare @t table(d date,c int identity)

    while @i<28 
    begin -- populate "November" array
        if datepart(weekday,@d)=5 insert @t(d) select @d -- assumes @@datefirst = 7
        select @d=dateadd(d,1,@d),@i+=1
    end;

    select @d=d from @t where c=4 

    return @d

end

Đây thực sự là con đường ngắn nhất?
lirtosiast

Tôi cho rằng tôi có thể không quen thuộc với các quy tắc của mã golf, nhưng câu trả lời tạo ra một đối tượng DB chấp nhận đầu vào và trả về đầu ra để khớp với OP. Có một số rút ngắn rõ ràng có thể xảy ra nếu đầu vào có thể được chấp nhận thành mã nội tuyến nhưng đây là suy nghĩ của tôi đối với loại đối tượng hàm. Tôi chắc chắn rằng nó có thể được chơi gôn trong cả hai trường hợp. @ThomasKwa, bạn có gợi ý nào không?
Peter Vandivier

Vâng, dường như với tôi bạn có thể sử dụng công thức toán học thuần túy mà câu trả lời này đề cập và không bận tâm với tất cả các công cụ đối tượng ngày đó.
lirtosiast

không hoàn toàn là một giải pháp toán học thuần túy, nhưng đọc câu trả lời đó chắc chắn đã cho tôi một số ý tưởng để chơi golf 200 ký tự. Cảm ơn!!
Peter Vandivier

(Ý tôi là (28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7) Vâng, đọc các câu trả lời khác có xu hướng giúp ích rất nhiều.
lirtosiast

3

Pyth, 30 28 * 75% = 21 byte

Tôi khẳng định 100% rằng việc này có thể được thực hiện ngắn hơn, nhưng này, đây là chương trình Pyth đầu tiên của tôi! \ o /

-28.11%+-+-Q2/Q4/Q100/Q400 7

Bộ kiểm tra

Xuất ra ngày ở dd.mmđịnh dạng.

Xin đề nghị cách để chơi golf này nếu bạn có thể! Tôi muốn tìm hiểu thêm về Pyth.


2

Excel, 64 48

Năm ở A1

= NGÀY (A1,11, CHỌN (TUẦN (NGÀY (A1,11,1)), 26,25,24,23,22,28,27))

=DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22)

Vì Excel dựa trên nội địa hóa và tôi muốn kiểm tra điều này. Vui lòng giải thích những gì các chức năng làm, vì vậy tôi có thể chọn một chức năng phù hợp trong ngôn ngữ của tôi.
Fuchs

1
Ngoài ra, điều này không hoạt động cho những ngày trước năm 1900 (ít nhất là trong bản sao Excel của tôi)
Angelo Fuchs

Ngoài ra, bạn lưu 13byte trên TEXTtừ =TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")- đầu ra là một số nguyên không có định dạng.
dùng3819867

@ user3819867, đó là cách excel lưu trữ ngày của nó. định dạng được để lại cho người dùng
SeanC

@AngeloFuchs, DATE trả về giá trị ngày, sử dụng năm, tháng, ngày làm tham số. MOD trả về phần còn lại của một bộ phận (mô đun). TUẦN trả về ngày trong tuần của một ngày (1 = Chủ nhật, 2 = Thứ Hai, v.v.).
SeanC

2

Befunge, 41 byte

47*&:::4"d"*/\"d"/-\4/++5+7%-" voN",,,,.@

Chạy trên trình thông dịch này .

Giải thích: Một năm thông thường là 365 = 1 mod 7 ngày, do đó năm cộng với mỗi 4 thứ năm, trừ mỗi 100 ngày ( dtrong ascii) năm, cộng với mỗi 400 ngày chiếm năm đối với bất kỳ ngày bước nhảy vọt (bao gồm cả năm nay). Kết quả :::4"d"*/\"d"/-\4/++sau đó có thể được coi là ngày 05 tháng 3 ngày , ngày đầu tiên sau khi tháng hai để rơi vào cùng một ngày như ngày đầu tiên của năm trong những năm chung. Sau đó chúng tôi hiệu chỉnh để mô hình với 5+7%-trừ một số ngày trong tuần từ 28 ngày (các 47*lưu trữ trước đó) của tháng mười một. Sau đó in.

Phiên bản sửa lỗi cho các năm BC hiện dài hơn phần thưởng cung cấp, ở mức 59 -25% = 44,25 byte:

47*&v
!`0:<+*"(F"_v#
" voN",,,,.@>:::4"d"*/\"d"/-\4/++5+7%-

2

Matlab, 78 byte

x=find(all(bsxfun(@eq,datestr(datenum(input(''),11,1:30),'ddd'),'Thu')'));x(4)

2

Ruby, 60 58 57 * 0,75 = 42,75 byte

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

58 byte

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

60 byte

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11,1).wday]+21}"}

Ung dung:

-> y {
  puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"
}

Sử dụng:

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

=> Nov 26

0

VBA, 124 byte * 75% = 93 byte

Function e(y)
For i = 1 To 7
x = DateSerial(y, 11, 21) + i
If Weekday(x) = 5 Then e = Format(x, "mmm dd")
Next
End Function

Tôi không chắc chắn nếu không gian được tính, nó nằm ở đâu đó giữa 102 và 124, vui lòng chỉnh sửa.
Nếu số nguyên là một đầu ra hợp lệ, tôi rất vui khi loại bỏ Formatphần đó.


Số lượng không gian; nếu chúng không cần thiết cho chương trình, bạn có thể loại bỏ chúng.
lirtosiast

0

PHP 5.3+, 59 byte

Điều này sử dụng hàm dựng sẵn PHP strtotimeđể phân tích ngày.

<?=gmdate('M d',strtotime("Next Thursday $_GET[Y]-11-19"));

Điều này hy vọng giá trị sẽ được chuyển qua tham số GET Y HOẶC hơn php-cli Y=<year>.

Nó cố gắng tìm thứ năm tiếp theo sau ngày 19 tháng 11.
Cho đến nay, với các thử nghiệm tôi đã thực hiện, nó hoạt động tốt.

Xin lưu ý rằng năm có 2 chữ số có thể được diễn giải khác nhau.

Tôi sử dụng gmdateđể tránh các vấn đề múi giờ, nhưng nó hoạt động tốt như nhau bằng cách sử dụng date(ít nhất là, nơi tôi sống).


1
Một câu trả lời không phải là nơi thích hợp để thảo luận về tính hợp lệ của phương thức nhập liệu. Tôi đã tạo tùy chọn này trong bài đăng meta I / O mặc định (để cộng đồng có thể bỏ phiếu cho nó) và chuyển cuộc trò chuyện của bạn sang trò chuyện . (CC @Mego)
Dennis

0

T-SQL 215 byte 248 * 0,75 = 186 byte

create function t(@y int)returns table return select x=convert(char(6),x,107)from(select x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)from(select d=21+n from(values(0),(1),(2),(3),(4),(5),(6))b(n))c)t where datepart(weekday,x)=5

Bị đánh cắp

set nocount on;
if object_id('dbo.t') is not null drop function dbo.t
go

create function t(@y int)returns table return
    select x=convert(char(6),x,107)
    from (
        select
        x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)
        from (
            select d=21+n 
            from (values (0),(1),(2),(3),(4),(5),(6))b(n)
        )c
    )t
    where datepart(weekday,x)=5
go

mà với bài kiểm tra này

select 
  [ 2015 = Nov. 26]=(select x from dbo.t( 2015))
 ,[ 1917 = Nov. 22]=(select x from dbo.t( 1917))
 ,[ 1752 = Nov. 23]=(select x from dbo.t( 1752))
 ,[ 1582 = Nov. 25]=(select x from dbo.t( 1582))
 ,[ 1400 = Nov. 27]=(select x from dbo.t( 1400))
 ,[ -480 = Nov. 25]=(select x from dbo.t( -480))
 ,[-5480 = Nov. 28]=(select x from dbo.t(-5480))
;
go

năng suất như mong muốn

2015 = Nov. 26  1917 = Nov. 22  1752 = Nov. 23  1582 = Nov. 25  1400 = Nov. 27  -480 = Nov. 25 -5480 = Nov. 28
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
Nov 26          Nov 22          Nov 23          Nov 25          Nov 27          Nov 25          Nov 28

0

Pike , 87 91 107 77 76 byte - 25% = 57

string t(int y){return"Nov "+((11-Calendar.Day(y,11,1)->week_day())%7+22);}

để lại cái cũ để so sánh vì tôi thấy nó thông minh hơn về việc tận dụng mô-đun Lịch, nhưng cách trên là ngắn hơn.

string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}

Điều này dường như không có đầu vào.
Peter Taylor

vâng, tôi đã nhầm lẫn bởi điều đó, một số giải pháp có định nghĩa hàm và một số chỉ sử dụng một biến không được xác định ở bất cứ đâu, vì vậy tôi không chắc chắn những gì tôi phải sử dụng cho bytecount.
eMBee

Tôi nghĩ rằng các câu trả lời mà bạn thấy là sử dụng " một biến không được xác định ở bất cứ đâu " thực sự đang sử dụng cú pháp khai báo hàm rất ngắn. Có một hoặc hai câu trả lời sử dụng esolang có cách đối xử đặc biệt với stdin và vì vậy hãy ưu tiên viết các chương trình đầy đủ. Tôi không biết Pike, nhưng nếu bạn có thể xóa khoảng trắng và viết tắt tên hàm để lấy string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}thì tôi tính đó là 107 byte.
Peter Taylor

Tôi nghĩ rằng tôi đã thấy một vài khai báo không có chức năng, nhưng chúng dường như đã được sửa, chỉ có ví dụ smalltalk không phù hợp. nếu đó là hợp lệ tôi có thể cạo thêm 17 byte của cái này ...
eMBee

Phiên bản Smalltalk được viết dưới dạng chương trình - cụ thể là biểu thức Workspace. Chúng tôi đã nói rằng chúng tôi được cung cấp một đầu vào, thay vì chào mời đầu vào.
Euan M

0

Smalltalk - Squeak và Pharo , 69 57 54 49 35 34 33 32 - 25% = 24 byte

"Tháng 11": 69B 49B (-25% = 36,75B)
11nn (anInt): 57 54 32B (-25% = 24B)

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn
 Methods Date>>y:m:d: and >>w created as duplicates 
 of year:month:day and weekdayIndex"
(12-(Date y:y m:11d:1)w)\\7+1122

Những phiên bản trước

Đầu ra 11nn

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn"
(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

"Year supplied as an integer value, y  
 Result provided as an integer value, d, prefixed by 11"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

Sản lượng nn tháng 11

"Year supplied as an integer value, y  Result provided as a string, 'Nov nn'"
'Nov ', (12-(Date year:y month:11 day:1) weekdayIndex\\7+22) asString

đầu ra nn

"Year supplied as an integer value, y  Result provided as an integer value, d"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+22

nb Điều này được cung cấp dưới dạng một chương trình - cụ thể là biểu thức Workspace - chứ không phải là một phương thức.

Nó giả sử đầu vào là một số đã cho (theo cụm từ "cho một năm có tới bốn chữ số".
Bao gồm cả việc khai báo và đưa ra đầu vào sẽ thêm 11 ký tự khác:

|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122

Cảm ơn eMBee, vì đã chỉ ra cách xóa thêm một char - khoảng trắng ngay trước 'w'.

Trên thực tế, điều đó đã truyền cảm hứng cho tôi để thử xóa khoảng trắng trước 'd:':
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
Cái nào hiệu quả!


Theo sự làm rõ của OP , phiên bản số ngày không hợp lệ.
Mego

Tôi đồng ý - nhưng được đưa ra có khá nhiều phiên bản chỉ có số ngày trong danh sách, tôi đặt nó ở đó để so sánh táo với táo
Euan M

0

GNU coreutils, 35 byte

seq -f$1-11-2%g 2 8|date -f-|grep h

Đơn giản chỉ cần tìm kiếm trong tuần 22-28 tháng 11 cho thứ Năm. Chạy nó trong ngôn ngữ C hoặc POSIX, vì tôi phụ thuộc vào thứ Năm là ngày viết tắt duy nhất có chứa 'h'.


Đây là một câu trả lời thông minh hơn, mặc dù một byte dài hơn:

echo Nov $((28-`date -d$1-5-5 +%w`))

Chúng tôi lấy số ngày trong tuần của một ngày trong một tuần khá độc đoán giữa tháng 3 và tháng 9 (vì vậy ngày và tháng là một chữ số và chúng tôi không bị ảnh hưởng bởi một ngày nhuận có thể). Chúng tôi chọn ngày để đó là Chủ nhật ( %w==0) khi Lễ Tạ ơn vào ngày 28. Sau đó chúng ta có thể trừ giá trị đó từ 28 để có được thứ Năm thích hợp.


2
Điều này hoạt động trừ khi Sean Connery chạy nó.
bkul

0

TSQL, 53 52 byte

DECLARE @ CHAR(4)=2000

PRINT DATEADD(d,59,DATEDIFF(d,1,DATEADD(m,9,@))/7*7)

Vĩ cầm

Tính thứ hai trước hoặc vào ngày 2 tháng 9 và thêm 59 ngày

(tốt hơn so với tính toán vào thứ hai trước hoặc vào ngày 4 tháng 10 và thêm 31 ngày vì tháng mười là tháng thứ 10 do đó tiết kiệm 1 byte)


-1

Perl, 92 byte

use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print "Nov $_":0for 22..28

EDIT: Đã sửa lỗi định dạng đầu ra, lỗi cố định, ví dụ kết quả năm 2012, được sử dụng định dạng "for" ngắn hơn. Cảm ơn msh210.


Điều này là ngắn hơn và làm điều tương tự : use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29. Nhưng cả hai tập lệnh đều có cùng một sai sót: (1) chúng không in đại diện của tháng theo yêu cầu; (2) họ có đầu ra sai trong ví dụ 2012.
msh210
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.