トップページ⇒tech
1001コメント294KB

七行プログラミング part5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/03/16(木) 09:02:39
7行×79文字なら言語は問いません。
過去作品は、もしかしたら>>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
>>356
常套句。鼻から悪魔で検索してみろ
0358デフォルトの名無しさん2007/02/01(木) 11:48:49
なるほど。生まれる前から言われてた言葉だったのか。
勉強になるなぁ。
0359デフォルトの名無しさん2007/02/01(木) 12:03:57
351は鼻から悪魔が出るんじゃないかな。
0360デフォルトの名無しさん2007/02/01(木) 18:29:14
出ないでない
0361デフォルトの名無しさん2007/02/01(木) 18:30:34
351なら出ても仕様違反ではないけどな
0362デフォルトの名無しさん2007/02/01(木) 18:45:17
どこが悪いの?
0363デフォルトの名無しさん2007/02/01(木) 18:52:07
>>361
> c[i]&&(t--||(t=c[++i]-*c))
||はsequence pointだからt--とt=c[++i]-*cはこの順に値の変更が行われることが保証されてる
03643052007/02/01(木) 23:42:07
副作用完了点とか意識してなかったわ('д`)
0365デフォルトの名無しさん2007/03/04(日) 18:06:55
int puts(const char*);int main(void){return puts("age")<0;}
0366デフォルトの名無しさん2007/03/04(日) 18:12:19
かなりの趣味スレですね
0367デフォルトの名無しさん2007/03/04(日) 18:19:55
ageるからには何かネタないの?
0368デフォルトの名無しさん2007/03/04(日) 18:24:12
>>365
ネタもなしにあげとはずいぶんなおまーんこですね
↑この一文を解釈して動くプログラミング言語を作ってくれ
0369デフォルトの名無しさん2007/03/04(日) 19:13:21
宣言だけ書いとけば、使ったライブラリを勝手にリンクしてくれる、と解釈。
つまりincludeの省略か。
しかしそんなもん俺に作れるわきゃーない。
0370デフォルトの名無しさん2007/03/04(日) 19:16:36
Cの話なら、#includeしなくても直にプロトタイプ宣言すれば済むじゃん?
0371デフォルトの名無しさん2007/03/04(日) 21:44:22
(・д・)どのCの話だ?
0372デフォルトの名無しさん2007/03/04(日) 21:53:15
#includeディレクティブとリンカがどのライブラリをリンクするかは関係ないでs
0373デフォルトの名無しさん2007/03/04(日) 22:58:55
#DEFINE ネタもなしにあげとはずいぶんなおまーんこですね main(){return(0);}
0374デフォルトの名無しさん2007/03/04(日) 23:02:34
このスレではreturnに括弧つけるのは許されないだろ、常識的に考えて…
0375デフォルトの名無しさん2007/03/05(月) 04:16:30
って言うか生きてたんだなおまいら。
0376デフォルトの名無しさん2007/03/05(月) 07:42:48
main関数でreturnしなかった場合、
戻り値は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:49
>>377
gcc -std=c99 -pedantic test.c
0379デフォルトの名無しさん2007/03/06(火) 01:35:29
99じゃしょうがないな
0380デフォルトの名無しさん2007/05/01(火) 07:42:12
age
0381デフォルトの名無しさん2007/05/01(火) 15:53:57
WinMainって
int WINAPI WinMain(HMODULE,HMODULE,LPSTR,int)
これじゃだめなのかな
bcc5.5.1とvc8.0では一応通ったんだけど
0382デフォルトの名無しさん2007/05/01(火) 17:33:41
HINSTANCEもHMODULEも意味のない構造体へのポインタだから大丈夫だろ。
0383デフォルトの名無しさん2007/05/01(火) 18:55:53
全く問題ない
0384デフォルトの名無しさん2007/05/02(水) 12:56:16
動けばいいってんなら、HWNDでもいいし、void*でもいいだろ。
0385デフォルトの名無しさん2007/05/02(水) 13:00:03
綺麗に書くなんて下の下だな
短く書け。ただし環境依存するな。
0386デフォルトの名無しさん2007/05/02(水) 13:05:28
>>385
長いし環境依存だし、しかも纏めようとしてる辺りが気に入らない
(´・ω・`) で?
0387デフォルトの名無しさん2007/05/02(水) 13:08:16
HWND環境依存じゃないだろ?
今手元にヘッダファイル無いけど…
0388デフォルトの名無しさん2007/05/02(水) 13:16:48
帰り値も 必要ないんじゃないのか?
0389デフォルトの名無しさん2007/05/02(水) 13:19:25
main型の返り値に関しては微妙だな
0390デフォルトの名無しさん2007/05/02(水) 14:20:55
HWNDとかいう時点で十分に環境依存な気がするんだが、これは言ったらダメか。
0391デフォルトの名無しさん2007/05/02(水) 15:07:24
WinMainな時点でWindows前提なんだから議論の余地はないだろうが
0392デフォルトの名無しさん2007/05/02(水) 15:14:24
(´・ω・`) で?
0393デフォルトの名無しさん2007/05/02(水) 16:45:18
このスレでの環境依存というのはそういう意味ではなくて、
開発環境に依存するコードを書くなって事じゃないかな。
#includeなくても動く環境とか、main関数でreturnがいらない環境とか、
そういう環境もあるけど、それに依存するコードは駄目だよって意味じゃない?
0394デフォルトの名無しさん2007/05/02(水) 17:55:57
(д)゚ ゚
0395デフォルトの名無しさん2007/05/02(水) 17:57:14
結論を出す必要は無いんだよ。 思ったようにコード書けばいいじゃない。
0396デフォルトの名無しさん2007/05/02(水) 18:16:13
今までこのスレ(過去スレ含)に出てきたコードを見てると
修正を加えないとコンパイルさえ通らないのばかり
よってセーフ
0397デフォルトの名無しさん2007/05/02(水) 18:33:02
大事なのは面白い事
0398デフォルトの名無しさん2007/05/02(水) 20:34:19
アウトセーフ決めるのは自分だし。
その限界の中でどれだけ短く出来るかが面白い。
0399デフォルトの名無しさん2007/05/02(水) 22:55:14
コンパイルが通らないようなのは全然駄目だと思うが、
全然駄目なのを発表するのは自由なんじゃないの?

多くの人に評価されたいなら、コンパイルくらい通して欲しいね
0400デフォルトの名無しさん2007/05/03(木) 00:05:35
まぁ試した、というか動く処理系を明記して欲しいわな。
0401デフォルトの名無しさん2007/05/06(日) 13:58:47
コメントも7行に入るんですか?
0402デフォルトの名無しさん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:40
その7行にしたほうのコードを見せなきゃわからんだろ
0404デフォルトの名無しさん2007/05/06(日) 15:12:47
#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;}

>>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
#pragma warning(push, 0);
#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
11行 orz


一応32bit Win2K(とたぶんXP)のNt(Zw)TerminateProcessをフクーするドライバ
ビルドしてテストできる環境は少ないと思うから面白くないかもしれない
ZwCloseとかのフックならntddk.hで宣言されてるので宣言文いらないし、
さらに環境を絞ったハードコードやら、アンインストール時に修復しない青画面直行OK仕様ならもっと削れる

けど、この内容では俺にはもうむりぽ
0409デフォルトの名無しさん2007/05/06(日) 19:23:52
#include<stdio.h>
#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:09
普通のプログラミングのときの習慣を忘れればいろいろ短くなる気が
0411デフォルトの名無しさん2007/05/06(日) 19:40:00
B を const にすりゃ いけるんじゃないの?
0412デフォルトの名無しさん2007/05/06(日) 20:10:04
#include<stdio.h>
typedef 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:25
先ほどの>>409の>>405ではなく>>404でした
0414デフォルトの名無しさん2007/05/06(日) 20:42:39
#include<stdio.h>
int 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
#pragma warning(push, 0)
#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:22
というか標準入出力にすればいいんでないかい?
0417デフォルトの名無しさん2007/05/06(日) 23:02:19
>>409
・1度しか呼ばれない関数は定義しない
 eもgもmainに展開する
・代入で無く初期化を使う
 int x;x=0;→int x=0;
・なるべくライブラリを使う
 freadとか
・whileよりforを使う
・繰り返しは1行になるようにする
・不要なスペース、変数、typedefを削る

これで随分削れると思う
ところでハフマン符号じゃなくてランレングスだよね
0418デフォルトの名無しさん2007/05/07(月) 00:23:37
>>417
アドバイスありがとうございます
挑戦してみます
0419デフォルトの名無しさん2007/05/07(月) 03:33:22
>>412
mainの仮引数ってそんなんで大丈夫なのか?

更に短くするコツとしては、
* 関数の戻り値の型が int の時は省略する。
* 仮引数に int がある場合は、K&R式の宣言を使うと短くなる場合がある。
例えば2引数のmainなら、main(c,v)char**v{} とするのが一番短い。
0420デフォルトの名無しさん2007/05/07(月) 03:35:04
どうせすぐ終了するんだし、fcloseなんかしない、っていう手もあるなw
0421デフォルトの名無しさん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
>>421
すごいっすねw
0423デフォルトの名無しさん2007/05/07(月) 21:11:00
>>420
mainからreturnかexitで終了するかしたらプログラムが終了する前に閉じられてないストリームは閉じられるはず。
0424デフォルトの名無しさん2007/05/07(月) 22:12:53
すみません
ランレングスでした
0425デフォルトの名無しさん2007/05/08(火) 17:57:09
誰かお題ちょーらい
0426デフォルトの名無しさん2007/05/08(火) 19:10:47
viみたいな簡易エディタがほしいな
0427デフォルトの名無しさん2007/05/08(火) 20:02:38
http://www.itmedia.co.jp/news/articles/0609/06/news107.html
お題
ナンプレ自動作成ソフト
0428デフォルトの名無しさん2007/05/08(火) 20:13:47
>>427
http://www.timedia.co.jp/news/event/884464213/numplace20060906.pdf
これよめ
くず
0429デフォルトの名無しさん2007/05/08(火) 22:52:28
>>428
結局その最後の解き味を判定する評価関数がすべてだよなあ
0430デフォルトの名無しさん2007/05/08(火) 23:56:02
作成より前に解くほうってもう出てたっけ? 7行で。
7行じゃなけりゃそんなに難しいお題じゃないけど。
0431デフォルトの名無しさん2007/05/09(水) 02:36:40
枝刈りなしのバックトラックなら7行で書けたが、
答えが出ないからあってるのかわからん・・・
0432デフォルトの名無しさん2007/05/12(土) 17:48:24
計算で出せばよくね?

一定の時間のクリック数/一定の期間にクリックできる最大数
0433デフォルトの名無しさん2007/05/12(土) 17:50:06
誤爆かね
0434デフォルトの名無しさん2007/05/12(土) 17:51:03
ばれたかねww
0435デフォルトの名無しさん2007/05/13(日) 01:12:28
まさか>>429へのレスのつもりじゃなかろうなと心配した
0436デフォルトの名無しさん2007/05/13(日) 10:24:33
「結局その最後の解き味を判定する評価関数がすべてだよなあ」


「計算で出せばよくね?
一定の時間のクリック数/一定の期間にクリックできる最大数」


考えただけでわらっちゃう

誤爆してすみませんでした。
0437デフォルトの名無しさん2007/05/30(水) 23:58:22
保守
0438デフォルトの名無しさん2007/06/25(月) 23:29:07
CやC++のコメントを除去するプログラムって過去に上がってたっけ?
0439デフォルトの名無しさん2007/06/27(水) 02:14:02
Perlで作ればいいだろう
0440デフォルトの名無しさん2007/06/27(水) 16:09:05

/* hogehoge /* fugafuga */ hagehage */

こんな風なコメントのときどう処理すればいいですか?
0441デフォルトの名無しさん2007/06/27(水) 20:50:44
>>440
手動
0442デフォルトの名無しさん2007/06/27(水) 20:57:52
コメントの中なに書いても良いんだから

/* hogehoge /* fugafuga hagehage */

/* hogehoge fugafuga */ hagehage */

なんかもあり
0443デフォルトの名無しさん2007/06/27(水) 21:33:13
>>442
>なんかもあり

上の例は全部コメントだからありだけど、下の例はダメだよ。

だから >>440 は
hagehage */
が残るのがコメント除去ツールとしては正しい処理だね。

もちろん /* から */ までと言っても、
\/* asdf */ みたいにエスケープされていたら、それはコメントにならない。

コメント閉じをエスケープするには /* *\/ と書く。

というわけで /* \*/ は正しいコメントだ。
0444デフォルトの名無しさん2007/06/27(水) 21:42:53
>>443は書き方間違った
>コメント閉じをエスケープするには /* *\/ と書く。
フツーはこう書くけど、これ、別にエスケープじゃないね。
ごめん。
0445デフォルトの名無しさん2007/07/04(水) 00:58:13
VCじゃネストコメント文だめっぽいな
Dならイイらしいが
0446デフォルトの名無しさん2007/07/04(水) 02:18:22
>>438ですが、
少しでも役に立つものがあれば…と思ったのですが、
7行の題材としてはあまり面白くなかったですかね。
頑張れば5行くらいで書けるでしょうし。

いい題材が浮かびません…。
0447デフォルトの名無しさん2007/07/04(水) 03:47:17
>>445
コメントのネストは伝統的にないことになってるはず。
>>446
5行で書く方法を思いつかない…orz

こんなコメントとか
/* printf("*/ \"\\"); */
Shift JISの2バイト目をきちんと処理できるように書くには7行じゃ足りない気がするんだけど…。

