ラベル 一文字プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル 一文字プログラミング の投稿を表示しています。 すべての投稿を表示

2009/07/19

ジオシティーズにアップロードした

URLはhttp://www.geocities.jp/sasurainootaku/

今のところ自作したプログラムのソースコードを載せています

一文字プログラムについては

http://www.geocities.jp/sasurainootaku/c/c-short/index.html

あと、ウマウマするプログラムも作りました

http://www.geocities.jp/sasurainootaku/c/umauma/index.html

Windowsにはexeファイルもおいてあります

バッチファイルで作ろうと思ったんだけど

waitするのが良く分からなくて仕方なくCで

2009/07/05

一文字プログラミングについて

また、あの一文字だけのCプログラムの話題です

ここでは普段良く使いそうな文のことを

int a;
scanf("%d",&a);

は
int a;int i;char buf[256];
for(i=0;;i++){read(0,&buf[i],1);if(buf[i]==0x0A)break;}a=atoi(buf);

とでもなります

int a;
printf("%d",a);
は

//itoaに必要
char *strrev(char *s){char *ret = s;char *t = s;char c;while( *t != '\ 0' )t++;t--;while(t > s) {c = *s;*s = *t;*t = c;s++;t--;}return ret;}void itoa(int value, char *buff){char *p;int mod;if( 0 > value ) {*buff++ = '-';value = -value;}p = buff;do{mod = value % 10 + 48;*p++ = (char)mod;value /= 10;}while(value);*p = '\ 0'; strrev(buff); }
//ここまで

int a;int i;char buf[256];
itoa(a,buf);
for(i=0;buf[i] != '\ 0';i++){write(1,&buf[i],1);}

とでもなります

char str[256];
printf("%s",str);は

void print_string(const char* str){int i;for(i=0; str[i] != '\ 0';i++){write(1,&str[i],1);}}

という風な関数にでもなります

char str[256];
scanf("%s",str);は

char* get_str(void){int i;char *str;for(i=0;;i++){read(0,&str[i],1);if(str[i]==0x0A)break;}return str;}

という感じの関数になります

これを利用して

数を入力して素数かどうかを判定するプログラムが作れます

載せようと思いましたが

なぜか文字が変わる部分があるので

載せられませんでした

追記

と思ったら

コメント欄では普通に表示出来たので

コメント欄にいれときいました

ひとつめのコメントについて

ファイル名はprime.c 中身はA一文字

二つ目のコメントは

コンパイラオプションを

Cのソースみたく書き下したものです

               ↓ここらへんのどこかにリンクがあったり

2009/07/03

2009/6/30のエントリで

ソースコードが一文字のHello,world!を作りましたが

今回はfizzbuzzに挑戦して見ました

ソースコードfizzbuzz.cの内容は

前回と同じく

A

のみ

肝心のコンパイラオプションは

gcc -DI="char *strrev(char *s){char *ret = s;char *t = s;char c;while( *t != '\ 0' )t++;t--;while(t > s) {c = *s;*s = *t;*t = c;s++;t--;}return ret;}void itoa(int value, char *buff){char *p;int mod;if( 0 > value ) {*buff++ = '-';value = -value;}p = buff;do{mod = value % 10 + 48;*p++ = (char)mod;value /= 10;}while(value);*p = '\ 0'; strrev(buff); }" -DX="write(1,&F,1);write(1,&i,1);write(1,&z,1);write(1,&z,1);" -DY="write(1,&B,1);write(1,&u,1);write(1,&z,1);write(1,&z,1);" -DA="I int main(void){int j;int k;char F='F';char B='B';char i='i';char u='u';char z='z';char N=0x0A;char buf[16];for(j=1;j<=100;j++){if(j%15==0){X Y}else if(j%5==0){Y}else if(j%3==0){X}else{itoa(j,buf);for(k=0;buf[k] != '\ 0';k++){write(1,&buf[k],1);}}write(1,&N,1);}return 0;} " fizzbuzz.c

です

マクロIの部分は

http://oshiete1.goo.ne.jp/qa3355671.htmlの10番の回答を

勝手に使わさせてもらいました

前回!が使えない的な事を言いましたが

なんか全部使えないわけじゃなさそうです

文字の次に!があるのがだめなのか?

スペースをいれればいけるのか?

書き下したコードをのせようと思いましたが

のせるとなぜか全体のプロポーションが崩れるので

別にします

このエントリに

http://tyosasurainootaku.blogspot.com/2009/07/fizzbuzzc.html

↑でも大分崩れてますけど

関係無いけど

こんなふうにソースコードが一文字で

コンパイラオプションでするプログラミングの事を

一文字(ひともじ)プログラミングとでも名付けようか

2009/06/30

1987年のIOCCC作品であるbiggar.cをgeekなページなんかでたまたま見かけた。
biggar.cのソースコードは

P;

以上。
は?と思われたでしょうが秘密はコンパイラオプションに有ります。

$cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" -DP="main(){X}"\ -DR="read(0,&c,1)" -DT="c!=015" -DW="while(C)I" -DX="char c;W" biggar.c

コンパイラオプション-Dでマクロを設定しているわけです。
こちらに書き下したものが有ります。

こんな感じです。
main(){
char c;
while(read(0,&c,1)>0)
if(c!=015) c=write(1,&c,1);
}
「IOCCC 1987 P;」なんかでググるといろいろ出てきます。
もちろんgccでも出来ます。
ccをgccに変えるだけで。
gccに関してはここなんかやman gccを見たりしました。
-Dmacro=valueで臨時にマクロを定義。

というわけで以前gccでコンパイルできる最短のHello,world!、最短のソースコードに挑みましたが、それよりさらに短い物に挑んで見たいと思います。
ソースコードhello.cの中身はこう

A

以上、半角一文字。
おそらく最短。

このAにマクロを設定する。
コンパイラオプションは

$gcc -DA="int main(void){char H='H';char e='e';char l='l';char o='o';char S=',';char w='w';char r='r';char d='d';char E=0x21;char N=0x0A;write(1,&H,1);write(1,&e,1);write(1,&l,1);write(1,&l,1);write(1,&o,1);write(1,&S,1);write(1,&w,1);write(1,&o,1);write(1,&r,1);write(1,&l,1);write(1,&d,1);write(1,&E,1);write(1,&N,1);return 0;}" hello.c

まともなソースコード風に書き下すと

int main(void){
/*初期化*/
char H='H';
char e='e';
char l='l';
char o='o';
char S=',';
char w='w';
char r='r';
char d='d';
char E=0x21;//!
char N=0x0A;//改行コード
/*出力*/
write(1,&H,1);
write(1,&e,1);
write(1,&l,1);
write(1,&l,1);
write(1,&o,1);
write(1,&S,1);
write(1,&w,1);
write(1,&o,1);
write(1,&r,1);
write(1,&l,1);
write(1,&d,1);
write(1,&E,1);
write(1,&N,1);
return 0;
}

printfやput系はSegment Faultとなるのでwriteを使った。
charで文字一種類ずつ宣言してwriteで出力、
の流れです
"が使えないのと!がマクロのイベントか何かと認識されるのと
改行コードでの改行の出力がポイント。

09/09/09 少し改良。文章を。