ページへ戻る

+ Links

 印刷 

blike​/works :: OSASK計画

osaskwiki:blike/works

blikeによるプログラム作品集 anchor.png

  • (by K, 2011.03.07)
Page Top

背景やルールなど anchor.png

  • blikeでどんなことができるのかを分かってもらう簡単な方法はサンプルプログラムを用意することだと思います。それで、そういうページを作ってみました。
  • しかし、ただだらだらと書いても面白くないので、いくつかの部門に分けます。
    • あまり長くない上に、難しい構文を使わないもの。
    • 少し長くて、少し難しいもの。
    • C言語の文法を全部使っていいもの(インラインアセンブラなどは不可)。サイズ制限なし。
    • blikeを使っていれば、もうなんでもあり(アセンブラからblikeを使うなども可)。
  • 長さの基準ですが、俗に言う「1画面」を単位に考えようと思います。つまり80x25=2000文字です。しかし25行以内というわけではありません。それはあまりに読みにくくなってしまうと思うからです。スペース類を含めずに数えて2000文字なら「1画面」とします。ということでインデントなどは普通にやってもらってOKです。数えるためのプログラムはあとで示します。
  • 難しさについては、
    • プリプロセッサ命令を使わない(だから#defineもダメ)、関数を作らない、switchを使わない、構造体を使わない、ポインタを使わない、ビット演算を使わない
  • を基準とします。配列を使わなければさらにいいですが、使ってもいいです。使う場合は、「少し難しい」に分類します。ちなみにwhileやdo-whileも使わなければもっといいですが(つまりループはforのみ)、まあ必要だったら使ってもいいです。
  • このページ群はKによって管理されているので、自作のプログラムを勝手に登録することはできません。しかしサンプルは多いほうがいいので、もしプログラムをいただければ、審査・調整の上、分類して掲載させていただきます。応募は掲示板などでお願いします。
Page Top

目次 anchor.png

  • A: proglen <= 2000 && 配列なし
  • B: proglen <= 4000 && 少し難しい
  • C: C言語only
  • D: blikeを使えばOK

Page Top

文字数を数えるプログラム anchor.png

  • proglen0.c
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, unsigned char **argv)
    {
        unsigned char *b = malloc(1024 * 1024);
        FILE *fp;
        int s, i, l;
        char f;
        if (argc >= 2) {
            fp = fopen(argv[1], "rb");
            if (fp != NULL) {
                *b++ = 0;
                s = fread(b, 1, 1024 * 1024 - 2, fp);
                fclose(fp);
                f = 0; l = 0;
                for (i = 0; i < s; i++) {
                    if (b[i] == '\n') f = 0;
                    if (b[i] == '\"' && b[i - 1] != '\\') f ^= 1;
                    if (f != 0 || b[i] > ' ') l++;
                }
                free(b - 1);
                printf("proglen = %d\n", l);
            }
        }
        return 0;
    }
  • まだblikeでファイルやコマンドラインをどう扱うかを決めてなくて、とりあえず標準関数で書きました。すみません。
  • このproglen0.cのproglenは367になりました。

Last-modified: 2011-03-10 (木) 00:00:00 (JST) (319d) by lina