たった7行でテトリスを実装「七行プログラミング」とは

ブログやってます。更新などはこちら。[地方エンジニアの学習日記](https://ryuichi1208.hateblo.jp/)

## 七行プログラミングとは

プログラミングの言語を問わず、
「7行 × 79文字 」という文字数制限のもとにコードを書くといったこと
ショートコーディングと呼ばれるらしいです。

1kbに満たないソースでテトリスが出来るのには感動しました(当時中学生ぐらい)
Unix哲学の「スモール イズ ビューティフル」もびっくりです()。

ちなみにスーパーマリオブラザーズは40kb程っていうのも驚き

> ショートコーダー(Short Coder)とは、プログラムのソースコードを極限まで短縮する技術を持ったプログラマのことである。「ソースコードの短縮」は、一見無意味に感じられるかもしれない。しかし最短コードを達成するには、省メモリ・高速プログラム・処理系の知識に加えて、並外れた集中力と熱いショートコーディング魂が必要なのである。

以下に見つけたソースを記載します
(2001 ~ 2004年頃の情報がメイン)

## 7行テトリス

改良に改良を重ね出来上がったのが下記。
第一版ができたのは今から約12年前の2002年と言うのが驚きです。
それぞれテキストエディタに保存しブラウザで実行すれば遊べます。

技術的解説は下記にあります。
http://www.geocities.jp/nanagyou/kaisetsu.html

■ モノクロ版

``` html

<body id=D onKeyDown=K=event.keyCode-38><script>Z=X=[B=A=12];function Y(){for(C
=[q=c=i=4];f=i--*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h
+=K:t?B=C:0;i=K=q--;f+=Z[A+p])k=X[p=h+B[q]]=1;if(e=!e)if(h+=A,f|B)for(Z=X,X=[l=
228],B=[[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l--;)for(l%A?l-=l%A*!Z[
l]:(P+=k++,c=l+=A);--c>A;)Z[c]=Z[c-A];for(S="";i<240;S+=X[i]|(X[i]=Z[i]|=++i%A<
2|i>228)?i%A?"■":"■<br>":"＿");D.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y(h=e
=K=t=P=0)</script>
```

■ カラー版

``` html
<body id=D onKeyDown=K=event.keyCode-38><script>Z=X=[B=A=12];function Y(){for(C
=[q=c=i=4];f=i--*K;c-=!Z[h+(K+6?p+K:C[i]=p*A-(p/9|0)*145)])p=B[i];for(c?0:K+6?h
+=K:t?B=C:0;k=i=K=q--;f+=Z[A+p])X[p=h+B[q]]=t+1;if(e=!e)if(h+=A,f|B)for(Z=X,X=[
l=228],B=[[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2];l--;)for(l%A?l-=l%A*!
Z[l]:(P+=++k,c=l+=A);--c>A;)Z[c]=Z[c-A];for(S="<b>";i<240;S+=(c=X[i]|(X[i]=Z[i]
|=++i%A<2|i>228))?"<b style=color:#"+142*c+">■":"＿")i%A?0:S+="<br>";
D.innerHTML=S+P;Z[5]||setTimeout(Y,99-P)}Y(h=e=K=t=P=0)</script>
```

■ 実行画面

![スクリーンショット 2018-11-27 21.41.29.png](https://qiita-image-store.s3.amazonaws.com/0/258841/3f127dc9-2ea9-949c-9897-fef55d4caab1.png)


## 7行オセロ

コンパイルすることでCLI上で遊べるCPU対戦型のオセロです。
コンピュータ操作部分を除けば実装できそうな気がしますが人工知能部分も含むとなると
ホントに天才技としか思えません。。

解説は下記参照
https://uguisu.skr.jp/othello/7gyou.html

整形前ソースがコメント付きであります。
一番目に付くのはmapを一次元配列で持っている点です。
多重ループしないことで文字数を削減しているようですが正直思いつくのがすごい。

``` c:oc.c
#include <stdio.h>
int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10};void k(){if(m[p]==0)
for(i=0;i<8;i++){for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++;if(c&&m[v]==t){a+=c;v=
p;if(d)do m[v]=t,v+=r[i];while(m[v]!=t);}}}char*h=" - o x\n";int main(){for(i=
1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++
p)k(),printf("%.2s",&h[m[p]*2]);if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d"
,&p,&i),p+=i*9):++p;else if(s)s=0,printf("pass");else break;t=3-t;}return 0;}
```

``` bash
$ gcc oc.c
$ ./a.out

 - - - - - - - -
 - - - - - - - -
 - - - - - - - -
 - - - o x - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -
5 3

 - - - - - - - -
 - - - - - - - -
 - - - - o - - -
 - - - o o - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -
```

## 7行玉避けゲーム

``` html

<body id=B onMouseMove=y=event.y;x=event.x><script>h=B.clientHeight-20;a=[b=[q= 
[D=document]]];for(U=x=99;x--;C=F=q[x]=P=y=0)D.write("<b style=background:red;" 
+"width=16;height=16;position:absolute;top:-20></b>");function T(){for(i=C;i--* 
!F;J=D.all(5+i).style,l=q[i]/U,m=J.left=a[i]*(c=1-l)+a[d=i+U]*l,n=J.top=b[i]*c+ 
b[d]*l,F=m-15<x&x<m+16&n-15<y&y<n+16)if(!q[s=i]--)for(j=2;j--;s+=R%3+1)R=Math. 
random(q[i]=U)*w*h|0,a[c=j?i:i+U]=s%2?s%4>1?0:w:R%w,b[c]=s%2?R%h:s%4?h:0;P++-C* 
9||C-U&&C++;if(F)alert(P);else setTimeout(T,U-C)}T(w=B.clientWidth-20)</script>
```

## 8行ぷよぷよ

こちらは8行
テキストで保存してブラウザで実行すれば遊べます。

``` html
<body id=D onKeyDown=K=event.keyCode-38><script>function G(x){Z[x]==c&&(Z[x]=q?
(P+=k++,0):-c,G(x+1),G(x+8),G(x-1),G(x-8),v++)}function Y(){i=I=96;if(e=++e%4)
for(K?K+6?Z[a=h+K]|Z[a+B]?0:h=a:Z[h+(E=B%8?B*8:-B/8)]?0:B=E:0;K=k=i--;X[h]=2+t%
5|0,X[h+B]=2+t/5|0,f=Z[8+h]+Z[8+h+B])X[i]=Z[i];else if(h+=8,r||f){r?r=0:X=[Z=X]
for(Z[-5]=0;i--;B=8)Z[j=i-8]*!Z[i]&&(Z[i]=Z[j],Z[r=j]=0);if(!r)for(t=Math.
random(h=3)*25;I--;q=v=0)if(c=Z[I],c>1)G(I),c=-c,r+=q=v>3,G(I);e=r?3:0}for(i=S=
"";i<96;S+=i%8?"＿■●★▲＊□".charAt(c):"■<br>")c=X[i]|(Z[i]|=++i%8<2|i>88);
D.innerHTML=S+P;Z[3]*!r||setTimeout(Y,99-P)}e=3;Y(f=X=Z=[r=h=K=P=0])</script>
```

![スクリーンショット 2018-11-27 21.52.48.png](https://qiita-image-store.s3.amazonaws.com/0/258841/f7871fd4-8e5a-ec27-e499-d4eb26ee7474.png)

## まとめ

元ネタは2ちゃん
検索してみると記事は2007年以降更新されていない。
現代版の7行プログラミングがあればぜひ教えていただきたいです。

## リンク

■ [七行プログラミング](http://pc.5ch.net/test/read.cgi/tech/984182993/)
■ [七行プログラミング part2](http://pc3.5ch.net/test/read.cgi/tech/1018840143/)
■ [七行プログラミング part3](http://pc2.5ch.net/test/read.cgi/tech/1033143528/)
■ [七行プログラミング part4](https://pc8.5ch.net/test/read.cgi/tech/1051703369/)
■ [七行プログラミング part5](https://pc11.5ch.net/test/read.cgi/tech/1142467359/)

その他作品は下記URLより見てみてください。
読むだけでも大変勉強になる内容が多い。