Ausgabe: Kalendermonat (ohne native Funktionen zur Kalendererstellung)

8

Generieren Sie nach Erhalt von Monat und Jahr im Format JJJJMM die Ausgabe des entsprechenden Kalendermonats für dieses Jahr.

Beispielsweise sollte die Eingabe 201312die folgende Ausgabe erzeugen:

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

Der einzige Trick ist, KEINE nativen Funktionen zum Generieren von Kalendern ... also Linux-Klone, keine "cal" -Funktion ... Muahahahahah!

PS: Der Kalender muss mit Montag als ganz links stehendem Tag beginnen. Dies soll sicherstellen, dass die Ausgabe der Funktion "cal" entspricht, nicht jedoch mit "cal", bei der Sonntag ganz links steht. ..

Die kleinste Codegröße gewinnt.

WallyWest
quelle
1
Sie möchten, dass es wie ein Kalender aussieht, möchten möglicherweise Ihren Text ändern, um dies klarer auszudrücken. Was sind auch die Gewinnbedingungen?
Justin
@ Quincunx, du bist wie mein Gewissen, nur digital ...
WallyWest
1
Außer ich bin nicht digital ...
Justin
1
"Kleinste Größe gewinnt." Größe von was? Wenn es sich um eine Codegröße handelt, ändern Sie bitte das Tag in Code-Golf
Justin
2
Ich nehme an, Sie wollen den Gregorianischen Kalender, aber für welchen Zeitraum?
Peter Taylor

Antworten:

6

Python 2.7 - 152

Leider scheitert es für September 1752 . Zugegeben, importiert sie alle die Kalender - Funktionen, aber nur verwendet 1, und das gibt nur den Starttag der Woche und die Anzahl der Tage.

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

Relativ Standardcode, aber das ist mein Lieblingsbit:

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

Die neue Zeile wird mithilfe der Zeichenfolgenmultiplikation gedruckt, wenn die Nummer des aktuellen Tages und des Starttages der Woche Sonntag (z. B. 7) ist, da der Boolesche Wert in eine Ganzzahl umgewandelt wird.

Dadurch wird ein Zeichen intuitiver gespeichert, x%7==0indem x%7<1stattdessen verwendet wird.

Testausgabe:

> 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

quelle
Lassen Sie mich raten: Sie haben gerade meinen Ansatz in eine andere Sprache übersetzt und er wurde kürzer. Ich bin damit einverstanden, aber die Offenlegung wäre nett.
John Dvorak
@ JanDvorak Oh nein. Ganz und gar nicht. Ich konnte deine nicht einmal verstehen. Um ehrlich zu sein, war ich angesichts der ausführlichen Importe, die ich brauchte, schockiert, dass es fast Ihren schlagen würde. Nur aus Neugier, was 52.timesmacht das? Es ist keine Multiplikation?
1
Es ist ein Schleifenkonstrukt. n.times{...}ist identisch mit (0...n).each{...}oder 0.upto(n-1){...}. Multiplikation wäre52 * ...
John Dvorak
@JanDvorak Ich habe vor ein paar Jahren mit Python in einem Job gespielt, in dem ich gearbeitet habe ... Ich fand die Einrückungssyntax ein bisschen schmerzhaft ... Ich glaube, ich habe mich an lockige Klammern gewöhnt ... LIEBE das "\ n" * ((s + w)% 7 <1) Trick ... Ich habe nie überprüft, ob dies in JavaScript funktionieren würde ...;)
WallyWest
Die von Ihnen erwähnte Wiki-Referenz war interessant ... "Sie reformierte den Kalender von England und den britischen Dominions so, dass ein neues Jahr am 1. Januar statt am 25. März (Lady Day) begann und nach dem Gregorianischen Kalender ablief, wie er in den meisten Fällen verwendet wird von Westeuropa. " Ich bin überrascht, dass die Engländer damals etwas zurückgeblieben sind ...?
WallyWest
8

Rubin, 170 168 Zeichen

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

Bugfix: Die erforderliche Bibliothek (+16) benötigte nicht julian date modulo 7 anstelle des aktuellen Wochentags direkt (-3)
verwendet / 100 und% 100, um das Datum anstelle von Regex (-13) zu analysieren. Entnommen aus der Antwort von LegoStormtroopr.
entfernte die Klammern um das Argument zu rjustund Date.new(-2)

John Dvorak
quelle
Cool. Nicht abschließend getestet, aber es scheint , dass Sie ändern können , "#{l[i].to_s.rjust 2} #{?\n if i%7>5}"mit "%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]]

Testen

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

Kalender

DavidC
quelle
Gute Verwendung von Mathematica!
WallyWest
2

SmileBASIC, 204 Bytes

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, dieser Schaltjahrdetektor ist SEHR lang ...

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

Ausgabe:

(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
quietmint
quelle
0

PHP, 153 147 Bytes

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

Nervenzusammenbruch

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
quelle
0

C (gcc) , 242 Bytes

Ich vermute, nicht die eleganteste Lösung.

Eingabe in Form einer Ganzzahl, wobei die vier hohen Ziffern das Jahr und die niedrigen zwei Ziffern den Monat bilden.

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

Probieren Sie es online aus!

Gastropner
quelle
Schlagen Sie (13*m+4)/5+y%X*5/4-7*y/X/4statt1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4
Deckenkatze