0448デフォルトの名無しさん2007/07/04(水) 23:04:50
>>447
ヒント:7行でありさえすればいい
0449デフォルトの名無しさん2007/07/05(木) 00:09:34
>>447
>/* printf("*/ \"\\"); */
これは、コメント削除処理した結果が
\"\\"); */
になればいいんですよね?

Shift JISの2バイト目をきちんと処理できるかどうかを検証する文字列って
どんなのなのでしょうか?
0450デフォルトの名無しさん2007/07/05(木) 08:38:24
>>449
> Shift JISの2バイト目をきちんと処理できるかどうかを検証する文字列って
ソ/* */
とか?
0451デフォルトの名無しさん2007/07/05(木) 08:43:43
ちょっと違うな。こういうのか?
printf("ソ");/* */
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:18
(^ω^;) (*ノ *)ノ
0454デフォルトの名無しさん2007/07/05(木) 17:15:43
n869 にこんな例があるな。

m = n//**/o
+ p;

m = n + p;
0455デフォルトの名無しさん2007/07/05(木) 17:34:54
> \/* asdf */ みたいにエスケープされていたら、それはコメントにならない。

ダウト。\/ というシーケンスは規格では定義されていない。
0456デフォルトの名無しさん2007/07/05(木) 18:49:59
>>455は>>443=444並のあわてんぼさん。
■ このスレッドは過去ログ倉庫に格納されています