Hôm nay là ngày gì (hoặc những ngày khác)?


12

Bài tập

Viết chương trình hoặc hàm tính toán tên ngày trong tuần của ngày mà người dùng nhập vào.

Đầu ra đầu vào

Đầu vào là một chuỗi , YYYYMMDD.

Ví dụ về các giá trị đầu vào:

20110617: ngày 17 tháng 6 năm 2011
19040229: ngày 29 tháng 2 năm 1904
06661225: ngày 25 tháng 12 năm 666
00000101: ngày 1 tháng 1, 0
99991231: ngày 31 tháng 12 năm 9999

Bạn có thể cho rằng tất cả các đầu vào là hợp lệ. Lưu ý rằng năm 0 là hợp lệ.

Đầu ra là một số nguyên giữa 06. Mỗi số nguyên đại diện cho một tên ngày trong tuần. Bạn có thể tự do quyết định số nguyên nào đại diện cho tên ngày trong tuần, như số nguyên này

0: Thứ Hai
1: Thứ ba
2: thứ tư
...
6: Chủ nhật

(theo thứ tự) hoặc cái này

0: Thứ Hai
1: Thứ Tư
2: Chủ nhật
...
6: thứ bảy

(không theo thứ tự).

Các trường hợp thử nghiệm

Đầu vào Đầu ra trong tuần ([0..6 -> Thứ hai..Sayay] được sử dụng trong ví dụ này.)

20110617 Thứ Sáu 4
19500101 Chủ nhật 6
22220202 Thứ Bảy 5
19000228 Thứ Tư 2
19000602 Thứ năm 3
19450815 Thứ tư 2
19040229 Thứ Hai 0
19040301 Thứ ba 1
17760704 Thứ năm 3
20000228 Thứ Hai 0
20000229 Thứ ba 1
20000301 Thứ Tư 2
20121223 Chủ nhật 6
00000401 thứ bảy
66660606 Thứ tư 2
59161021 thứ bảy ngày 5

Sự hạn chế

Bạn không được sử dụng bất kỳ loại hàm / lớp / ... nào liên quan đến dấu thời gian hoặc ngày tháng, như Datelớp trong Java/ JavaScript/ ActionScripthoặc getdatehàm trong PHP.

Bạn nên sử dụng lịch Gregorian , được sử dụng bởi nhiều người bây giờ.

Tất nhiên, mã ngắn nhất sẽ thắng. Nếu hai mã có cùng độ dài, thì mã có số phiếu cao nhất sẽ thắng.

(Đến hạn: Khi có nhiều hơn 5 mã có nhiều hơn (hoặc bằng) +1phiếu bầu.)


Hôm nay? Tại sao, ngày Giáng sinh!
Joey Adams

3
Giải pháp lạc quan được viết bằng Bash (6 ký tự) : echo 4.
thật

1
@trutheality Không, tôi không có ý đó .. Điều tôi muốn là một mã in / trả về ngày trong tuần của một ngày mà ai đó đã nhập, không chỉ in vào ngày trong tuần hôm nay.
JiminP

Ồ, tôi biết. Đó là những gì người này làm.
thật

Đúng ít nhất 14% thời gian!
Draco18 không còn tin tưởng SE

Câu trả lời:


2

Ruby, 95 92 ký tự

Thực hiện ruby ​​đơn giản với 0: Thứ hai, ...

p ((y=(d=gets.to_i)/(k=100)/k-((m=d/k%k)<3?1:0))+y/4-y/k+y/400+"squsptrotqro"[-m].ord+d%k)%7

4

PHP - 101 97 103 125 ký tự

  • Thuật toán Sakamoto
  • 0 = Chủ nhật

<?php fscanf(STDIN,"%4d%2d%2d",$y,$m,$d);@$a=a032503514624;$y-=$m<3;$z=$y+1;echo($y+$y/4%$z-$y/100%$z+$y/400%$z+$a[$m]+$d)%7;

Ghi chú

Thật không may, do cách gõ yếu, năng động của PHP, thuật toán Sakamoto không hoạt động đúng mà không làm rõ ràng từng thao tác phân chia.


Bạn có thể vui lòng kiểm tra lại không? Trong một số năm, nó mang lại cho tôi các kết quả khác nhau (ví dụ: testcase 17760704 mang lại thứ ba thay vì thứ tư).
Howard

@Howard đó là rất kỳ lạ; cho 17760704, tôi nhận được thứ tư. Tuy nhiên, tôi nhận được những mâu thuẫn khác mà tôi không thể giải thích được, ví dụ 19040229 trả lại vào thứ ba. Không chắc chắn những gì có thể gây ra điều này. Tôi nhận được kết quả tương tự khi tôi mở rộng thuật toán trở lại y+y/4-y/100+y/400.
rintaun

