風邪はひくもの、なおすもの

どうもcatupperです
風邪気味です。
なんだか風邪をひとつの基準にこのブログ書いてる感じがします。
今年一回風邪引いたからもう引かないだろうと思ってたんですけどねー
ちょうど1ヶ月で再び風邪をひいてしまいますた。
原因はおそらくベッドにおける「ダブル」という概念の存在だと思われます。
ある所以で先日東京に行きまして、まぁGDDなんですけど、そこの宿泊施設で一部屋で5人泊まるシチュエーションが発生したわけです。
その部屋で用意されてたのはダブルのベッド×2とシングル一つ。ずば抜けて背の高い人がいたので自動的にシングルはそのひとによってmalloc
というわけで私はダブルで寝ることになったのですね、荷物整理して眠りにつきました。まぁここまでは順調。
あるとき目が覚める。 なんだこの寒さは。 東京の気温はこんなに低かったか。 理解に苦しんだが、とどのつまり得た結論は「布団がない」。
あるぇーと思い私と同じベッドで寝てる方を見てみると見事に人間サイズの春巻きが出来上がっておりまして。ほんとうに春巻きなみに布団が
まきついていたので、取り返すにも起こすしかない。それに割りと中央までよってきてて私のベッド上生活も危うい、そういえば弟にもよくこの類の
奇襲攻撃をされたことがあるなーといらない思い出に浸りつつも頭を働かせる。この事象を処理しなければ落ちる先にあるのは我が荷物。 
赤い服まみれになってしまうことだろう。 なので起こしてトラブルシューティングしようと思った。しかし・・・

この時フラグが動いた!

起こそうと思い顔を覗き込むと、非常にこころよさそうな寝顔をしてるではないか。人のことを気にしないつっぱしる男度ナンバーワン(俺調べ)の私
でさえ起こすのをためらった。 ここで起こすのは後々に悔いを生むのではなかろうか。 別に一晩だし残り睡眠時間わずか180分。耐え切れるだろう。
しかし寒さは我慢するとして、落ちる危機はいかに回避するか。 この時の私の頭の回転は寝起きにしては冴えてた! そう!最初から落ちていれば良い!
添削しがいのあるロジックを踏んだ結果私は床で寝ることにした。靴で踏まれているようなところでなくてよかった。


翌朝


快眠、とは言えないもの十分な睡眠を取りその日の予定を済ませ大阪へ帰宅。このときから少し咳の傾向アリ。
そして今日、起きて一番最初に脳内で処理されたBigIssueは 「かぜひいてるー!」。
学校から帰宅したら咳の量が多くなってるしまじうけるんですけど。 次の日少林寺の部活に行くん予定があるのだ。責任者はどこか。
  

そんな経緯で風邪を引きました。 ダブルのベッドなんていらねー ダブルはトイレットペーパーだけで十分だー!


はい今回は風邪の特効薬として有名なshortcodingをしようかと思います。
ただするだけじゃ今までと一緒なのでちょっと関係無いことを羅列しまーす。

引数の評価順序。

どんな所以でこんなこと考える必要になったか忘れたがきっとprintfとフォーマットされる側のインクリメントだとおもわれ。

main(a){
printf("hoge%d%d"+a,a,a++);
}

これを実行すると何が起こるか。
出力

ge21

と出力されます。

つまりどういうことかというと引数は右から評価されていくよということ。
printfのフォーマットは対応する引数が少ないとエラーを吐くが多いぶんにはスルーなので、余計な処理を入れることができちゃったりする。

printf("%d%d",a,b,a+=b);//実用性のある例なんてなかった

argc[0]のlength

Perlとかは特殊変数の初期値に特別な文字列が入っててなにかと使えたりしますが
Cでもargc使えないかと思って調べてみますた。
調べ方は

main(int a,char *argc[]){
while(strlen(argc[0])>任意の整数);
return 0;
}

でwrong answerになる最大の整数を二分探索しながらみつけた。
AOJ: 7文字
POJ: 30文字
だったです なんかの役に立てたらいいね。POJなげえ

多次元配列

Cに多次元配列なんてない あれはポインタのポインタだー 
ゆえに足し算で参照できる

array[x]=*(array+x); //True
//よって
array[x][y][z]==*(*(*(array+x)+y)+z);//True

んでもっていかに縮めるか 

//どれかが0の場合
array[x][y][0]==1;
array[x][0][z]==2;
array[0][y][z]==3;
printf("%d %d %d",*y[x[array]],z[*x[array]],z[y[*array]]);//1 2 3

という感じで1byteへりまーす。

main再帰かfor loopか

とあるコードを組みたい。
たとえば
nを偶数個入力していくから
n1+n2-n3+n4.....nk-n(k+1)をもとめろ
みたいなコード。

//for loop
b;main(a){for(;~scanf("%d",&a);b=a-b);b=printf("%d\n",-b);}
//main再帰
b;main(a){b=~scanf("%d",&b)?main(b-a):printf("%d\n",1-a);}

とこのようにmain再帰のほうが短くなりました。
ここまで読み進むほどのshortcoderなら経験則的にmain再帰よりfor loopのほうが短くなることが多いことを知ってるだろう。
main再帰も時々短くなるがどのようなときなのだろうか。
1.ループする処理の最後が代入
一般的に

b;main(a){for(;HOGE;HUGA,a=b);PIYO;}
b;main(a){HOGE?main(HUGA,b):PIYO;}

というかんじでbyte数が短くなる。
しかし幾つか条件がついてくる。
for文の初期化文は空でないといけない、aの初期値が1、PIYOで0を返するか代入をしないといけない、HOGEやPIYOが優先度的に()が必要ない文じゃないといけない(PIYOについてはHOGEを!演算子で否定して入れ替える手もある)。etc..
色々めんどくさい。
2.for文のループ処理部分を{}でくくらないといけない場合

main(){for(;a;){c;d;}}
main(){d,a&&main(c);}

と1byte減る。
for文内に2文ないといけません。

finish

いじょうです。 最後の方、眠たかったんで適当に書きました。 すいません。