Thứ hai tuần trước


27

Thứ hai, ngày 31 tháng 10, là Halloween. Và nó làm tôi suy nghĩ - tôi tự hỏi những tháng khác có ngày cuối cùng của tháng cũng là thứ Hai?

Đầu vào

  • Một số nguyên dương trong bất kỳ định dạng thuận tiện đại diện cho một năm , 10000 > y > 0.
  • Đầu vào có thể được đệm bằng số không (ví dụ: 0025cho năm 25) nếu được yêu cầu.

Đầu ra

  • Một danh sách các tháng của năm đó trong đó ngày cuối cùng của tháng là thứ Hai.
  • Đây có thể là tên tháng (ví dụ January, March, October:) hoặc tên ngắn ( Jan, Mar, Oct) hoặc số ( 1, 3, 10), dưới dạng các dòng riêng biệt hoặc danh sách hoặc phân cách, v.v., miễn là nó không rõ ràng đối với người đọc.
  • Định dạng đầu ra phải nhất quán:
    • Đối với đầu vào tất cả các năm (có nghĩa là, bạn không thể xuất tên tháng cho một số đầu vào và số tháng cho các đầu vào khác)
    • Cũng như nhất quán trên mỗi đầu ra (có nghĩa là, bạn không thể xuất 1cho Januarycùng một đầu ra như Julcho July)
    • Về cơ bản, chọn một định dạng và dính vào nó.

Quy tắc

  • Giả sử lịch Gregorian cho đầu vào / đầu ra, thậm chí xuống tới y = 1.
  • Năm nhuận phải được tính đúng (như một lời nhắc nhở: mỗi năm chia hết cho 4, trừ năm không chia hết cho 100, trừ khi chia hết cho 400 - 1700, 1800, 1900 tất cả các năm nhuận, nhưng 2000 là).
  • Bạn có thể sử dụng bất kỳ công cụ tính toán tích hợp hoặc ngày nào khác mà bạn muốn.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

   1 --> Apr, Dec
 297 --> May
1776 --> Sep
2000 --> Jan, Jul
2016 --> Feb, Oct
3385 --> Jan, Feb, Oct

Bảng xếp hạng



1
Liên quan nhưng không trùng lặp hay?
ElPedro

@ElPedro Liên quan nhưng không trùng lặp. Cái đầu tiên không cho phép bất kỳ tiện ích tích hợp nào và yêu cầu kết hợp ngày / ngày cố định (Thứ Sáu ngày 13), trong khi thứ hai yêu cầu Chủ nhật cuối cùng của mỗi tháng trong năm, giới hạn trong khoảng từ 1900 đến 3015.
admBorkBork

Xin lỗi @TimmD. Sự hiểu lầm của tôi về nhận xét của bạn.
ElPedro

1
@ElPedro Không có vấn đề! Tôi thà có một câu hỏi và làm cho nó rõ ràng, hơn là không có một câu hỏi và có một cái gì đó không rõ ràng.
admBorkBork

Câu trả lời:


2

Dyalog APL với cal của dfns , Phiên bản 15.0: 22; Phiên bản 16.0: 19 byte

Các chức năng cal đi kèm với một cài đặt mặc định, chỉ cần nhập )copy dfns.

Phiên bản 15.0: ∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12

tranh thủ (làm phẳng)

