Output: Bulan Kalender (tanpa fungsi penghasil kalender asli)

8

Setelah menerima bulan dan tahun dalam format YYYYMM, hasilkan bulan kalender terkait untuk tahun itu.

Misalnya input 201312harus menghasilkan output berikut:

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

Satu-satunya trik adalah, TIDAK ada fungsi menghasilkan kalender asli ... jadi klon Linux, tidak ada fungsi "cal" ... Muahahahahah!

PS: Kalender harus dimulai dengan hari Senin sebagai hari paling kiri, ini untuk memastikan bahwa outputnya seperti fungsi "cal", tetapi tidak menampilkan seperti "cal", yang menjadikan hari Minggu sebagai hari paling kiri. ..

Ukuran kode terkecil menang.

WallyWest
sumber
1
Anda ingin terlihat seperti kalender, mungkin ingin mengubah teks Anda untuk mengatakannya dengan lebih jelas. Juga, bagaimana kondisi kemenangannya?
Justin
@ Quincunx, Anda seperti hati nurani saya, hanya digital ...
WallyWest
1
Kecuali saya bukan digital ...
Justin
1
"Ukuran terkecil menang." ukuran apa? Jika ini ukuran kode, maka ubah tag ke kode-golf
Justin
2
Saya kira Anda ingin kalender Gregorian, tetapi untuk rentang tahun berapa?
Peter Taylor

Jawaban:

6

Python 2.7 - 152

Sayangnya gagal untuk September 1752 . Memang, itu mengimpor semua fungsi kalender, tetapi hanya menggunakan 1, dan itu hanya mengembalikan hari awal minggu dan jumlah hari.

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)])

Kode yang relatif standar, tetapi ini adalah bit favorit saya:

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

Ini mencetak baris baru menggunakan perkalian string, jika jumlah hari saat ini dan hari mulai minggu adalah Minggu (misalnya 7) karena boolean dilemparkan ke bilangan bulat.

Ini menyimpan karakter lebih intuitif x%7==0dengan menggunakan x%7<1sebagai gantinya.

Hasil tes:

> 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

sumber
coba saya tebak: Anda baru saja menerjemahkan pendekatan saya ke bahasa lain dan hasilnya lebih pendek. Saya setuju dengan itu, tetapi pengungkapan akan menyenangkan.
John Dvorak
@ JanDvorak Oh tidak. Tidak semuanya. Aku bahkan tidak bisa mengerti milikmu. Sejujurnya, mengingat impor verbose yang saya butuhkan, saya terkejut itu akan hampir mengalahkan Anda. Hanya karena penasaran apa yang sedang 52.timesdilakukan? Ini bukan multiplikasi?
1
Ini adalah konstruksi perulangan. n.times{...}identik dengan (0...n).each{...}atau 0.upto(n-1){...}. Perkalian akan menjadi52 * ...
John Dvorak
@JanDvorak Saya bermain dengan Python beberapa tahun yang lalu dalam pekerjaan yang saya kerjakan ... Saya menemukan sintaks indentasi sedikit sakit ... Jadi digunakan untuk kurung keriting kurasa ... CINTA "\ n" * ((s + w)% 7 <1) trik ... Saya tidak pernah memeriksa untuk melihat apakah ini akan berfungsi dalam JavaScript ...;)
WallyWest
Referensi Wiki yang Anda sebutkan menarik ... "Ini mereformasi kalender Inggris dan Kerajaan Inggris sehingga tahun baru dimulai pada 1 Januari daripada 25 Maret (Lady Day) dan akan berjalan sesuai dengan kalender Gregorian, seperti yang digunakan di sebagian besar Eropa barat. " Saya terkejut bahasa Inggris sedikit di belakang itu ...?
WallyWest
8

Rubi, 170 168 karakter

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}"}

Perbaikan bug: tidak memerlukan pustaka yang diperlukan (+16) menggunakan julian date modulo 7 alih-alih hari kerja saat ini secara langsung (-3)
digunakan / 100 dan% 100 untuk mengurai tanggal alih-alih regex (-13). Diambil dari jawaban LegoStormtroopr.
menghapus tanda kurung di sekitar argumen ke rjustdan Date.new(-2)

John Dvorak
sumber
Keren. Tidak diuji secara mendalam, tetapi tampaknya bahwa Anda dapat mengubah "#{l[i].to_s.rjust 2} #{?\n if i%7>5}"dengan "%2s %s"%[l[i],i%7>5?$/:""].
manatwork
5

Mathematica 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]]

Pengujian

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

kalender

DavidC
sumber
Penggunaan hebat Mathematica!
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, detektor tahun kabisat itu SANGAT panjang ...

12Me21
sumber
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)

Keluaran:

(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
tenang
sumber
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);

kerusakan

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
Titus
sumber
0

C (gcc) , 242 byte

Bukan solusi yang paling elegan, saya kira.

Input dalam bentuk bilangan bulat dengan empat digit tinggi membentuk tahun, dan dua digit rendah bulan.

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);}

Cobalah online!

gastropner
sumber
Sarankan (13*m+4)/5+y%X*5/4-7*y/X/4alih-alih1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4
ceilingcat