Những ngày làm việc cho tôi


8

Lý lịch

Bạn là một tay golf mã hấp dẫn và khá nhiều người hỏi bạn.

Bạn không có thời gian để suy nghĩ về những ngày chính xác bạn có sẵn, vì vậy bạn quyết định tạo một chức năng chấp nhận một ngày và trả về các ngày trong tuần đó.

Sau đó, bạn lấy những ngày đó trong tuần, chèn nó vào chương trình lịch của bạn để xem có ai khác đã yêu cầu bạn ra ngoài chưa.

Quy tắc

  • Chấp nhận một ngày ở định dạng YYYY-MM-DD
  • Trả về một mảng / danh sách các ngày trong tuần đó. (Chủ nhật là ngày đầu tiên)
    • Ngày có thể được hiển thị dưới dạng mili giây giữa ngày 1 tháng 1 năm 1970 và ngày đó, ở định dạng ngày "chung" 1 hoặc đối tượng ngày.
  • Thứ tự của ngày phải tăng dần.
    • (Mặc dù bạn đủ thông minh để bao gồm hỗ trợ cho danh sách giảm dần, chương trình có thể hoạt động nhanh nhất với danh sách tăng dần và ai có vài mili giây dự phòng?)
  • Phải làm việc với bất kỳ ngày nào kể từ năm 1993. (Vâng, bạn 24 tuổi tại thời điểm viết!)
  • Mỗi câu trả lời Javascript được năm điểm cao!

Thông số kỹ thuật

Đầu vào mẫu: whichDates(2017-08-29)

Đầu ra: (tương đương)

console.log([
  Date.parse('2017-08-27'),
  Date.parse('2017-08-28'),
  Date.parse('2017-08-29'),
  Date.parse('2017-08-30'),
  Date.parse('2017-08-31'),
  Date.parse('2017-09-01'),
  Date.parse('2017-09-02'),
]);

1 Một định dạng khá nổi tiếng. Chẳng hạn như YYYY-MM-DD.

2 Đây là ! Mã ngắn nhất trên mỗi ngôn ngữ sẽ thắng, nhưng mã ngắn nhất nói chung sẽ có dấu kiểm ngọc lục bảo!


2
Ngoài ra, tôi khuyên bạn nên cho phép các định dạng khác, ngoài YYYY-MM-DD(tôi không thấy lý do chính đáng tại sao nó phải nghiêm ngặt).
Ông Xcoder

5
Câu đầu tiên là phần giới thiệu kỳ lạ và ít hợp lý nhất mà tôi từng thấy trong một thử thách. Làm tốt lắm :-)
Luis Mendo

2
@LuisMendo Cảm ơn! Nhưng bạn không bao giờ biết chính xác ai đang thầm ngưỡng mộ kỹ năng lập trình bệnh hoạn của bạn ....
Chris Chúc mừng

1
Tại sao mỗi câu trả lời Javascript được năm điểm cao! ?
sergiol

1
Date.parse(2017-08-27)?? điều này nên được Date.parse('2017-08-27')?
tsh

Câu trả lời:


1

Japt , 15 byte

ÐU
7Æf1X+Uf -Ue

Kiểm tra nó


Giải trình

Đầu vào ngầm định của chuỗi U.

ÐU

Chuyển đổi Uthành một đối tượng ngày và gán lại cho U.

Tạo một mảng các số nguyên từ 0đến 6, đi qua từng hàm trong đó Xlà phần tử hiện tại.

f1

Đặt ngày của U.

X+Uf

Thêm ngày hiện tại của Uđể X.

-Ue

Trừ đi ngày hiện tại trong tuần U.

Ngẫu nhiên xuất ra mảng kết quả.


5

Perl 6 , 47 byte

{my$d=Date.new($_);map($d+*-$d.day-of-week,^7)}

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

Các mã gần như tự giải thích. Đầu tiên chúng ta tạo một đối tượng Date $dtừ chuỗi, có định dạng ISOwhthing đẹp. Chúng ta có thể thực hiện số học với các ngày (thêm một số nguyên = thêm nhiều ngày, giống với phép trừ). Vậy $d-$d.day-of-weekCuối cùngnày (trời ơi, tuần luôn bắt đầu với thứ Hai đối với tôi: D) chủ nhật tuần. ( .day-of-weeklà 1 cho Thứ Hai đến 7 cho Chủ Nhật.) Sau đó, chúng tôi ánh xạ từ 0 đến 6 ( ^7) và thêm nó vào Chủ Nhật, nhận tất cả các ngày trong tuần. Số chúng tôi lập bản đồ xuất hiện ở vị trí của ngôi sao *. Danh sách này sau đó được trả lại.


5

JavaScript (ES6), 73 63 62 byte

Tôi nghĩ rằng tôi cũng sẽ sử dụng JavaScript.

Chỉnh sửa: Sử dụng cách tiếp cận mili giây, như được nhắc bởi dấu nhắc, tôi đã giảm xuống còn 62 byte.