⎕{... nhập số dưới dạng đối số bên trái cho hàm ẩn danh sau, lần lượt lấy từng giá trị bên phải làm đối số bên phải

⍵/⍨ đối số if (đưa ra một danh sách trống nếu không)

2= hai (cụ thể là Chủ nhật và Thứ Hai) bằng

kiểm đếm của

những con số trong

⊢⌿ hàng dưới cùng của

cal lịch cho

⍺⍵ năm tranh luận trái, tháng tranh luận phải, năm sau

⍳12 1 đến 12

Phiên bản 16.0: ⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12

các chỉ số ở đâu

2= hai bằng nhau (cụ thể là Chủ nhật và Thứ Hai)

⎕{... nhập số dưới dạng đối số bên trái cho hàm ẩn danh sau, lần lượt lấy từng giá trị bên phải làm đối số bên phải

kiểm đếm của

những con số trong

⊢⌿ hàng dưới cùng của

cal lịch cho

⍺⍵ năm tranh luận trái, tháng tranh luận phải, năm sau

⍳12 1 đến 12


19

JavaScript (Firefox 30+), 112 109 103 95 byte

Nhìn ma, không có tích hợp!

y=>[for(m of(i=0,y%4|y%400*!(y%100)&&6)+"63153042641")if((i++,y+(y>>2)-(y/100|0)*3/4|0)%7==m)i]

Đây là phiên bản ES6 107 byte:

y=>[...(y%4|y%400*!(y%100)&&6)+"63153042641"].map((m,i)=>(y+(y>>2)-(y/100|0)*3/4|0)%7-m?0:i+1).filter(x=>x)

Và đây là nỗ lực trước đây của tôi, 123 113 byte ES6:

y=>[(l=y%4|y%400*!(y%100))?[7]:[1,7],[4,12],[9],[3,6],[8,11],[5],l?[1,2,10]:[2,10]][(y+(y>>2)-(y/100|0)*3/4|0)%7]

Giải trình

Ngày trong tuần của một năm cụ thể được tính như vậy:

y+(y>>2)-(y/100|0)*3/4|0)%7

Nói cách khác:

  • Đi y.
  • Thêm số của năm thứ 4 trước y( y>>2).
  • Trừ đi số thứ 100 năm trước y( y/100|0).
  • Thêm lại vào số 400 năm trước y; Đây là 1/4 y/100|0, vì vậy chúng tôi sử dụng *3/4|0.

Sau đó, chúng tôi điều chỉnh kết quả bằng 7. Nếu chúng ta 0có nghĩa là Chủ nhật, 1nghĩa là Thứ Hai, v.v., kết quả tương ứng với ngày trong tuần của ngày 31 tháng 12 năm đó. Do đó, trong tháng 12, chúng tôi muốn kiểm tra xem kết quả có như vậy không 1. Điều này cho chúng ta char cuối cùng trong chuỗi.

Ngày cuối cùng của tháng 11 là 31 ngày trước ngày cuối cùng của tháng 12. Điều này có nghĩa là vào ngày cuối cùng của tháng 11 là thứ Hai, ngày 31 tháng 12 cần phải là a (1 + 31) % 7 = 4= Thứ Năm.

Thủ tục này được lặp lại cho đến khi chúng tôi trở lại vào tháng 3 (a 3). Cho dù có ngày nhuận hay không, ngày cuối cùng của tháng 2 là 31 ngày trước ngày cuối cùng của tháng 3, vì vậy chúng ta cũng có thể tính toán điều đó (đó là (3 + 31) % 7 = 6). Phần khó khăn là tìm giá trị chính xác cho tháng 1:

  • Nếu đó là một năm nhuận, ngày cuối cùng của tháng 1 là 29 ngày trước ngày cuối cùng của tháng 2, kết quả là (6 + 29) % 7 = 0.
  • Nếu không, đó là 28 ngày trước ngày cuối cùng của tháng Hai, kết quả là (6 + 28) % 7 = 6.

Chúng tôi có thể tính toán liệu đó có phải là năm nhuận hay không với đoạn trích sau:

!(y%400)|y%100*!(y%4)

Điều này cho 0nếu ykhông phải là một năm nhuận và một số nguyên dương khác. Điều này dẫn chúng ta đến

!(y%400)|y%100*!(y%4)?0:6

để tính ngày cho tháng một. Tuy nhiên, chúng ta có thể làm tốt hơn bằng cách đảo ngược các điều kiện:

y%4|y%400*!(y%100)?6:0

Vì kết quả sai luôn luôn là 0, nên chúng ta có thể giảm nó xuống

y%4|y%400*!(y%100)&&6

tiết kiệm thêm một byte quý giá.

Đặt tất cả lại với nhau, chúng tôi lặp qua từng char trong chuỗi, kiểm tra xem mỗi chuỗi có bằng với ngày trong tuần của ngày 31 tháng 12 không. Chúng tôi giữ các chỉ mục của những cái phù hợp, cuối cùng trả về mảng này. Và đó là cách bạn thực hiện các tính toán năm nhuận mà không cần tích hợp sẵn.


Owww ... Bộ não của tôi, bạn đã tính đến năm nhuận trong alla đó?
Bạch tuộc ma thuật Urn

2
@carusocomputing Đó là những gì !(y%4)*y%100|!(y%400)dành cho. mỗi năm chia hết cho 4, trừ năm không chia hết cho 100, trừ khi chia hết cho 400
mbomb007

Hy vọng y+(y>>2)+(z=y/25>>2)+(z>>2)vẫn tiết kiệm cho bạn một byte.
Neil

@Neil Cảm ơn, nhưng tôi đã tìm thấy một cách tốt hơn :-)
ETHproductions

Tốt đẹp; Tôi đã lưu 6 byte trên cổng Batch của mình bằng cách sử dụng (y*5/4-(y/100)*3/4).
Neil

11

JavaScript (Firefox 30-57), 67 65 64 63 61 byte

y=>[for(_ of(m='')+1e11)if(new Date(y+400,++m).getDay()==2)m]

Đã lưu 2 4 6 byte nhờ @ETHproductions. Đã lưu một byte khác bằng cách xuất các tháng theo thứ tự ngược lại.


Tôi nghĩ rằng bạn có thể tiết kiệm 2 byte bởi winging nó mà không có .keys():y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
ETHproductions

@ETHproductions Tôi có thể lưu thêm một byte bằng cách đảo ngược thứ tự!
Neil

Đảo ngược là tốt. Định dạng đầu ra không phải là phần thú vị của thử thách này.
admBorkBork

Chính sách của chúng tôi về mảng Hiểu toàn diện bây giờ đã bị xóa khỏi thông số kỹ thuật là gì?
MayorMonty

Bạn có thể lưu thêm 2 byte bằng cách bỏ qua Array(12)hoàn toàn: y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
ETHproductions

8

MySQL, 183 134 129 106 byte

SET @y=2016;SELECT help_topic_id AS m FROM mysql.help_topic HAVING m BETWEEN 1 AND 12 AND 2=DAYOFWEEK(LAST_DAY(CONCAT(@y,-m,-1)))

Thay thế 2016bằng năm mong muốn. Chạy.

Rev. 2: Đã sử dụng help_topicsbảng trong cài đặt mặc định thay vì tạo bảng tạm thời.

Rev.3: Được thông qua aross's -lừa và nhận thấy tôi cũng có thể bỏ qua các dấu ngoặc kép cho "-1".
Tuy nhiên, -1được yêu cầu trong MySQL: Tôi cần một ngày đầy đủ.

Rev.4: Hạn chế m BETWEEN 1 AND 12có thể được thực hiện dưới dạng m>0 AND m<13(-6), nhưng hoàn toàn không cần thiết - các giá trị không hợp lệ sẽ bị bỏ qua; cảnh báo sẽ được tính nhưng không được liệt kê.


Bạn cần thực sự các bảng shema mysql? mariadb.com/kb/en/mariadb/mysqlhelp_topic-table
Jörg Hülsermann

