5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

七行プログラミング

1 :デフォルトの名無しさん:2001/03/10(土) 09:09
海外のプログラマーが、たったの七行足らずで
DVDのプロテクトを解除するプログラムを作成!
我々も負けてはいられません!

ルール:七行なら言語は問いません。では、どうぞ!

2 :デフォルトの名無しさん:2001/03/10(土) 09:27
<イチロー養成、動体視力強化プログラム Java>
・動作環境 MS-DOS プロンプト

1>class Suzuki {
2> public static void main(String args[]) {
3> while (true) {
4> System.out.print( System.in ) ;
5> }
6> }
7>}


3 :SAGE:2001/03/10(土) 09:44
1> #include <stdio.h>
2>
3> int main()
4> {
5>   printf( "Hello, World!" );
6>   return 0;
7> }

4 :デフォルトの名無しさん:2001/03/10(土) 12:22
横幅はいったい何行あるんだ?


5 :デフォルトの名無しさん:2001/03/10(土) 15:36
横幅は80桁でしょう、そりゃ。
1>cli
2>hlt
3>nop
4>nop
5>nop
6>nop
7>nop

6 :デフォルトの名無しさん:2001/03/10(土) 16:46
セミコロンで区切ればいくらでも書けるんじゃないのか。

7 :デフォルトの名無しさん:2001/03/10(土) 16:52
スレタイトル、なぜか「エロプログラミング」に見えた。
卯津だ・・

8 :デフォルトの名無しさん:2001/03/10(土) 17:24



9 :デフォルトの名無しさん:2001/03/10(土) 17:27
>海外のプログラマーが、たったの七行足らずで
>DVDのプロテクトを解除するプログラムを作成!
このコードが気になる。だれかあぷして。

10 :アンノウン名無しさん:2001/03/10(土) 17:47
↓にアプしてる人がいたよ

http://piza.2ch.net/test/read.cgi?bbs=tech&key=983191866&ls=50

11 :デフォルトの名無しさん:2001/03/10(土) 17:48
>>9http://cocoa.2ch.net/test/read.cgi?bbs=linux&key=981301272&st=32&to=32&nofirst=true

12 :トリッキーの1:2001/03/10(土) 17:51
面白くなりそうなスレですね。
7行で意味のある複雑なことをやりたいですね〜

>>6
世界標準と言うことで、1行79文字以下で行きましょう。


13 :デフォルトの名無しさん:2001/03/10(土) 19:07
転載あげ

