Tuần này là ngày gì


8

Ngày trong tuần và tháng trong năm dường như được chú ý rất nhiều nhưng dường như không ai quan tâm đến tuần trong năm. Tôi tin rằng đã đến lúc thay đổi điều đó, vì vậy công việc của bạn là viết một chương trình hoặc chức năng mà khi được đưa ra một ngày sẽ xuất ra một số nguyên từ 1 đến 53 tương ứng với tuần hiện tại của năm.

Đối với mục đích của thử thách này, chúng tôi sẽ nói rằng Chủ nhật đầu tiên của năm đánh dấu sự khởi đầu của năm, vì vậy trường hợp duy nhất khi ngày 1 tháng 1 được coi là tuần 1 là khi rơi vào Chủ nhật.

  • Đầu vào có thể là bất kỳ định dạng ngày nào không bao gồm rõ ràng số tuần (chỉ xác định định dạng trong câu trả lời của bạn) cho các ngày giữa 1JAN190031DEC2100.
  • Đầu ra là một số nguyên từ 1 đến 53
  • Bạn có thể sử dụng bất kỳ phương pháp tiêu chuẩn nào để cung cấp đầu vào / đầu ra.

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

17MAY2017 -> 20

3JAN2013 -> 53

1JAN2017 -> 1

17MAY1901 -> 19

31DEC2100 -> 52

7JUL2015 -> 27
  • Đây là để áp dụng tất cả các quy tắc chơi gôn tiêu chuẩn và mã ngắn nhất (tính bằng byte) sẽ thắng.

5
Tuần ISO sẽ chuẩn hơn; IIRC họ dựa trên ngày thứ Năm đầu tiên trong một năm.
Neil

Chúng tôi có thể sử dụng các định dạng đầu vào ngày khác (tức là 07/07/2015) không? Có thể 7JUL2015được 07JUL2015không?
Stephen

@StephenS Vâng, điều đó tốt. 7/7/2015, 2015-07-07cũng có giá trị.
J_Lard

2
@Neil: Không khớp chính xác với định nghĩa tiêu chuẩn là một điều tốt ở đây, nó làm cho ít có khả năng vấn đề chỉ có thể được giải quyết thông qua một nội trang, trong khi làm cho nó không khó giải quyết hơn nếu không có.

4
Lưu ý cho những người sử dụng %U: Như @J_Lard chỉ ra, bạn cần quan tâm xem liệu tuần 0 là tuần 52 hay 53 của năm trước. Đó là tuần 53 năm 2001, 2007, 2013, 2018, 2024, 2029 và lặp lại theo chu kỳ 28 năm. Những năm khác là tuần 52.
Neil

Câu trả lời:


2

, 12 33 byte

BIÊN TẬP : Đã các trường hợp cạnh cho "% U".

IΩDÖ?┼╓y≤s"-12-31"C"%F"╓₧Ω
"%U"╓&

Giả sử đầu vào có thể là dấu thời gian. Giải thích sắp tới.

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


1
Tuần 0 khác nhau trong các năm như 1995 và 2023.
Neil

@Neil Điều đó đúng, nhưng thử thách cho biết câu trả lời phải nằm trong khoảng từ 1 đến 53 và về cơ bản tôi đang làm điều tương tự như tất cả các câu trả lời khác.
Nick Clifford

Xin lỗi, tôi đã có nhiều năm của tôi trộn lẫn. Dù sao, nó là 52 trong một số năm và 53 trong những người khác.
Neil

@Neil Có chúng tôi đi.
Nick Clifford

1
Thật vậy, điều này đưa ra câu trả lời chính xác cho ví dụ: ngày 1 tháng 1 năm 2018 và năm 2019.
Neil

6

TOÁN , 50 byte

Cảm ơn @Neil và @NickClifford đã chỉ ra một lỗi, hiện đã được sửa

ZO1)TThXJYOXIGYO&:8XO!s310=sJ4B-YOIq&:8XO!s310=sX\

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Điều này sử dụng ba hàm chuyển đổi ngày / giờ có trong MATL:

  • XO: chuyển đổi ngày và giờ sang định dạng chuỗi;
  • YO: chuyển đổi ngày và giờ thành số ngày nối tiếp;
  • ZO: chuyển đổi ngày và giờ thành vector của các thành phần.

Việc xác định xem tuần "0" sẽ trở thành 52 hay 53 là tốn kém, vì MATL không thể xác định các hàm có thể gọi để sử dụng lại 8XO!s310=sphần đó. Sử dụng lại bằng phương thức vòng lặp với một nhánh chỉ tiết kiệm một byte và làm phức tạp lời giải thích, vì vậy có lẽ không đáng.

Ngoài ra, một cái gì đó có thể đạt được khi nhập ngày dưới dạng một mảng [năm, tháng, ngày]; nhưng tôi sẽ không sử dụng cả ba chức năng ngày :-)

Hãy xem xét đầu vào '17MAY2017'là một ví dụ.

       % Implicit input
       % STACK: '17MAY2017'
ZO     % Convert to date vector
       % STACK: [2017 5 17]
1)     % Get first entry: year
       % STACK: 2017
TTh    % Append [1 1]
       % STACK: [2017 1 1]
XJ     % Copy to clipboard J
YO     % Convert to date number
       % STACK: 736696
XI     % Copy to clipboard I
GYO    % Push input again. Convert to date number
       % STACK: [736696 736832]
&:     % Binary range
       % STACK: [736696 736697 736698 ... 736832]