@ JörgHülsermann Tôi không nhận được điểm của bạn.
Tít

Nên FROM help_topickhông mysql.làm việc? Tôi đã thử chưa
Jörg Hülsermann

@ JörgHülsermann chỉ khi bạn trả trước USE mysql;Cơ sở dữ liệu chính xác phải được chọn bằng cách nào đó.
Tít

5

Perl, 64 byte

Bao gồm +1 cho -n

Cung cấp đầu vào trên STDIN:

perl -M5.010 mon.pl <<< 2016

mon.pl:

#!/usr/bin/perl -n
map$b.=$/.gmtime$_.e4,-7e6..3e7;say$b=~/on (\S+ )\S.* $_.* 1 /g

5

Hàng loạt, 160 152 byte

@set/ay=%1,m=0,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%d in (%j% 6 3 1 5 3 0 4 2 6 4 1)do @set/am+=1&if %%d==%y% call echo %%m%%

Câu trả lời của cảng @ ETHproduction. Với chữ viết tắt tháng cho 197 189 byte:

@set/ay=%1,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%m in (Jan.%j% Feb.6 Mar.3 Apr.1 May.5 Jun.3 Jul.0 Aug.4 Sep.2 Oct.6 Nov.4 Dec.1)do @if %%~xm==.%y% call echo %%~nm

4

J, 48 34 33 byte