s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*864e5)

Bạn có thể thực hiện một .map(x=>new Date(x))mảng trên trả về nếu bạn muốn chuyển đổi nó.


Duy trì cách tiếp cận ngày ( 72 byte )

s=>[..."0123456"].map(i=>new Date((x=new Date(s))-(x.getDay()-i)*864e5))

Có một lỗi trong trình ban đầu của tôi, nó đã được sửa. Nhờ một quan sát bằng sữa, tôi đã có thể loại bỏ lỗi và vẫn giảm số byte.


Đập tay!!
Chris Chúc mừng

2
Chào mừng đến với trang web!
Luis Mendo

Nó ngắn hơn để chỉ viết ra các số trong mảng. 60 byte:s=>[..."0123456"].map(i=>(x=new Date(s))-(x.getDay()-i)*8e7)
sữa

1
Chào mừng bạn đến với PPCG và được gắn chặt chẽ :) Mẹo 1: Bỏ keysvà sử dụng chỉ mục thay vì phần tử khi ánh xạ qua mảng. Mẹo 2: Đối với một mảng nhỏ này, nó sẽ ngắn hơn để tạo nó theo cách tôi đã làm.
Shaggy

3

MATL , 22 21 byte

7:j8XOs21Y2=f-GYO+1XO

Đầu ra có dd-mm-yyyyđịnh dạng.

Hãy thử nó tại MATL Online!

Giải trình

7:     % Push [1 2 3 4 5 6 7]
j      % Input as a string
8XO    % Convert date to string with format 8, which is 'Mon', 'Tue' etc
s      % Sum
21Y2   % Push predefined literal [298 302 288 305 289 296 310]. The first number
       % is the sum of ASCII codes of 'Mon', the second is that of 'Tue', etc.
=      % Is equal?, element-wise
f      % Index of nonzero value. For example, if input is a Friday this gives 5
-      % Subtract, element-wise. For a Friday this gives [-4 -3 -2 -1 0 1 2]
G      % Push input again
YO     % Convert to date number: number of days from January 0, 0000
+      % Add, element-wise
1XO    % Convert to date format 1, which is 'dd-mm-yyyy'. Implicitly display

3

JavaScript (ES6), 76 byte

Tôi nghĩ rằng cuối cùng tôi đã tìm thấy môi trường ít thuận lợi nhất để chơi golf hiệu quả: từ phía sau quán bar của tôi, trong khi phục vụ pint bằng tay kia của tôi!

s=>[...""+8e6].map((_,x)=>d.setDate(d.getDate()-d.getDay()+x),d=new Date(s))

Dùng thử trực tuyến (Đoạn trích để theo dõi)


Giải trình

s=>

Hàm ẩn danh lấy chuỗi (định dạng yyyy-(m)m-(d)d) làm đối số thông qua tham số s.

[...""+8e6]

Tạo một mảng gồm 7 phần tử bằng cách chuyển đổi 8000000ký hiệu khoa học thành một chuỗi và phá hủy nó, nó ngắn hơn [...Array(7)].

.map((_,x)=>          )

Ánh xạ qua mảng, chuyển từng phần tử qua một hàm trong đó _phần tử hiện tại sẽ không được sử dụng và xlà chỉ mục hiện tại, dựa trên 0.

,d=new Date(s)

Chuyển đổi sthành một Dateđối tượng và gán nó cho biếnd

d.setDate(     )

Đặt ngày của d.

d.getDate()

Lấy ngày hiện tại của d.

-d.getDay()

Trừ số ngày trong tuần hiện tại, 0 chỉ mục, để có Chủ nhật.

+x

Thêm x.


2
trong khi phục vụ pint với bàn tay khác của tôi! - Kỹ năng đa nhiệm tốt đẹp :-)
Ông Xcoder

Hầu như quên mất ... High Five!
Chris Chúc mừng

2
@ChrisHappy nếu bạn đang học JS, đừng tìm cách viết mã cho golf: P
caird coinheringaahing

1
@ChrisHappy: Cũng có thể là Chủ nhật cho đến khi tôi có đủ thời gian để viết lên; Bị kẹt sau thanh 'cho đến khi.
Shaggy

1
@ChrisHappy: Tìm thấy một phút, giải thích thêm. Bạn nên xem qua các mẹo về JS trong thẻ mẹo nếu bạn đang tìm kiếm nhiều mẹo hơn để chơi gôn trong JS.
Shaggy

2

Bash + tiện ích chung, 53

jot -w@ 7 `date -f- +%s-%w*86400|bc` - 86400|date -f-

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

Điều này giả định rằng đầu ra của ngày GNU là định dạng ngày "phổ biến", vd Fri Sep 1 00:00:00 UTC 2017.

Giải trình

           date -f- +%s-%w*86400                       # read date from STDIN, output expression "seconds-since-epoch - (index of day in week * 60 * 60 * 24)
                                |bc                    # arithmetically evaluate generated expression - result is date of required sunday in seconds-since-epoch
