Аргументируй... покажи в реальной математике операцию побитового сдвига вправо. Жду ссылку.
Не собираюсь я на это тратить и секунды.
Mozilla/4.0 (compatible; U; MSIE 6.0; Windows NT 5.1)
Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 6.0)
потратил 10 минут на разбор
for(B=i=y=u=b=i=5-5,x=10,I=[],l=[];B++<304;I[B-1]=B%x?B/x%x<2|B%x<2?7:B/x&4?0:l[i++]="ECDFBDCEAAAAAAAAIIIIIIIIMKLNJLKM@G@TSb~?A6J57IKJT576,+-48HLSUmgukgg OJNMLK IDHGFE".charCodeAt(y++)-64:7);function X(c,h,e,s){c^=8;for(var o,S,C,A,R,T,G,d=e&&X(c,0)>1e4,n,N=-1e8,O=20,K=78-h<<9;++O<99;)if((o=I[T=O])&&(G=o^c)<7){A=G--&2?8:4;C=o-9?l[61+G]:49;do if(!(R=I[T+=l[C]])&&!!G|A<3||(R+1^c)>9&&G|A>2){if(!(R-2&7))return K;n=G|(c?T>29:T<91)?o:6^c;S=(R&&l[R&7|32]*2-h-G)+(n-o?110:!G&&(A<2)+1);if(e>h||1<e&e==h&&S>2|d){I[T]=n;I[O]=0;S-=X(c,h+1,e,S-N);if(!(h||e-1|B-O|T-b|S<-1e4))return W(),c&&setTimeout("X(8,0,2),X(8,0,1)",75);I[O]=o;I[T]=R}if(S>N||!h&S==N&&Math.random()<.5)if(N=S,e>1)if(h?s-S<0:(B=O,b=T,0))break}while(!R&G>2||(T=O,(G||A>2|(c?O>78:O<41)&!R)&&++C*--A))}return-K+768<N|d&&N}function W(){i="<table>";for(u=18;u<99;document.body.innerHTML=i+=++u%x-9?"<th width=60 height=60 onclick='I[b="+u+"]>8?W():X(0,0,1)'style='font-size:50px'bgcolor=#"+(u-B?u*.9&1||9:"d")+"0f0e0>&#"+(I[u]?9808+l[67+I[u]]:160):u++&&"<tr>")B=b}W()
>>
- такая же математическая операция как +
, ~
, /
, %
, &
или |
или даже **
.2) почему new Array()? = []; - не?
[,,,,,,,]
а не new Array(7)
.console.log(cal(2020,8));
[
[ , , , , , , 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, , , , , ]
]
Причем тут ФП?
Math.trunc
, Math.pow
- это и есть побочные эффекты. function cal ( year, month ) {
const { trunc, pow } = Math;
const leap = year % 4;
const result = new Array ( );
let weekCounter = ( trunc ( 23 * month / 9 ) + ( month < 3 ? year -- : year - 2 ) + 5 + trunc ( year / 4 ) - trunc ( year / 100 ) + trunc ( year / 400 ) ) % 7;
const monthEnd = 29 + trunc ( ( 62648012 + pow ( 2, 2 * 2 ) * ! leap ) / pow ( 2, month * 2 ) ) % pow( 2, 2 );
for ( let day = 1, week = 0; day < monthEnd; ++ day ) {
if ( ! result [ week ] ) {
result [ week ] = new Array ( 7 );
}
result [ week ] [ weekCounter ] = day;
weekCounter = ++ weekCounter % 7;
week += ! weekCounter;
}
return result;
}
m >> n * 2
куда понятнее, чем Math.trunc ( m / Math.pow ( 2, n * 2 ) )
. Аналогично этому, если бы, например, я не знал таблицу умножения и категорически избегал таких операций как m = x * y
, реализуя циклом let res = 0; for(let i = 0; i < y; i ++) res = res + x
. Вы смеётесь, а такое я встречаю постоянно. Там тоже самое: простая формула в одну операцию с логарифмом заменена целой программой разными циклами. У кого-то вызывает сложности безопасный арктангенс Math.atan2()
[ссылку добавлю чуть позже]. Что тут сказать?! И среди программистов порой случаются гуманитарии.