02/06/14 21:09
>368
いや、縮める隙を探してるさいちゅう。
HSPだって立派じゃないけど言語だしね
370:366
02/06/14 21:35
>>369
ありがたや。なるべくif文使わないようにしたから、回りくどいことやってます。(´ー`
もっといい迷路アルゴリズムが使いたいんだけど、長くなる・・・
371:デフォルトの名無しさん
02/06/14 23:05
>>350
(゚д゚)すげー
372:デフォルトの名無しさん
02/06/14 23:22
>>367だけど
>>366,>>368ゴメソ、HSPだったのね、よく考えずにレスしてた(w
勉強中の折れは「レベルが低くてHSPを知らない」のであった。
ダウソしてみよかな?
373:moge
02/06/15 00:12
もっと繁栄を願ってage
374:デフォルトの名無しさん
02/06/15 14:38
7行以内でbase64エンコード/デコードプログラム作ってくれ
375:デフォルトの名無しさん
02/06/15 15:24
#include "stdafx.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
ExitWindowsEx(EWX_SHUTDOWN,0);return 0;}
まぁ激しくガイシュツだろうな・・・。
376:デフォルトの名無しさん
02/06/15 17:21
ネットワークゲーム用の汎用サーバとかは7行じゃ大変?
Javaでキボンヌ。
377:デフォルトの名無しさん
02/06/15 20:35
>>376
そもそも汎用サーバなどという発想自体が厨
仕様を定義してみせい
378:デフォルトの名無しさん
02/06/16 13:41
アクセスしてきたクライアントのソケットを保持。
どのクライアントから言われたことも、すべてのクライアントに返す。
という意味でした。
379:デフォルトの名無しさん
02/06/16 13:46
>>378
絶対どこかでデータの動機ミスが怒りそうな予感。
380:デフォルトの名無しさん
02/06/16 18:48
>>378
それはむしろチャットサーバだね。そのくらいならできそうかな。
本気でネットゲの鯖やるならオブジェクトの同期も考えるから難しい。
381:デフォルトの名無しさん
02/06/21 22:16
たまには、あげにゃ
382:デフォルトの名無しさん
02/06/22 00:08
HSP製があったので、私もHSPでチャレンジ。
行数削るのだるいんでそのまんま。
一応砂嵐。改行なくせば一行いくかな?
boxf 0,400,640,0
repeat
redraw 0
repeat 60
y=cnt*8
repeat 80
x=cnt*8
pos x,y
rnd rx,640
rnd ry,480
gcopy 0,rx,ry,8,8
loop
loop
redraw 1
await 1
loop
処理的にはパレットモードにして、
パレットを白黒にランダムで変更てのが楽なんだけどね。
つーか、そっちも作ってみるかな。
383:デフォルトの名無しさん
02/06/22 00:13
>>382
7行にまとめよ
384:382
02/06/22 00:37
>>383
スマソ、そういうわけでまとめてみたら2行になった。
boxf 0,0,640,400:repeat:redraw 0:repeat 60:y=cnt*8:repeat 80:x=cnt*8:pos x,y
rnd rx,640:rnd ry,480:gcopy 0,rx,ry,8,8:loop:loop:redraw 1:await 1:loop
砂嵐の濃度調整はboxf 0,0,640,400の部分で、画面を何割黒で塗りつぶすかで決まるから。
385:デフォルトの名無しさん
02/06/22 00:46
お題:BlockSorting
386:デフォルトの名無しさん
02/06/22 01:20
>>385
#include <stdlib.h>
typedef unsigned char b;e(b*s,b*d,int c){unsigned*o,i=0,r;o=calloc(65536,4);c--
;for(i;i<c;i++)o[s[i]<<8|s[i+1]]++;o[s[c]<<8|*s]++;for(i=1;i<65536;i++)o[i]+=o[
i-1];d[--o[s[c]<<8|*s]]=s[i=c-1];for(;i;i--)d[--o[s[i]<<8|s[i+1]]]=s[i-1];r=--o
[*s<<8|s[1]];d[r]=s[c];free(o);return r;}
一応、限定ソートなり。
387:デフォルトの名無しさん
02/06/22 01:44
こっちは復元
#include <stdlib.h>
typedef unsigned char B;void d(B*s,B*d,int c,unsigned x){unsigned*o,i,a=0,t[256
];memset(t,0,1024);for(i=--c;i;i--)t[s[i]]++;o=calloc(65536,4);for(;i<256;i++){
memset(d+a,i,t[i]);a+=t[i];}for(i=0;i<=c;i++)o[(s[i]<<8)+d[i]]++;for(i=1;i<
65536;i++)o[i]+=o[i-1];*d=d[x];d[c]=s[x];d[c-1]=s[--o[(d[c]<<8)+*d]];for(i=c;i>
2;i--)d[i-2]=s[--o[d[i-1]<<8|d[i]]];free(o);}
388:385
02/06/22 01:58
>386-387
(゚д゚)ハヤー
で、自分でも作ってみた。動作未確認・ブロックサイズ256に固定。
#include <stdlib.h>
enum{S=256};typedef unsigned char UC;int cmp(void*a,void*b){return memcmp(a,b,S
);}UC*bs(UC*s,UC*d){UC*p,**t,i;p=malloc(S*2);t=malloc(S);for(i=0;i<S;i++)p[i]=p
[i+S]=s[i],t[i]=p+i;qsort(t,S,S,cmp);for(i=0;i<size;i++)if(p== t[i])break;*d++=
i;for(i=0;i<S;i++)d[i]=t[i][S-1];free(p);free(t);return --d;}
389:385
02/06/22 02:50
ぅぁー、>388バグりまくりだ。
出なおしてきます。
390:デフォルトの名無しさん
02/06/24 00:47
ageじゃ!
391:デフォルトの名無しさん
02/06/24 19:14
インチキだけど(includeとか含めなければ)7行
アナログ時計
#define NO_STRICT
#include <windows.h>
typedef void*v;typedef int i;typedef float f;f q=50,r=100;f R(f n){return(90.0\
-n)/57.3;}void L(v h,f r){MoveToEx(h,q,q,0);LineTo(h,q+q*cos(r),q-q*sin(r));}i\
WINAPI WinMain(v,v,char*,i){v h=CreateWindow("EDIT","n",(1<<28),0,0,1<<31,1<<\
31,0,0,0,0);HideCaret(h);SetTimer(h,1,r,0);MSG m;while(GetMessage(&m,0,0,0)!=0\
){if(m.message==275){v d=GetDC(h);Rectangle(d,0,0,r,r);SYSTEMTIME s;GetLocalTi\
me(&s);L(d,R(s.wSecond*6));L(d,R(s.wMinute*6));L(d,R(s.wHour*30));ReleaseDC(h,\
d);}if(m.message==513){break;}DispatchMessage(&m);}KillTimer(h,1);}
392:デフォルトの名無しさん
02/06/28 14:31
漏れの環境(VS6SP5)だと、
math.hをインクルードしないとエラーになったので、
一行減って、一行増えたから、減ってない・・・。
鬱だ。
#define NO_STRICT
#include <windows.h>
#include <math.h>
typedef void*v;typedef float f;v d;f q=50;void L(f r){r=(15-r)/9.55;MoveToEx(d,
q,q,0);LineTo(d,q+q*cos(r),q-q*sin(r));}int WINAPI WinMain(v,v,char*,int){v h=\
CreateWindow("EDIT","n",1<<28,0,0,1<<31,1<<31,0,0,0,0);HideCaret(h);SetTimer(h,
1,100,0);MSG m;while(GetMessage(&m,0,0,0)&&m.message!=513){if(m.message==275){
d=GetDC(h);Rectangle(d,0,0,100,100);SYSTEMTIME s;GetLocalTime(&s);L(s.wSecond);
L(s.wMinute);L(s.wHour*5);ReleaseDC(h,d);}DispatchMessage(&m);}KillTimer(h,1);}
393:デフォルトの名無しさん
02/06/28 15:00
「 #include
は数えないのはどうよ?」
って議論になったことがあった(はず)なのでキニスンナ!
394:デフォルトの名無しさん
02/06/28 19:29
新たなお題キボーン
395:デフォルトの名無しさん
02/06/28 19:47
>>393
おいおい、ソリャだめだって話になったろ
396:392
02/06/28 21:22
>>395
オーケイ、分かった
#include <windows.h>
#include <math.h>
HDC d;float q=50;L(float r){r=(15-r)/9.55;MoveToEx(d,q,q,0);LineTo(d,q+q*cos(r)
,q-q*sin(r));}WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){WNDCLASS w={67,D\
efWindowProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);HWND h=CreateWindow("1",0,51\
3<<19,0,0,200,200,0,0,i,0);SetTimer(h,1,99,0);MSG m;d=GetDC(h);while(GetMessag\
e(&m,h,0,0)!=-1){if(m.message==275){Rectangle(d,0,0,100,100);SYSTEMTIME s;GetL\
ocalTime(&s);L(s.wSecond);L(s.wMinute);L(s.wHour*5);}DispatchMessage(&m);}}
先人の遺産(砂嵐)を参考にしてみた
でも、漏れには限界・・・
397:392
02/06/28 22:55
前スレの537を参考に・・・
#include <windows.h>
typedef double b;b cos(b);b sin(b);HDC d;b q=30;L(b r){r=(15-r)/9.55;MoveToEx(d
,q,q,0);LineTo(d,q+q*cos(r),q-q*sin(r));}WINAPI WinMain(HINSTANCE i,HINSTANCE p
,LPSTR l,int q){MSG m;HWND h;SYSTEMTIME s;WNDCLASS w={67,DefWindowProc,0,0,i,0,
0,0,0,"1"};RegisterClass(&w);h=CreateWindow("1",0,513<<19,0,0,95,95,0,0,i,0);S\
etTimer(h,1,99,0);d=GetDC(h);while(GetMessage(&m,h,0,0)!=-1){if(m.message==275)
{Rectangle(d,0,0,60,60);GetLocalTime(&s);L(s.wSecond);L(s.wMinute);L(s.wHour*5)
;}DispatchMessage(&m);}}
あと、24字で七行達成かな?
一人でやってると鬱だからage
誰か、助けて
398:392
02/06/28 22:56
書き忘れたけど、>>397からは.cppじゃなくて.cでよろしく
399:tara
02/06/29 04:50
VC++ .NETであれば、これでも動くはずです。
#include <windows.h>
typedef double b;b cos(b),sin(b);HDC d;b q=30;L(b r){r=(15-r)/9.55;MoveToEx(d,q
,q,0);LineTo(d,q+q*cos(r),q-q*sin(r));}WinMain(i,p,l,q){MSG m;HWND h;SYSTEMTIME
s;WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);h=
CreateWindow("1",0,513<<19,0,0,95,95,0,0,i,0);SetTimer(h,1,99,0);d=GetDC(h);
while(GetMessage(&m,h,0,0)!=-1){if(m.message==275){GetLocalTime(&s);Rectangle(
d,0,0,60,60);L(s.wSecond);L(s.wMinute);L(s.wHour*5);}DispatchMessage(&m);}}
400:デフォルトの名無しさん
02/06/29 13:54
>>395
いや、「打つ」とかかいてあったんで。
401:392
02/06/29 16:48
>>399
お早う。本当だ、動いたヨ。
ずっと、VS6でやってたからなぁ。
何はともあれ、taraさんThx!
402:392
02/06/29 18:07
#include <windows.h>
typedef double b;b sin(b),q=30;HDC d;HWND hL(b r){r=(15-r)/9.55;MoveToEx(d,q,q,
0);LineTo(d,q+q*sin(r+1.57),q-q*sin(r));}WINAPI WinMain(HINSTANCE i,HINSTANCE p
,LPSTR l,int q){MSG m;SYSTEMTIME s;WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,
"1"};RegisterClass(&w);h=CreateWindow("1",0,513<<19,0,0,95,95,0,0,i,0);SetTimer
(h,1,99,0);d=GetDC(h);while(GetMessage(&m,h,0,0)!=-1){if(m.message==275){Recta\
ngle(d,0,0,60,60);GetLocalTime(&s);L(s.wSecond);L(s.wMinute);L(s.wHour*5);}Dis\
patchMessage(&m);}}
taraさんを見習って宣言をまとめた。
あと、cosを使わないように変えた。
これで、5文字減らした。
VS6でも七行達成するのを目標に!
403:392
02/06/29 18:14
>>402
しまった。HWND hの後にセミコロンが抜けてる!
でも、4行目の余白で吸収されるかな。
404:デフォルトの名無しさん
02/06/29 23:34
家にはVC++無いんで確認できないけど七行達成したよ。
誰か確認おながいします。
#include <windows.h>
float sinf(float),q=30;HDC d;HWND h;MSG m;L(float r){MoveToEx(d,q,q,0);r/=9.55;
LineTo(d,q+q*sinf(r),q-q*sinf(r+1.57));}WINAPI WinMain(HINSTANCE i,HINSTANCE p,
LPSTR l,int q){SYSTEMTIME s;WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,"1"};Re\
gisterClass(&w);Rectangle(d=GetDC(h=CreateWindow("1",0,513<<19,0,0,95,95,0,0,i,
0)),0,0,60,60);SetTimer(h,1,99,0);while(GetMessage(&m,h,0,0)>-1)m.message==275?
GetLocalTime(&s),L(s.wSecond),L(s.wMinute),L(s.wHour*5):0;DispatchMessage(&m);}
405:せめて
02/06/29 23:37
>>404
なにをするプログラムなのか、書け
406:392
02/06/29 23:41
#include <windows.h>
typedef double b;b sin(b),q=30;HDC d;HWND h;L(b r){r=(15-r)/9.55;MoveToEx(d,q,q
,0);LineTo(d,q+q*sin(r+1.57),q-q*sin(r));}WINAPI WinMain(HINSTANCE i,HINSTANCE
p,LPSTR l,int q){MSG m;WORD s[8];WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,"1"
};RegisterClass(&w);h=CreateWindow("1",0,513<<19,0,0,95,95,0,0,i,0);SetTimer(h,
1,99,0);d=GetDC(h);while(GetMessage(&m,h,0,0)!=-1){if(m.message==275){Rectangle
(d,0,0,60,60);GetLocalTime((PSYSTEMTIME)s);L(s[6]);L(s[5]);L(s[4]*5);}Dispatch\
Message(&m);}}
SYSTEMTIME構造体をWORDの配列に変更
407:404
02/06/29 23:53
>405
>>402のを縮めてみますた。
408:392
02/06/29 23:53
>>404
ごめん、見てなかった
残念ながら、
error LNK2001: 外部シンボル "_sinf" は未解決です
fatal error LNK1120: 外部参照 1 が未解決です。
と言われたよ。
409:デフォルトの名無しさん
02/06/30 00:03
つーか>>399のやつ、VC6.0でも動くが何が問題?
410:392
02/06/30 00:13
>>409
あ、VC.NETで動くのは見たけど、
VC6で動かないのは確かめなかった。
taraさん、>>404さん、ごめんなさい
#include <windows.h>
double sin(double),q=30;HDC d;L(double r){r/=9.55;MoveToEx(d,q,q,0);LineTo(d,q+
q*sin(r),q-q*sin(r+1.57));}HWND h;WinMain(i,p,l,q){MSG m;WORD s[8];WNDCLASS w={
67,DefWindowProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);h=CreateWindow("1",0,513\
<<19,0,0,95,95,0,0,i,0);SetTimer(h,1,99,0);d=GetDC(h);while(GetMessage(&m,h,0,0
)!=-1){m.message==275?Rectangle(d,0,0,60,60),GetLocalTime((PSYSTEMTIME)s),L(s[6]
),L(s[5]),L(s[4]*5):0;DispatchMessage(&m);}}
これで最後。
411:392
02/06/30 00:27
>>409
教えてくれてありがとう。
おかげで助かった。
412:tara
02/06/30 01:42
>409
お、VC++6.0でも動きましたか。
.NETの方しかインストールしてなかったもので、確認できなかったんです。
ありがとうございました。
413:404
02/06/30 01:48
>>408
sinfってman引いてあったから使ったんだけどVCには無いのか。鬱氏。
>>410
7行達成おめでとう♪
414:392
02/06/30 02:00
>>413
ありがとうございます
sinの計算と、三項演算子は参考にさせて頂きました。
ところで、次のお題って誰かありませんか?
415:tara
02/06/30 02:15
>414
遅ればせながら、おめでとうございます。
で、次ですか……。
POP3のクライアントってありましたっけ。
416:392
02/06/30 04:53
>>415
POP3クライアントは、
無かったと思いますよ。
SMTPは・・・、参加なさってたんですね(w
とりあえず、Webアプリの経験ないんで、
猫で修行しに逝ってきます
URLリンク(www.kumei.ne.jp)
417:デフォルトの名無しさん
02/06/30 05:26
pop3は意味無いだろ
メッセージ取ってきてもmimeとかでエンコーディングされてるし
418:デフォルトの名無しさん
02/06/30 10:15
>>417
デコードすればいいじゃん。
できない?
nkf32.dllを使いなさい。
419:4k demo
02/06/30 12:42
7行じゃないけど・・・これはすごいの?すごくないの?どぉなの?
4K+ポリゴン+音源+音楽
fURLリンク(ftp.jp.scene.org)
420:おまえら!
02/06/30 12:44
includeしているのは何行あるんだ!
7行じゃなくてコンパイル後のサイズで勝敗つけろや!
421:デフォルトの名無しさん
02/06/30 12:46
>>420
>includeしているのは何行あるんだ!
その手があったか!w
422:デフォルトの名無しさん
02/06/30 12:54
>>420
それでいいやろ(w
423:デフォルトの名無しさん
02/06/30 14:07
>>420
静的リンクする上に、標準のライブラリもサイズに含めるということかな?
でも、ライブラリなんて(サイズも含めて)システム依存だから、単純に比べられないよね
アセンブラだったら、ソースコードの方がサイズが大きいってことか…
424:デフォルトの名無しさん
02/06/30 14:08
>>420
Perl や JavaScript はどうすればいいんだ?
425:おまえら!
02/06/30 16:57
PerlはともかくJavaはこんぱいるできるだろ。
426:デフォルトの名無しさん
02/06/30 17:42
Java(以下略)
427:デフォルトの名無しさん
02/06/30 18:19
>>425
Perl はコンパイルできますが、JavaScript は……
428:デフォルトの名無しさん
02/06/30 19:16
>>425
議論をするのは構わないけど、ageないで。
429:デフォルトの名無しさん
02/06/30 20:27
インタプリタは従来どおりでイイんじゃ?
430:おまえら!part2
02/06/30 21:20
>>423
あほか?
ワシがいうてんのは、しらん人間の作ったソースを
組み込んでて、
「すごいねチミ!ハァハァ」
「おたくのやつのほうがスゴイッスよアニキィ!ハァハァ」
やってられん!
431:デフォルトの名無しさん
02/06/30 22:17
>>430
それって GPL ?
432:デフォルトの名無しさん
02/06/30 22:17
>>430
オブジェクトならいいのか ?
433:おまえら!part2
02/06/30 22:28
俺はすごいぞ。
Cの標準関数なんぞ使ったこと無い。
人のライブラリなんぞ信用できるか!
main以外は全部自作だ。
434:デフォルトの名無しさん
02/06/30 22:54
mainを他人のプログラムから流用するのはスゴイ
435:デフォルトの名無しさん
02/06/30 22:54
4kデモはデモスレで語ってくれ。
436:デフォルトの名無しさん
02/06/30 22:56
>>433
Windowsのプログラムをどう書いてるのか、興味が・・・
437:デフォルトの名無しさん
02/06/30 23:37
>>433
もちろん Java でもそれを実行なさっている、と
438:デフォルトの名無しさん
02/06/30 23:42
まぁ、漏れもJavaでCの標準関数は使わないな
439:デフォルトの名無しさん
02/07/01 00:41
で、この議論は7行スレとどんな関係があるのですか?
440:デフォルトの名無しさん
02/07/01 00:57
>>438
使っている漏れは、どうすればいいのでしょう
441:デフォルトの名無しさん
02/07/03 22:11
保守
442:デフォルトの名無しさん
02/07/03 23:31
うーん
7行でJPEG、かなり厳しいなぁ・・・
443:デフォルトの名無しさん
02/07/04 01:11
>>442
7行で DCT あるいは DFT だけならいけるかもしれないよ。
つーか、普通に書いてもメインの部分はそれくらいか…
444:デフォルトの名無しさん
02/07/04 01:18
>442
7行無圧縮PNGなら出来るかもな。
でも、CRCの計算がきついかもしれない。
445:デフォルトの名無しさん
02/07/04 09:57
>>444
とりあえず CRC の部分から書き始めてみる?
そこから、PNG のように大きな枠組みに持っていくのは大変かもしれないけど、
任意の CRC を計算するまでならできそうだし、それはそれで功有りかと。
446:デフォルトの名無しさん
02/07/04 10:49
>>445
いいですねぇ。最終的に7行の*.cファイル群を幾つかリンクするとJPEGエンコーダ/
デコーダ等々になる、というのは面白いかも。
447:445
02/07/04 11:52
CRC32 を計算、入力は標準入力から。g++ 2.95.3
多分あってると思いますが、確認お願いします。
#include <fstream>
unsigned C,t[256],i,j,v,a=256;
main(){
for(i=0;i<a;t[i++]=v)for(v=i,j=0;j<8;j++)v=(v&1)?((v/2)^0xEDB88320):(v/2);
for(C=~0;~(i=cin.get());)C=t[(C%a)^i]^(C/a);
cout<<hex<<~C<<endl;
}
448:445
02/07/04 12:08
ごめんなさい。1つ前のバージョンを送ってしまいました。
#include <fstream>
unsigned C,t[256],i,j,a=256;
main(){
for(;i<a;t[i++]=C)for(C=i,j=9;--j;)C=C/2^(C&1?0xEDB88320:0);
for(C=~0;~(i=cin.get());C=t[(C%a)^i]^(C/a));
cout<<hex<<~C<<endl;
}
449:デフォルトの名無しさん
02/07/04 13:34
参考資料
URLリンク(www01.u-page.so-net.ne.jp)
450:445
02/07/04 14:49
>>449
そうです。そこから縮めました。書いておけばよかったですね、はい。
ちなみに C=t[C%a^i]^C/a) でもう少し縮められます。
451:1
02/07/04 18:54
#include <stdio.h>
int main(void)
{
while(1)
printf("\t\b\b");
}
452:デフォルトの名無しさん
02/07/04 22:49
>>451
XPクラッシャーじゃん
453:デフォルトの名無しさん
02/07/05 09:21
>>452
確か 2000 でも落ちるような。
9x, Me は大丈夫。
454:デフォルトの名無しさん
02/07/05 21:47
>>453
NT系アウトの罠>>printf("\t\b\b");
455:デフォルトの名無しさん
02/07/06 10:39
七行プログラミングのスレにでてるコードをちゃんとインデントを入れた形に整形してくれる
プログラムなんてガイシュツですか?
456:デフォルトの名無しさん
02/07/06 10:41
>>455
作ればいいかと。{}付けがよっぽど変なバカのコード以外は簡単かと。
457:デフォルトの名無しさん
02/07/06 10:45
>>455
プリティプリンタでぐぐればいっぱいあるよ。
458:デフォルトの名無しさん
02/07/06 11:11
gnu-indent
459:デフォルトの名無しさん
02/07/06 11:19
>>455
visual stadioでもできるよ(たぶん
460:デフォルトの名無しさん
02/07/06 11:22
できない
461:デフォルトの名無しさん
02/07/06 19:53
DCTまだですか?
462:デフォルトの名無しさん
02/07/06 22:43
double c[8][8],is;void di(){int u,v;is=1./sqrt(2.);for(u=0;u<8;u++)for(v=0;x<8;
x++)c[u][x]=cos((2.*x+1.)*u*M_PI/16.);}void dc(int *b){int v,u,x,y,w[64];double
s,cu,cv;for(v=0;v<8;v++){cv=(v==0)?is:1.0;for(u=0;u<8;u++){cu=(u==0)?is:1.;s=0;
for(y=0;y<8;y+)for(x=0;x<8;x++)s+=b[y*8+x]*c[u][x]*c[v][y];w[v*8+u]=(int)(s*cu*
cv/4);}}}
463:デフォルトの名無しさん
02/07/06 23:07
>>462
x と v を間違えたり、y+ になったり、ちょっとしょぼーん(´・ω・`)
もっと短くできそうだ
次は、PNG と JPG のファイルフォーマット変換部分か…
464:デフォルトの名無しさん
02/07/06 23:23
モジュールを集めればJPEGだって何だってできるのはあたりまえだから、
もう少し「寄せ集めること」の意義を考えてみないか?
たとえばSUSIEみたいに、メインルーチンとローダー・変換部分をわけて、
それぞれが7行プログラムで作成されているというように。
465:462
02/07/06 23:25
>>463 叩き台なので勘弁してCRAY.
466:デフォルトの名無しさん
02/07/06 23:54
Javaを使えば、JPEG入出力なんて始めからできているという罠
467:デフォルトの名無しさん
02/07/07 00:28
double c[8][8],is,s;int x,y,u,w[64];di(){is=1/sqrt(2);for(u=0;u<64;u++)c[u/8][u
%8]=cos((2*(u%8)+1)*(u/8)*M_PI/16);}dc(int*b){for(x=0;x<8;x++)for(u=0;u<8;w[x*8
+u]=s*(x?1:is)*(u++?1:is)/4)for(s=0,y=0;y<64;y++)s+=b[y]*c[u][y%8]*c[x][y/8];}
468:463
02/07/07 01:11
先を越された…
double c[8][8],s;int x,y,w[64];di(){for(x=64;x--;c[y=x/8][x%8]=cos((2*(x%8)+1)*
y*M_PI/16));}dc(int*b){for(x=64;x--;w[x]=s*(x/8?1:1/sqrt(2))*(x%8?1:1/sqrt(2))/
4)for(s=0,y=64;y--;)s+=b[y]*c[x%8][y%8]*c[x/8][y/8];}
469:デフォルトの名無しさん
02/07/07 12:27
>>464
過去ログ読んでね。そう言うコンセプトでやってる。
470:464
02/07/07 18:19
>>469
ごめん。読んでいるけどわからんかった・・・ウツ
471:デフォルトの名無しさん
02/07/08 02:27
(⌒Д⌒)あらやだわ奥さんハハハ
472:みぃとぼぉる
02/07/08 15:09
参戦?させていただきます。んで、Pascalにて迷路...
Program Q;const B=$B800;var S,C,D,F:Word;A:Array[1..999]of Integer;begin For C
:=81to 3840do begin MemW[B:C*2]:=4016;If(C mod 80)=77 then C:=C+3;end;S:=1;A[S]
:=324;while(S>0)do begin C:=A[S];Mem[B:C]:=0;F:=0;while(F<15)do begin D:=(
Port[65]+S)mod 4;F:=F OR(1SHL D);D:=(2-(D div 2)*4)*(1+(D mod 2)*79);If Mem[B:C
+D*2]=176then begin Mem[B:C+D]:=0;A[S+1]:=C+D*2;S:=S+2;Break;end;end;S:=S-1;end
;Mem[B:164]:=0;Mem[B:7672]:=0;Readln;End.
80x50の英語モードDOS窓で CLS してから実行してちょ。
Borland Pascal 7.0 / WinXP で動作確認済み。難しい事は一切やっていないような。
ランタイムエラーが怖いのでCRTは未使用です。
尚、MS-DOSのメモリ依存。
473:みぃとぼぉる
02/07/08 16:25
ちょっぴり修正。
Program Q;Uses crt;const B=$B800;var S,C,D,F:Word;A:Array[1..999]of Word;begin
TextMode(259);Randomize;For C:=81to 3840do begin MemW[B:C*2]:=4059;If(C mod 80)
=77 then C:=C+3;end;S:=1;A[S]:=324;while(S>0)do begin C:=A[S];Mem[B:C]:=0;F:=0;
while(F<15)do begin D:=Random(4);F:=F OR(1SHL D);D:=(2-(D div 2)*4)*(1+(D mod 2
)*79);If Mem[B:C+D*2]=219then begin Mem[B:C+D]:=0;A[S+1]:=C+D*2;S:=S+2;Break;
end;end;S:=S-1;end;Mem[B:164]:=0;Mem[B:7672]:=0;Readln;End.
- ランダムナンバージェネレーターにポートを使わずに正規の命令を使用。
- 毎回生成するパターンも変更される。
- Borland / Turbo Pascal で実行時にエラーが出る場合は CRT と TextMode を削除
するか、バグ修正板のCRT RTLを使用すること。
でわ。
474:775
02/07/09 23:02
激簡単なもんから・・・・。
元画像をppmに限定すれば読みこみはかなり削減できないかな。>コンバータ
#include <stdio.h>/* usage:bmp2ppm src.bmp dest.ppm*/
main(int c, char*v[]){int i,x,y;FILE *f,*g;if(c<3)return;if((f=fopen(v[1],
"rb"))==NULL||(g=fopen(v[2],"w"))==NULL)return;fseek(f,18,SEEK_SET);fread(&x,4
,1,f);fread(&y,4,1,f);fprintf(g,"P6\n%d %d\n255\n",x,y);fseek(f,54,SEEK_SET);
for(i=0;i<x*y*3;i++)fputc(fgetc(f),g);fclose(f);fclose(g);}
475:392
02/07/10 10:32
遅くなったけど、popクライアント
rcvmail サーバ名 ユーザ名 パスワード メール番号
#include <WinSock.h>
char z[512];int s,r,S;M(){z[r=recv(s,z,512,0)]=0;printf("%s",z);}T(x,y){r=spri\
ntf(z,x,y);strcat(z,"\r\n");send(s,z,r+2,0);M();}main(int c,char** v){SOCKADDR\
_IN a={2,28160};WSAStartup(257,z);a.sin_addr=*((PIN_ADDR)*(gethostbyname(v[1]))
->h_addr_list);connect(s=socket(2,1,0),&a,16);M();T("USER %s",v[2]);T("PASS %s"
,v[3]);if(c>4&&(c=atoi(v[4]))>0){T("LIST %d",c);sscanf(z,"%s%d%d",z+r,&r,&S);T(
"RETR %d",c);while((S-=r)>=0)M();}T("QUIT",0);closesocket(s);WSACleanup();}
476:463
02/07/10 18:19
>>474
上下反転はともかく、RGBも逆だといやんなので、直しました。
上下も直した方が良いでしょうかね?
#include <stdio.h>/* usage:bmp2ppm src.bmp dest.ppm */
main(int c,char**v){int i,x,y,z[3];FILE*f,*g;if(c<3||(f=fopen(v[1],"rb"))==NULL
||(g=fopen(v[2],"w"))==NULL)return;fseek(f,18,c=SEEK_SET);fread(&x,4,1,f);fread
(&y,4,1,f);fprintf(g,"P6\n%d %d\n255\n",x,y);fseek(f,54,c);for(i=x*y;--i;){for(
c=0;c<3;)z[c++]=fgetc(f);for(;c--;)fputc(z[c],g);}fclose(f);fclose(g);}
477:デフォルトの名無しさん
02/07/10 21:36
保守
478:デフォルトの名無しさん
02/07/10 21:41
>>477
早っ ∑(゚Д゚)
479:デフォルトの名無しさん
02/07/10 22:35
popクライアント
キタ━━(^∀゚)━━!!
480:デフォルトの名無しさん
02/07/11 18:47
寄せ集めで作ってみた無圧縮PNG。10行デス
CRCは>>448のを使わせてもらいました
#include <stdio.h>
typedef unsigned U;U X=128,C,t[256],i,j,a=256,h[17]={73,72,68,82},d[1<<18]={73,
68,65,84,120,218,1},l,M=1,N;FILE*f;B(U b){fputc(b,f);}W(U n){B(n>>24);B(n>>16);
B(n>>8);B(n);}S(U*b,U n){for(i=0;i<n;)B(b[i++]);for(i=0;i<a;t[i++]=C)for(C=i,j=
9;--j;)C=C/2^(C&1?0xedb88320:0);for(i=0,C=~0;i<n;)C=t[C%a^b[i++]&0xff]^C/a;W(~C
);}main(){f=fopen("mona.png","wb");W(0x89504e47);W(0xd0a1a0a);l=X+X*X*3;h[7]=h[
11]=X;h[12]=8;h[13]=2;W(13);S(h,17);d[7]=l;d[8]=l>>8;d[9]=~l;d[10]=~l>>8;l+=11;
for(i=11;i<l;M=(M+d[i++])%65521,N=(N+M)%65521)d[i]=(i-11)%(X*3+1)?i%a:0;d[i++]=
N>>8;d[i++]=N;d[i++]=M>>8;d[i++]=M;W(l);S(d,l+4);W(0);W(0x49454e44);
W(0xae426082);}
481:デフォルトの名無しさん
02/07/11 20:43
これは流石に7行は無理じゃなかろか?
482:480
02/07/12 14:08
9行・・・これ以上は無理ぽ
#include <stdio.h>
typedef unsigned U;U X=128,C,t[256],i,j,a=256,h[17]={73,72,68,82},d[1<<18]={73,
68,65,84,120,218,1},l,M=1,N;FILE*f;B(U b){fputc(b,f);}W(U n){B(n>>24);B(n>>16);
B(n>>8);B(n);}S(U*b,U n){for(i=0;i<a;t[i++]=C)for(C=i,j=9;--j;)C=C/2^(C&1?
0xedb88320:0);for(i=0,C=~0;i<n;C=t[C%a^b[i++]&0xff]^C/a)B(b[i]);W(~C);}main(){f
=fopen("mona.png","wb");W(0x89504e47);W(0xd0a1a0a);l=X+X*X*3;h[7]=h[11]=X;h[12]
=8;h[13]=2;W(13);S(h,17);d[7]=l;d[8]=l>>8;d[9]=~l;d[10]=~l>>8;l+=11;for(i=11;i<
l;M=(M+d[i++])%65521,N=(N+M)%65521)d[i]=(i-11)%(X*3+1)?i%a:0;d[i++]=N>>8;d[i++]
=N;d[i++]=M>>8;d[i]=M;W(l);S(d,l+4);W(0);W(0x49454e44);W(0xae426082);}
483:448
02/07/12 18:45
>>480
縮めてみました。
#include <stdio.h>
typedef unsigned U;U*x,X=128,i,j,a=256,t[256],l,M=1,k;FILE*f;W(U n){for(i=4;i--
;)fputc(n>>i*8,f);}S(U*b,U n){W(n-4);for(i=~0;n--;i=t[i%a^*b++%a]^i/a)fputc(*b,
f);W(~i);}main(){U h[17]={73,72,68,82,0,0,0,X,0,0,0,X,8,2},d[1<<18]={73,68,65,
84,120,218,1,l=X+X*X*3,l/a,~l,~l/a};f=fopen("mona.png","wb");for(i=a;i--;k=l/X)
for(k=i,j=9;--j;x=d+11)t[i]=k=k/2^(k&1?0xedb88320:0);W(0x89504e47);W(0xd0a1a0a)
;for(S(h,17);l;l--)j+=M+=*x++=l%k?l%a:0,M%=i=65521,j%=i;*x++=j/a;*x++=j;*x++=M/
a;*x++=M;S(d,x-d);W(0);fputs("IEND\256B`\202",f);}
484:デフォルトの名無しさん
02/07/12 22:43
>>483
もうわからん∑(´Д`;)
485:484
02/07/12 22:46
つーか、新ネタ来たらあげて良し。
486:デフォルトの名無しさん
02/07/12 23:21
mona.pngって…
487:デフォルトの名無しさん
02/07/12 23:23
>>486
モナの絵が出てくるかと思ったけど、そうじゃないところが2ちゃんらしいというか。
488:デフォルトの名無しさん
02/07/14 00:38
age
489:484
02/07/14 02:18
これ以上はちょっと苦しいですね。
標準出力にしてもよいなら、後6文字くらいなんですが。
#include <stdio.h>
unsigned t[256],M=1,i,j,k,l,X=128,a=256;FILE*f;W(int n){for(i=4;i--;)putc(n>>i*
8,f);}S(int*b){W(X-4);for(i=~0;X--;i=t[i%a^putc(*b++,f)%a]^i/a);W(~i);}main(){
int*x,h[17]={73,72,68,82,0,0,0,X,0,0,0,X,8,2},d[1<<16]={73,68,65,84,120,218,1,l
=X+X*X*3,l/a,~l,~l/a};f=fopen("mona.png","wb");for(i=a;i--;k=l/X)for(k=i,j=9;--
j;x=d+11)t[i]=k=k/2^(k&1?0xedb88320:0);W(0x89504e47);W(0xd0a1a0a);for(X=17,S(h)
;l;l--)j+=M+=*x++=l%k?l%a:0,M%=i=65521,j%=i;*x++=j/a;*x++=j;*x++=M/a;*x++=M;X=x
-d;S(d);W(0);fputs("IEND\256B`\202",f);}
490:デフォルトの名無しさん
02/07/14 02:21
失礼。 484 ではなく 448 でした。
491:448
02/07/14 02:59
標準出力へ無圧縮 PNG を吐き出す7行プログラム
#include <stdio.h>
unsigned t[256],M=1,i,j,l,X=128,a=256;W(int n){for(i=4;i--;)putchar(n>>i*8);}S(
int*b){W(X-4);for(i=~0;X--;i=M^i/a)for(M=i%a^putchar(*b++)%a,j=9;--j;)M=M/2^(M&
1?0xedb88320:0);W(~i);}main(){int*x,h[17]={73,72,68,82,0,0,0,X,0,0,0,X,8,2},d[1
<<16]={73,68,65,84,120,218,1,l=X+X*X*3,l/a,~l,~l/a};W(0x89504e47);W(0xd0a1a0a);
X=l/X;for(x=d+11;l;l--)j+=M+=*x++=l%X?l%a:0,M%=i=65521,j%=i;*x++=j/a;*x++=j;*x
++=M/a;*x++=M;X=17;S(h);X=x-d;S(d);W(0);printf("IEND\256B`\202");}
492:デフォルトの名無しさん
02/07/14 10:39
ってかコンパイルとおらん・・・。
「不正な初期化」
493:448
02/07/14 13:28
>>492
gcc -ansi foo.c として通ったから問題ないと思った・・・
どこがだめだかわかります? h[] と d[] の初期化かなぁ
494:448
02/07/14 13:47
>>492
通らないコンパイラは bcc32 かな。
gcc も -pedantic を付けたら通らなかった。
配列の初期化はコンパイル時に決定すべし、ということを忘れていたよ・・・欝
495:デフォルトの名無しさん
02/07/14 13:56
------ ビルド開始 : プロジェクト : 491, 構成 : Debug Win32 ------
コンパイルしています...
main.cpp
f:\programs\C++.net\7行\part2\491\main.cpp(2) : warning C4508: 'W' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
f:\programs\C++.net\7行\part2\491\main.cpp(4) : warning C4508: 'S' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。
f:\programs\C++.net\7行\part2\491\main.cpp(7) : warning C4244: '=' : '__w64 int' から 'unsigned int' に変換しました。データが失われているかもしれません。
リンクしています...
ビルドログは "file://f:\programs\C++.net\7行\part2\491\Debug\BuildLog.htm" に保存されました。
491 - エラー 0、警告 3
---------------------- 終了 ----------------------
ビルド : 1 正常終了、0 失敗、0 スキップ
496:392
02/07/15 10:40
>>475 で受信したメッセージのSJISの本文を読めるようにする
rcvmail サーバ名 ユーザ名 パスワード メール番号 | tosjis
#include <stdio.h>
int x,y=0,f=0,c=-1,h,l;int T(int j){h=(j>>8)&255;l=j&255;l+=(h&1)?31:125;if(l>
126)l++;h=((h-33)>>1)+129;if(h>159)h+=64;return(h<<8)|l;}main(){while((x=getch\
ar())!=EOF)if(++c||x!=27)if(c!=1||!f||x!=40)if(c!=1||f||x!=36){if(c!=2||x!=66){
if(f)if(x<33||x>126)putchar(x);else if(!y)y=x;else{x=T(x|(y<<8));y=0;putchar(x
>>8);putchar(x&255);}else putchar(x);}else f^=1;c=-1;}}
497:デフォルトの名無しさん
02/07/15 19:48
>>496
縮めてみました。
#include <stdio.h>
int x,y,f,c=-1;main(){while(~(x=getchar()))if(++c||x-27)if(c-1||!f||x-40)if(c-1
||f||x-36){if(c-2||x-66)f&&32<x&&x<127&&!(c=!y)?x+=y&1?31:125,x>126?x++:0,y=(y-
33)/2+129,putchar(y>159?y+64:y),y=0:0,c?y=x:putchar(x);else f^=1;c=-1;}}
498:デフォルトの名無しさん
02/07/15 20:24
4行…(~~~ ゚ ∀~)~~~ ゚ メダマ ボーン
499:デフォルトの名無しさん
02/07/15 20:28
>>498ワラタ。
( ~~~゚ ∀~)~~~ ゚ メダマ ボーン
みんなご一緒に… ( ~~~ ゚ ∀~)~~~ ゚ メダマ ボーン
意味不明なところで>>500getしてください。
500:デフォルトの名無しさん
02/07/15 20:30
500!!
7行は永遠に不滅です!
501:デフォルトの名無しさん
02/07/15 20:32
>>500
はげどー
502:デフォルトの名無しさん
02/07/15 20:35
七行はPart2で終わりです
503:デフォルトの名無しさん
02/07/15 20:46
Part2で終り?!・・・( ~~~゚ ∀~)~~~ ゚ メダマ ボーン
504:デフォルトの名無しさん
02/07/15 20:48
7行どころか7行未満にする達人が増えたので、今度は
7行以下プログラミング
になります。
505:デフォルトの名無しさん
02/07/15 20:51
>>497 を >>475 の pop クライアントに融合させ、
直接 SJIS でメールを読むことができるようにならんかなぁ
お題のつもりなので age ます
506:497
02/07/15 21:59
これ以上は難しそうなので、終わりにします。
メールの方は良くわからないので、 >>505 のお題は他の方、どうぞお願いします。
#include <stdio.h>
int x,y,f,c=-1;main(){while(~(x=getchar()))if(++c||x-27)if(c-1||!f||x-40)if(c-1
||f||x-36){c==2&&x==66?f^=1:(f&&32<x&&x<127&&!(c=!y)?x+=y&1?x>95?32:31:126,y=(y
-33)/2+129,putchar(y>159?y+64:y),y=0:0,c?y=x:putchar(x));c=-1;}}
507:デフォルトの名無しさん
02/07/16 00:00
(~~~ ゚ ∀~)~~~ ゚ メダマ ボーン
508:デフォルトの名無しさん
02/07/16 20:33
保持age
509:デフォルトの名無しさん
02/07/17 01:00
repeat
cls 0:mes ""+h+":"+m+":"+s
wait 100
s+
if s=60{m+:s = 0}
if m=60{h+:m = 0}
loop
510:392
02/07/17 15:12
>>505 のお題に応えてみたけど・・・
とりあえず、くっつけてみただけ
#include <WinSock.h>
char z[512];int s,r,S,x,f,y,c=-1;M(){z[recv(s,z,512,0)]=0;for(r=0;x=z[r++];)if(
++c||x-27)if(c-1||!f||x-40)if(c-1||f||x-36){c==2&&x==66?f^=1:(f&&32<x&&x<127&&!
(c=!y)?x+=y&1?x>95?32:31:126,y=(y-33)/2+129,putchar(y>159?y+64:y),y=0:0,c?y=x:\
putchar(x));c=-1;}}T(x,y){r=sprintf(z,x,y);send(s,strcat(z,"\r\n"),r+2,0);M();}
main(int c,char** v){SOCKADDR_IN a={2,28160};WSAStartup(257,z);a.sin_addr=*((P\
IN_ADDR)*(gethostbyname(v[1]))->h_addr_list);connect(s=socket(2,1,0),&a,16);M()
;T("USER %s",v[2]);T("PASS %s",v[3]);if(c>4&&(c=atoi(v[4]))>0){T("LIST %d",c);
sscanf(z,"%s%d%d",z+r,&r,&S);T("RETR %d",c);while((S-=r)>=0)M();}T("QUIT",0);c\
losesocket(s);WSACleanup();printf("\r\n");}
現在、10行
511:デフォルトの名無しさん
02/07/19 18:21
age
512:七誌饅頭 ◆Pc9801rE
02/07/20 17:23
静的RangeEncoderです
encode inputfile outputfileとして使ってください。
unsigned longのかわりにsize_tを使うなど、外道なことをしています。
#include <stdio.h>
size_t l=0,r=0xffffffff,z,u[257];unsigned char f[256];main(int a,char**v){FILE
*n=fopen(v[1],"rb"),*o=fopen(v[2],"wb");int i,c;fseek(n,0,2);z=ftell(n);fwrite
(&z,4,1,o);fseek(n,0,0);while((c=fgetc(n))!=-1)if(f[c]!=255)f[c]++;for(i=0;i<
256;i++)u[i+1]=u[i]+f[i];fwrite(f,1,256,o);fseek(n,0,0);while((c=fgetc(n))!=-1
){r/=u[256];l+=u[c]*r;r*=f[c];while((l^l+r)<1<<24||r<1<<16&&((r=65535&~l+1),1)
){fputc(l>>24,o);r<<=8;l<<=8;}}for(i=0;i<4;i++){fputc(l>>24,o);l<<=8;}}
513:七誌饅頭 ◆Pc9801rE
02/07/20 17:24
ついでにDecoder
#include <stdio.h>
unsigned char f[256];size_t l,r=0xffffffff,c,q,z,u[257],i;main(int a,char**v){
FILE*n=fopen(v[1],"rb"),*o=fopen(v[2],"wb");fread(&z,4,1,n);fread(f,1,256,n);
for(i=0;i<256;i++)u[i+1]=u[i]+f[i];for(i=0;i<4;i++)c=c<<8|fgetc(n);while(z){r
/=u[256];q=(c-l)/r;if(q>=u[256])return;for(i=0;i<256&&q>=u[i+1];i++);if(i>=256
)break;fputc(i,o);z--;l+=u[i]*r;r*=f[i];while((l^l+r)<1<<24||r<1<<16&&((r=~l+1
&65535),1)){c=c<<8|fgetc(n);r<<=8;l<<=8;}}}
514: ◆iM7eXrMU
02/07/20 18:20
C言語+Win32でマンデルブロー。
cygwin で gcc -mno-cygwin -mwindows でコンパイル。
2行目はs=倍率、x=x座標、y=y座標。適当に変えれ。
s=2400,x=500,y=1030なんかも良いかも。
#include <windows.h>
int s=5800,x=1100,y=3000;
m(double a,double b){int t=100;double c,d,e,f;c=a=(a+x)/s;d=b=(b+y)/s;while(t--
){e=c*c-d*d+a;f=2*c*d+b;if(e*e+f*f>4)return 0;c=e;d=f;}return 1;}int WINAPI
WinMain(HINSTANCE q,HINSTANCE w,PSTR e,int r){HDC a=CreateDC("DISPLAY",0,0,0);
double i,j,k=0.5;for(j=0;j<400;j++)for(i=0;i<400;i++)SetPixel(a,i,j,255-RGB(((m
(i,j)+m(i+k,j)+m(i+k,j+k)+m(i,j+k)))*63,0,0));DeleteDC(a);}
515:デフォルトの名無しさん
02/07/20 21:05
>7行×79文字なら言語は問いません。
>過去作品は>>2-5を参照。
これ7行プログラミングじゃなくて、素直に553文字プログラミングにしたほうが
いいような気がする。
改行文字はカウントに含まない。
それでいいじゃん。
本質はそういう事だし、読みづらいだけ。
多分ガイシュツなんだろうけど。
あと悪気はありません。これ面白いと思います。
516:デフォルトの名無しさん
02/07/20 21:14
改行をいかに避けるかにも面白さがあるんじゃないかな?ともおもう
517:デフォルトの名無しさん
02/07/20 22:00
>>512 >>513
符号と復号を別々にしても、いまさらという感じがする。
前スレ スレリンク(tech板:745番) で、
両者を併せて7行にしてしまっている(こちらは動的だが)。
できれば、静的バージョンもあわせて7行を目指して頑張って欲しい。
518:517
02/07/20 22:10
どうでもいいことなのかもしれないが、
過去レスで使われているテクニックをもっと使って欲しいと思ふ。
for 文の記述 for(i=0;i<x;i++){} --> for(i=x;i--;){}
シフト演算の置換 x<<=8,y>>=8; --> a=256;x*=a;y/=8;
ビット演算の利用 x=0xffffffff;while((c=getchar())!=EOF){}
--> x=~0;while(~(c=getchar())){}
519:デフォルトの名無しさん
02/07/21 11:53
>>518
参考になります。
過去ログあんまり読んでなので。なんとなくやっただけだし。
今9行。exec E input outputでエンコード
exec d input outputでデコード
ファイルの入出力が痛い。
#include <stdio.h>
size_t l=0,r=~0,z,q,e,u[257],g;unsigned char f[256];main(int a,char**v){FILE*n
=fopen(v[2],"rb"),*o=fopen(v[3],"wb");int c=4,x=256;if(g=*v[1]-69){fread(&z,4,
1,n);fread(f,1,x,n);for(;c--;)e=e*x|fgetc(n);}else{while(~(c=fgetc(n)))z++,f[c
]<255?f[c]++:0;fwrite(&z,4,1,o);fwrite(f,1,x,o);fseek(n,0,0);}for(c=0;c<x;c++)
u[c+1]=u[c]+f[c];while(g?z--:~(c=fgetc(n))){r/=u[x];if(g){if((q=(e-l)/r)>=u[x]
)break;for(c=x;--c&&q<u[c];);fputc(c,o);}l+=u[c]*r;r*=f[c];while((l^l+r)<1<<24
||r<1<<16&&((r=65535&~l+1),1))g?(e=e*x|fgetc(n)):fputc(l>>24,o),r*=x,l*=x;}if(
!g)for(c=4;c--;)fputc(l>>24,o),l*=x;}
520:デフォルトの名無しさん
02/07/21 14:55
#include <stdio.h>
size_t l,r=~0,z,q,e,u[257],g,f[256];main(int a,char**v){FILE*n=fopen(v[2],"rb"
),*o=fopen(v[3],"wb");int c=4,x=256,(*t)()=fgetc;if(g=*v[1]-69)for(fread(&z,4,
1,n),fread(f,4,x,n);c--;)e=e*x|t(n);else{while(~(c=t(n)))z++,f[c]<255?f[c]++:0
;fwrite(&z,4,1,o);fwrite(f,4,x,o);fseek(n,0,0);}for(c=0;c<x;c++)u[c+1]=u[c]+f[
c];while(g?z--:~(c=t(n))){r/=u[x];if(g){for(q=(e-l)/r,c=x;--c&&q<u[c];);fputc(
c,o);}for(l+=u[c]*r,r*=f[c];(l^l+r)<1<<24||r<1<<16&&(r=65535&~l+1);)g?(e=e*x|t
(n)):fputc(l>>24,o),r*=x,l*=x;}if(!g)for(c=4;c--;)fputc(l>>24,o),l*=x;}
出力サイズは増えるが八行。
これ以上は厳しいかも
521:デフォルトの名無しさん
02/07/21 18:14
>>520
協力しようと思いましたが、あまり縮みませんね。
ロジック部が良くわからないので、ソース追いかけ中です。
定数やそのシフトを変数にできそう。(1<<24とか)
f=u-1 で置き換えると、もう少し短くなりそうですが・・・
#include <stdio.h>
size_t l,r=~0,z,q,e,u[257],f[256],c=5,x=256;main(int g,char**v){FILE*n=fopen(v[
2],"rb"),*o=fopen(v[3],"wb");int(*t)()=fgetc;if(g=*v[1]-69)for(fread(&z,4,1,n),
fread(f,4,x,n);--c;)e=e*x|t(n);else{for(;~(c=t(n));f[c]<255?f[c]++:0)z++;fwrite
(&z,4,1,o);fwrite(f,4,x,o);fseek(n,c=0,0);}for(;c<x;c++)u[c+1]=u[c]+f[c];while(
g?z--:~(c=t(n))){r/=u[x];if(g){for(q=(e-l)/r,c=x;--c&&q<u[c];);fputc(c,o);}for(
l+=u[c]*r,r*=f[c];(l^l+r)<1<<24||r<1<<16&&(r=65535&~l+1);)g?e=e*x|t(n):fputc(l
>>24,o),r*=x,l*=x;}for(c=4;!g&&c--;)fputc(l>>c*8,o);}
522:デフォルトの名無しさん
02/07/21 20:14
int(*t)()=fgetcはsize_tに移動しても大丈夫かと(警告は出るかも)。
523:デフォルトの名無しさん
02/07/22 20:27
u[c+1]=u[c]+f[c];を
q=u[c+1]=q+f[c];にすると1バイトちぢむかも(w
524:521
02/07/22 23:46
>>522 getc に置き換えることにより t を使わないようにしました。
>>523 サンクスです。でも現時点で q が無くても同じ文字数だ・・・
#include <stdio.h>
size_t l,r=~0,z,q,e,u[257],f[256],c=5,x=256;main(int g,char**v){FILE*n=fopen(v[
2],"rb"),*o=fopen(v[3],"wb");if(g=*v[1]-69)for(z=getw(n),fread(f,4,x,n);--c;)e=
e*x|getc(n);else{for(;~(c=getc(n));f[c]<255?f[c]++:0)z++;putw(z,o);fwrite(f,4,x
,o);fseek(n,c=0,0);}for(;c++<x;)q=u[c]=q+f[c-1];for(;g?z--:~(c=getc(n));){r/=u[
x];if(g){for(c=x;--c&&(e-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];(l^l+r)<1
<<24||r<1<<16&&(r=65535&~l+1);)g?e=e*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4
;!g&&c--;)putc(l>>c*8,o);}
525:デフォルトの名無しさん
02/07/22 23:58
age
526:521
02/07/22 23:58
ふと思ったんですが、7行スレで開発されて続けている新しい技術を使うと、
昔のプログラムがもっと縮められることに気づきました。
7行に不到達のもので、何か挑戦してみようかな、などと考えてしまう・・・
でもそれはネタ的には面白くない罠、か
527:デフォルトの名無しさん
02/07/23 01:16
>>526
イインジャネーノ
528:いつも名無し
02/07/23 09:00
しっかし凄い良スレだなぁココ
529:デフォルトの名無しさん
02/07/23 10:33
java chat サーバー
マルチユーザー用のスレッドクラスを別にしてみました。
mainの方は楽勝。
スレッドのほうはだめでした。
クライアントもやってみます。
import java.net.*;import java.io.*;import java.util.*;
public class S{public static void main (String args[]) throws IOException{
int port = Integer.valueOf(args[0]).intValue();ServerSocket sS = null;
boolean e = true;try{sS = new ServerSocket(port);}catch (IOException i){}
while(e){new T(sS.accept()).start();}sS.close(); }}
class T extends Thread {Socket s;PrintStream o;BufferedReader i;static Vector
m;T(Socket s){super("T");s=s;if(m==null){m=new Vector();}m.addElement(this);}
public void run(){try{o=new PrintStream(s.getOutputStream(),true);i=new
BufferedReader(new InputStreamReader(s.getInputStream()));String c;while((c=i.
readLine())!=null){w(c);}e();}catch(IOException e){}}public void w(String s){
for(Enumeration e=m.elements();e.hasMoreElements();){T c=(T)e.nextElement();c.
o.println(s);}}public void e(){try{i.close();o.close();s.close();}catch(
IOException e){}m.removeElement(this);}}
530:デフォルトの名無しさん
02/07/23 12:04
その程度ならまとめろという気がしないでもない。
わざわざスレッド別にして文字数を増やすこともないだろうに。
531:七誌饅頭
02/07/23 17:41
>>521さんすごいです。
r/=u[x];はr/=qにできそうですね。
って3バイトしか縮みませんが。
532:521
02/07/23 17:52
>>531
いやいやとんでもない。これはアルゴリズムもすごいですよ。
オーバーフローを避けるために、r の値を毎回制御しているのはわかったんですが、
(l^l+r)<1<<24 がどういう役割を担っているのか、いまいちわからん。
l の精度が落ちたら? を判定しているのかな。それとも r の?
符号化部と復号部をいっしょにしてしまったのもすごいが、
ロジック部が小さいと、全体のサイズはかえって大きくなるんじゃないかな、
などといろいろプログラムを試行中。
533:デフォルトの名無しさん
02/07/23 18:06
7行未到達のお題を旧スレから見繕ってみました。
現代の技術で、7行を目指してくだちい。
ハフマン符号化
スレリンク(tech板:194番)
レイトレーシング
スレリンク(tech板:209番)
BASIC
スレリンク(tech板:497-518番)
波紋
スレリンク(tech板:678番)
パーティクル
スレリンク(tech板:675-676番)
SHA1
スレリンク(tech板:881-886番)
534:七誌饅頭
02/07/23 18:50
>>532
>(l^l+r)<1<<24 がどういう役割を担っているのか、いまいちわからん。
lとl+rの最上位の8ビットが等しいかどうかの判定ですね。
等しいならXORで消えるので1<<24未満になると。
>符号化部と復号部をいっしょにしてしまったのもすごいが
これは寝る直前に思いつきました。
RangeCoderは符号かも複号化も似たようなものになるのでできそうだ。と思い、
判定の結果を保存しておけば、三項演算子でいけるかもと気づきました。
535:デフォルトの名無しさん
02/07/23 19:22
>>534
いやー、勉強になります。
というわけで、z を保存しないようにしてみました。
#include <stdio.h>
size_t l,r=~0,z,q,e,u[257],f[257],c=5,x=256;main(int g,char**v){FILE*n=fopen(v[
2],"rb"),*o=fopen(v[3],"wb");if(g=*v[1]-69)for(fread(f,4,x,n);--c;)e=e*x|getc(n
);else{for(;~(c=getc(n));f[c]++);fwrite(f,4,x,o);fseek(n,c=0,0);}for(;c<x;c++)z
+=f[c],f[c]>=x?f[c]=255:0,q=u[c+1]=q+f[c];for(;g?z--:~(c=getc(n));){r/=q;if(g){
for(c=x;--c&&(e-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];(l^l+r)<1<<24||r<1
<<16&&(r=65535&~l+1);)g?e=e*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;!g&&c--;
)putc(l>>c*8,o);}
536:デフォルトの名無しさん
02/07/23 19:53
標準入出力に切り替えれば、7行達成じゃね?
537:頭
02/07/23 22:08
1<<16はx*xの方向で。
538:デフォルトの名無しさん
02/07/23 22:37
>>536
標準入出力の巻き戻し fseek(f,0,0); って使えるんでしたっけ?
まぁ、旧スレは標準入出力を使ったので、今回は無しで目指すのはどうでしょ?
もっとも、旧スレのも標準入出力を使わずにできることが判明しました。
539:今日も名無しさん
02/07/23 22:39
f[c] の最大値を 255 じゃなくて、256 にしてもいいもんだろうか?
540:デフォルトの名無しさん
02/07/23 22:46
>>539
終端をサイズで無くターミネータ(0x100)で判断させるためだろ。
この手の圧縮は別に0x00-0xff/charでないといけない物ではない。
541:デフォルトの名無しさん
02/07/23 22:49
>>540
いや、そうではなくて、l と r の上位8ビットを比較するわけで、
このとき 256 倍までならば、整合性が保たれることは確実です。
しかし、r=256*256 となると、r=65535&~l+1 がまずいことになりそうなので、
誰か検証してくれないかなぁ、と思ったのです。
542:541
02/07/23 22:50
ちなみに e>=l が必ず成り立つので、g と e をまとめることができますね。
543:Javaさん
02/07/23 22:54
>>529
ひとつにまとめますた。
T.java
import java.net.*;import java.io.*;import java.util.*;class T extends Thread{
Socket s;OutputStream o;static Vector m;T(Socket a){s=a;m=(m==null)?new Vector()
:m;m.addElement(this);start();}public void run(){try{o=s.getOutputStream();for(
BufferedReader i=new BufferedReader(new InputStreamReader(s.getInputStream()));;
){for(int k=0;k<m.size();) {T c=(T)m.get(k++);c.o.write((i.readLine()+"\n").
getBytes());c.o.flush();}}}catch(Exception e){}m.remove(this);}public static
void main (String[]q) throws Exception{for(ServerSocket v=new ServerSocket(
Integer.parseInt(q[0]));;new T(v.accept()));}}
544:七誌饅頭
02/07/23 23:10
#include <stdio.h>
size_t l,r=~0,z,q,e,u[257],f[257],c=5,x=256;main(int g,char**v){FILE*n=fopen(v
[2],"rb"),*o=fopen(v[3],"wb");g=*v[1]-69;for(g&&fread(f,4,x,n);g?--c:~(c=getc(
n));)g?e=e*x|getc(n):f[c]++;g||(fwrite(f,4,x,o),fseek(n,c=0,0));for(;c<x;c++)z
+=f[c],f[c]>=x?f[c]=255:0,q=u[c+1]=q+f[c];for(;g?z--:~(c=getc(n));){r/=q;if(g)
{for(c=x;--c&&(e-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];(l^l+r)<1<<24||r
<x*x&&(r=-l&65535);)g?e=e*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;!g&&c--;)
putc(l>>c*8,o);}
どうも頭が固いな。
545:デフォルトの名無しさん
02/07/23 23:19
(l^l+r)<1<<24→r<=~l*x/x
遅いけどな(w
546:今日から名無し
02/07/23 23:21
>>544 横1行78文字ですよん?
他もちょっと縮めました。
#include <stdio.h>
size_t l,r=~0,z,q,u[257],f[257],c=5,x=256,*a=f;main(int g,char**v){FILE*n=fopen
(v[2],"rb"),*o=fopen(v[3],"wb");g=*v[1]-69;for(g&&fread(f,4,x,n);g?--c:~(c=getc
(n));)g?g=g*x|getc(n):f[c]++;g||(fwrite(f,4,x,o),fseek(n,c=0,0));for(;c<x;q=u[1
+c++]=q+*a++)z+=*a,*a>=x?*a=255:0;for(;g?z--:~(c=getc(n));){r/=q;if(g){for(c=x;
--c&&(g-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];(l^l+r)<1<<24||r<x*x&&(r=-
l&65535);)g?g=g*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;c--;)g||putc(l>>c*8,
o);}
後4文字っす
547:Javaさん
02/07/23 23:22
>>543のバグ取り (´・ω・`)ショボーン
T.java
import java.net.*;import java.io.*;import java.util.*;class T extends Thread{
Socket s;OutputStream o;static Vector m;T(Socket a){s=a;m=(m==null)?new Vector()
:m;m.addElement(this);}public void run(){try{o=s.getOutputStream();String c="";
for(BufferedReader i=new BufferedReader(new InputStreamReader(s.getInputStream()
));;c=i.readLine()){for(int k=0;k<m.size();) {T t=(T)m.get(k++);t.o.write((c+
"\n").getBytes());t.o.flush();}}}catch(Exception e){}m.remove(this);}public
static void main (String[]q) throws Exception{for(ServerSocket v=new
ServerSocket(Integer.parseInt(q[0]));;new T(v.accept()).start());}}
548:今日こそ名無しさん
02/07/23 23:23
7行達成!?
#include <stdio.h>
size_t l,r=~0,z,q,u[257],f[257],c=5,x=256,*a=f;main(int g,char**v){FILE*n=fopen
(v[2],"rb"),*o=fopen(v[3],"wb");g=*v[1]-69;for(g&&fread(f,4,x,n);g?--c:~(c=getc
(n));)g?g=g*x|getc(n):f[c]++;g||(fwrite(f,4,x,o),fseek(n,c=0,0));for(;c<x;q=u[1
+c++]=q+*a++)z+=*a,*a>=x?*a=255:0;for(;g?z--:~(c=getc(n));){r/=q;if(g){for(c=x;
--c&&(g-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];r<=~l*x/x||r<x*x&&(r=65535
&-l);)g?g=g*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;c--;)g||putc(l>>c*8,o);}
549:デフォルトの名無しさん
02/07/23 23:25
>>548
兄さん! age ましょう!!
550:548
02/07/23 23:27
>>548
すいませんでした!! バイナリファイルだと暴走します。
鬱だ・・・・
551:548
02/07/23 23:31
所詮 >>545 と >>546 を見て、4文字ちょうどジャンと
知識も無いのに参加したおいらが厨ですた・・・
552:521
02/07/23 23:41
>>548-551
g と e をまとめちゃったのが、まずいのではないかな?
今のところ後2文字くらいになっていますが、どこを削れるかなぁ。
553:521
02/07/23 23:45
これで7行ですね。上げておきます。
#include <stdio.h>
size_t*a,l,r=~0,e,z,q,u[257],f[257],c=5,x=256;main(int g,char**v){FILE*n=fopen(
v[2],"rb"),*o=fopen(v[3],"wb");for(g=*v[1]-69&&fread(f,4,x,n);g?--c:~(c=getc(n)
);)g?e=e*x|getc(n):f[c]++;g||fwrite(f,4,x,o)&&fseek(n,c=0,0);for(a=f;c<x;q=u[1+
c++]=q+*a++)z+=*a,*a>=x?*a=255:0;for(;g?z--:~(c=getc(n));){r/=q;if(g){for(c=x;
--c&&(e-l)/r<u[c];);putc(c,o);}for(l+=u[c]*r,r*=f[c];r<=~l*x/x||r<x*x&&(r=65535
&-l);)g?e=e*x|getc(n):putc(l>>24,o),r*=x,l*=x;}for(c=4;c--;)g||putc(l>>c*8,o);}
554:七誌饅頭
02/07/23 23:59
あらま。考えてる間に。
>>521さんお疲れ様です。それにしても縮んでよかった(w
3人寄れば文殊の知恵というかなんと言うか。
コードのエントロピーはどこにあるんでしょうね(w
555:デフォルトの名無しさん
02/07/24 00:14
>>554
今回は久しぶりに参加者が多かったですね。
中盤では、比較的わかりやすいソースコードになっていたからでしょうね。
最終的にはやはり奇妙奇天烈(に見えるもの)になりましたが。
556:デフォルトの名無しさん
02/07/24 00:17
>>553
こいつはマジですげぇ。インデントしてもまともなプログラムとは思えねぇ(w
forをうまく使い込み、(まともに使っていれば)ありえないような例外処理も省き、
その上でエンコードとデコードの処理が3項演算子と論理演算子で融合されている。
定石と、非常識が合わさった執念のプログラム。これが匠という奴なのか。
557:デフォルトの名無しさん
02/07/24 00:22
ソースを追うごとにwhileが消えていく(w
558:最大の賛辞
02/07/24 00:28
君たち頭おかしいよ、まじで。
559:デフォルトの名無しさん
02/07/24 00:29
>>557
やたら for や ?:, ++, --, * が増える。それもまた楽しw
560:デフォルトの名無しさん
02/07/25 14:18
前スレのハフマン符号 スレリンク(tech板:194番)
アルゴリズムをほとんど見ずに、ステートメントだけで縮めてみました。
int b,i,j,l,m,n=1024,c,p=7,h[32],y=16;r(h,b){for(;b--;!p--?putchar(c),c=0,p=7:0
)c|=(h>>b)%2<<p;}q(int*a,int*b){return*a-*b;}struct v{int i,b,h,n;}*v,*f;struct
{int n,i,e,k;struct v v[63];}x[32]={0,},*a=x;main(){char*d=0;for(;~(b=getchar()
);a[d[l++]=b%y].n++)a[(d=realloc(d,l+2))[l++]=b/y].n++;for(i=32;i--;)a[a[i].i=a
[i].v[0].i=i].e=1;qsort(a,y,n,&q);for(b=17,i=0;!x[i++].n;a++)b--;for(;2<b;a+=2)
{qsort(a,b--,n,&q);for(j=1;j<3;j++)for(i=0,v=a[j].v;i<a[j].e;i++)v[i].h|=j%2<<v
[i].b++;m=a[1].e;memcpy(a->v+a->e,a[1].v,m*y);memcpy(a->v+m+a->e,a[2].v,496);a
->e+=m+a[2].e;a->n+=a[1].n+a[2].n;memcpy(a+2,a,n);}for(i=0;i<y;i++)for(j=0;j<32
;j++)if((f=a->v+j)->i==i)r(f->b-1,4),r(f->h,f->b),h[i]=f->b,h[i+y]=f->h,j=32;
for(i=0;i<l;r(b+y,b))b=h[d[i++]];p-7&&r(0,p);}
561:デフォルトの名無しさん
02/07/25 18:55
面白そうなので、私も作ってみました。15パズルです。
P.java(JDK1.4.0で確認)
import java.awt.*;public class P extends Frame{class B extends Button{String l,
r,t;int o;B(int i){o=i%4+i/4*6;s(r=i+1+"");}void m(){if((64<<o&4257<<n.o)>0){t=
l;s(n.l);n.s(t);n=this;}}void s(String n){setLabel(l=n);}}int g;B[]a=new B[16];
B n;public P(){setLayout(new GridLayout(4,4));for(;g<16;g++)add(n=a[g]=new B(g)
);pack();show();i();}void i(){n.s("");for(g=0;g++<999;)a[(int)(Math.random()*16
)].m();}public boolean handleEvent(Event e){if(e.id==201)System.exit(0);if(e.id
==1001)if(g<0)i();else{((B)e.target).m();for(g=15;g-->0;)if(a[g].l!=a[g].r)
return 1>0;n.s("R");}return 1>0;}public static void main(String s[]){new P();}}
頑張って8行まで縮めたのですが、私にはこれで限界でした(;_;)
ちなみに、201==Event.WINDOW_DESTROY、1001==Event.ACTION_EVENTです(笑)
# 2ちゃんねる初書き込みなので、ちょっとどきどき…。
562:560
02/07/26 18:45
オリジナルに間違いがあったのでそれも修正しました。
現在9行。アルゴリズムを変更しないと、これ以上は無理かな・・・
int b,i,j,l,n=1024,c,p,h[32],y=16;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c|=(
h>>b)%2<<7-p;}q(int*a,int*b){return*a-*b;}struct v{int i,b,h,n;}*v;struct{int n
,i,e,k;struct v v[63];}x[32],*a=x;main(){char*d=0;for(;~(b=getchar());a[d[l++]=
b%y].n++)d=realloc(d,l+2),a[d[l++]=b/y].n++;for(i=32;i--;)a[a[i].i=a[i].v[0].i=
i].e=1;for(qsort(a,b=y,n,&q);!x[y-b--].n;a++);for(;b;a+=2){qsort(a,2+b--,n,&q);
for(j=1;j<3;j++)for(i=0,v=a[j].v;i<a[j].e;i++)v[i].h|=j%2<<v[i].b++;i=a[1].e;
memcpy(a->v+a->e,v-64,i*y);memcpy(a->v+i+a->e,v,496);a->e+=i+a[2].e;a->n+=a[1].
n+a[2].n;memcpy(a+2,a,n);}for(i=0;i<y;i++)for(j=0;(v=a->v+j)->i==i?r((b=v->b)-1
,4),r(h[i+y]=v->h,h[i]=b),0:++j;);for(i=0;i<l;r(h[b+y],h[b]))b=d[i++];r(0,7);}
563:デフォルトの名無しさん
02/07/27 03:20
ひさしぶりage
564:デフォルトの名無しさん
02/07/27 03:26
コーディングテクニックが極まっちゃうと手を加えられなくなるよね。
565:560
02/07/27 05:59
Huffman 符号構成のアルゴリズムを変更してみました。現在8行。
ほぼ1から作り直したので、コーディングに甘い部分があります。
関数 z とか新設したんですが、どなたかこれを無くして下さいです。
int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c|=(h>>
b)%2<<7-p;}q(int*a,int*b){return*a-*b;}struct v{int f,b,s[2],i,c;}n[31],*x=n,*w
;z(d,c){int m;struct v*w=x;if(w->i<y)w->b=d,w->c=c;else for(m=2;m--;)for(j=30;w
->s[m]==n[j].i?x=n+j,z(d+1,c*2+m),0:j--;);}main(){for(;i<y;)n[i++].f=1;for(;~(i
=getchar());n[d[l++]=i/y].f++)d=realloc(d,l*4+8),n[d[l++]=i%y].f++;for(;++i<y;)
n[i].i=i;for(j=k=y;--k;w->s[1]=x++->i){qsort(x,j,24,&q);w=x+j--;w->f=x->f+x[1].
f;w->i=i++;w->s[0]=x++->i;}z(-1,0);for(i=y;i--;)for(k=31;k--;)n[k].i==i?r(j=h[y
+i]=n[k].b,4),r(h[i]=n[k].c,j):0;for(;++i<l;r(h[j],h[y+j]))j=d[i];r(0,7);}
寝よう・・・
566:560
02/07/27 06:10
圧縮率と簡便さから、range coder が Huffman にとって代わりつつあるが、
符号化&復号をあわせて7行プログラミングできるかどうかでも、
Huffman は range coder に敵わないのだということを嫌というほど実感中w
・・・起きたら7行に到達していたらいいなぁ・・・zZZ
567:デフォルトの名無しさん
02/07/27 11:15
ここのソースを自動インデントするプログラムを書こうと思ったけど
一文字ずつの処理じゃもうだめぽ
568:デフォルトの名無しさん
02/07/27 12:41
>565
c|=(h>>b)%2<<7-p;→c+=c+(h>>b)%2;
A==B?C:D;→A-B?D:C;
で僅かに縮む…が、焼け石に水か(w
569:デフォルトの名無しさん
02/07/27 14:18
>>568
A-B?D:C; の場合、C にカンマ演算子が含まれていないことが条件ですぞ。
: までと : 以降ではカンマの扱いが微妙に違うのがいやらしい。
&&, || の場合もカンマ演算子は使いにくいです。
570:568>569
02/07/27 15:03
3項演算子の方は検証せずに書いてた、逝って狂
571:560
02/07/27 18:09
現在残り29文字になりました。これから z を改良します。
・・・ところで、どなたか復号器を作っていただけませんか。
>>565までのものには、明らかな間違いが存在します。
また復号が不可能だったので、データ長を記録するようにしました。
符号語のフォーマットは、
元のデータ長(4byte), (符号語長 4bit, 符号語 x bit) の組が16個,
その後ろに符号化したデータがぞろぞろと繋がります。
int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c+=c+(h
>>b)%2;}struct v{int f,b,s[4],i,c;}n[31],*x=n,*w;z(d,c){int m;struct v*w=x;w->b
=d,w->c=c;for(m=2;(w->i>=y)&&m--;)for(j=30;w->s[m]==n[j].i?x=n+j,z(d+1,c*2+m),0
:j--;);}q(int*a,int*b){return*a-*b;}main(){for(;~(i=getchar());n[d[l++]=i/y].f
++)d=realloc(d,l*4+8),n[d[l++]=i%y].f++;for(;++i<y;)n[i].i=i;for(j=k=y;--k;w->s
[1]=x++->i){qsort(x,j,32,&q);w=x+j--;w->f=x->f+x[1].f;w->i=i++;w->s[0]=x++->i;}
z(i=0,0);for(r(l,32);i<l+y;i++)for(w=n+31;w-->n;w->i==(i<y?i:d[i-y])?i<y&&r(j,4
),r(w->c,j):0)j=w->b;r(0,7);}
>>568>>570 いえいえ、ありがとうございます。
572:560
02/07/27 18:55
7行 Huffman符号化。
ただし、復号できるかどうかは未検証です。
int*d=0,i,j,k,l,h[32],y=16,c,p;r(h,b){for(;b--;++p>7?putchar(c),p=c=0:0)c+=c+(h
>>b)%2;}q(int*a,int*b){return*a-*b;}struct v{int f,b,s[4],i,c;}n[31],*x=n,*w=n+
16;main(){for(;~(i=getchar());n[d[l++]=i/y].f++)d=realloc(d,l*4+8),n[d[l++]=i%y
].f++;for(;++i<y;)n[i].i=i;for(k=y;--k;w++->s[1]=x++->i){qsort(x,k+1,32,&q);w->
f=x->f+x[1].f;w->i=i++;w->s[0]=x++->i;}for(r(l,32);i--;)for(j=i,w=n+i;w->i>=y&&
j--;)for(k=2;k--;)w->s[k]==n[j].i?n[j].b=w->b+1,n[j].c=w->c*2+k:0;for(;++i<l+y;
)for(w=n+31;w-->n;w->i==(i<y?i:d[i-y])?i<y&&r(j,4),r(w->c,j):0)j=w->b;r(0,7);}
573:デフォルトの名無しさん
02/07/27 19:07
(~~~ ゚ ∀~)~~~ ゚ メダマ ボーン
574:デフォルトの名無しさん
02/07/27 21:30
&qの&はなくてもいいんではないのかい?
575:デフォルトの名無しさん
02/07/27 21:54
最近のレスを見ていると、よくもこんなというテクニックが多く見られる
当時興味があったBASICも、今見るとあちこち縮められそうに思える
技術の進歩はすごいんだなあ…参戦したくなりますたw
576:今日始めてこのスレ見つけた奴
02/07/27 22:01
このスレにWebプログラミングで参戦してみようと思います
恐らくPHPですかね
なんかやってみます
577:デフォルトの名無しさん
02/07/27 22:02
>>576
大歓迎ざます
578:今日始めてこのスレ見つけた奴
02/07/27 22:06
ただ、ここにいる方々ほど偉大な
プログラミングは出来ないですが、
やれるだけのことはやってみます
579:デフォルトの名無しさん
02/07/28 00:19
>>578
始めてじゃなくて初めてだな
プログラミングと一緒に日本語もガンバレヨ
580:デフォルトの名無しさん
02/07/28 15:43
前スレのスライド辞書圧縮
スレリンク(tech板:153-154番)
符号化と復号とが分かれていたので、いっしょにしてみました。現在9行。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;r(o){for(p(o
);o--;)p(d[g++]);}main(int i){if(i>1){l=getw(stdin);for(d=malloc(l+8);s<l;){g=q
();if(g<n)for(i=g;i--;)d[s++]=q();else for(k=q()+(g-128)*256,i=k>>10,j=s-(k&f);
i--;)d[s++]=d[j++];}for(;l--;)p(*d++);}else{for(;~(s=q());d[l++]=s)d=realloc(d,
l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){m=1;j=s>31?31:s;j=l-s-2
>j?j:l-s;for(;j>2;j--){for(i=s<f?0:s-f;i<s;i++)if(!(m=memcmp(d+i,d+s,j))||i+j>l
)break;if(!m)break;}if(!m){for(k=s-g;k>n;k-=n)r(n);k&&r(k);p(128+j*4+(k=s-i)/
256);p(k%256);g+=j;s=g-1;}}}}
581:でけた!
02/07/28 15:53
fawekfgvuq4eoptvnu4u905634^05689^3-5iqwoptjap bmg\xcm,c/<a\;vifa
sfkqvprv8q^@08pgkv\b/m,sb\/Vcbn\/.\>a[]-1[\lo-5^-269^2ryib@;:]ym
wriobyw45[2bm9^\c;,lhmx\:V,xc\./n,z_C;1^\@a:daf/v,w@]byk90w46by0
-3569kby-w35y6w65yeryhnu356ja;4pot8mi681^-:]bc\./bzsgnsfhn/.n,s
we\2\q34t5o34^-68^24690^-oy;:pvb\./xn,\/XCV,.b;:d]s9tbqo^while
dt69oqw@]qyniom7@ln:,/.zcvbn;]r[q[rt2^\56o2^\5789hknl.vmn.;/vmn;
hlwit^y02846ypokfhfghh56yfghadginytmainstdio.hriotjueirutjintint
582:デフォルトの名無しさん
02/07/28 16:41
>>581 ワラタ
583:デフォルトの名無しさん
02/07/28 17:07
>>580
縮めてみますた。アルゴリズムが間違っていたらすまソ
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;main(int i){
if(i>1){l=getw(stdin);for(d=malloc(l+8);s<l;){g=q();if(g<n)for(i=g;i--;)d[s++]=
q();else for(k=q()+(g-128)*256,i=k>>10,j=s-(k&f);i--;)d[s++]=d[j++];}for(;l--;)
p(*d++);}else{for(;~(s=q());d[l++]=s)d=realloc(d,l+9);putw(l,stdout);memset(d+l
,0,8);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l-s;m&&j>2;j--)for(i=s<f?0:s-f;m
&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k+1;)for(p(m=k>n?n:k);k--,m--;)p(
d[g++]);p(++j*4+128+(k=s-i+1)/256);p(k);g+=j;s=g-1;}}}}
584:昨日初めてこのスレ見つけた奴
02/07/28 18:01
オセロ作ったら39行になっちった(汗
585:580
02/07/28 18:17
意外と縮むようで、縮まない。後21文字
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d=0;main(int i){
if(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k
>>10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~(s=q());d[
l++]=s)d=realloc(d,l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(
m=j=l-s-2>31?31:l-s;m&&j>2;j--)for(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if
(!m){for(k=s-g;k;)for(p(m=k>n?n:k);m--;k--)p(d[g++]);p(++j*4+128|(k=s-i+1)>>8);
p(k);g+=j;s=g-1;}}}}
586:デフォルトの名無しさん
02/07/28 21:18
>>585
関数ポインタか…
587:580
02/07/29 00:07
rangecoderを7行にしたみなさんこちらも挑戦してみてください、と言ってみるテスト
もう一人協力いただければ、文殊の知恵で何とかできるかもしれない
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~((d=realloc(
d,9+l))[l]=q());)l++;putw(l,stdout);memset(d+l,0,8);for(l+=8;m=l-s,m>3;s++){for
(j=m-2>31?31:m;m*j>2;j--)for(i=s<f?0:s-f;i<s*m;)m=memcmp(d+i++,d+s,j);if(!m){
for(k=s-g;k;)for(p(m=k>n?n:k);m--;k--)p(d[g++]);k=++g-i;s+=j;g+=j;p(j*4+132|k>>
8);p(k);}}}}
588:デフォルトの名無しさん
02/07/29 00:11
みんな作るときどうしてる?
・普通にコード書く→スペース・タブなどを潰して縮めて見てを繰り返す
・いきなり7行書きをする
589:デフォルトの名無しさん
02/07/29 00:39
>>588
for や if は右にそのまま書く。
インデントは長いブレースのところにだけ置く。
などとして、15行程度のソースコードで書いている。
590:饅頭
02/07/29 09:30
多分memsetはいらないと。
あと>>587は動かなかった。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1){for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)d[s]=g>n?d[s-(k&f)]:q();for(;l--;)p(*d++);}else{for(;~(s=q());d[l
++]=s)d=realloc(d,l+9);putw(l,stdout);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l
-s;m&&j>2;j--)for(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k;
)for(p(m=k>n?n:k);m--;k--)p(d[g++]);k=++g-i;s+=j;g+=j;p(j*4+132|k>>8);p(k);}}}}
591:561
02/07/29 18:36
15パズル、7行達成しました~♪
P.java(JDK1.4.0で確認)
import java.awt.*;public class P{public static void main(String[]s){new Frame()
{class B extends Button{String l,r;int o;B(int i){o=i%4+i/4*6;s(r=i+1+"");}void
m(){if((64<<o&4257<<n.o)>0){n.s(l);s("");n=this;}}void s(String n){setLabel(l=n
);}}int g;B n,a[]=new B[16];{setLayout(new GridLayout(4,4));for(;g<16;g++)add(n
=a[g]=new B(g));n.s("");pack();show();for(;g++<999;)a[(int)(Math.random()*16)].
m();}public boolean action(Event e,Object o){if(g<0)System.exit(0);((B)e.target
).m();for(g=15;g-->0;)if(a[g].l!=a[g].r)return 1>0;n.s("E");return 1>0;}};}}
ちょっと仕様変更して、
・ウィンドウクローズボタンをあきらめ
(七行スレのJavaプログラム標準?(^^;))
・ゲームクリア時、リスタートせず終了するよう変更
としました。
あと、先達のテクニックも参考にさせていただきました。
(匿名クラスを使うのは目から鱗…)
592:饅頭
02/07/29 18:58
どうせなのでもう少し削っておきました。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--;s++)p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~(s=q());d[l++]=s)d=realloc(d
,l+9);putw(l,stdout);for(l+=8;s<l-3;s++){for(m=j=l-s-2>31?31:l-s;m&&j>2;j--)for
(i=s<f?0:s-f;m&&i<s;)m=memcmp(d+i++,d+s,j);if(!m){for(k=s-g;k;)for(p(m=k>n?n:k)
;m--;k--)p(d[g++]);p(++j*4+128|(k=s-i+1)>>8);p(k);s=(g+=j)-1;}}}}
593:デフォルトの名無しさん
02/07/29 19:58
>>590
>>587は動作しますが、>>590および>>592は動作しません・・・core dump
memset および復号時の l までの復号は必須のようですよ?
当片 gcc 2.95.2 を使用しています。
594:580
02/07/29 20:28
ややっ7行達成と思ったのですが、>>593での指摘通り、動きません。
前スレのレスを見ると、符号語を過剰に生成して、
復号時に余分を切り捨てるという仕組みなので、
アルゴリズムを変えないと memset などは消せないのかもしれませんね。
ちなみに私は Cygwin(or FreeBSD) + gcc 2.95.3 を使用しています。
595:饅頭
02/07/29 23:34
むう、一応やってみました。これでオッケーなら七行達成です。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;)for(g=m=q(),m>n?k=q()|g-128<<8,m=k>>
10:0;m--&&s<l;s++)p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~((d=realloc(d,9+l))[l]=
q());)l++;putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(j=l-s>33?31:l-
s;j>2;j--)for(i=s<f?0:s-f;i<s;)if(!memcmp(d+i++,d+s,j)){for(k=s-g;k;)for(p(m=k>
n?n:k);m--;k--)p(d[g++]);p(j*4+128|(k=s-i+1)>>8);p(k);g+=j;s=g-1;goto z;}z:}}}
596:饅頭
02/07/30 00:59
すいません>>595はVCで文句を言われました。
これで七行です。多分gccでもO.K.ではないかと。
#include <stdio.h>
int(*p)()=putchar,(*q)()=getchar,f=1023,g,j,k,l,m,n=127,s;char*d;main(int i){if
(i>1)for(l=getw(stdin),d=malloc(l+8);s<l;s++,m--)!m?g=m=q(),m>n?k=q()|g-128<<8,
m=k>>10:0:0,p(d[s]=g>n?d[s-(k&f)]:q());else{for(;~(s=q());d[l++]=s)d=realloc(d,
l+9);putw(l,stdout);memset(d+l,0,8);for(l+=8;s<l-3;s++){for(j=l-s>33?31:l-s;j>2
;j--)for(i=s<f?0:s-f;i<s;)if(!memcmp(d+i++,d+s,j)){for(k=s-g;k;)for(p(m=k>n?n:k
);m--;k--)p(d[g++]);p(j*4+128|(k=s-i+1)>>8);p(k);g+=j;s=g-1;goto z;}z:;}}}
597:580
02/07/30 13:33
>>596
おみごと! 今度は gcc でも動作しました。
if や for をまとめる手腕は素晴らしいです。
>>587 は gcc でもファイルによっては動作しないようですね・・・欝。
598:*nix厨
02/07/30 18:31
久しぶりに来て見たら、なんと7行!
しかも圧縮+復元してるし素晴らしすぎる
ここまで縮むと思ってなかったので感動です
# おかげで、また何か作りたくなっちゃいました(w
599:デフォルトの名無しさん
02/07/30 21:06
おお!*nix厨たんだ。萌え~
600:デフォルトの名無しさん
02/07/30 22:26
スライド辞書の別版です、適当に作ったのでまだ縮む筈
#include<stdio.h>/*encoder*/
int X,Z,M,P;char*L,B[17],*W=B,*N,*R,K,*T;main(int c,char**v){FILE*r=fopen(v[1],
"rb"),*w=fopen(v[2],"wb");for(;~(X=fgetc(r));L[Z++]=X)L=realloc(L,Z+1);for(N=L;
N-L<Z;K+=K){if(!K)fwrite(B,K=1,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)>18?M=18:0,(T
=N-4096)<L?T=L:0;T<N;T++,P>X?X=P,R=T:0)for(P=0;P<M&&T[P]==N[P];P++);X*=2<X;P=N-
R;X?*W++=P>>8<<4|X-3:(*B|=K);*W++=X?N+=X,P:*N++;}fwrite(B,1,W-B,w);}
#include<stdio.h>/*decoder*/
int X,Z,M;char*W,F,K,*C;main(int c,char**v){FILE*r=fopen(v[1],"rb"),*w=fopen(v[
2],"wb");for(;~(X=fgetc(r));K+=K){if(!K)F=X,X=fgetc(r),K=1;if(F&K)M++[W=realloc
(W,M+1)]=X;else for(Z=3+X%16,W=realloc(W,M+Z),C=W+M-fgetc(r)-X/16*256-1;Z--;W[M
++]=*C++);}fwrite(W,1,M,w);}
601:デフォルトの名無しさん
02/07/30 23:09
>>600
うわー、これまた奇妙で素晴らしい。
こんな配列の操作方法、普段は絶対に使いたくないですなあ。
M++[W=realloc(W,M+1)]=X
・・・おおっ、(W=realloc())[M++] よりカッコの分だけ短くなるのかー!
602:デフォルトの名無しさん
02/07/30 23:34
>>600
また、ここの住人がまとめて7行にしちゃうよね、と言ってみるテスト
603:デフォルトの名無しさん
02/07/31 01:23
>>602
それにはまずageなきゃ.
604:デフォルトの名無しさん
02/07/31 01:24
>>600>>601
M=M++ と同じ問題が起こるのはカンマと論理演算子以外と思っていましたが、
配列のカッコ [] の中と外では、++ の演算順序が決まっているんでしたっけ?
あれ? M[W=realloc(W,1+M++)]=X; とすればいいのでは?
つーか、そんな使い方を実際に目にするのは初めてだ・・・。
605:デフォルトの名無しさん
02/07/31 01:25
神の集うスレッドはここですか?
606:デフォルトの名無しさん
02/07/31 01:28
>>605
あなたも >>602 のお題を成し遂げて神になりましょう、と言ってみるテスト
607:デフォルトの名無しさん
02/07/31 02:46
>604
>601の部分はW=realloc(W,M+α);W[M++]=X;(但しα>0)となれば良い
従って演算順序はどちらでも構わない
むしろM[W=realloc(W,1+M++)]=X;は順序次第でバグるかと思われ
…もっとも実際に順序が規定されてるのかは知らん(w
608:昼あげ
02/07/31 10:58
神の集うすれを執拗にage
609:デフォルトの名無しさん
02/07/31 17:52
>>607
どちらにしろ未定義動作。何が起こるかわからない。
某UNIXと某コンパイラはこれやるとカーネルパニック起こすことで有名。
610:デフォルトの名無しさん
02/07/31 18:42
某knkタンが思い浮かぶな<未定義動作
611:デフォルトの名無しさん
02/07/31 18:59
未定義動作といえば、あれでしょう。
というわけで>>600を実行すると鼻から悪魔が出てくるかもしれません。
612:*nix厨
02/07/31 19:12
7行リハビリということでBASICを少し刈り込みました
#include <stdio.h>
#include <stdlib.h>
int b[2<<16],f,g,i,n;char l[103][80],c[80],*p,*q,*r,x;S(){for(;*p==32;++p);}T()
{for(r="GOTO \0PUT \0 ET \0 IF \0 RUN\0 QUIT"+6*n++,*r&&*r==*p;++r)++p;return
!*r&&(S()|1);}I(){g=atoi(p);return*p-48?g?g:b[*(short*)p]:g;}main(){for(;;){gets
(p=l[i=100]);while(i<101){n=0;S();if(*(q=p)==48||atoi(q))for(p=l[atoi(q)],q+=3;
*p++=*q++;)i=101;else p=!*q?l[++i]:T()?l[i=I()]:T()?printf("%d\n",I()),l[++i]:T
()?printf("?"),gets(c),b[*(short*)p]=atoi(c),l[++i]:T()?(I()?p+3:l[++i]):T()?l[
i=l[100][0]=0]:T()?exit(0),0:(61-q[2]?puts("ERR"):(p=q+3,f=I(),x=p[2]-43,p+=3,g
=I(),b[*(short*)q]=x?x-2?x+1?x-4?x-17?x-19?x+10?x-18?x+6?f:f%g:f==g:f!=g:f>g:f<
g:f/g:f*g:f-g:f+g),l[++i]);}puts("OK");}}
613:デフォルトの名無しさん
02/07/31 19:21
きました。主任の登場です(w
614:デフォルトの名無しさん
02/07/31 19:30
>>612
atoi() を関数ポインタで置き換えれば少しちぢむね。
printf() と puts() もまとめて置き換えられないだろうか?
しかし、stdlib.h を何とかしたほうがよっぽどちぢむかもしれん。
615:デフォルトの名無しさん
02/07/31 19:41
>>614
atoiは短くならないみたい
ちなみに4行目の6*n++の後は;の間違い
多分、空白を消す際に間違ったんだろう
616:デフォルトの名無しさん
02/07/31 20:34
>>600の展開
#include<stdio.h>/*decoder*/
int Z,M;char*W,F,K,*C;main(int X,char**v){FILE*r=fopen(v[1],"rb"),*w=fopen(v[2]
,"wb");for(;~(X=fgetc(r));K+=K){if(!K)F=X,X=fgetc(r),K=1;W=realloc(W,M+18);for(
Z=F&K?W[M++]=X,0:(C=W+M-fgetc(r)-X/16*256-1,3+X%16);Z--;W[M++]=*C++);}fwrite(W,
1,M,w);}
617:デフォルトの名無しさん
02/07/31 23:05
>>600>>616 をまとめただけです。
>exec {D|E} file1 file2
#include<stdio.h>
int Z,M,P;char*L,B[17],*W=B,*N,*R,*T,K;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");if(*v[1]-68){for(;~(X=fgetc(r));L[Z++]=X)L=realloc(L,
Z+1);for(N=L;N-L<Z;K+=K){if(!K)fwrite(B,K=1,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)
>18?M=18:0,(T=N-4096)<L?T=L:0;T<N;T++,P>X?X=P,R=T:0)for(P=0;P<M&&T[P]==N[P];P++
);X*=2<X;P=N-R;X?*W++=P>>8<<4|X-3:(*B|=K);*W++=X?N+=X,P:*N++;}T=B;M=W-B;}else{
for(;~(X=fgetc(r));K+=K){if(!K)P=X,X=fgetc(r),K=1;T=realloc(T,M+18);for(Z=P&K?T
[M++]=X,0:(R=T+M-fgetc(r)-X/16*256-1,3+X%16);Z--;T[M++]=*R++);}}fwrite(T,1,M,w);
}
618:デフォルトの名無しさん
02/08/01 02:06
クソスレの下に潜ってしまっているので上げ
619:デフォルトの名無しさん
02/08/01 04:35
>617、残り40文字弱
int Z,P,M,Q;char*L,*N,B[17],*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");for(Q=*v[1]-68;~(X=fgetc(r));L[Z++]=X,K+=K){L=realloc
(L,Z+18);if(!Q){for(!K?F=X,X=fgetc(r),K=1:0,P=~F&K?T=L+Z-fgetc(r)-X/16*256-1,3+
X%16:1;--P;L[Z++]=*T++,X=*T);T=L;}}if(Q){for(N=L;N-L<Z;K+=K){if(!K)fwrite(B,K=1
,W-B,w),W=B,*W++=0;for(X=0,(M=L-N+Z)>18?M=18:0,(T=N-4096)<L?T=L:0;T<N;T++,P>X?Q
=N-T,X=P:0)for(P=-1;++P<M&&T[P]==N[P];);2<X?*W++=Q>>8<<4|X-3,N+=X:(*B|=K,Q=*N++
);*W++=Q;}L=B;Z=W-B;}fwrite(L,1,Z,w);}
620:619
02/08/01 04:38
すまん、最初の#include<stdio.h>コピペし忘れた
621:デフォルトの名無しさん
02/08/01 11:30
stdlib.hは atoiだけの為みたいだから
extern int atoi(const char *s); と直接書いてはルールに触れる?
622:デフォルトの名無しさん
02/08/01 13:24
>>621
いいと思うよ。やってるの見た気がする。
623:デフォルトの名無しさん
02/08/01 14:36
>>619
fgetc() は getc() と置き換えてよい。
符号器の for(N=L; ...) を N=L=realloc(L, ...) にすると1文字短くなる。
あまり手伝えないなぁ
624:623
02/08/01 14:40
>>619
そうか、N=L=realloc(L, ...) にすると、復号器側の T がいらなくなる。
T=L; を消せるし、if(!Q){...} のブレースもいらないな。
625:623
02/08/01 14:53
ごめん、他にもいろいろ削れたんで、うpしちゃう。
#include <stdio.h>
int Z,P,M,Q;char*L,*N,B[17],*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],
"rb"),*w=fopen(v[3],"wb");for(Q=*v[1]-68;N=L=realloc(L,Z+18),~(X=getc(r));L[Z++
]=X,K+=K)if(!Q)for(!K?F=X,X=getc(r),K=1:0,P=~F&K?N=L+Z-getc(r)-X/16*256-1,3+X%
16:1;--P;L[Z++]=*N++,X=*N);if(Q){for(;N-L<Z;X>2?*W++=Q>>8<<4|X-3,N+=X:(*B|=K,Q=
*N++),*W++=Q,K+=K)for(X=!K?fwrite(B,K=1,W-B,w),W=B,*W++=0:0,(M=L-N+Z)>18?M=18:0
,(T=N-4096)<L?T=L:0;T<N;T++,P>X?Q=N-T,X=P:0)for(P=-1;++P<M&&T[P]==N[P];);L=B;Z=
W-B;}fwrite(L,1,Z,w);}
626:*nix厨
02/08/01 18:07
もう少し短くしました
とりあえずここまでで、また縮むかもと思ったらBASICに手をつけます
これからオリジナルに挑戦、まずネタ探しから始めます
#include <stdio.h>
#include <stdlib.h>
int b[2<<16],f,g,i,n;char*p,l[103][80],c[80],*q,*r,x;S(){for(;*p==32;++p);}T(){
for(r="GET \0OTO \0PUT \0RUN\0 QUIT\0IF"+5*n++;*r&&*r==*p;++r)++p;return!*r&&(S
()|1);}I(){g=atoi(p);return*p-48?g?g:b[*(short*)p]:g;}main(){for(;;){gets(p=l[i
=100]);while(i<101){n=0;S();g=atoi(p);if(*(q=p)==48||g)for(p=l[g],q+=3;*p++=*q
++;)i=101;else p=!*q?l[++i]:T()?printf("?"),gets(c),b[*(short*)p]=atoi(c),l[++i
]:T()?l[i=I()]:T()?printf("%d\n",I()),l[++i]:T()?l[i=l[100][0]=0]:T()?exit(0),0
:T()?I()?p+3:l[++i]:(61-q[2]?puts("ERR"):(p=q+3,f=I(),x=p[2]-43,p+=3,g=I(),b[*(
short*)q]=x?x-2?x+1?x-4?x-17?x-19?x+10?x-18?x+6?f:f%g:f==g:f!=g:f>g:f<g:f/g:f*g
:f-g:f+g),l[++i]);}puts("OK");}}
627:デフォルトの名無しさん
02/08/02 02:13
とりあえずここまで縮んだ
#include<stdio.h>
int Z,P,Q;char*L,*N,B[17]="rb",*W=B,F,K,*T;main(int X,char**v){FILE*r=fopen(v[2
],B),*w=fopen(v[3],"wb");for(Q=*v[1]-68;N=L=realloc(L,18+Z),~(X=getc(r));L[Z++]
=X,K+=K)for(P=!Q?!K?F=X,X=getc(r),K=1:0,~F&K?T=L+Z-getc(r)-X/16*256-1,3+X%16:1:
1;--P;X=*T)L[Z++]=*T++;if(Q){for(;Z;Z-=(2<X?*W++=Q>>8<<4|X-3,N+=X,X:(*B|=K,Q=*N
++,1)),*W++=Q,K+=K)for(X=!K?fwrite(B,K=1,W-B,w),W=B,*W++=0:0,(T=N-4096)<L?T=L:0
;T<N;T++,P>X?Q=N-T,X=P:0)for(P=-1;++P<(Z>18?18:Z)&&T[P]==N[P];);L=B;Z=W-B;}
fwrite(L,1,Z,w);}
628:561
02/08/02 19:07
Javaでブロック崩しと詰めロードランナー(番兵がいない奴(^^;))にも挑戦してみたけど、
ブロック崩しの方は16行、詰めロードランナーの方は17行と敗北…(;_;)
う~む、題材が無謀過ぎたか。
629:デフォルトの名無しさん
02/08/02 19:57
7行達成したのでageときます
#include <stdio.h>
int Z,P,Q;char*L,*N,B[17],F,K,*T;main(int X,char**v){FILE*r=fopen(v[2],"rb"),*w
=fopen(v[3],"wb");for(X=*v[1]-69;N=L=realloc(L,18+Z),~(Q=getc(r));K+=K,L[Z++]=Q
)for(P=X?!K?F=Q,Q=getc(r),K=1:0,~F&K?T=L+Z-getc(r)-Q/16*256-1,3+Q%16:1:1;--P;Q=
*T)L[Z++]=*T++;if(!X){for(;Z-=X;2<X?B[P++]=Q>>8<<4|X-3:(*B|=K,Q=*N,X=1),N+=X,B[
P++]=Q,K+=K)for(X=!K?fwrite(B,K=1,P,w),P=1,*B=0:0,(T=N-4096)<L?T=L:0;T<N;T++,F>
X?Q=N-T,X=F:0)for(F=0;F<(Z>18?18:Z)&&T[F]==N[F];F++);L=B;Z=P;}fwrite(L,1,Z,w);}
630:デフォルトの名無しさん
02/08/02 21:16
前スレの雰囲気が出てきたね
631:デフォルトの名無しさん
02/08/02 21:20
始めまして。なんか最近面白いサイトが出来たみたいですよ。
掲示板とチャットルームがくっついたサイト?!ですかね。
キャラクター(笑)とかがタダで持てたり、着替えさしたり・・・・
でも今だけらしいですよ入会無料なのって!!
詳しくは下記URLをクリックして、確かめて!!
URLリンク(www.e-mansion.co.jp)
632:デフォルトの名無しさん
02/08/02 22:25
>>628=561
とりあえずうpしてみてください。
一人で縮めるより、みんなでああだこうだすると、
思いがけないテクニックが考案されたりして、どんどん縮まるよ。
633:561
02/08/02 22:57
>>632
了解っす!
まずはブロック崩しから…。(現在16行)
import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=23,H=32,P=7,U=6,b=W/2+(H-4)*W,n,d=56,p=W/2+(H-3)*W,g,l,t,o,i,j,k;int[]m=
new int[W*H];{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(
Graphics g){for(int i=0;i<W*H;i++){g.setColor(m[i]>0?Color.BLACK:Color.WHITE);g
.fillRect(i%W*U,i/W*U,U,U);}}public boolean handleEvent(Event e){if(e.id==503){
int n;if((n=e.x/U)<1)n=1;if(n>W-2)n=W-2;p=n+(H-3)*W;}if(e.id==501)g=l;return 1>
0;}};for(;i<H;i++){m[j=i*W]=m[W-1+j]=1;if(i%3==1&i>3&i<=H/2)for(k=6-i/3%2*2;k<W
-6;k+=4){m[k+j]=m[k+1+j]=2;l++;}}for(i=W;i>0;){m[--i]=1;m[i+H*W-W]=4;}add(c);
pack();show();try{for(;;Thread.sleep(50)){m[n=b]=0;if(g>0){n+=v((d+16)%64)+v(d)
*W;o=m[n];if(o>0){i=n%W;j=n/W*W;d=(m[b%W+j]>0)?(m[i+b/W*W]>0)?(d+32)&63:-d&63:d
&32|(32-d)&31;if(o==2){m[k=(i&~1)+j]=m[k+1]=0;if(--l<1)g=0;}if(o==3){if((d+=(b%
W-p%W)*2/3)<36)d=36;if(d>60)d=60;}if(o==4){b=p-W;d=56;g=0;}}else b=n;}else b=p-
W;i=(H-3)*W;for(k=0;k<W;k++)m[k+i]=0;m[i]=m[W-1+i]=1;for(k=(j=p)-P/2;k<=j+P/2;k
++)if(k>=(H-3)*W&k<(H-2)*W)m[k]=3;m[b]=1;t=(t+1)%8;c.repaint();}}catch(
Exception e){}}int v(int d){int n;if((n=d%32)>16)n=32-n;return n*(t+1)/8>n*t/8?
(d<32)?1:-1:0;}};}}
アルゴリズム自体試行錯誤中なので、まだ最適化をしてません。
((H-2)*W→690みたいな…)
そこら辺を直せば1~2行は縮まりそうですが、とても7行は無理っぽい…(;_;)
ボールの数は無制限です(^^;)
それから、終了はControl+Cで…。
634:561
02/08/02 23:11
おっと、言い忘れましたが633はB.javaです。
続いて、詰めロードランナー。(L.java : 現在17行)
import java.awt.*;import java.io.*;public class L extends Frame{int W,H,T,U=12,
p,t,v,g,e,l,r,u,d,a,b,i,j,k,x,y,m[],w[];char[]q={'□','田','田',' ', ' ̄','#',
' ','◎','★'};L(String n){try{BufferedReader f=new BufferedReader(new
FileReader(n));W=Integer.valueOf(f.readLine()).intValue();H=Integer.valueOf(f.
readLine()).intValue();m=new int[T=W*H];w=new int[T];for(;i<T;){if((j=i%W)<1)n=
f.readLine();if((m[i]=(int)n.charAt(j)-48)>7)m[p=i]=3;if(m[i++]>6)g++;}Canvas
c=new Canvas(){{setSize(W*U,H*U);}public void paint(Graphics g){for(k=T;--k>=0;
)g.drawChars(q,m[k],1,k%W*U,k/W*U+U);g.drawChars(q,8,1,p%W*U,p/W*U+U);}};add(c)
;pack();show();m:for(;g>0|p>W*2;Thread.sleep(20)){e=0;for(i=T;--i>=0;)if(w[i]>0
&&--w[i]<1){e=m[i]=1;if(i==p)break m;}if((i=m[p])>6){m[e=p]=3;if(--g<1)for(j=T;
--j>=0;)if(m[j]==6)m[j]=5;}if(t>0)t--;else{v=(i!=4&i!=5&(j=m[p+W])!=0&j!=1&j!=5
|d>0&j>1)?W:(u>0&i==5&m[p-W]>2)?-W:(l>0&m[p-1]>2)?-1:(r>0&m[p+1]>2)?1:0;if(v!=0
){p+=v;e=t=4;}else{if(a>0)v=p+W-1;if(b>0)v=p+W+1;if(v>0&m[v]==1)if((j=m[v-W])==
3|j==6){m[v]=3;e=w[v]=500;}}}if(e>0)c.repaint();}}catch(Exception e){}}public
boolean handleEvent(Event e){if((x=402-e.id)>=0&x<2){y=e.key;if(y==52)l=x;if(y
==54)r=x;if(y==56)u=x;if(y==50)d=x;if(y==90|y==122)a=x;if(y==88|y==120)b=x;}
return 1>0;}public static void main(String[]a){new L(a[0]);}}
番兵はおらず、ひたすら穴を掘って金塊を集めます(笑)
こちらは、ゲームの面データを外部から与える形式なので、単独では動きません。
java L map.txt
として、テキストファイルで面データを指定します。
(ずるいかな?(^^;))
現時点で思いつくかぎりの最適化をしましたが、これ以上は縮まらず…(;_;)
635:561
02/08/02 23:22
634の詰めロードランナー用面データはこんな感じ↓で作ります。
12
7
000000000000
033333333360
033334337360
075112115360
035177715360
035177715860
000000000000
1行目に幅、2行目に高さを指定します。
配置するブツの番号は
0 : ブロック(掘れない)
1 : レンガ(掘れる)
2 : 落とし穴(外見はレンガと同じ)
3 : 空白
4 : バー
5 : はしご
6 : 脱出はしご
7 : 金塊
8 : ロードランナー
です。
なお、画面端の判定を行っていないため、面データの周囲はブロックで囲ってください。
(アルゴリズム的な意味の『番兵』(笑))
オマケで、逆転掘りデータ(^^;)
7
10
0000000
0353330
0353330
0158310
0131510
0151310
0131510
0151710
0111110
0000000
636:デフォルトの名無しさん
02/08/03 00:08
>>631
勿論7行で作ったんだよね?
出来ればソース欲しいかも
637:デフォルトの名無しさん
02/08/03 00:21
>>636
perlとかなら7行掲示板作れそうだな。
荒らし対策とかは無理だろうけど。
638:デフォルトの名無しさん
02/08/03 00:28
webprogかどっかで見掛けたよ、掲示版。
見付けたら張ります。
639:デフォルトの名無しさん
02/08/03 00:37
>>637-638
>>2
640:デフォルトの名無しさん
02/08/03 01:02
>>633
定数HやWなんかは、定数でいいと思うよ
641:デフォルトの名無しさん
02/08/03 01:12
>>633 これは難しいねぇ。 >>20 を参考にして少し何とかできませんかね?
import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=23,H=32,P=7,U=6,b=W/2+(H-4)*W,n,d=56,p=W/2+(H-3)*W,g,l,t,o,i,j,k;int[]m=
new int[W*H];{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(
Graphics g){for(int i=0;i<W*H;g.fillRect(i%W*U,i++/W*U,U,U))g.setColor(m[i]>0?
Color.BLACK:Color.WHITE);}public boolean handleEvent(Event e){int n=e.x/U;n=n<1
?1:n>W-2?W-2:n;p=e.id==503?n+(H-3)*W:p;g=e.id==501?l:g;return 1>0;}};for(;i<H;i
++){m[j=i*W]=m[W-1+j]=1;if(i%3==1&i>3&i<=H/2)for(k=6-i/3%2*2;k<W-6;k+=4,l++)m[k
+j]=m[k+1+j]=2;}for(i=W;i>0;m[i+H*W-W]=4)m[--i]=1;add(c);pack();show();try{for(
;;Thread.sleep(50)){m[b]=0;o=m[n=b+v((d+16)%64)+v(d)*W];if(g>0)if(o>0){i=n%W;j=
n/W*W;d=m[b%W+j]>0?m[i+b/W*W]>0?(d+32)&63:-d&63:d&32|(32-d)&31;if(o==2){m[k=(i&
~1)+j]=m[k+1]=0;g=--l<1?0:g;}if(o==3){d+=(b%W-p%W)*2;d=d/3<36?36:d>60?60:d;}if(
o==4){b=p-W;d=56;g=0;}}else b=n;else b=p-W;m[i=(H-3)*W]=1;for(k=W-1;k>1;)m[--k+
i]=0;for(k=(j=p)-P/2;k<=j+P/2;k++)if(k>=(H-3)*W&k<(H-2)*W)m[k]=3;m[b]=1;t=(t+1)
%8;c.repaint();}}catch(Exception e){}}int v(int d){o=d%32;o=o>16?32-o:o;return
o*(t+1)/8>o*t/8?(d<32)?1:-1:0;}};}}
642:デフォルトの名無しさん
02/08/05 13:29
>>633とは別のブロック崩しを自分で作ってみました(現在9行)
JAVAアプレットです
C.java
import java.awt.*;public class C extends java.applet.Applet{int W=15,H=21,x=1,y
=W,i,m[]=new int[W*H],p=278,b=290;{for(;i<W*11;m[i++]=i<W?2:1);for(i=0;i<H;m[i*
W]=m[i++*W+14]=2);for(i=0;i<5;m[b+i++]=2);new Thread(){public void run(){try{
for(;;p+=x+y,repaint(),Thread.sleep(80))while(s(0,y)|s(x,0)|s(x,y));}catch(
Exception e){}}}.start();}boolean s(int t,int u){if((i=m[p+t+u])>0){x-=t*2;y-=u
*2;m[p+t+u]-=i>1?0:2;}return i>0;}public boolean keyDown(Event e,int k){if(k==
1007&m[b+5]<2){m[b]=0;m[b+++5]=2;}if(k==1006&m[b-1]<2){m[b+4]=0;m[b---1]=2;}
return 1>0;}public void paint(Graphics g){for(i=0;i<W*H;i++)g.drawString(m[i]>0
|i==p?"■":"□",i%W*10,i/W*10);}}
C.html
<HTML><BODY>
<APPLET code="C.class" width="150" height="200"></APPLET>
</BODY></HTML>
jdk1.4の場合、javac -target 1.1 C.java としてください
appletviewerおよびIE5で動作確認済(ちらつくのは仕様です)
643:561
02/08/05 18:55
>>641
参考になりました。三項演算子を効果的に使うんですね。
かなり短縮できました。(ブロック崩し - B.java : 現在13行)
import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=26,H=33,T=W*H,P=7,U=6,b=1+W,d=56,p=1+T-W*3,g,l,t,i,j,k,u,m[]=new int[T];
{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(Graphics g){for(u=
0;u<T;g.fillRect(u%W*U,u++/W*U,U,U))g.setColor(m[u]>0?Color.BLACK:Color.WHITE);
}public boolean handleEvent(Event e){k=e.x/U;k=k<1?1:k>W-2?W-2:k;p=e.id==503?k+
T-W*3:p;g=e.id==501?l:g;return 1>0;}};for(;i<T;i++)m[i]=(j=i/W)>=H-1?4:j<1|(k=i
%W)<1|k>W-2?1:j>3&j<H/2+2&j%3>1&k>3&k<W-4&((j/3^k/2)&1)>0?2+0*++l:0;l/=2;add(c)
;pack();show();try{for(;;Thread.sleep(50)){m[b]=0;i=g>0?b+v((d+16)%64)+v(d)*W:p
-W;j=g>0?m[i]:0;if(j>0){d=m[i%W+b/W*W]>0?m[b%W+i/W*W]>0?(d+32)&63:(32-d)&63:-d&
63;if(j==2){m[i]=m[i^1]=0;g=--l<1?0:g;}if(j==3)d=(d+=b%W-p%W)<36?36:d>60?60:d;
if(j==4){d=56;g=0;}i=b;}m[b=i]=1;i=p%W-P/2;for(j=0;j<W;j++)m[j+T-W*3]=j>=i&j<i+
P?3:j<1|j>W-2?1:0;t=(t+1)%8;c.repaint();}}catch(Exception e){}}int v(int d){j=d
%32;j=j>16?32-j:j;return j*(t+1)/8>j*t/8?d<32?1:-1:0;}};}}
ただ、「g=--l<1?0:g;」のような処理はアトミックじゃないので、別スレッドから変更さ
れた場合に、やや心配ではありますが。(取り越し苦労?(^^;))
>>642
やっぱり仕様そのものが問題だったかも(^^;)
ラケットの位置により反射角度が変化ってのはオーバースペックかな?
あと、ApplicationよりAppletの方が短くできそうですね。