[:I.(2=7|_2#@".@,@{.])&>@calendar

Đã lưu 15 byte với sự trợ giúp từ @ Adám .

Sử dụng lịch dựng sẵn để tạo ra một chuỗi các chuỗi biểu thị các tháng, sau đó phân tích từng chuỗi để xác định xem thứ Hai cuối cùng có phải là ngày cuối cùng của tháng hay không. Nó xuất ra mỗi tháng là số tháng của mỗi. Đó là, Jan = 0, Feb = 1, ..., Dec = 11.

Đầu ra của calendar

   _3 ]\ calendar 2016
┌─────────────────────┬─────────────────────┬─────────────────────┐
│         Jan         │         Feb         │         Mar         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│        1  2  3  4  5│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  6  7  8  9 10 11 12│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 13 14 15 16 17 18 19│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 20 21 22 23 24 25 26│
│ 24 25 26 27 28 29 30│ 28 29               │ 27 28 29 30 31      │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Apr         │         May         │         Jun         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│  1  2  3  4  5  6  7│           1  2  3  4│
│  3  4  5  6  7  8  9│  8  9 10 11 12 13 14│  5  6  7  8  9 10 11│
│ 10 11 12 13 14 15 16│ 15 16 17 18 19 20 21│ 12 13 14 15 16 17 18│
│ 17 18 19 20 21 22 23│ 22 23 24 25 26 27 28│ 19 20 21 22 23 24 25│
│ 24 25 26 27 28 29 30│ 29 30 31            │ 26 27 28 29 30      │
│                     │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Jul         │         Aug         │         Sep         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│              1  2  3│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  4  5  6  7  8  9 10│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 11 12 13 14 15 16 17│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 18 19 20 21 22 23 24│
│ 24 25 26 27 28 29 30│ 28 29 30 31         │ 25 26 27 28 29 30   │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Oct         │         Nov         │         Dec         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                    1│        1  2  3  4  5│              1  2  3│
│  2  3  4  5  6  7  8│  6  7  8  9 10 11 12│  4  5  6  7  8  9 10│
│  9 10 11 12 13 14 15│ 13 14 15 16 17 18 19│ 11 12 13 14 15 16 17│
│ 16 17 18 19 20 21 22│ 20 21 22 23 24 25 26│ 18 19 20 21 22 23 24│
│ 23 24 25 26 27 28 29│ 27 28 29 30         │ 25 26 27 28 29 30 31│
│ 30 31               │                     │                     │
└─────────────────────┴─────────────────────┴─────────────────────┘

Sử dụng

   f =: [:I.(2=7|_2#@".@,@{.])&>@calendar
   f 1
3 11
   f 297
4
   f 1776
8
   f 2000
0 6
   f 2016
1 9
   f 3385
0 1 9

Giải trình

[:I.(2=7|_2#@".@,@{.])&>@calendar  Input: year Y
                         calendar  Get 12 boxes each containing a month
    (                )&>@          Operate on each box
                    ]                Identity, get the box
         _2       {.                 Take the last two strings
                ,@                   Flatten it
             ".@                     Parse it into an array of integers
           #@                        Get the length
       7|                            Take it modulo 7
     2=                              Test if it equals 2 - it will either
                                     have two days or 9 days in the last
                                     two lines if the end is on a Monday
[:I.                               Return the indices containing a true value

chờ đã, lịch thực sự xuất ra nghệ thuật ascii?
Lemon phá hủy

@DestructibleWatermelon Để được chính xác, định dạng đầu ra của calendarlà một mảng của 12 hộp trong đó mỗi hộp chứa một mảng 2ngày của nhân vật
dặm

Tôi thậm chí không biết cách thực hiện "từng" trong J, nhưng điều này đã ngắn hơn nhiều: I.7=;#&.>".&.>,&.>_2{.&.>calendar 2016Nếu bạn kết hợp tất cả các "dưới mở", bạn sẽ có thể có được nó khá ngắn.
Adám

@ Adam Cảm ơn, nó sử dụng một phương pháp tốt hơn nhưng nó không phải là một động từ trong J. Tôi nghĩ rằng nó sẽ vẫn giúp đỡ mặc dù
dặm

Ý định của tôi chỉ là để truyền cảm hứng. Tôi biết nó không phải là một động từ.
Adám

4

Toán học, 62 57 byte

DayName@DayRange[{#},{#+1},"EndOfMonth"]~Position~Monday&

Chức năng ẩn danh. Lấy một số làm đầu vào và trả về một danh sách các danh sách các thành phần đơn của các số làm đầu ra. Tôi thực sự không chắc chắn làm thế nào nó hoạt động nữa.


4

Perl + cal, 46 byte

say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12

Thí dụ:

$ perl -E 'say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12' 2016

2







10


$

1
Nói đúng ra, đây là perl + cal, không chỉ perl :-p. Ví dụ: máy Windows của tôi có perl, nhưng điều này sẽ không hoạt động ở đó.
triết học

Điểm công bằng, cập nhật này và nỗ lực bash của tôi.
steve

4

Java 7,186 182 172 byte

Cảm ơn kevin vì đã lưu 4 byte
Cảm ơn @cliffroot vì đã lưu 10 byte

int[]f(int n){int c=n-1,x=c*365+c/4+c/400-c/100,k=0,b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3},a[]=new int[12];for(int i:b)a[k++]=(x+=i+28)%7==1?1:0;return a;}

vô dụng

int[] f(int n) {
 int c=n-1,x=c*365+(c/4)+(c/400)-(c/100),k=0,
   b[] = {3,(n % 4 < 1 & n % 100 > 0) | n % 400 < 1 ? 1 : 0
                                     ,3,2,3,2,3,3,2,3,2,3},a = new int[ 12 ];

 if ( (n % 4 < 1 & n % 100 > 1) | n % 400 < 1 )
     b[ 1 ] = -1;
 for (int i : b)
    a[ k++ ] = (x += i + 28) % 7 == 1 ? 1 : 0;

return a;
     }

Phiên bản này được cung cấp bởi @cliffroot ( 168 byte )

 static int[] f(int n) {
 int b = 13561787 | ( (n%4 < 1 & n%100 > 0) | n%400 < 1 ? 1 << 20 : 0 ),
           x = --n*365 + n/4 + n/400 - n/100,a[]=new int[12],k=0;
    while (k < 12)
    a[k++] = (x += (b >> 24 - k*2&3 ) + 28) % 7 == 1 ? 1 : 0;
  return a;   }
    }

mẫu đầu ra

1 1 0 0 0 0 0 0 0 1 0 0(for input 3385)

1
Sau khi tôi đã viết câu trả lời của tôi, tôi biết tính toán tất cả mọi thứ mình sẽ ngắn hơn .. :) Btw, bạn có thể chơi golf n%4==0để n%4<1; n%400==0để n%400<1int c=...;int[]b=...,a=...để int c=...,b[]=...,a[]=....
Kevin Cruijssen

1
bacó thể được định nghĩa trong intphần như thế này:int ... ,b[]=...,a[]=...
Olivier Grégoire

1
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}vài byte được lưu
cliffroot

1
cũng có thể thay đổi bthành b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}i+30để i+28có thêm 2 byte
cliffroot

1
và 3 byte khácint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
cliffroot

3

Python 2, 100 byte

Ừ Toán học với ngày tháng không đơn giản như tôi muốn.

lambda y:[m+1for m in range(12)if(date(y,12,31)if m>10else(date(y,m+2,1)-timedelta(1))).weekday()<1]

Dùng thử trực tuyến

Cùng chiều dài:

lambda y:[m-1for m in range(2,14)if(date(y,12,31)if m>12else(date(y,m,1)-timedelta(1))).weekday()<1]

Tôi thậm chí sẽ không thử Python với cái này. Nỗ lực tốt đẹp.
ElPedro

3

MATL , 21 byte

12:"G@QhO6(YO9XO77=?@

Tháng được hiển thị dưới dạng số.

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 các hàm dựng sẵn chuyển đổi ngày. Đối với năm nhất định, nó sẽ kiểm tra ngày cuối cùng của tháng là thứ Hai.

Thay vì chỉ định rõ ràng ngày cuối cùng của tháng k(có thể là 28, 29, 30 hoặc 31), chúng tôi chỉ định 0ngày thứ nhất của tháng k+1, tương đương và không phụ thuộc vào tháng hoặc năm.

12:      % Push [1 2 ... 12] (months)
"        % For each month k
  G      %   Push input
  @Q     %   Push k+1
  h      %   Concatenate
  O6(    %   Postpend four zeros. For example, for input 2016 and month k=1 
         %   (first iteration) this gives [2016 2 0 0 0 0] (year, month, day,
         %   hour, min, sec). The 0-th day of month k+1 is the same as the
         %   last day of month k.
  YO     %   Convert the above 6-element date vector to date number
  9XO    %   Convert date number to date string with output format 9, which 
         %   is weekday as a capital letter
  77=    %   Is it an 'M'?
  ?      %   If so
    @    %     Push current month (will be implicitly displayed)

3

Tiện ích Bash + GNU, 56 byte

seq -f1month-1day$1-%g-1 12|date -f- +%B%u|sed -n s/1//p

Xuất hiện để yêu cầu datephiên bản 8.25. Phiên bản 8.23 ​​trong Ideone không cắt nó.


3

Excel, 537 byte

Bởi vì - bạn biết đấy - Excel!

Mất năm đầu vào A1. Trả về danh sách thập lục phân của tháng; 1 = tháng 1, C = tháng 12. Vì mỗi tháng là một chữ số duy nhất, không cần có dấu phân cách.

=IF(2=WEEKDAY(EOMONTH(DATE(A1,1,1),0)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,3,1),0)),3,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,4,1),0)),4,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,5,1),0)),5,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,6,1),0)),6,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,7,1),0)),7,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,8,1),0)),8,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,9,1),0)),9,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,10,1),0)),"A","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,11,1),0)),"B","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,12,1),0)),"C","")

