最短コード到達

swap linesで最短コードに到達できた。
割と簡単に到達できたコードだけど、やっぱり達成感があるなあ。
多分始めた当初では到達できなかっただろうから、ちょっとは成長しているんだと思いたい。

swap lines

2行読み込んでから入れ替えて表示しろっていう問題。
幸いテストコードが全部偶数行で構成されていたので、入力が奇数行だった場合なんかを気にしないでいいので楽できた。
なんの工夫もなく素直に書いても52B。
ちなみに最短コードは手元の環境では動かない環境依存のコードでした。


52B

t;

main(o)
{
  for(; gets(&o); puts(&t), puts(&o))
    gets(&t);
}

短縮する過程で気付いたことだけど、getsの引数を省略して書いたコードが動作した場合
直前に起動した関数に渡した引数が使用されて動くみたい。
多分スタックポインターに残ってるのを使用してるのかなと無責任に予想してみる。
コードはこんな感じ。

main(i)
{
  gets(&i);  //ここでhogeを入力
  gets();    //ここでpiyoを入力
  puts(&i);  //表示はpiyoになる
}

これだと落ちる。

main(i)
{
  gets();  //puts(gets())としても落ちる
}

stdioとかをincludeしてしまうとgetsの引数がないってエラーになるので、ゴルフにしか使えないけど。
そもそも他の環境でも同じ動作になるのかもわからないという。
うーん、C言語にはまだわからないことがたくさんあるなあ。