七行プログラミング part5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/03/16(木) 09:02:39過去作品は、もしかしたら>>2-20あたりに。
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1051703369/
part 3
http://pc2.2ch.net/tech/kako/1033/10331/1033143528.html
part 2
http://pc3.2ch.net/tech/kako/1018/10188/1018840143.html
part 1
http://pc.2ch.net/tech/kako/984/984182993.html
0357デフォルトの名無しさん
2007/02/01(木) 10:56:16常套句。鼻から悪魔で検索してみろ
0358デフォルトの名無しさん
2007/02/01(木) 11:48:49勉強になるなぁ。
0359デフォルトの名無しさん
2007/02/01(木) 12:03:570360デフォルトの名無しさん
2007/02/01(木) 18:29:140361デフォルトの名無しさん
2007/02/01(木) 18:30:340362デフォルトの名無しさん
2007/02/01(木) 18:45:170363デフォルトの名無しさん
2007/02/01(木) 18:52:07> c[i]&&(t--||(t=c[++i]-*c))
||はsequence pointだからt--とt=c[++i]-*cはこの順に値の変更が行われることが保証されてる
0364305
2007/02/01(木) 23:42:070365デフォルトの名無しさん
2007/03/04(日) 18:06:550366デフォルトの名無しさん
2007/03/04(日) 18:12:190367デフォルトの名無しさん
2007/03/04(日) 18:19:550368デフォルトの名無しさん
2007/03/04(日) 18:24:12ネタもなしにあげとはずいぶんなおまーんこですね
↑この一文を解釈して動くプログラミング言語を作ってくれ
0369デフォルトの名無しさん
2007/03/04(日) 19:13:21つまりincludeの省略か。
しかしそんなもん俺に作れるわきゃーない。
0370デフォルトの名無しさん
2007/03/04(日) 19:16:360371デフォルトの名無しさん
2007/03/04(日) 21:44:220372デフォルトの名無しさん
2007/03/04(日) 21:53:150373デフォルトの名無しさん
2007/03/04(日) 22:58:550374デフォルトの名無しさん
2007/03/04(日) 23:02:340375デフォルトの名無しさん
2007/03/05(月) 04:16:300376デフォルトの名無しさん
2007/03/05(月) 07:42:48戻り値は0になると決められているから、
return(0);は書く必要すらない。
-10文字
0377デフォルトの名無しさん
2007/03/06(火) 01:23:37% cat test.c
#include <stdio.h>
main(void){printf("hello, world\n");}
% gcc -ansi -pedantic test.c
% ./a.exe
hello, world
% echo $?
13
それとも、言ってるのはこういう意味じゃない?
0378デフォルトの名無しさん
2007/03/06(火) 01:27:49gcc -std=c99 -pedantic test.c
0379デフォルトの名無しさん
2007/03/06(火) 01:35:290380デフォルトの名無しさん
2007/05/01(火) 07:42:120381デフォルトの名無しさん
2007/05/01(火) 15:53:57int WINAPI WinMain(HMODULE,HMODULE,LPSTR,int)
これじゃだめなのかな
bcc5.5.1とvc8.0では一応通ったんだけど
0382デフォルトの名無しさん
2007/05/01(火) 17:33:410383デフォルトの名無しさん
2007/05/01(火) 18:55:530384デフォルトの名無しさん
2007/05/02(水) 12:56:160385デフォルトの名無しさん
2007/05/02(水) 13:00:03短く書け。ただし環境依存するな。
0386デフォルトの名無しさん
2007/05/02(水) 13:05:28長いし環境依存だし、しかも纏めようとしてる辺りが気に入らない
(´・ω・`) で?
0387デフォルトの名無しさん
2007/05/02(水) 13:08:16今手元にヘッダファイル無いけど…
0388デフォルトの名無しさん
2007/05/02(水) 13:16:480389デフォルトの名無しさん
2007/05/02(水) 13:19:250390デフォルトの名無しさん
2007/05/02(水) 14:20:550391デフォルトの名無しさん
2007/05/02(水) 15:07:240392デフォルトの名無しさん
2007/05/02(水) 15:14:240393デフォルトの名無しさん
2007/05/02(水) 16:45:18開発環境に依存するコードを書くなって事じゃないかな。
#includeなくても動く環境とか、main関数でreturnがいらない環境とか、
そういう環境もあるけど、それに依存するコードは駄目だよって意味じゃない?
0394デフォルトの名無しさん
2007/05/02(水) 17:55:570395デフォルトの名無しさん
2007/05/02(水) 17:57:140396デフォルトの名無しさん
2007/05/02(水) 18:16:13修正を加えないとコンパイルさえ通らないのばかり
よってセーフ
0397デフォルトの名無しさん
2007/05/02(水) 18:33:020398デフォルトの名無しさん
2007/05/02(水) 20:34:19その限界の中でどれだけ短く出来るかが面白い。
0399デフォルトの名無しさん
2007/05/02(水) 22:55:14全然駄目なのを発表するのは自由なんじゃないの?
多くの人に評価されたいなら、コンパイルくらい通して欲しいね
0400デフォルトの名無しさん
2007/05/03(木) 00:05:350401デフォルトの名無しさん
2007/05/06(日) 13:58:470402デフォルトの名無しさん
2007/05/06(日) 14:46:07あの
#include<stdio.h>
#include<windows.h>
int a = 1;
int main()
{
while(a)
{
printf("1〜8どうぞ\n0は終了\n---------");
scanf("%d", &a);
switch(a)
{
case 1: ::Beep(262, 300);break;
case 2: ::Beep(294, 300);break;
case 3: ::Beep(330, 300);break;
case 4: ::Beep(349, 300);break;
case 5: ::Beep(392, 300);break;
case 6: ::Beep(440, 300);break;
case 7: ::Beep(494, 300);break;
case 8: ::Beep(523, 300);break;
}
}
return 0;
}
これ7行にするとコンパイルできないんですよ
どうしたらいいですか?
0403デフォルトの名無しさん
2007/05/06(日) 14:58:400404デフォルトの名無しさん
2007/05/06(日) 15:12:47printf("1〜8どうぞ\n0は終了\n---------");scanf("%d", &a);switch(a){
case 1: ::Beep(262, 300);break;case 2: ::Beep(294, 300);break;
case 3: ::Beep(330, 300);break;case 4: ::Beep(349, 300);break;
case 5: ::Beep(392, 300);break;case 6: ::Beep(440, 300);break;
case 7: ::Beep(494, 300);break;case 8: ::Beep(523, 300);break;}}return 0;}
>>402をそのまま短くしたんですけどエラーがたくさんでるんですよ
0405デフォルトの名無しさん
2007/05/06(日) 15:14:24#include<stdio.h>
#include<windows.h>
int a=1;int main(){while(a){printf("1〜8どうぞ\n0は終了\n---------"
);scanf("%d",&a);switch(a){case 1:Beep(262,300);break;case 2:Beep
(294,300);break;case 3:Beep(330,300);break;case 4:Beep(349,300);
break;case 5:Beep(392,300);break;case 6:Beep(440,300);break;case 7:
Beep(494,300);break;case 8:Beep(523,300);break;}}return 0;}
0406デフォルトの名無しさん
2007/05/06(日) 15:16:57ありがとうございます。
0407デフォルトの名無しさん
2007/05/06(日) 19:14:08#include <ntddk.h>
#define F(f) KeServiceDescriptorTable->s[*(PULONG)((PUCHAR)f+1)]
typedef struct{PVOID* s;PULONG c;ULONG t;PUCHAR a;}SDT;long (NTAPI *O)(HANDLE,
long);extern SDT* KeServiceDescriptorTable;long NTAPI N(HANDLE h,long s){
DbgPrint("Exit%d",s);return O(h,s);}NTSYSAPI long NTAPI ZwTerminateProcess(
HANDLE,long);void U(PDRIVER_OBJECT d){InterlockedExchange(&F(ZwTerminateProcess
),O);}long D(PDEVICE_OBJECT d,PIRP i){i->IoStatus.Status=0;IoCompleteRequest(i,
0);return 0;}long DriverEntry(PDRIVER_OBJECT d,PUNICODE_STRING r){int i;for(i=0
;i<27;++i)d->MajorFunction[i]=D;d->DriverUnload=U;O=InterlockedExchange(&F(
ZwTerminateProcess),N);return 0;}
// 実行テスト環境 Win2k(build2195)SP4
// ビルド環境 WinXP VC8 + Windows DDK 3790.1830 -> Win2k Checked Build
C_ASSERT(sizeof(SDT) == 16); // prgma pack(1)
0408デフォルトの名無しさん
2007/05/06(日) 19:14:41一応32bit Win2K(とたぶんXP)のNt(Zw)TerminateProcessをフクーするドライバ
ビルドしてテストできる環境は少ないと思うから面白くないかもしれない
ZwCloseとかのフックならntddk.hで宣言されてるので宣言文いらないし、
さらに環境を絞ったハードコードやら、アンインストール時に修復しない青画面直行OK仕様ならもっと削れる
けど、この内容では俺にはもうむりぽ
0409デフォルトの名無しさん
2007/05/06(日) 19:23:52#define B 102400
typedef unsigned char y;unsigned char b[B];int e(FILE *fp,y *i,int m){int r,c;
int x;x=0;while(x<m) {x=g(i,x,m,0xff,&r,&c);fputc(r,fp);fputc(c,fp);}return 0;}
int g(y *i,int x,int m,int l,int *r,int *c){int p;p=x;*r=1;*c=i[p];p++;
while(p<m && *c==i[p] && *r<l ) {p++;(*r)++;}return p;}int main(char *a[]){
FILE *_i,*_o;int i,c;_i=fopen(a[1],"rb");i=0;while(i<B && (c=fgetc(_i))!=EOF) {
b[i]=c;i++;}fclose(_i);_o=fopen(a[2],"wb");e(_o,b,i);fclose(_o);}
>>405作った初心者ですが
ハフマン法圧縮なんですけど作ってみました
どうしてもあと1行減らす方法が思いつかないんですけどどうしたらいいと思いますか?
目が潰れそうです
0410デフォルトの名無しさん
2007/05/06(日) 19:34:090411デフォルトの名無しさん
2007/05/06(日) 19:40:000412デフォルトの名無しさん
2007/05/06(日) 20:10:04typedef unsigned char y;unsigned char b[102400];int e(FILE *fp,y *i,int m){
int r,c;int x;x=0;while(x<m) {x=g(i,x,m,0xff,&r,&c);fputc(r,fp);fputc(c,fp);}
return 0;}int g(y *i,int x,int m,int l,int *r,int *c){int p;p=x;*r=1;*c=i[p];
p++;while(p<m && *c==i[p] && *r<l ) {p++;(*r)++;}return p;}int main(char *a[])
{FILE *x,*z;int i,c;x=fopen(a[1],"rb");i=0;while(i<102400 && (c=fgetc(x))!=EOF) {
b[i]=c;i++;}fclose(x);z=fopen(a[2],"wb");e(z,b,i);fclose(z);}
ちょっと短くなりました
0413デフォルトの名無しさん
2007/05/06(日) 20:29:250414デフォルトの名無しさん
2007/05/06(日) 20:42:39int d(FILE *fp){int i;int r,c;while(!feof(fp)) {r=fgetc(fp);c=fgetc(fp);
for(i=0;i<r;i++){fputc(c,stdout);}}return 0;}int main(int ac,char *av[]){
FILE *fp;if ((fp = fopen(av[1],"rb"))==NULL)return 6;d(fp);fclose(fp);return 0;}
解凍は4行でできました。
0415デフォルトの名無しさん
2007/05/06(日) 21:00:21#include <ntddk.h>
typedef struct{PVOID*s;}SDT;extern SDT*KeServiceDescriptorTable;ULONG F(void*f)
{return(*(ULONG*)((UCHAR*)f+1));}void*I(void*f){return InterlockedExchange(
KeServiceDescriptorTable->s+F(ZwClose),f);}long(NTAPI*O)(void*);long NTAPI N(
void*h){DbgPrint("0x%08X",h);return O(h);}void U(PDRIVER_OBJECT d){I(O);}long
DriverEntry(DRIVER_OBJECT*d,UNICODE_STRING*r){d->DriverUnload=U;O=I(N);return 0;}
機能はそのままでZwCloseにした。意外と削れた。最後の行が82文字orz アタマイタイ
0416デフォルトの名無しさん
2007/05/06(日) 21:12:220417デフォルトの名無しさん
2007/05/06(日) 23:02:19・1度しか呼ばれない関数は定義しない
eもgもmainに展開する
・代入で無く初期化を使う
int x;x=0;→int x=0;
・なるべくライブラリを使う
freadとか
・whileよりforを使う
・繰り返しは1行になるようにする
・不要なスペース、変数、typedefを削る
これで随分削れると思う
ところでハフマン符号じゃなくてランレングスだよね
0418デフォルトの名無しさん
2007/05/07(月) 00:23:37アドバイスありがとうございます
挑戦してみます
0419デフォルトの名無しさん
2007/05/07(月) 03:33:22mainの仮引数ってそんなんで大丈夫なのか?
更に短くするコツとしては、
* 関数の戻り値の型が int の時は省略する。
* 仮引数に int がある場合は、K&R式の宣言を使うと短くなる場合がある。
例えば2引数のmainなら、main(c,v)char**v{} とするのが一番短い。
0420デフォルトの名無しさん
2007/05/07(月) 03:35:040421デフォルトの名無しさん
2007/05/07(月) 04:44:26#include<stdio.h>
main(c,a)char**a;{FILE*i=fopen(a[1],"rb"),*o=fopen(a[2],"wb");while((c=getc(i))
!=EOF){int x=1,d;while((d=getc(i))==c&&x++<255);ungetc(d,i);putc(x,o);putc(c,o)
;}fclose(o);fclose(i);return 0;}
0422デフォルトの名無しさん
2007/05/07(月) 06:38:51すごいっすねw
0423デフォルトの名無しさん
2007/05/07(月) 21:11:00mainからreturnかexitで終了するかしたらプログラムが終了する前に閉じられてないストリームは閉じられるはず。
0424デフォルトの名無しさん
2007/05/07(月) 22:12:53ランレングスでした
0425デフォルトの名無しさん
2007/05/08(火) 17:57:090426デフォルトの名無しさん
2007/05/08(火) 19:10:470427デフォルトの名無しさん
2007/05/08(火) 20:02:38お題
ナンプレ自動作成ソフト
0428デフォルトの名無しさん
2007/05/08(火) 20:13:47http://www.timedia.co.jp/news/event/884464213/numplace20060906.pdf
これよめ
くず
0429デフォルトの名無しさん
2007/05/08(火) 22:52:28結局その最後の解き味を判定する評価関数がすべてだよなあ
0430デフォルトの名無しさん
2007/05/08(火) 23:56:027行じゃなけりゃそんなに難しいお題じゃないけど。
0431デフォルトの名無しさん
2007/05/09(水) 02:36:40答えが出ないからあってるのかわからん・・・
0432デフォルトの名無しさん
2007/05/12(土) 17:48:24一定の時間のクリック数/一定の期間にクリックできる最大数
0433デフォルトの名無しさん
2007/05/12(土) 17:50:060434デフォルトの名無しさん
2007/05/12(土) 17:51:030435デフォルトの名無しさん
2007/05/13(日) 01:12:280436デフォルトの名無しさん
2007/05/13(日) 10:24:33「計算で出せばよくね?
一定の時間のクリック数/一定の期間にクリックできる最大数」
考えただけでわらっちゃう
誤爆してすみませんでした。
0437デフォルトの名無しさん
2007/05/30(水) 23:58:220438デフォルトの名無しさん
2007/06/25(月) 23:29:070439デフォルトの名無しさん
2007/06/27(水) 02:14:020440デフォルトの名無しさん
2007/06/27(水) 16:09:05/* hogehoge /* fugafuga */ hagehage */
こんな風なコメントのときどう処理すればいいですか?
0441デフォルトの名無しさん
2007/06/27(水) 20:50:44手動
0442デフォルトの名無しさん
2007/06/27(水) 20:57:52/* hogehoge /* fugafuga hagehage */
/* hogehoge fugafuga */ hagehage */
なんかもあり
0443デフォルトの名無しさん
2007/06/27(水) 21:33:13>なんかもあり
上の例は全部コメントだからありだけど、下の例はダメだよ。
だから >>440 は
hagehage */
が残るのがコメント除去ツールとしては正しい処理だね。
もちろん /* から */ までと言っても、
\/* asdf */ みたいにエスケープされていたら、それはコメントにならない。
コメント閉じをエスケープするには /* *\/ と書く。
というわけで /* \*/ は正しいコメントだ。
0444デフォルトの名無しさん
2007/06/27(水) 21:42:53>コメント閉じをエスケープするには /* *\/ と書く。
フツーはこう書くけど、これ、別にエスケープじゃないね。
ごめん。
0445デフォルトの名無しさん
2007/07/04(水) 00:58:13Dならイイらしいが
0446デフォルトの名無しさん
2007/07/04(水) 02:18:22少しでも役に立つものがあれば…と思ったのですが、
7行の題材としてはあまり面白くなかったですかね。
頑張れば5行くらいで書けるでしょうし。
いい題材が浮かびません…。
0447デフォルトの名無しさん
2007/07/04(水) 03:47:17コメントのネストは伝統的にないことになってるはず。
>>446
5行で書く方法を思いつかない…orz
こんなコメントとか
/* printf("*/ \"\\"); */
Shift JISの2バイト目をきちんと処理できるように書くには7行じゃ足りない気がするんだけど…。
0448デフォルトの名無しさん
2007/07/04(水) 23:04:50ヒント:7行でありさえすればいい
0449デフォルトの名無しさん
2007/07/05(木) 00:09:34>/* printf("*/ \"\\"); */
これは、コメント削除処理した結果が
\"\\"); */
になればいいんですよね?
Shift JISの2バイト目をきちんと処理できるかどうかを検証する文字列って
どんなのなのでしょうか?
0450デフォルトの名無しさん
2007/07/05(木) 08:38:24> Shift JISの2バイト目をきちんと処理できるかどうかを検証する文字列って
ソ/* */
とか?
0451デフォルトの名無しさん
2007/07/05(木) 08:43:43printf("ソ");/* */
0452デフォルトの名無しさん
2007/07/05(木) 10:04:12#include <stdio.h>
int main(int, char *[]) {
printf("表");/* ");/* */
return 0;
}
というか、別に入力文字コードはUTF-8限定でもいいと思うんだけど。
0453デフォルトの名無しさん
2007/07/05(木) 11:18:180454デフォルトの名無しさん
2007/07/05(木) 17:15:43m = n//**/o
+ p;
m = n + p;
0455デフォルトの名無しさん
2007/07/05(木) 17:34:54ダウト。\/ というシーケンスは規格では定義されていない。
0456デフォルトの名無しさん
2007/07/05(木) 18:49:59■ このスレッドは過去ログ倉庫に格納されています