140字以内ブックマークレット

個人的にハマってる140字以内のブックマークレット。"javascript:" で既に11字使ってるのが痛い。


その1。
今月のカレンダー。

javascript:d=new Date;d.setDate(1);w=d.getDay();c=[];i=0;while(w--)c[i++]='\t';for(n=1;n<32;n++)c[i++]=n+(i%7?'\t':'\n');alert(c.join(''));

139字。

30日までの月と31日までの月と2月を分けようと思うと160字超えてしまう。閏年を判定すると180字ぐらいになってしまう。どうにかならんかなー。

119字でできた。

javascript:d=new Date;d.setDate(1);w=i=d.getDay();for(c='';w--;c+='\t');for(n=1;n<32;c+=n+++(++i%7?'\t':'\n'));alert(c)

それでも月判定は難しい。。


その2。
今見てる URL を twitter に投稿。

javascript:'<body onload=f.submit()><form action=//twitter.com/statuses/update.xml id=f method=post><input name=status value='+location+'>'

139字。

最初見たときは、こんなブックマークレットがあるの!? って思った。

その前までは document.body.innerHTML で書いてたんだけど、そういえばブックマークレットの最後に返す値は document.write っぽくなるよなあ、と↑の方法を os0x さんに教えてもらった後に気付いた。

action=//twitter.com/ というのも os0x さんのアイデア。http: って省略できるのね。

// から始まる URIRFC2396 などに書かれているけど、「めったに使われない」とあるのでどれほど使えるのかわからない。scheme についても定義されていないし、ブラウザのサポートもよくわからない。

net_path      = "//" authority [ abs_path ]

140字以内で何ができるかな?

今月の日数

javascript:d=new Date;m=d.getMonth();y=d.getFullYear();s={3:1,5:1,8:1,10:1};alert(m==2?(y%4?28:y% 100?29:28):s[m]?30:31)

120文字。こんなに書かないといけないのか。

%100 のところにスペースを入れないと Unicode に変換されてしまう可能性がある。


id:Koonies さん、カレンダー&日数判定で149文字まで下がりましたが限界気味…

javascript:with(new Date)setMonth(getMonth()+1),setDate(0),d=getDate(),i=getDay()-d%7+1;c='';for(n=-i;n++<d;)c+=n>0?n+(++i%7?'\t':'\n'):'\t';alert(c)

140文字以内のカレンダー

コメント欄の id:nanto_vi さんの回答が一番乗りと思ってましたが、それより前に id:murky-satyr さんから twitter で回答が寄せられていたのを見落としていました。

130文字で、nanto_vi さんのものよりは魔術めいてないかなーという気がします。

javascript:with(new Date)for(c=i=0;setDate(++i),!c|getDate()>1;)c=c?c+(w++%7?t:'\n')+i:Array(w=1+getDay()).join(t='\t')+1;alert(c)
http://twitter.com/m_satyr/status/5909908800

お二方には、お見事と言いたいです。

まだまだ減る

うーぱーさんの

javascript:with(new Date)for(a=[],i=j=0;setDate(++i),j=j?j:getDay(),getDate()==i;a[j+1]=i+(++j%7?"":"\n"));alert(a.join("\t"))

今月のカレンダー126文字

http://twitter.com/uupaa/status/5991517401

や murky-satyr さんの

@uupaa 成程。その方針なら余裕ですね

javascript:with(new Date)for(a=i=[];getDate(setDate(++i))==i;a[++j]=j%7?i:i+"\n")i-1?0:j=getDay();alert(a.join("\t"))
http://twitter.com/m_satyr/status/5993593005

だともっと減ります。i=0 しておいて getDate(setDate(++i))==i でループするのがミソ。