1272
1046

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2018-11-27

ブログやってます。更新などはこちら。地方エンジニアの学習日記

七行プログラミングとは

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

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

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

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

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

7行テトリス

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

技術的解説は下記にあります。
http://www.geocities.jp/nanagyou/kaisetsu.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>

■ カラー版

<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

7行オセロ

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

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

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

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;}
$ gcc oc.c
$ ./a.out

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

 - - - - - - - -
 - - - - - - - -
 - - - - o - - -
 - - - o o - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -

7行玉避けゲーム


<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行
テキストで保存してブラウザで実行すれば遊べます。

<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

まとめ

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

リンク

七行プログラミング
七行プログラミング part2
七行プログラミング part3
七行プログラミング part4
七行プログラミング part5

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

1272
1046
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1272
1046

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?