Ví dụ: A1 chứa 2016. B1 chứa công thức trên và hiển thị dưới dạng 2A, có nghĩa là tháng hai và tháng mười.


3

PHP, 109 180 159 byte

for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
  • Đầu ra năm được cung cấp, không phải tất cả trong số họ (... luôn đọc câu hỏi)
  • Thông báo bỏ qua (cảm ơn Tít)
  • Thay đổi whilethành forbây giờ là một năm (một lần nữa, cảm ơn Titus)

2 tuổi

$z=0;while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime(sprintf("%04d-$m-","$z").cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

Hỗ trợ tất cả các năm từ chấm đến 10000, cũng đã thoát khỏi cảnh báo var không xác định mà tôi không biết trên một PC. Có, nó dài hơn phiên bản cũ, nhưng nó mạnh mẽ hơn.

Cũ 1

while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime("$z-$m-".cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

Nếu chạy trên Windows hoặc hệ thống 32 bit, sẽ có lỗi 2038 đáng sợ, nhưng trên hệ thống linux 64 bit thì không sao.

Tôi đã cố gắng sử dụng date("t"...có nghĩa là đại diện cho ngày cuối cùng của tháng nhất định, nhưng kết quả không khớp với những gì được đề cập trước đó trong chủ đề này.


2
-2: "$ z" không cần dấu ngoặc kép -7: bỏ qua các thông báo (chúng không được in với cài đặt mặc định: không init $z, không có dấu ngoặc kép cho N) -1: forthay vì while -43 : lấy đầu vào theo yêu cầu thay vì lặp qua các năm -3: jointhay vì implode-16: đầu ra trực tiếp: for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";+9 nếu bạn khăng khăng không có dấu phẩy:echo$o=$o?",$m":$m;
Tít

Ahh đọc sai câu hỏi! Nghĩ rằng đó là tất cả các năm .. oops: B Cảm ơn vì những gợi ý khác, sẽ nhận được chúng
CT14.IT

3

PHP, 92 byte

for($d=new DateTime("$argv[1]-1-1");$i++<12;)$d->modify("1month")->format(w)!=2?:print"$i,";

kiểm tra 12 lần 1 tháng sau ngày đầu tiên của năm là thứ ba. Nếu đó là ngày trước ngày cuối cùng trong tháng là thứ hai.


Bạn có thể sử dụng echo thay vì in và lưu 1
Bạch tuộc

1
@Octopus không nằm trong Nhà điều hành
chim nhạn

3

C, 214 byte

main(int a,char *b[]){for(int x,y,d,m=12;m;m--){y=atoi(b[1]);x=m-1;d=x==1?(y%4==0?(y%100==0?(y%400==0?29:28):29):28):(x==3||x==5||x==10?30:31);if((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7==1)printf("%d\n",m);}}

Biên dịch

gcc -std=c99 -o foo foo.c

Bị đánh cắp

Với các khoản tín dụng cho các bậc thầy có liên quan.

Michael KeithTom Craver cho Chương trình C để tìm ngày trong tuần .

Collin Biedenkapp cho Q & A: Làm thế nào để tôi biết ngày cuối cùng của tháng là gì?

/* credit to Collin Biedenkapp */
short _get_max_day(short x, int z) {
    if(x == 0 || x == 2 || x == 4 || x == 6 || x == 7 || x == 9 || x == 11)
        return 31;
    else if(x == 3 || x == 5 || x == 8 || x == 10)
        return 30;
    else {
        if(z % 4 == 0) {
            if(z % 100 == 0) {
                if(z % 400 == 0)
                    return 29;
                return 28;
            }
            return 29;
        }
        return 28;
    }
}

main(int argc,char *argv[]) {
 for(int y,d,m=12;m;m--) {
  y=atoi(argv[1]);
  d=_get_max_day(m-1,y);
  /* credit to Michael Keith and Tom Craver */
  if ((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7 == 1)
    printf("%d\n",m);
 }
}

1
Điều gì sẽ xảy ra nếu bạn lật ifhướng khác, để có sự elsequay trở lại của bạn 31, và do đó bạn có thể loại bỏ ==chuỗi lớn ?
admBorkBork

1
sẽ tốt hơn nếu (x == 1) {z part} khác if (x == 3 || x == 5 || x == 8 || x == 10) trả lại 30 khác trả về 31
RosLuP

1
còn về: return x == 1? (z% 4 == 0? (z% 100 == 0? (z% 400 == 0? 29: 28): 29): 28) :( x == 3 | | x == 5 || x == 8 || x == 10? 30: 31)
RosLuP

TimmyD + RosLuP: cảm ơn vì các điểm return (), hiện đã lưu 100 byte.
steve

1
cuối cùng có thể tiếp tục giảm cho đến khi này: u (y, m) {return m - 1? 30 + ((2773 >> m) & 1): 28+ (y% 4 == 0 && y% 100 || y% 400 == 0);} trong đó y là năm và m là tháng
RosLuP

3

C, 119 byte

t=1248700335,m;main(y){for(scanf("%d",&y),t+=y&3||y%25<1&&y&15;m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;t/=7);}

Bảng này sử dụng bảng chứa phần bù của các ngày trong tuần của ngày cuối cùng của mỗi tháng cho một năm nhuận, được mã hóa bằng một từ 32 bit đã ký bằng cơ sở 7. Nếu đó không phải là năm nhuận, chúng ta thêm 1 vào phần bù của tháng 1 (như bạn có thể thấy y&3||y%25<1&&y&15được sử dụng để kiểm tra trong nhiều năm mà không có ngày nhuận). Sau đó, chúng tôi chỉ cần lặp lại hàng tháng và kiểm tra xem ngày cuối cùng của nó có phải là thứ Hai không. Thực sự khá đơn giản, không có hack hay thủ thuật xấu xí. Ở đây nó hơi vô căn cứ:

t=1248700335,m;
main(y){
  for(
    scanf("%d",&y),t+=y&3||y%25<1&&y&15;
    m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;
    t/=7
  );
}

Tôi có thể xem lại điều này để viết lại nó như là một chức năng để lưu một vài ký tự. Việc này printfcũng chiếm quá nhiều không gian ...


Printf ("% d,", m) sẽ in thứ gì đó là 1, hoặc 2, 3, vì vậy luôn có một ',' thêm ... Tôi chỉ thích sử dụng khoảng trắng
RosLuP

Thật vậy, tôi cũng thích không gian đầu ra thực sự, nhưng tôi thường viết các giải pháp C được đánh gôn của mình để chúng không cần bất kỳ khoảng trắng nào, vì vậy tôi chỉ có thể nuke tất cả các khoảng trắng từ phiên bản nửa gôn của mình khi tôi muốn kiểm tra số lượng nhân vật của mình .
Dành cho

3

PHP, 96 95 76 71 69 64 61 byte

Lưu ý: số năm phải được đệm thành 4 ký tự, như thế nào 0070.

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;

Chạy như thế này:

echo 3385 | php -nR 'for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;';echo
> -1-2-10

Giải trình

Lặp lại từ -1 đến -12. Tạo ngày bằng mktime, ngày 0(ngày cuối cùng của tháng trước) và tháng 2..13. Định dạng ngày là số ngày và nếu kết quả là 1, hãy in số hiện tại. Dấu âm -được sử dụng làm dấu phân cách.

Lỗi Millenium lại tấn công!

Lưu ý rằng với phiên bản này, phạm vi 0..100được hiểu là 1970..2069. Điều này không có vấn đề gì với phạm vi 0..69, vì các tuần có mô hình lặp lại sau mỗi 400 năm (146097 ngày, chính xác là 20871 tuần), nhưng đối với phạm vi 70..99, 1900 được thêm vào số năm, không phải là bội số của 400. Để sửa vấn đề đó CHỈ cho các số 30 năm trong phạm vi 10k, cách đơn giản nhất là thêm 400 vào số năm để ngăn việc diễn giải 2 chữ số ( +4 byte ):

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn+400))-1||print$i;

Tinh chỉnh

  • Đã lưu một byte bằng cách sử dụng !~-$iđể so sánh $ivới 1( -1phủ định nhị phân là 0, phủ định logic là true; mọi số khác là false), vì vậy dấu ngoặc đơn không cần thiết
  • Đã lưu 19 byte bằng cách sử dụng last day ofYYYY-mký hiệu để tạo ngày
  • Đã lưu 5 byte bằng cách sử dụng datestrtotimethay vìdate_create
  • Đã lưu 2 byte bằng cách đếm từ các số âm, sử dụng dấu âm làm dấu phân cách đầu ra (số tháng âm không tồn tại) và cũng là dấu phân cách trong YYYY-mphần của ngày
  • Đã lưu 5 byte bằng cách sử dụng mktimethay vì strtotime. Hoàn nguyên về sử dụng ngày 0( mktimecũng hỗ trợ tháng 13, vì vậy 0-13== 31-12)
  • Đã lưu 3 byte bằng cách sử dụng -Rđể $argncung cấp

mktimeloại bỏ sự cần thiết phải đệm trong năm, phải không?
Tít

@Titus, sắc sảo. Vâng, tôi chỉ tìm ra rằng đó mktimephản trực giác , bởi vì các đối số được coi là INTs. Điều đó có nghĩa là bạn không thể đệm năm ... vì vậy mọi thứ trong phạm vi 0..100được hiểu là 1970..2070. Đó không phải là vấn đề đối với phạm vi 0..70vì 400 năm có số tuần chính xác (vì vậy lịch lặp lại mô hình cứ sau 400 năm), nhưng 70..99thêm 1900 (không phải là bội số của 400!). Do đó ver mới. có một lỗi.
vào

Giải pháp duy nhất tôi thấy cho điều đó ngay bây giờ là $argv[1]+400... trừ khi các ngày trong tuần của Julian và Gregorian khác nhau.
Tít

@Titus, vâng. Các quy tắc nói rằng hãy sử dụng Gregorian cal
từ

3

Excel, 428 97 96 byte

Đầu vào trong A1. Xuất các giá trị thập lục phân không tách rời (tháng 1 = 0, tháng 12 = B)

=IF(2=WEEKDAY(DATE(A1+2000,1,31)),0,"")&CHOOSE(WEEKDAY(DATE(A1+2000,3,0)),4,19,6,"3B",8,25,"7A")

Đã thêm 10 byte ("+2000") để cho phép xử lý các ngày trước năm 1990.

Đã lưu 11 byte nhờ @ Engineering Toast .


Nỗ lực đầu tiên (428 byte), vay mượn rất nhiều từ giải pháp của @ Adám .

=IF(2=WEEKDAY(DATE(A1,1,31)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(DATE(A1,3,31)),3,"")&IF(2=WEEKDAY(DATE(A1,4,30)),4,"")&IF(2=WEEKDAY(DATE(A1,5,31)),5,"")&IF(2=WEEKDAY(DATE(A1,6,30)),6,"")&IF(2=WEEKDAY(DATE(A1,7,31)),7,"")&IF(2=WEEKDAY(DATE(A1,8,31)),8,"")&IF(2=WEEKDAY(DATE(A1,9,30)),9,"")&IF(2=WEEKDAY(DATE(A1,10,31)),"A","")&IF(2=WEEKDAY(DATE(A1,11,30)),"B","")&IF(2=WEEKDAY(DATE(A1,12,31)),"C","")

Làm thế nào để điều này làm việc trên những năm sớm hơn 1900? Các trường hợp thử nghiệm 297 -> Maytrả về 6với công thức này. Không phải là 4 sao? 1776cho 7Athay vì chỉ 8cho Tháng Chín.
Kỹ sư Toast

Tuy nhiên, nếu bạn làm cho nó hoạt động, có lẽ bạn có thể sử dụng Date(A1,3,0)thay vìEOMONTH(DATE(A1,2,1),0)
Kỹ sư Toast

2

Bash + cal, 58 byte

$ cat t.sh
for A in {1..12};do cal $A $1|grep -qx .....&&echo $A;done
$ bash t.sh 2016
2
10
$

+1 - hoạt động cho BSD cal(ví dụ OSX), nhưng theo dõi các dấu cách trên GNU cal.
Chấn thương kỹ thuật số

2

Python 2, 94 byte

from datetime import*
lambda y:[m for m in range(1,13)if date(y+(m>11),m%12+1,1).weekday()==1]

thay thế

Một hàm không tên, mất một năm nguyên, đưa ra một danh sách các số tháng [1-12].

Tôi cũng đã cố gắng đánh bại số byte bằng số học nhưng không thành công (110 byte). :

lambda y:map(lambda x,v:(23*((x+2)%13or 1)/9+y-2*(0<x<11)+(x>10)+v/4-v/100+v/400)%7==4,range(12),[y-1]+[y]*11)

Hàm không tên trả về danh sách các giá trị boolean đại diện nếu các tháng [tháng 1-tháng 12] kết thúc vào thứ hai


2

Java 7, 200 249 byte

import java.util.*;String c(int y){String r="";GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));c.set(1,y);c.set(2,0);for(int i=0;i++<12;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}

Trong Java, GregorianCalendarlà sự pha trộn giữa lịch Gregorian và Julian. Bởi vì điều này, năm 1cho kết quả không chính xác. Thay đổi Calendar c=Calendar.getInstance();để GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));sửa lỗi này bằng cách chỉ sử dụng lịch Gregorian. Cảm ơn @JonSkeet trên stackoverflow.com đã giải thích điều này cho tôi.

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

import java.util.*;
class M{
  static String c(int year){
    String r = "";
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 12; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

Đầu ra:

4 12
5 
9 
1 7 
2 10 
1 2 10 

2

C # 6 C #, 171 167 135 byte

using System;
void d(int n){for(int i=0;++i<13;)if((int)new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==1)Console.Write(i+" ");}

-32 byte nhờ vào Shebang

In tháng như số; với không gian giới hạn; với không gian dấu. Bây giờ câu trả lời này cũng hoạt động cho các phiên bản trước của C #.


Cũ, 167 byte

using System;using System.Linq;
c(int n)=>string.Join(",",Enumerable.Range(1,12).Where(i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==(DayOfWeek)1));

-4 byte nhờ TimmyD

Tháng đầu ra là các số trong chuỗi trả về, được phân cách bằng dấu phẩy

Bị đánh cắp

string c(int n)=>
    string.Join(",",                                        // Join them with commas
        Enumerable.Range(1,12)                              // For 1-12 inclusive
        .Where(                                             // Select only
            i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)   // Get last day of that year-month
            ).DayOfWeek                                     // Get its day of week
            ==(DayOfWeek)1                              // Is Monday
        )
    )
;

@TimmyD Có nhưng cần diễn viên rõ ràng. Câu trả lời được cập nhật
Liên kết Ng

LINQ rất thú vị nhưng đây là 126 byte : void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}};) Ngoài ra, nó sẽ ngắn hơn để truyền DayOfWeektới intnó so với việc intchuyển sangDayOfWeek
Kade

