Đầu ra: Tháng theo Lịch (không có chức năng tạo lịch gốc)


8

Khi nhận được tháng và năm ở định dạng YYYYMM, hãy tạo đầu ra của tháng theo lịch tương ứng cho năm đó.

Ví dụ: đầu vào 201312sẽ tạo đầu ra sau:

Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

Chỉ có một mẹo nhỏ là KHÔNG có chức năng tạo lịch bản địa ... vì vậy Linux nhân bản, không có chức năng "cal" ... Muahahahahah!

PS: Lịch phải bắt đầu vào thứ Hai là ngày ngoài cùng, điều này là để đảm bảo rằng đầu ra giống như chức năng "cal", nhưng không xuất ra như "cal", có ngày Chủ nhật là ngày còn lại của ngày. ..

Kích thước mã nhỏ nhất sẽ thắng.


1
Bạn muốn nó trông giống như một lịch, có thể muốn thay đổi văn bản của bạn để nói rõ hơn. Ngoài ra, các điều kiện chiến thắng là gì?
Justin

@Quincunx, bạn giống như lương tâm của tôi, chỉ là kỹ thuật số ...
WallyWest

1
Ngoại trừ tôi không phải là kỹ thuật số ...
Justin

1
"Kích thước nhỏ nhất sẽ thắng." kích thước của cái gì? Nếu đó là kích thước mã, vui lòng thay đổi thẻ thành mã golf
Justin

2
Tôi đoán bạn muốn lịch Gregorian, nhưng trong khoảng năm nào?
Peter Taylor

Câu trả lời:


6

Con trăn 2.7 - 152

Thật không may, nó thất bại cho tháng 9 năm 1752 . Cấp, nó nhập tất cả các chức năng lịch, nhưng chỉ sử dụng 1, và điều đó chỉ trả về ngày bắt đầu trong tuần và số ngày.

from calendar import*
w,l=monthrange(*divmod(input(),100))
print" Mo Tu We Th Fr Sa Su\n"+"   "*w+''.join(["%3d"%s+"\n"*((s+w)%7<1)for s in range(1,l+1)])

Mã tương đối chuẩn, nhưng đây là bit yêu thích của tôi:

"\n"*((s+w)%7<1)

Nó in dòng mới bằng cách nhân chuỗi, nếu số của ngày hiện tại và ngày bắt đầu trong tuần là Chủ nhật (ví dụ 7) khi boolean được chuyển thành một số nguyên.

Điều này tiết kiệm một nhân vật trực quan hơn x%7==0bằng cách sử dụng x%7<1thay thế.

Đầu ra thử nghiệm:

> 198210
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

hãy để tôi đoán: bạn vừa dịch cách tiếp cận của tôi sang ngôn ngữ khác và nó đã xuất hiện ngắn hơn. Tôi ổn với điều đó, nhưng tiết lộ sẽ tốt đẹp.
John Dvorak

@JanDvorak Ồ không. Không có gì. Tôi thậm chí không thể hiểu bạn. Thành thật mà nói, với những nhập khẩu dài dòng mà tôi cần, tôi đã bị sốc vì nó sẽ đến gần để đánh bại bạn. Chỉ tò mò không biết đang 52.timeslàm gì? Nó không nhân lên?

1
Đó là một cấu trúc lặp. n.times{...}là giống hệt với (0...n).each{...}hoặc 0.upto(n-1){...}. Phép nhân sẽ là52 * ...
John Dvorak

@JanDvorak Tôi đã chơi với Python vài năm trước trong một công việc tôi đang làm việc ... Tôi thấy cú pháp thụt lề hơi đau một chút ... Đã quen với dấu ngoặc nhọn Tôi đoán ... YÊU "\ n" * ((s + w)% 7 <1) lừa ... Tôi chưa bao giờ kiểm tra xem liệu điều này có hoạt động trong JavaScript không ...;)
WallyWest

Tài liệu tham khảo Wiki mà bạn đề cập rất thú vị ... "Nó đã cải tổ lịch của Vương quốc Anh và Vương quốc Anh để một năm mới bắt đầu vào ngày 1 tháng 1 thay vì ngày 25 tháng 3 (Ngày phụ nữ) và sẽ chạy theo lịch Gregorian, như được sử dụng trong hầu hết của Tây Âu. " Tôi ngạc nhiên khi tiếng Anh bị chậm một chút sau đó ...?
WallyWest

8

Hồng ngọc 170 168 ký tự