Tôi có thể thấy điều đó xảy ra với 497 * y / 400: y=4trong trường hợp đó trả về 4, thay vì 5 đúng từ y+y/4+y/100+y/400(trong đó chỉ có hai thuật ngữ đầu tiên phát huy tác dụng). Đó là những gì làm hỏng câu trả lời JavaScript của tôi. Có thể là đôi đang được tạo ra thay vì ints? (PHP của tôi quá yếu để biết.)
DocMax

@DocMax: Rời khỏi biểu thức được mở rộng có cùng kết quả (497y / 400 nên tương đương: y / 100 bị trừ và y / 400 được thêm lại bất kể). Tôi đoán rằng PHP chỉ đang cắt bỏ mọi thứ sau số thập phân thay vì làm tròn nó. Tôi đã kiểm tra điều này bằng cách làm tròn trước modulo. Điều này sửa hai trong số các dị thường, nhưng 19040229 vẫn trả về kết quả tương tự. Còn ý tưởng nào khác không?
rintaun

@rintaun tôi không nghĩ đó là làm tròn số. Chúng khác nhau về cơ bản. Lấy ví dụ từ phía trên (y = 4): 497 * 4/400 = 1988/400 = 4 nhưng mặt khác 4 + 4 / 4-4 / 100 + 4/400 = 4 + 1-0 + 0 = 5 . Các điều khoản / 100 và / 400 có trọng số quá lớn trong tính toán của bạn sao cho không thể đạt được 2000.
Howard

2

C - 129

main(y,m,d,s)
{
    scanf("%04d%02d%02d",&y,&m,&d);
    y-=s=86400;
    d+=y+"-addgbegcfadf"[m];
    m>2?y++:0;
    putchar(48+(d+y/4-y/100+y/400+s+s)%7);
}

Điều này lạm dụng cách phân chia làm tròn về 0, ít nhất là trên hệ thống của tôi (Linux x86).

Hằng số ma thuật 86400, phục vụ hai mục đích:

  • Trừ đi trong năm để làm cho nó tiêu cực, mà không ảnh hưởng đến ngày trong tuần. Điều này làm cho nó để các bộ phận sẽ làm tròn thay vì xuống.
  • Thay đổi số ngày để thứ Hai sẽ là 0.

Nó cũng xảy ra là số giây trong một ngày.


Sử dụng y+=m>2;thay vì m>2?y++:0;và cạo một vài byte.
Rõ ràng hơn

2

Javascript, 126 123 ký tự

Sử dụng thuật toán của Sakamoto với 0 = Chủ nhật:

prompt().replace(/(....)(..)(..)/,function(_,y,m,d){y-=m<3;alert((+d+y-~(y/4)+~(y/100)-~(y/400)+ +".621462403513"[+m])%7)})

Tôi nghi ngờ sự chia rẽ có thể bị sụp đổ, nhưng hiện tại tôi không thấy nó.

Chỉnh sửa: Cải thiện các bộ phận (không cần ~~khi bạn có thể chỉ ~).


2

Python 2 , 83 116 113 109 byte

Thực hiện thuật toán của Sakamoto . Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

Chỉnh sửa: Tôi nên đã sửa lỗi này từ lâu. -6 byte từ đề xuất của Jonathan Allan +2 byte để thực sự sửa mã.

def w(s):m=int(s[4:6]);y,d=int(s[:4])-(m<3),int(s[6:]);return(y+y/4-y/100+y/400+int('032503514624'[m-1])+d)%7

Đầu vào phải là một chuỗi đơn.
msh210

int('032503514624'[m-1])tiết kiệm 6
Jonathan Allan

0

Perl - 110 byte

Đây là một giải pháp được chạy với perl -p source.pl HOẶC perl -pe 'here-is-code'.

s/((..)(..))(..)(..)/(1+3*$1+$2-2*($1%4+$2%4)-(2<$4?$4+(1&$4&&4-(8&$4)):(2^$4)+(!($3%4)-!-$3+!($2%4)))+$5)%7/e

Đơn giản chỉ cần sao chép-dán các trường hợp thử nghiệm vào stdin.

Đây dường như là mã duy nhất không có biến, hằng chuỗi và phân chia.


0

JavaScript (ES6), 73 byte (Không cạnh tranh)

d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)

Thử nó

f=
d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)
o.innerText=f(i.value="59161021")
oninput=_=>i.value.length==8&&(o.innerText=f(i.value))
<input id=i type=number><pre id=o>


Tại sao không cạnh tranh?
lập trình

@ lập trình5000, kiểm tra ngày thử thách được đăng;)
Shaggy
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.