@Shebang Cảm ơn. Tôi thực sự không nên chơi golf trong một dòng linq --- Chỉ Jon Skeet có thể làm điều đó. Xem nếu tôi có thời gian để cập nhật vào ngày mai. Đang cô găng.
Liên kết Ng

Bạn có thể chuyển đổi nó thành một Action<int>để lưu một số byte
TheLethalCoder

2

Ruby, 54 + 6 = 60 byte

λ cat monday.rb
p (1..12).select{|m|Date.new($*[0].to_i,m,-1).monday?}
λ ruby -rdate monday.rb 2016
[2, 10]

6 byte cho -rdatedòng lệnh để lấy lớp Date từ thư viện chuẩn.

Giải thích: khá đơn giản nhờ vào Datelớp học tuyệt vời của Ruby stdlib . Không chỉ có các phương thức như monday?, tuesday?v.v., nhà xây dựng sẽ lấy số âm cho bất kỳ trường nào trong năm qua để có nghĩa là 'đếm trường này ngược từ cuối giai đoạn được đại diện bởi trường trước đó'. $*là viết tắt cho ARGV, vì vậy $*[0]là một cách nhanh chóng để có được đối số dòng lệnh đầu tiên.


2

PHP, 84 byte

for($m=1;$m++<14;){if(strftime('%w',strtotime($argv[1]."-$m-1"))==2)echo($m-1)." ";}