g=gets.to_i
require'date'
d=Date.new g/100,g%100
puts'Mo Tu We Th Fr Sa Su'
l=['']*(d.jd%7)+[*1..(d>>1).jd-d.jd]
56.times{|i|$><<"#{l[i].to_s.rjust 2} #{?\n if i%7>5}"}

Sửa lỗi: không yêu cầu thư viện cần thiết (+16) sử dụng modulo ngày julian 7 thay vì trực tiếp ngày trong tuần hiện tại (-3)
được sử dụng / 100 và% 100 để phân tích ngày thay vì regex (-13). Lấy từ câu trả lời của LegoStormtroopr.
đã xóa các dấu ngoặc đơn xung quanh đối số thành rjustDate.new(-2)


Mát mẻ. Không kiểm tra tường tận, nhưng dường như bạn có thể thay đổi "#{l[i].to_s.rjust 2} #{?\n if i%7>5}"với "%2s %s"%[l[i],i%7>5?$/:""].
manatwork

5

Toán học 203

g@d_:=Module[{w={"Mo","Tu","We","Th","Fr","Sa","Su"},c},
c@n_:=" "~ Table ~{n};
Grid@Partition[Join[w,c[Position[w,StringTake[ToString@DayName@d,2]][[1,1]]-1],
Range@DayCount[d,d~DatePlus~{1,"Month"}],c@6],7]]

Kiểm tra

g[{2013, 12}]
g[{2014, 1}]
g[{2014, 2}]

lịch


Công dụng tuyệt vời của Mathicala!
WallyWest

2

SmileBASIC, 204 byte

INPUT Y$Y$[3]=Y$[3]+"/
DTREAD Y$+"/01"OUT Y,M,,W
W=W-1+!W*7?"Mo Tu We Th Fr Sa Su
FOR I=1TO 30+(1AND M-(M>7))-(M==2)*2+(Y MOD 4<1&&(Y MOD 100||Y MOD 400<1))LOCATE W*3,?STR$(I,2);
W=W+1
IF W>6 THEN W=0?
NEXT

Wow, máy dò năm nhuận đó RẤT dài ...


1

JavaScript (239)

h=prompt();y=h.slice(i=0,4);m=h[4]+h[5]-1;d=new Date(y,m);a='MoTuWeThFrSaSu'.match(/../g);for(p=0;p<(d.getDay()||7)-1;p++)a.push('  ');while(d.setDate(++i)&&d.getMonth()==m)a.push(9<i?i:' '+i);while(c=a.splice(0,7).join(' '))console.log(c)

Đầu ra:

(for 198210)                (for 201312)

Mo Tu We Th Fr Sa Su        Mo Tu We Th Fr Sa Su
             1  2  3                           1
 4  5  6  7  8  9 10         2  3  4  5  6  7  8
11 12 13 14 15 16 17         9 10 11 12 13 14 15
18 19 20 21 22 23 24        16 17 18 19 20 21 22
25 26 27 28 29 30 31        23 24 25 26 27 28 29
                            30 31

0

PHP, 153 147 byte

Mo Di We Th Fr Sa Su
<?=str_pad("",3*$w=date(w,$t=strtotime(chunk_split($argv[1],4,"-")."7")));while($d++<date(t,$t))printf("%2d "."
"[++$w%7],$d);

phá vỡ

echo"Mo Di We Th Fr Sa Su\n";   // header
echo str_pad("",3*                      // 4. print leading spaces
    $w=date(w,                          // 3. get weekday
    $t=strtotime(                       // 2. convert to unix timestamp
        chunk_split($argv[1],4,"-")."7" // 1. import, split to year-month-, append day 7
)));
while($d++<date(t,$t))                  // 5. loop $d through days of month:
    printf("%2d "."\n"[++$w%7],$d);         // print date, plus a linebreak for sundays

0

C (gcc) , 242 byte

Không phải là giải pháp thanh lịch nhất, tôi nghi ngờ.

Nhập vào dưới dạng một số nguyên với bốn chữ số cao tạo thành năm và hai chữ số thấp trong tháng.

X=100,W;f(d){int m=d%X,y=d/X,i=0,M=" >8><><>><><>"[m]/2+(m==2&(!(y%4)&&(y%X|!(y%400))));for(m+=m<3?y--,10:-2,W=(((1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4)%7)+6)%7,printf("Mo Tu We Th Fr Sa Su\n%*s",3*W,"");i<M;)printf("%2d%c",++i,W++%7^6?32:10);}

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


Đề xuất (13*m+4)/5+y%X*5/4-7*y/X/4thay vì1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4
trần mèo
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.