jot -w@ 7 `                        ` - 86400           # output seconds-since-epoch for all 7 required days of the week, prefixed with "@"
                                            |date -f-  # convert all seconds-since-epoch dates back to regular dates

2

Python 3, 133 124 126 112 byte

-9 byte nhờ Mr. Xcoder
+2 byte vì tuần bắt đầu bằng Chủ nhật
-14 byte nhờ notjagan

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print(a-timedelta(a.weekday()-i+1))

Điều đó đã không diễn ra tốt như tôi đã hy vọng.





Điều này cũng hoạt động trong Python2 nếu chúng ta làm raw_input()thay vì input()ở trên. (+4 byte). rangevẫn hoạt động trong Python2 cho điều nhỏ này là tốt. Nếu không có raw_inputbạn nhận được lỗi.
Thomas Ward

1

Toán học 20 byte?

Mathematica thể hiện danh sách các ngày dưới dạng một đối tượng ngày. Nếu đối tượng ngày đó là đầu ra chấp nhận được, hàm thuần 20 byte sau sẽ hoạt động:

#~DateObject~"Week"&

Thí dụ

#~DateObject~"Week"&["2017-08-29"]

đối tượng tuần


1
Tôi không thấy vấn đề gì với nó! :)
Chris Chúc mừng

1

Java 8 ( 161 154 123 122 102 + 19 36 byte)

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

import static java.time.LocalDate.*;

e->{for(int i=0;i<7;System.out.println(parse(e).plusDays(i++-parse(e).getDayOfWeek().getValue()%7)));}

Đừng quên bao gồm nhập khẩu trong giải pháp và số byte của bạn.
Jakob

Ngoài ra, bạn có thể lưu byte bằng cách loại bỏ lvà thay thế các tham chiếu bằng LocalDate.parse(e).
Jakob

@Jakob Tiếng hét tốt, cảm ơn bạn
Roberto Graham

Và bây giờ bạn có thể tăng itrong thân vòng lặp để tiết kiệm 1 byte. Ồ, và việc java.util.function.*nhập khẩu không được lambda sử dụng, vì vậy bạn không phải coi đó là một phần của giải pháp.
Jakob

1

Python 2, 115 Byte hoặc 111 Byte, tùy thuộc vào định dạng đầu vào.

Về cơ bản, đây gần như là cùng một mã trong câu trả lời cho Python3 được viết bởi Sobsz , nhưng được tạo ra để hoạt động trong Python 2.


Nếu đầu vào ở dạng YYYY-MM-DD:

(Điều này giả sử đầu vào không được gói trong dấu ngoặc đơn để biểu thị một chuỗi là đầu vào)

Sự khác biệt chính là chúng ta cần raw_inputthay vì input, trừ khi chúng ta chỉ định rõ ràng ngày trong 'YYYY-MM-DD'dấu nháy đơn để xác định đó là một chuỗi bằng chữ. Nếu không có đầu vào chuỗi ký tự, chúng ta sẽ gặp Lỗi Cú pháp, do đó việc sử dụng raw_inputđể chấp nhận ngày YYYY-MM-DDtrực tiếp mà không đặt nó trong chuỗi ký tự.

Tất nhiên điều này giả định rằng đầu vào được đưa vào như vậy : 2017-08-29.

from datetime import*
a=date(*map(int,raw_input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

+4 từ câu trả lời của Sobsz, sau đó -1 vì chúng ta không cần dấu ngoặc đơn cho printcâu lệnh và lưu một byte từ dấu ngoặc đơn đóng không có ở đó; tổng chênh lệch +3 byte.

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


Nếu đầu vào ở dạng 'YYYY-MM-DD':

(Lưu ý rằng chúng ta phải có ngày được cung cấp bên trong dấu ngoặc kép để câu trả lời này hoạt động)

Chúng tôi có thể lưu 4 byte vì chúng tôi không cần raw_và đây thực sự là câu trả lời giống như Sobsz cung cấp, trừ đi một byte vì chúng tôi không cần dấu ngoặc đơn xung quanhprint lệnh.

Cảm ơn ông Xcoder đã chỉ ra cái này, mặc dù về mặt kỹ thuật đây là một bản sao chính xác, trừ đi một byte, câu trả lời của Sobsz .

from datetime import*
a=date(*map(int,input().split('-')))
for i in range(7):print a-timedelta(a.weekday()-i+1)

1
Chào mừng đến với PPCG! Bạn có thể thay thế raw_input()bằng đầu vào và bao quanh đầu vào bằng dấu ngoặc kép để lưu 4 byte. Tất nhiên, điều đó biến giải pháp của bạn thành một bản sao mặc dù: P
Ông Xcoder

@ Mr.Xcoder Đúng, đó là lý do tại sao tôi bỏ qua điều đó. Mặc dù, nếu chúng ta đặt đầu vào trong dấu ngoặc kép trước, chúng ta thực sự lưu một byte từ Sobsz và tôi đã ghi chú điều đó.
Thomas Ward
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.