fork download
  1. #define R return
  2. #define L(i) for(;i-->0;)
  3. u(y,m){R m-1?30+((2773>>m)&1):28+(y%4==0&&y%100||y%400==0);}s(y,m,g){g+=4;L(m)g+=u(y,m),g%=7;L(y)g+=1+u(y,1),g%=7;R g;}z(y,m,r){m=12;L(m)s(y,m,13)-4||(r|=1<<(m+1));R r;}
  4.  
  5.  
  6. w(y,m,r){m=12;L(m)s(y,m,u(y,m))||(r|=1<<(m+1));R r;}
  7. /*
  8.   // ritorna il numero dei giorni di anno=y mese=m con mese in 0..11
  9.   // m==1 significa febbraio y%4?0:y%100?1:!(y%400) non funziona
  10.   u(y,m){R m-1?30+((2773>>m)&1):28+(y%4==0&&y%100||y%400==0);}
  11.  
  12.   // argomenti anno:y[0..0xFFFFFFF] mese:m[0..11] giorno:g[1..u(y,m)]
  13.   // ritorna il numero del giorno[0..6]
  14.   s(y,m,g)
  15.   {g+=4; // correzione per il giorno di partenza anno mese giorno = 0,1,1
  16.   L(m)g+= u(y,m),g%=7; // m:0..m-1 somma mod 7 i giorni del mese dell'anno y
  17.   L(y)g+=1+u(y,1),g%=7; // y:0..y-1 somma mod 7 gli anni da 0..y-1
  18.   // g+=1+u(y,1) poiche' (365-28)%7=1 e 1 e' febbraio
  19.   R g;
  20.   }
  21.  
  22.   // argomenti anno:y[0..0xFFFFFFF], m=0 r=0
  23.   // calcola tutti gli ultimi giorni del mese dell'anno y che cadono di lunedi'
  24.   // e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
  25.   w(y,m,r){m=12;L(m)s(y,m,u(y,m))||(r|=1<<(m+1));R r;}
  26.  
  27.   // argomenti anno:y[0..0xFFFFFFF], m=0 r=0
  28.   //ritorna in r il numero dei mesi che ha giorno 13 di venerdi[==4]
  29.   // e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
  30.   z(y,m,r){m=12;L(m)s(y,m,13)-4||(r|=1<<(m+1));R r;}
  31.   */
  32.  
  33. #define P printf
  34. #define W while
  35. #define M main
  36. #define F for
  37. #define U unsigned
  38. #define N int
  39. #define B break
  40. #define I if
  41. #define J(a,b) if(a)goto b
  42. #define G goto
  43. #define P printf
  44. #define D double
  45. #define C unsigned char
  46. #define A getchar()
  47. #define O putchar
  48. #define Y malloc
  49. #define Z free
  50. #define S sizeof
  51. #define T struct
  52. #define E else
  53. #define Q static
  54. #define X continue
  55. M()
  56. {N y,m,g,r,arr[]={1,297,1776,2000,2016,3385}, arr1[]={2016,1,1997,1337,123456789};
  57. C*mese[]={"gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"};
  58. C*giorno[]={"Lun","Mar","Mer","Gio","Ven","Sab","Dom"};
  59. P("Inserisci Anno mese giorno>");r=scanf("%d %d %d", &y, &m, &g);
  60. P("Inseriti> %d %d %d r=%d\n", y, m, g, r);
  61. I(r!=3||m>12||g>u(y,m-1))R 0;
  62. r=s(y,m-1,g);// 12-> 11 -> 0..10
  63. P("Risultato=%d giorno=%s\n", r, giorno[r]);
  64. r=w(y,0,0);P(" r=%d ", r);P("\n");
  65. F(m=0;m<6;++m)
  66. {P("N anno=%d -->",arr[m]);
  67. r=w(arr[m],0,0); // ritorna in r i mesi tramite i suoi bit...
  68. F(y=1;y<13;++y) I(r&(1<<y))P("%s ",mese[y-1]);
  69. P("\n");
  70. }
  71. F(m=0;m<4;++m)
  72. {P("N anno=%d -->",arr1[m]);
  73. r=z(arr1[m],0,0); // ritorna in r i mesi tramite i suoi bit...
  74. F(y=1;y<13;++y) I(r&(1<<y))P("%s ",mese[y-1]);
  75. P("\n");
  76. }
  77.  
  78. }
  79.  
Success #stdin #stdout 0s 2176KB
stdin
2016 1 1
stdout
Inserisci Anno mese giorno>Inseriti> 2016 1 1 r=3
Risultato=4 giorno=Ven
 r=1028 
N anno=1 -->apr dic 
N anno=297 -->mag 
N anno=1776 -->set 
N anno=2000 -->gen lug 
N anno=2016 -->feb ott 
N anno=3385 -->gen feb ott 
N anno=2016 -->mag 
N anno=1 -->apr lug 
N anno=1997 -->giu 
N anno=1337 -->set dic