#!/usr/bin/perl -w
# 526-byte qrpff, Keith Winstein and Marc Horowitz <sipb-iap-dvd@mit.edu>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$c=142;if((@a=unx"C*",$_)[20]&48){$h=5;
$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$d=
unxV,xb25,$_;$b=73;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=($t=255)&($d
>>12^$d>>4^$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9
,$_=(map{$_%16or$t^=$c^=($m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t
^=(72,@z=(64,72,$a^=12*($_%16-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271))
[$_]^(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval

[Hot Wired - 7行でDVD暗号を解読するプログラム]
http://www.hotwired.co.jp/news/news/technology/story/20010308302.html


14 :デフォルトの名無しさん:2001/03/10(土) 21:38
>>13
誰かインデントしてみてくれ。

15 :perl初心者:2001/03/10(土) 21:55
まずxをpack+に置き換えてから、$_の内容を実行するんですよね。
それでSTDINから$_に2048バイトずつ読み込んで、$a=29,$c=142、
ifのなかで、@aに$_の内容をunsigned charの配列にして読み込み、
その21番目と48と論理積とって偽ならそのまま出力、真なら$h=5,
$_と@aの80番目のXORをとってその下8ビット・・・むきーーーー


16 :デフォルトの名無しさん:2001/03/10(土) 22:24
向こうの高校生よりも劣るのか、日本のプログラマって。
さいてー、プププ

17 :デフォルトの名無しさん:2001/03/10(土) 22:48
while (read(STDIN,$_,2048))
{
    $a = 29;
    $c = 142;
    if ((@a = unpack("C*",$_))[20] & 48)
    {
        $h = 5;
        $_ = unpack(b24,join("",@b = map
                                     {
                                         pack(B8,unpack(b8,chr($_^$a[--$h+84])))
                                     }
                                     @ARGV ));
        s/...$/1$&/;
        $d = unpack(V,pack(b25,$_));
        $b = 73;
        $e = 256 | (ord($b[4])) << 9 | ord($b[3]);
        $d = $d>>8^($f = ($t = 255)&($d>>12^$d>>4^$d^$d/8))<<17,
        $e = $e>>8^($t&($g = ($q = $e>>14&7^$e)^$q*8^$q<<6))<<9,
        $_ = (map
              {
                  $_%16or$t^=$c^=($m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;
                  $t ^=(72,@z=(64,72,$a^=12*($_%16-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]
              }
              (16..271) )[$_]^(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]
    }
    print pack("C*",@a)
}


18 :デフォルトの名無しさん:2001/03/10(土) 23:34
あ、間違えてる、、、

19 :デフォルトの名無しさん:2001/03/11(日) 00:35
これ、どうやって使うの?


20 :デフォルトの名無しさん:2001/03/11(日) 00:46
なんだ。7行に収まったってだけじゃん・・・

21 :デフォルトの名無しさん:2001/03/11(日) 00:50
>向こうの高校生よりも劣るのか、日本のプログラマって。
>さいてー、プププ

否定はしないよ。あっちのメガデモ関係とか見てると鬱になるよな。


22 :デフォルトの名無しさん:2001/03/11(日) 00:56
>>21
技術云々って言うか、暇な奴が多いってことだろうけど。

日本のプログラマは搾取対象なので、趣味でなんか作る暇も無い。
(そういう風にプログラマを使ってる糞会社のせい。)

23 :デフォルトの名無しさん:2001/03/11(日) 00:58
っていうか、おれ高校生の時プログラムなんてしなかったし。

24 :デフォルトの名無しさん:2001/03/11(日) 01:34
>>20
凄いことだろ

25 :デフォルトの名無しさん:2001/03/11(日) 03:30
日本にも1画面プログラムや1行プログラムがたくさんあったじゃん。


26 :デフォルトの名無しさん:2001/03/11(日) 03:39
void main() while(1) printf("逝って良し!\n");

27 :いつでもどこでも名無しさん:2001/03/11(日) 04:04
>>25
テクノポリス別冊 プログラム・ポシェット
に投稿してました。

28 :五郎:2001/03/11(日) 04:35
これはその高校生もすごいが、それよりperlがすごいんだよ。


29 :デフォルトの名無しさん:2001/03/11(日) 04:39
てゆーか高校生じゃないじゃん、(>>13)どーでもいーけど。

30 :デフォルトの名無しさん:2001/03/11(日) 05:45
妙にデモスレと似た雰囲気だなここは(藁

31 :21:2001/03/11(日) 06:10
すまん。吾輩のせいかも。

32 :トリッキーの1:2001/03/11(日) 06:20
(関東など一部の地域での)テレビの2ちゃんねるシミュレータ、
すなわち砂嵐シミュレータを作ってみました。ざーっていうあれです。音は鳴らないけど。
言語はC+APIです。VisualC++6でコンパイル確認、Win2kと98で動作確認しました。
かな〜り削り取ったつもりですが、#include含めて13行もあります。

#include <Windows.h>
int i,r,a=640,b=400;long t[11]={40,640,400,2097153};char*k,y[0xfa000];long
WINAPI WndProc(HWND d,UINT m,UINT w,long l){PAINTSTRUCT p;switch(m){case 15:
HBITMAP q;HDC e;e=CreateCompatibleDC(BeginPaint(d,&p));GetDIBits(e,(q=
CreateCompatibleBitmap(p.hdc,a,b)),0,b,0,(BITMAPINFO*)t,0);for(k=y;k<y+a*b*4;
k+=4)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(p.hdc,0,0,a,b,0,0,0,b,y
,(BITMAPINFO*)t,0);DeleteObject(q);DeleteDC(e);EndPaint(d,&p);InvalidateRect
(d,0,0);return 0;case 2:PostQuitMessage(0);}return DefWindowProc(d,m,w,l);}int
WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int n){MSG m;WNDCLASS w;w.style=3;w
.lpfnWndProc=WndProc;w.cbWndExtra=w.cbClsExtra=0;w.lpszMenuName=0;w.hIcon=0;w.
hbrBackground=0;w.hCursor=LoadCursor(0,IDC_ARROW);w.lpszClassName="Tax's";w.
hInstance=i;RegisterClass(&w);ShowWindow(CreateWindow("Tax's","2ch",1<<19,99,
99,a,b,0,0,i,0),n);while(GetMessage(&m,0,0,0))DispatchMessage(&m);return 0;}

あと1行くらいは何とかなるかもしれないけれど、7行はちょっと……
オリジナルの、まともな変数名なコードを読みたいという人がもしいれば公開します。
あと、「俺ならここはこうする」という人がいれば是非是非教えてください。

33 :このスレの1:2001/03/11(日) 06:34
あくまで七行でお願いします。

34 :30:2001/03/11(日) 06:38
>>31
気にしない気にしない。一休み一休み。

35 :16進数スレより:2001/03/11(日) 06:52
#include <stdio.h>
int main(){
FILE *stream = fopen( "temp.txt", "w" );int giko, hahaha;
for( giko = 0; giko <= 0xF; giko++ ){fprintf( stream, "%x│", giko );
for( hahaha = 0; hahaha <= 0xF; hahaha++ )
fprintf( stream, " %x", giko & hahaha );
fprintf( stream, "\n" );}fclose( stream );}

36 :デフォルトの名無しさん:2001/03/11(日) 07:01
>>32
まじで凄くねぇ?これ・・・

37 :デフォルトの名無しさん:2001/03/11(日) 10:25
>>32
必要最低限のものが詰まってる感じだな

38 :SAGE:2001/03/11(日) 10:32
>>32
11行にはなったけど…7行はツラいなぁ。

// 無意味にC++。VC++6依存かも。
#include <windows.h>
PAINTSTRUCT p;HBITMAP q;HDC e;char*k,y[1<<20];int a=640,b=400,i,t[11]={40,a,b,
2097153},r;long WINAPI f(HWND d,UINT m,UINT w,long l){if(m==15){GetDIBits((e=
CreateCompatibleDC(BeginPaint(d,&p))),(q=CreateCompatibleBitmap(p.hdc,a,b)),0,
b,0,(BITMAPINFO*)t,0);for(k=y;k<y+a*b*4;k+=4)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;
SetDIBitsToDevice(p.hdc,0,0,a,b,0,0,0,b,y,(BITMAPINFO*)t,0);DeleteObject(q);
DeleteDC(e);return !InvalidateRect(d,0,!EndPaint(d,&p));}if(m==2)
PostQuitMessage(0);return DefWindowProc(d,m,w,l);}int WINAPI WinMain(HINSTANCE
i,HINSTANCE,LPSTR,int n){WNDCLASS w={3,f,0,0,i,0,LoadCursor(0,IDC_ARROW),0,0,
"Tax's"};RegisterClass(&w);ShowWindow(CreateWindow("Tax's","2ch",1<<19,99,99,a
,b,0,0,i,0),n);for(MSG m;GetMessage(&m,0,0,0);DispatchMessage(&m));return 0;}

39 :デフォルトの名無しさん:2001/03/11(日) 11:22
Noise.java-------------------------
import java.awt.*;import java.awt.image.*;import java.util.*;public class Noise
extends Canvas{int P=256;byte[]c=new byte[P];int W=320;int H=240;byte[]p=new
byte[W*H];MemoryImageSource s;Image image;Random r=new Random();public Noise(){
for(int i=0;i<P;i++)c[i]=(byte)r.nextInt();s=new MemoryImageSource(W,H,new
IndexColorModel(8,P,c,c,c),p,0,W);s.setAnimated(true);image=createImage(s);}
public void update(Graphics g){for(int i=0;i<W*H;i++)p[i]=(byte)r.nextInt();s.
newPixels(0,0,W,H);g.drawImage(image,0,0,null);repaint(20);}public void paint(
Graphics g){update(g);}public Dimension getPreferredSize(){return new Dimension(
W,H);}public static void main(String[]a){Frame f=new Frame("Noise");Noise n=new
Noise();f.add(n);f.pack();f.setVisible(true);}}


32氏にならって作成。
Javaアプリケーション。
3行オーバー。
APIの使い方ちゃうねん。
レイアウトめんどい。
終了はCTRL+Cで(駄目すぎ)。
はっきり言って面白くない。
他の題材を探してこようと思う。

40 :39:2001/03/11(日) 11:26
とにかくJavaでは見た目糞コードっぽくならなくてつまらん。
やはりPerlしかあるまいか。

41 :トリッキーの1:2001/03/11(日) 12:13
>>38
やっぱ他人の目は大切だな。何で気付かない?という所でだいぶん無駄がありましたね。
3行目が処理系依存なのが残念ですが、修正しても多分11行に収まりそうです。
最適化ありがとうございます。随分参考になりました。

>>40
Javaは言語が綺麗ですからね。import文はいいなぁ……(笑)

42 :デフォルトの名無しさん:2001/03/11(日) 12:15
>>16
16,7,8歳頃ってハッカーとして一番の成長期だと思う。
なのに、日本の高校生は受験に追われ、PCとネットに(特にネットに)触れる機会が
少ないので、諸外国と比べハッカーが育ちにくいというのは、憂うべき状況だな。


43 :デモスレ住人:2001/03/11(日) 12:19
>>32 Watcom.
#include<windows.h>typedef void*v;typedef int i;i a=640,b=400,t[11]={40,640,400
,2097153},r;char*k,y[1<<25];HDC h,e;WINAPI w(v d,i m,i w,i l){if(m==15){v q=
CreateCompatibleBitmap(h,a,b);GetDIBits(e=CreateCompatibleDC(0),q,0,b,0,(v)t,0)
;for(k=y;k<y+a*b*4;k+=4)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(h,0,0,
a,b,0,0,0,b,y,(v)t,0);DeleteObject(q);DeleteDC(e);InvalidateRect(d,0,0);return
0;}return(m==2)?PostQuitMessage(0),0:DefWindowProc(d,m,w,l);}WNDCLASS c={0,(v)w,
0,0,(v)(1<<22),0,0,0,0,"."};WINAPI WinMain(v i,v x,v y,i z){MSG m;RegisterClass
(&c);h=GetDC(CreateWindow(".","頑張ってみたけど9行が限界かなぁ",37066<<16|32,
99,99,a,b,0,0,i,0));while(GetMessage(&m,0,0,0))DispatchMessage(&m);return 0;}


44 :デフォルトの名無しさん:2001/03/11(日) 12:41
>42
プ。ちょうどその期間だけポッカリとブランクがあるんですけれど。

45 :名無しさんi486:2001/03/11(日) 12:55
あのさ、smalltalkなら最終的にどんなプログラムでも一行なんすけど・・・

46 :>39:2001/03/11(日) 13:03
8行になった。

N.java

import java.awt.*;import java.awt.image.*;import java.util.*;class N extends
Frame{int W=320,H=240,P=256;byte[]c=new byte[P],p=new byte[W*H];
MemoryImageSource s;Image im;Random r=new Random();int i;N(){for(i=0;i<P;i++)c
[i]=(byte)r.nextInt();s=new MemoryImageSource(W,H,new IndexColorModel(8,P,c,c,c
),p,0,W);s.setAnimated(true);im=createImage(s);setSize(W,H);setVisible(true);}
public void update(Graphics g){for(i=0;i<W*H;i++)p[i]=(byte)r.nextInt();s.
newPixels(0,0,W,H);g.drawImage(im,0,0,null);repaint(20);}public void paint(
Graphics g){update(g);}static void main(String[]a){new N();}}


47 :デフォルトの名無しさん:2001/03/11(日) 13:07
>>45
なんで?1行80文字以下の制限があるのに?プ

48 :デフォルトの名無しさん:2001/03/11(日) 13:13
なんか知らんけど、発言するたびに屁を漏らす奴が一人いるね、このスレ。

49 :43:2001/03/11(日) 13:19
ごめん,8行で書けたわ. 訂正.
#include<windows.h>typedef void*v;typedef int i;i a=640,b=400,t[11]={40,640,480
,2097153},r;char*k,y[1<<25];v h,m=y;WINAPI w(v d,i m,i w,i l){if(m==15){v q=Cr\
eateCompatibleBitmap(h,a,b);GetDIBits(h,q,0,b,0,(v)t,0);for(k=y;k<y+a*b*4;k+=4\
)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(h,0,0,a,b,0,0,0,b,y,(v)t,0);\
DeleteObject(q);return InvalidateRect(d,0,0);}if(m==2)ExitProcess(0);return De\
fWindowProc(d,m,w,l);}WINAPI WinMain(v i,v x,v y,i z){v c[]={0,(v)w,0,0,(v)(1<\
<22),0,0,0,0,"."};RegisterClass((v)c);h=GetDC(CreateWindow(".","2ch",37066<<16|
32,99,99,a,b,0,0,i,0));while(GetMessage(m,0,0,0))DispatchMessage(m);return 0;}


50 :デフォルトの名無しさん:2001/03/11(日) 13:31
えらい圧迫感のあるスレだな(藁

51 :トリッキーの1:2001/03/11(日) 13:32
>>49
コンパイル出来なかったですが(Cコンパイラだとinclude以外は可能かな?)
参考になる部分は多かったです。文末の\はしらなかった。

WM_PAINTでBegin/EndPaintを呼ばなくてもいいんでしたっけ?
Windows3.1だと飛んでしまった記憶があるんですが、今試してみると
上手く動いてそうに見えます。MSDNにも「呼べ」って書いてないし。

最終的に10行になりました。後1行なら何とかなるでしょうが、
速度を維持したまま7行は絶対無理だと確信しました(笑)。
今回のはBegin/EndPaint問題も回避して、DCも毎回解放し、
何より全ての行が78文字以上なので等角フォントでみると
とても美しく見えます。俺としては満足です。
皆さんのコードはとても参考になりました。ありがとうございます。

#include <Windows.h>
HBITMAP q;HDC e,v;char*k,y[1<<20];int a=640,b=400,c,i,t[11]={40,a,b,1572865},r
;long WINAPI f(HWND d,UINT m,UINT w,long l){c=DefWindowProc(d,m,w,l);if(m==2)
PostQuitMessage(0);if(m==15){GetDIBits((v=GetDC(d)),(q=CreateCompatibleBitmap(
v,a,b)),0,b,0,(BITMAPINFO*)t,0);for(k=y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9
+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,y,(BITMAPINFO*)t,0);DeleteObject(q
);InvalidateRect(d,0,0);ReleaseDC(d,v);}return c;}int WINAPI WinMain(HINSTANCE
i,HINSTANCE,LPSTR,int n){MSG m;WNDCLASS w={3,f,0,0,i,0,LoadCursor(0,IDC_ARROW)
,0,0,"Tax's"};RegisterClass(&w);ShowWindow(CreateWindow("Tax's","2ch",1<<19,99
,99,a,b,0,0,i,0),n);for(m;GetMessage(&m,0,0,0);DispatchMessage(&m));return 0;}


52 :46:2001/03/11(日) 13:35
7行になった〜

N.java

import java.awt.*;import java.awt.image.*;import java.util.*;class N extends
Frame{int W=320,H=240;byte[]p=new byte[W*H];MemoryImageSource s;Image m;Random
r=new Random();void b(){for(int i=0;i<W*H;i++)p[i]=(byte)r.nextInt();}N(){b();s
=new MemoryImageSource(W,H,new IndexColorModel(8,256,p,p,p),p,0,W);
s.setAnimated(true);m=createImage(s);setSize(W,H);setVisible(true);}public void
update(Graphics g){b();s.newPixels();g.drawImage(m,0,0,null);repaint(20);}
public void paint(Graphics g){update(g);}static void main(String[]a){new N();}}


53 :駄目プログラマ:2001/03/11(日) 13:49
#include <windows.h>
int WINAPI WinMain (HANDLE hI,HANDLE hP,LPSTR lp,int n)
{
RECT g;DWORD i=-1;HDC hdc = GetDC(0);GetWindowRect(GetDesktopWindow(), &g);
while(i--)SetPixel(hdc,rand()%g.right,rand()%g.bottom,rand());
ReleaseDC(0,hdc);return 0;
}

ほらよ、7行砂嵐プログラム。WIN32用でCな。win98meで動作確認。win2kは未確認。
ほっとけば いつか終了(藁。 我慢できなくなったらタスク終了しとけ。

54 :デフォルトの名無しさん:2001/03/11(日) 13:59
>>53
見るからに動かしてみたくないぞ(藁

55 :デフォルトの名無しさん:2001/03/11(日) 16:08
つかライブラリの量と質によるだろperlだってモジュールがあるし。
なんだって最終的に1行にできるよ。

56 :デフォルトの名無しさん:2001/03/11(日) 16:49
>>55
用意されてるものだけで書くのが面白いんだろ。



57 :デフォルトの名無しさん:2001/03/11(日) 16:54
>>51
これはすげえ。これだけのコードの短さを保ちながら、WNDCLASS部分などの
エラーチェック以外はほぼ完璧だ。しかも鬼門のDIBits関連APIをいじりながら、
描画アルゴリズムも最適化されてる。それでこの速度が達成出来るのか、うーむ。
いい勉強をさせられた。久々に他人のソースを見て感動したよ。

58 :デフォルトの名無しさん:2001/03/11(日) 18:00
>51
>WM_PAINTでBegin/EndPaintを呼ばなくてもいいんでしたっけ?

呼ばなくてもいいけど、そのときはDefWindowProc()に処理を回さないとだめ。
DefWindowProc()が代わりにBegin/EndPaintを呼んでくれる。
WM_PAINTでBegin/EndPaintを呼ばずにreturnすると、無限ループになるよ。



59 :57:2001/03/11(日) 18:23
>58
51さんはちゃんとその周りの処理も出来ているよ。
先にDefWindowProcを呼んで、その後で個別処理をしている。
ちなみにBegin/EndPaintを呼ばないと無限ループというのは間違いで、
WM_PAINTが絶え間なく呼ばれ続けるだけのはず。
今回の様なプログラムならそれを逆手にとって
InvalidateRectを呼ばない方法も考えられるね。
(そうするとまた少しコードが短くなる(笑))
でもそれは本来正しいプログラムではないので、51さんの方法がベストでしょう。

60 :デフォルトの名無しさん:2001/03/11(日) 19:27
あまり誉められたものじゃないけど9行。
もう1行いけそう

#include <windows.h>
HBITMAP q;HDC e,v;char*k,y[1<<20];int a=640,b=400,c,i,t[11]={40,a,b,1572865},r;
int WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){int m[7];WNDCLASS w={67,De\
fWindowProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);ShowWindow(CreateWindow("1",0,
1<<19,0,0,a,b,0,0,i,0),1);while(GetMessage((MSG*)m,0,0,0)){DefWindowProc((HWND)
m[0],m[1],m[2],m[3]);if(m[1]==513)return 0;if(m[1]==15){GetDIBits((v=GetDC((HW\
ND)m[0])),(q=CreateCompatibleBitmap(v,a,b)),0,b,0,(BITMAPINFO*)t,0);for(k=y;k<y
+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,
y,(BITMAPINFO*)t,0);DeleteObject(q);InvalidateRect((HWND)m[0],0,0);}}}


61 :60:2001/03/11(日) 19:28
ちなみに、クリックで終了w
ウインドウを閉じると、メモリにゴミが残りますw
スタイル変更したほうがよかったな。

62 :デフォルトの名無しさん:2001/03/11(日) 19:51
>52
ふ〜ん。Javaの方が短いけれどずいぶんスッキリしているなあ

63 :デフォルトの名無しさん:2001/03/11(日) 20:01
すごいですね。プログラムまったくわかりませんが、
大学に行ったらこんな凄いプログラムつくってみたいです

64 :名無しでGO!:2001/03/11(日) 20:05
ところで、なんでみんな明らかに長くなりそうなWindows+CとかJavaなの?

65 :60:2001/03/11(日) 20:25
もうちょっと縮めて8行

#include <windows.h>
HBITMAP q;HDC v;char*k,y[1<<20];int a=640,b=400,c,i,t[11]={40,a,b,1572865},r;W\
INAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){int m[7];WNDCLASS w={67,DefWind\
owProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);ShowWindow(CreateWindow("1",0,1<<19
,0,0,a,b,0,0,i,0),1);while(GetMessage((MSG*)m,0,0,0)){w.lpfnWndProc((HWND)m[0],
m[1],m[2],m[3]);if(m[1]==513)break;if(m[1]==15){v=GetDC((HWND)m[0]);for(k=y;k<y
+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,
y,(BITMAPINFO*)t,0);DeleteObject(q);InvalidateRect((HWND)m[0],0,0);}}return 0;}


66 :>64:2001/03/11(日) 20:41
だったら他の言語で書いてよ。

67 :トリッキーの1:2001/03/11(日) 20:44
>>58-59
情報tnxです。
59さん、確かにコレを利用するとかなり短く書けますね。
>>60
うーん、怖い。メッセージループ内で処理する場合、
SendMessageで送られたメッセージなどが
直接プロシージャにまわされてしまうので、
この例では例えばWM_DESTROYなどが処理できないはずです。
しかし、今思いついたんですが、GetMessageの返す
エラーメッセージを利用する方法がありますね。

というわけで>>58-60さんを参考にして書いてみました。
これも8行ですが、ちゃんと終了出来ます。
メモリはOSが解放してくれることを期待しています。
#include <Windows.h>
HBITMAP q;char*k,y[1<<20];int a=640,b=400,r,m[8];BITMAPINFO t={40,a,b,1,24};H\
WND g;int WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){WNDCLASS w={3,DefWi\
ndowProc,0,0,i,0,LoadCursor(0,IDC_ARROW),0,0,"T"};RegisterClass(&w);HDC v=Get\
DC(g=CreateWindow("T","2ch",268959744,99,99,a,b,0,0,i,0));q=CreateCompatibleB\
itmap(v,a,b);while(GetMessage((MSG*)m,g,0,0)!=-1){if(m[1]==15){GetDIBits(v,q,0
,b,0,&t,0);for(k=y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToD\
evice(v,0,0,a,b,0,0,0,b,y,&t,0);}else DispatchMessage((MSG*)m);}return 0;}

7行が見えてきましたね(笑)

68 :トリッキーの1:2001/03/11(日) 20:53
まるでPGP鍵のようだ。

>>62
美しい言語である上、比較的簡単にグラフィックをさわれますからね。

>>63
これは悪い例です。というか、パズルみたいな物です。参考にしてはいけません。
確かに私は大学生ですが、普段こんな狂ったコードを書いているわけではありません。

>>64
他に適した言語がなかなか見つからないんですが、心当たりありますか?
使ったこと無いけれど、HSPとかだと簡単なのかな?

69 :デフォルトの名無しさん:2001/03/11(日) 20:58
馬鹿スレから名スレへ

70 :デフォルトの名無しさん:2001/03/11(日) 21:01
68さん>>
プログラム組んだことないのですが
はじめからC++って大丈夫ですか??
C言語知らなくてもC++の入門書読んでも大丈夫ですか??

71 :60:2001/03/11(日) 21:01
>>67

>メモリはOSが解放してくれることを期待しています。
CS_CLASSDC か CS_OWNDC指定しておけば平気だと思う。
この例だと
WNDCLASS w = {67, ...
かな


72 :トリッキーの1:2001/03/11(日) 21:04
>>71=60さん
なるほど、名案!素晴らしい。
ちなみに>>67は、WM_PAINTが外から投げられると画面の更新を止めます。
その可能性は結構大きいので、バグプログラムだと言えるでしょう。悲しい。

>>70
すみません、スレ違いなので別の場所で会えれば……

73 :60:2001/03/11(日) 21:07
関係ないけど、ちょっと気になってMSDN見てみた。

>警告 GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。したがって、次のようなコードは避けてください。
>while (GetMessage(lpMsg, hWnd, 0, 0)) ...

おぃ、どういうことだよ。
今までのサンプルってなんなんだ?

74 :トリッキーの1:2001/03/11(日) 21:13
>>73=60
-1を返しても、メッセージは大抵取れています。
Windows3.1の名残なのか、hwnd==NULLの場合でも正常に動作します。
ただこの場合、頻繁にエラーの-1が返されるようです。

しかし、本当にエラー(Windowが消滅した、など)を返してきた場合
対応できないので、>>67ではわざわざhwndを設定してエラーが出ないようにし、
その代わりエラーが返ってきたら(必ずいつか返ってくる)強制終了しています。

75 :60:2001/03/11(日) 21:47
ゴール?
7行到達w
Cだとプリプロセッサというウザイものがあるから難しいねw

>>67を参考に。

#include <windows.h>
HDC v;char*k,y[1<<20];int a=640,b=400,c,i,r, m[8];BITMAPINFO t={40,a,b,1,24};H\
WND g;WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){ WNDCLASS w={67,DefWind\
owProc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);v=GetDC(g=CreateWindow("1",0,26895\
9744,0,0,a,b,0,0,i,0));while(GetMessage((MSG*)m,g,0,0)!=-1){if(m[1]==15){for(k=
y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0
,0,b,y,&t,0);}elseDispatchMessage((MSG*)m);}return 0;}


76 :トリッキーの1:2001/03/11(日) 22:04
>>75
恥ずかしい……まさかこんな大穴を見落としていたとは。
確かにここまできたらGetDIBitsをする意味は全くないですね。

ちょっと惜しいのは、ウィンドウをドラッグすると更新が止まってしまう事です。
↓はそれを修正したInvalidateRectを呼ぶバージョンです。あとちょっと手を入れてあります。

#include <Windows.h>
char*k,y[1<<20];int a=640,b=400,c,r,m[8];BITMAPINFO t={40,a,b,1,24};HWND g;WI\
NAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){WNDCLASS w={67,DefWindowProc,0,0
,i,0,0,0,0,"T"};RegisterClass(&w);HDC v=GetDC(g=CreateWindow("T","2ch",513<<19
,99,99,a,b,0,0,i,0));while(GetMessage((MSG*)m,g,0,0)!=-1){if(m[1]==15){for(k=y
;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0
,0,b,y,&t,0);}else DispatchMessage((MSG*)m);InvalidateRect(g,0,0);}return 0;}

しかし60さん、メッセージループといい素晴らしい目の付け所です。
60さんがいなければ7行達成出来ませんでしたね。今回はホントに勉強になりました。

77 :39:2001/03/11(日) 22:09
>>52
ブラボー! 素晴らしいでし。
ていうか、宣言をまとめることすら思いつかなかった俺って
(いつも1行1個なんだも〜ん)
鬱だ氏のう

78 :60:2001/03/11(日) 22:14
>>76
むむっ、こっちも別のアプローチで完成w
InvalidateRect呼ばないけど、ちょっとずるしてその辺解決。

#include <windows.h>
HDC v;char*k,y[1<<20];int a=640,b=400,c,i,r, m[8];BITMAPINFO t={40,a,b,1,24};H\
WND g;WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int){WNDCLASS w={67,DefWindow\
Proc,0,0,i,0,0,0,0,"1"};RegisterClass(&w);v=GetDC(g=CreateWindow("1",0,2689597\
44,0,0,a,b,0,0,i,0));for(;;){if(PeekMessage((MSG*)m,0,0,0,1))DispatchMessage((
MSG*)m);else{if(!IsWindow(g))return 0;for(k=y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(
r=r*9+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,y,&t,0);}}}



79 :トリッキーの1:2001/03/11(日) 22:20
>>78
ああなるほど。良くあるOnIdleの形ですね。
どちらの手法でも最終的にCPUを喰いまくるので(笑)
OKでしょう。

……そろそろ次のネタの時期ですね。
フルスクリーンのラスタースクロールとか(笑)

80 :トリッキーの1:2001/03/11(日) 22:27
>>51
自己レス
>最終的に10行になりました。後1行なら何とかなるでしょうが、
>速度を維持したまま7行は絶対無理だと確信しました(笑)。

今日の昼の発言。なんといい加減な確信だ(鬱)

81 :デフォルトの名無しさん:2001/03/11(日) 22:28
ついでに多重スクロールもきぼん

82 :トリッキーの1:2001/03/11(日) 22:37
7行で?(藁

83 :81>82:2001/03/11(日) 22:39
いやべつに

84 :38:2001/03/11(日) 22:39
>>76 , >>78
うぉ、あんたらすげぇ!

>>64
長くなりそうな言語で短く書くのが面白いのサ。

85 :名無しの轍:2001/03/11(日) 22:41
俺は>>51のコードが非常に素晴らしいと思う。
もちろん7行達成も凄いことだが。

86 :トリッキーの1:2001/03/11(日) 22:44
>>85
ほめてくれてありがとう。
でも実は51、処理系依存の部分が1ヶ所あります。
書き直しても簡単に10行なのに、気付かなかった自分がちょっと嫌。

87 :60:2001/03/11(日) 23:03
うんうん、51はすごかった。
俺もアレに触発されてやってみたわけだし。

88 :52:2001/03/11(日) 23:04
>77
Javaの方が短いけれどわかりやすい。
・・・、というかWin32 APIよくわからないだけかも・・・。

乱数使うときはRandom#nextInt()を使ったほうが高速なんですね。
今までMath.random()使っていたけれど実はMath.random()が重いということを
知った今日この頃。

# Random#nextInt()はintだしねー

89 :60:2001/03/11(日) 23:06
結局出来上がったコードはインデント戻せば普通な感じで面白み無いしね。
最後におまけで整理した行連結(\)なしバージョン

#include <windows.h>
char*k,y[1<<20];int a=640,b=400,c,r;BITMAPINFO t={40,a,b,1,24};WINAPI WinMain(
HINSTANCE i,HINSTANCE,LPSTR,int){MSG m;WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0
,0,"1"};RegisterClass(&w);HWND g=CreateWindow("1",0,268959744,0,0,a,b,0,0,i,0);
HDC v=GetDC(g);for(;;){if(PeekMessage(&m,0,0,0,1))DispatchMessage(&m);else{if(!
IsWindow(g))return 0;for(k=y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;
SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,y,&t,0);}}}


90 :デフォルトの名無しさん:2001/03/12(月) 00:53
新しいお題をクレー。粘土をクレー。

91 :60:2001/03/12(月) 01:16
7行ラスタスクロールっしょ?
元絵を作る時点で7行超えてるし(鬱

92 :トリッキーの1:2001/03/12(月) 02:40
>>91
えっ……マジだったの?
ああ、今回はJavaにしたい……

93 :デフォルトの名無しさん:2001/03/12(月) 04:55
;; nasmw s.asm -o s.com
dd 10cd13b0h,0c38ea0b7h,193740e4h,0f8e2aac7h,8626c031h,0f2e94105h,0ffh


94 :トリッキーの1:2001/03/12(月) 05:24
>>93
それは7行スレよりトリッキースレでしょう。
お待ちしております(笑)

>>91
骨格だけ作ってみました。10行です。最適化していないのでコード的に無駄だらけです(tとか)。
ここから出発するのはやめた方がいいかもしれません。BitBltは良くない。
とはいえ、Get/PutDIBitsを使うのもいまいち良くないですし。
いっそのこと、Windowの形態を無くしてしまうのも手かも……
その場合終了方法が問題です。

フルスクリーン ラスタースクロール
#include <windows.h>
#include <math.h>
HDC v,d,e;HWND g;int n,f,t[10]={40,0,0,1572865},m[8];WINAPI WinMain(HINSTANCE
i,HINSTANCE,LPSTR,int){t[1]=GetSystemMetrics(0);t[2]=GetSystemMetrics(1);
WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,"Lus"};RegisterClass(&w);v=GetDC(g=
CreateWindow("Lus",0,WS_VISIBLE|WS_POPUP,0,0,t[1],t[2],0,0,i,0));d=GetDC(0);
SelectObject(e=CreateCompatibleDC(d),CreateCompatibleBitmap(d,t[1],t[2]));
BitBlt(e,0,0,t[1],t[2],d,0,0,SRCCOPY);while(GetMessage((MSG*)m,g,0,0)!=-1){if
(m[1]==15)for(n=0;n<t[2];n++)BitBlt(v,sin(n*3.0/t[2])*sin((f++)/40.0)*60,n,t[1
],1,e,0,n,SRCCOPY);DispatchMessage((MSG*)m);InvalidateRect(g,0,0);}return 0;}


95 :デフォルトの名無しさん:2001/03/12(月) 07:09
トリッキーの1さん、すっかりここの主になっちゃったね(藁

96 :デフォルトの名無しさん:2001/03/12(月) 13:52
>94
なんでこの行数でこんな事が出来るんだ・・

97 :  :2001/03/12(月) 14:44
優良スレだな。


98 :デフォルトの名無しさん:2001/03/12(月) 14:55
月面着陸ゲームを50 or 25行で。


99 :デフォルトの名無しさん:2001/03/12(月) 15:07
ぬ、560文字という制限なのですね。
Rubyじゃ無理だな。

100 :デフォルトの名無しさん:2001/03/12(月) 15:07
>98
おいおい、(約)7行っていう縛りがあるから面白いんじゃないの?
50行×79字なんて掲示板には適さないし、研ぎの魅力が半減だ。


362 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)