出力:カレンダー月(ネイティブカレンダー生成関数なし)


8

YYYYMM形式で月と年を受け取ったら、その年の対応する暦月の出力を生成します。

たとえば、入力201312は次の出力を生成する必要があります。

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

唯一の秘訣は、ネイティブカレンダー生成関数がないことです... Linuxクローン、「cal」関数はありません...ムアハハハハ!

PS:カレンダーは、左端の月曜日から開始する必要があります。これは、出力が「cal」関数のようであることを保証しますが、日曜日を左端とする「cal」のように出力しないようにするためです。 ..

最小のコードサイズが優先されます。


1
カレンダーのように見せたい場合や、テキストを変更してそれをより明確に伝えたい場合があります。また、当選条件は?
ジャスティン

@Quincunx、あなたは私の良心のようで、デジタルのみです...
WallyWest

1
私はデジタルではないのを除いて...
Justin

1
「最小サイズの勝利。」何のサイズ?コードサイズの場合は、タグをcode-golfに変更してください
Justin

2
グレゴリオ暦が必要だと思いますが、何年ですか。
Peter Taylor

回答:


6

Python 2.7〜152

残念ながら、1752年9月には失敗しました。確かに、すべてのカレンダー関数をインポートしますが、使用するのは 1つだけで、週の開始日と日数を返すだけです。

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

比較的標準的なコードですが、これは私のお気に入りのビットです:

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

ブール値が整数にキャストされるため、現在の日付と曜日の開始日が日曜日(例:7)の場合、文字列の乗算を使用して新しい行を出力します。

代わりにx%7==0を使用することで、より直感的にキャラクターを節約できx%7<1ます。

テスト出力:

> 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

推測させてください:あなたは私のアプローチを別の言語に翻訳したばかりで、短くなりました。私はそれで大丈夫ですが、開示は素晴らしいでしょう。
John Dvorak

@JanDvorakああ どういたしまして。私もあなたのことを理解できませんでした。正直に言うと、必要な詳細なインポートを考えると、それがあなたのものを打ち負かすところになるだろうとショックを受けました。好奇心から、何をし52.timesているのですか?その掛け算ではない?

1
これはループ構造です。またはn.times{...}と同じです。乗算は次のようになります(0...n).each{...}0.upto(n-1){...}52 * ...
John Dvorak

@JanDvorak私は数年前に私が働いていた仕事でPythonを使って遊んだ...インデントの構文は少し苦痛だった...中かっこで慣れていたと思う... "\ n"が大好き*((s + w)%7 <1)トリック...これがJavaScriptで機能するかどうかを確認したことはありません...;)
WallyWest

あなたが言及したWikiのリファレンスは興味深いものでした。「イギリスとイギリスの領土のカレンダーを再構成したので、3月25日(レディの日)ではなく1月1日に新年が始まり、ほとんどの場合で使用されているグレゴリオ暦に従って実行されます。西ヨーロッパの。」英語が少し遅れていたのには驚きました…?
WallyWest

8

ルビー、 170 168文字

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

バグ修正:必要なライブラリを必要とせず(+16)、現在の曜日の代わりに7を法とするジュリアン日付を使用(-3)
正規表現の代わりに/ 100と%100を使用して日付を解析(-13)。LegoStormtrooprの回答から引用。and (-2)
への引数を囲む括弧を削除rjustDate.new


涼しい。徹底的にテストされていますが、変更することができますように思わない"#{l[i].to_s.rjust 2} #{?\n if i%7>5}""%2s %s"%[l[i],i%7>5?$/:""]
manatwork 2013

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

テスト中

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

カレンダー


Mathematicaの素晴らしい使い方!
WallyWest

2

SmileBASIC、204バイト

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

うるう年検出器はとても長いです...


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)

出力:

(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バイト

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

壊す

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バイト

最もエレガントな解決策ではない、と私は思う。

上位4桁が年、下位2桁が月の整数で入力します。

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

オンラインでお試しください!


提案する(13*m+4)/5+y%X*5/4-7*y/X/4代わりに1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4
ceilingcat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.