Salida: Mes calendario (sin funciones de generación de calendario nativas)

8

Al recibir el mes y el año en formato AAAAMM, genere la salida del mes calendario correspondiente para ese año.

Por ejemplo, la entrada 201312debe generar la siguiente salida:

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

El único truco es, NO hay funciones nativas generadoras de calendario ... así que clones de Linux, no hay función "cal" ... ¡Muahahahahah!

PD: El calendario debe comenzar con el lunes como el día más a la izquierda, esto es para asegurarse de que la salida sea como la función "cal", pero no salga como "cal", que tiene el domingo como su día más a la izquierda. ..

El tamaño de código más pequeño gana.

WallyWest
fuente
1
Desea que se vea como un calendario, puede cambiar su texto para decirlo más claramente. Además, ¿cuáles son las condiciones ganadoras?
Justin
@Quincunx, eres como mi conciencia, solo digital ...
WallyWest
1
Excepto que no soy digital ...
Justin
1
"El tamaño más pequeño gana". tamaño de qué? Si es el tamaño del código, entonces cambie la etiqueta a code-golf
Justin
2
Supongo que quieres el calendario gregoriano, pero ¿para qué rango de años?
Peter Taylor

Respuestas:

6

Python 2.7 - 152

Desafortunadamente falla para septiembre de 1752 . Por supuesto, importa todas las funciones del calendario, pero solo usa 1, y eso solo devuelve el día de inicio de la semana y el número de días.

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

Código relativamente estándar, pero este es mi bit favorito:

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

Imprime la nueva línea usando la multiplicación de cadenas, si el número del día actual y el día de inicio de la semana es domingo (por ejemplo, 7) ya que el booleano se convierte en un entero.

Esto ahorra un personaje en el más intuitivo x%7==0al usar en su x%7<1lugar.

Prueba de salida:

> 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

fuente
déjame adivinar: acabas de traducir mi enfoque a otro idioma y se hizo más corto. Estoy de acuerdo con eso, pero la divulgación sería buena.
John Dvorak
@ JanDvorak Oh no. De ningún modo. Ni siquiera pude entender el tuyo. Para ser honesto, dadas las importaciones detalladas que necesitaba, me sorprendió que estuviera a punto de vencer a la suya. Solo por curiosidad, ¿qué está 52.timeshaciendo? ¿No es multiplicación?
1
Es una construcción en bucle. n.times{...}es idéntico a (0...n).each{...}o 0.upto(n-1){...}. La multiplicación sería52 * ...
John Dvorak, el
@ JanDvorak Jugué con Python hace unos años en un trabajo en el que estaba trabajando ... Encontré la sintaxis de sangría un poco dolorosa ... Así que solía usar llaves, supongo ... ME ENCANTA la "\ n" * ((s + w)% 7 <1) truco ... Nunca he verificado si esto funcionaría en JavaScript ...;)
WallyWest
La referencia de Wiki que mencionaste fue interesante ... "Reformaba el calendario de Inglaterra y los Dominios Británicos para que un nuevo año comenzara el 1 de enero en lugar del 25 de marzo (Lady Day) y corriera según el calendario gregoriano, como se usa en la mayoría de Europa occidental ". Me sorprende que los ingleses estuvieran un poco retrasados ​​...
WallyWest
8

Rubí, 170 168 caracteres

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

Corrección de error: no requería que la biblioteca necesaria (+16) usara el módulo de fecha juliana 7 en lugar del día de la semana actual directamente (-3)
usado / 100 y% 100 para analizar la fecha en lugar de expresiones regulares (-13). Tomado de la respuesta de LegoStormtroopr.
eliminado los paréntesis alrededor del argumento para rjusty Date.new(-2)

John Dvorak
fuente
Frio. No se ha probado exhaustivamente, pero parece que puede cambiar "#{l[i].to_s.rjust 2} #{?\n if i%7>5}"con el "%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]]

Pruebas

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

calendarios

DavidC
fuente
Gran uso de 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, ese detector de año bisiesto es MUY largo ...

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

Salida:

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

Descompostura

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
Tito
fuente
0

C (gcc) , 242 bytes

No es la solución más elegante, sospecho.

Ingrese en forma de un entero con los cuatro dígitos altos que forman el año, y los dos dígitos bajos del mes.

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

Pruébalo en línea!

gastropner
fuente
Sugerir en (13*m+4)/5+y%X*5/4-7*y/X/4lugar de1+(26*m-2)/10-2*y/X+5*(y%X)/4+y/X/4
ceilingcat