Mã Golf đầu tiên của tôi. Đây là PHP ngắn nhất cho đến nay về câu hỏi này.

EDIT: dường như không hoạt động trong năm 1. Tôi sẽ phải tìm hiểu tại sao, nhưng ngay bây giờ tôi phải đi.


1
Tôi muốn nói "Chào mừng đến với PPCG!" nhưng bạn đã đăng ký ở đây lâu hơn tôi có! : D Sân golf đầu tiên đẹp.
admBorkBork

Lỗi của bạn là bạn tạo 1-13-1 và 1-14-1 cho năm 1 <13 là đủ. Nếu bạn giải quyết được điều này, bạn có thể xóa dấu ngoặc đơn trong thời điểm này và suy nghĩ về việc sử dụng toán tử ternary
Jörg Hülsermann

Điều này sẽ khắc phục sự cố của bạnfor(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
Jörg Hülsermann

2

R, 106 99 95 83 78 77 74 byte

g=function(x)which(format(seq(as.Date(paste0(x,-2,-1)),,'m',12)-1,"%u")<2)

Chuỗi các ngày cuối cùng của mỗi tháng được đưa ra bởi seq(as.Date(paste0(x,-2,-1)),,'m',12)-1:

  • paste0ép buộc -2 và -1 cho các ký tự. Nếu xlà năm 2016 chẳng hạn, thì paste0(x,-2,-1)đưa ra "2016-2-1"sau đó được chuyển đổi sang ngày 1 tháng 2 năm 2016 as.Date.

  • seqáp dụng cho POSIXct hoặc đối tượng Ngày là seq(from, to , by, length.out): ở đây tokhông được đưa ra, byđược đưa ra khi 'm'được khớp với 'month'nhờ khớp một phần và length.outdĩ nhiên là 12.

  • Chuỗi kết quả là ngày đầu tiên trong 12 tháng bắt đầu từ tháng Hai của năm. -1cung cấp cho chúng tôi sau đó ngày cuối cùng của 12 tháng bắt đầu bằng tháng một năm.

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

> g(1)
[1]  4 12
> g(25)
[1] 3 6
> g(297)
[1] 5
> g(2000)
[1] 1 7
> g(2016)
[1]  2 10
> g(3385)
[1]  1  2 10
> g(9999)
[1] 5

Phiên bản cũ ở mức 95 byte, xuất ra tên tháng thay vì chỉ số của chúng:

g=function(x)format(S<-seq(as.Date(sprintf("%04i-02-01",x)),,'m',12)-1,"%B")[format(S,"%u")==1]

Câu trả lời này chỉ là tuyệt vời. Tôi không có ý tưởng nào seqcó phương pháp cho Date-objects và điều này giải quyết vấn đề as.Datekhông xử lý nhiều năm ở trên 10000trong câu trả lời bị xóa của tôi.
Billywob

@Billywob có seq.Dateseq.POSIXtkhá ấn tượng: họ thậm chí có thể xử lý các lệnh như seq(time1, time2, by="10 min")hoặc seq(date1, date2, by="quarter"). Rất hữu ích khi vẽ một chuỗi thời gian.
plannapus

2

Japt, 24 byte

Do1 £Ov"Ð400+U"+X e ¥2©X

Kiểm tra nó trực tuyến! Xuất ra một dãy số,falsethay cho các tháng không kết thúc vào thứ Hai.

Có một lỗi trong trình thông dịch không cho phép tôi sử dụng Ðtrong thân hàm £. Sau khi sửa lỗi và bổ sung tính năng khác, đây là 18 byte trong cam kết hiện tại:

Do1@Ð400+UX e ¥2©X

1

Java, 143 129 byte

Điều này sử dụng API thời gian mới của Java 8.

y->{String s="";for(int m=0;++m<13;)if(java.time.YearMonth.of(y,m).atEndOfMonth().getDayOfWeek().ordinal()==0)s+=m+" ";return s;}

Đầu ra

Lưu ý rằng mỗi dòng có thêm một khoảng trống ở cuối.

4 12 
5 
9 
1 7 
2 10 
1 2 10 

Thử thách và thử nghiệm

import java.time.*;
import java.util.function.*;

public class Main {
    public static void main (String[] args) {
        IntFunction<String> func = year -> {
          String result = "";
          for (int month=1; month <= 12; month++) {
            if (YearMonth.of(year, month).atEndOfMonth().getDayOfWeek().ordinal() == 0) {
              result += month + " ";
            }
          }
          return result;
        };
        System.out.println(func.apply(1));
        System.out.println(func.apply(297));
        System.out.println(func.apply(1776));
        System.out.println(func.apply(2000));
        System.out.println(func.apply(2016));
        System.out.println(func.apply(3385));
    }
}

Dao cạo

  1. 143 đến 129 byte: sử dụng DayOfWeek::ordinalđể so sánh với hằng số thay vì hằng số enum.
    Cảm ơn @TimmyD cho ý tưởng chung nếu không phải là giải pháp chính xác! ;-)

@TimmyD thật đáng buồn, đó là một enum. Tuy nhiên, nó có một getValue()phương thức sẽ tiết kiệm một vài byte.
Celos

@Celos ordinal()tiết kiệm thêm 1 byte so với getValue(), mặc dù nó được đề xuất là không bao giờ sử dụng nó.
Olivier Grégoire

vâng, suy nghĩ tốt. Tôi đã đăng bình luận của mình mà không cần làm mới trước, vì vậy tôi không thấy phản hồi và chỉnh sửa của bạn.
Celos

1

GNU awk, 80 byte

{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}

Thí dụ

$ gawk '{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}' <<<2016
2
10
$
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.