8XO    % Convert to date string with format 'ddd': day of week
       % STACK: ['Sun'; 'Mon'; 'Tue'; ... ; 'Wed']
!s     % Sum of each row (chars are interpreted as code points)
       % STACK: [310 298 302 ...  288]
310=   % Compare with 310 (sum of 'Sun')
       % STACK: [1 0 0 ... 0]
s      % Sum of array. If is 0, it needs to be transformed into 52 or 53,
       % depending on the number of Sundays the previous year contains.
       % STACK: 20
J      % Paste from clipboard J
       % STACK: 20, [2017 1 1]
4B-    % Push [1 0 0] and subtract element-wise
       % STACK: 20, [2016 1 1]
YO     % COnvert to date number
       % STACK: 20, 736330
I      % Paste from clipboard I
       % STACK: 20, 736330, 736696
q      % Subtract 1
       % STACK: 20, 736330, 736695
&:     % Binary range
       % STACK: 20, [736330 736331 736332 ... 736695]
8XO    % Convert to date string with format 'ddd': day of week
       % STACK: 20, ['Fri'; 'Sat'; 'Sun'; ... ; 'Sat']
!s     % Sum of each row (chars are interpreted as code points)
       % STACK: 20, [289 296 310 ... 296]
310=   % Compare with 310 (sum of 'Sun')
       % STACK: 20, [0 0 1 ... 0]
s      % Sum of array
       % STACK: 20, 52
X\     % 1-based modulo
       % STACK: 20
       % Implicit display

2
Chúc mừng 50k! Tôi ở ngay sau bạn :)
Chấn thương kỹ thuật số

1
2 điểm để đi ... và bùng nổ! Chúc mừng!
Jonathan Allan

Điều này có hoạt động với các trường hợp cạnh được chỉ ra bởi Neil? Tôi biết nó không sử dụng %U, nhưng tôi chỉ muốn chắc chắn.
Nick Clifford

Điều này dường như nghĩ ngày 1 tháng 1 năm 2019 là vào Tuần 53, nhưng chỉ trong Tuần 52.
Neil

@Neil Vâng, bạn đã đúng. Điều thú vị là các trường hợp thử nghiệm khác là chính xác.
J_Lard

4

JavaScript (ES6), 82 80 byte

Đưa đầu vào là (year,month,day).

let f =

(y,m,d)=>-~((((x=new Date(y,m-1,d))-new Date(y,0,1))/864e5+372-x.getDay())/7%53)

console.log(f(2017, 5,17)) // 20
console.log(f(2013, 1, 3)) // 53
console.log(f(2017, 1, 1)) // 1
console.log(f(1901, 5,17)) // 19
console.log(f(2100,12,31)) // 52
console.log(f(2015, 7, 7)) // 27


4

JavaScript (Firefox 34+), 70 byte

with(new Date())y.value=getFullYear(),m.value=getMonth()+1,d.value=getDate()+1
f=
(y,m,d)=>new Date(y,--m,d-new Date(y,m,d).getDay()).toLocaleFormat`%U`
<div oninput=w.value=f(y.value,m.value,d.value)><input id=y type=number><input id=m type=number min=1 max=12><input id=d type=number min=1 max=31><input id=w readonly placeholder=Output>

Hoạt động bằng cách tìm ngày đầu tiên trong tuần có chứa ngày đã cho, sau đó tìm số tuần của ngày đó (không bao giờ bằng 0).


+1 cho with. Luôn +1 cho with!
Xù xì

2

Python 2, 70 64 byte

Đầu vào => (year,month,day)

from datetime import*;lambda*v:int(date(*v).strftime('%U'))or 53

print(f(2017, 5,17)) #20
print(f(2013, 1, 3)) #53
print(f(2017, 1, 1)) #1
print(f(1901, 5,17)) #19
print(f(2100,12,31)) #52
print(f(2015, 7, 7)) #27

-6 byte, nhờ @ovs


2

JavaScript (Chỉ dành cho Firefox), 77 byte

Lấy ngày dưới dạng chuỗi: tức là Jan 1, 2017

s=>+new Date(s)[k='toLocaleFormat']`%U`||new Date(s.slice(-4)-1,11,31)[k]`%U`

Cố gắng tốt nhưng "tuần 0" không phải lúc nào cũng giống nhau (năm 1995 và 2023 thì khác).
Neil

Xin lỗi, trường hợp kiểm tra sai. Tôi nên đăng một bình luận thích hợp cho câu hỏi.
Neil

@Neil Nó nên được sửa.
powelles


2

C #, 138 123 121 byte

namespace System.Globalization{d=>CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d,(CalendarWeekRule)1,(DayOfWeek)0);}

Hóa ra có một tích hợp cho điều đó, mặc dù nó khá lớn ...

namespace System.Globalization
{
    Func<DateTime, int> f = d =>
        CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d, (CalendarWeekRule)1, (DayOfWeek)0);
 }

1

Powershell, 260 + 8 = 268 byte

+8 byte vì -DateTimecờ


Chấp nhận đối số như "day month year"định dạng.

function W([datetime]$DateTime = (Get-Date)) {
$cultureInfo = [System.Globalization.CultureInfo]::CurrentCulture
$cultureInfo.Calendar.GetWeekOfYear($DateTime,$cultureInfo.DateTimeFormat.CalendarWeekRule,$cultureInfo.DateTimeFormat.FirstDayOfWeek)
}

Không phải chuyên gia Powershell, không thể chơi gôn


Trường hợp thử nghiệm

>W -DateTime "11 March 2015"
11
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.