2021-07-05
この6行のHTML/JavaScriptは、何のプログラムでしょう? <body onload='onkeydown=e=>K=parseInt(e.key[5]||6,28)/3-8;Z=X=[B=A=12];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:B=C;i=K=q--;f+=Z[A+p])X[p=h+B[q]]=1;h+=A;if(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++, 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;setTimeout(Y,i-P)};Y(h=K=t=P=0)'id=D> なんとこの1ファイルだけで動く有名某ゲーム!

6lines (src on GitHub」(遊ぶにはキーボードが必要です)
左右キーで移動、スペースで回転、1行揃えると消え点数加算。リトライはリロード(他のキーを押すとおかしなことになるのはご愛嬌、下キーとか押さないで!)
信じがたいですが、ちゃんとゲームとしての一通りが揃っています。

初出は2002年、その後いろいろと改良されてきているようです。
たった7行でテトリスを実装「七行プログラミング」とは - Qiita

改めて見るとHTMLやJavaScriptの書き方が古いので、改善します。

関数宣言をモダンに変えて5文字削減!
function Y(){

Y=_=>(){

問題はキー入力処理、keyCodeは非推奨なので、今後も動く保証がないので、keyを使って無理やり0,1,-1,-6を返す互換式を作成。ArrowRightの6文字目Rを28進数として数値化!
onKeyDown=K=event.keyCode-38

onkeydown=e=>K=parseInt(e.key[5]||6,28)/3-8
でも、15文字も増えてしまいました。

ゲームとして保ったまま削れる部分を探して、下記の処理を省略して79文字6行達成!
- 2x2のテトロミノの場合回転しない処理
- 一度に消した際の点数ボーナス計算処理
- 詰まったらループを止める処理

感動的なのはテトロミノを生成する部分、0-6で7種類のテトロミノを表す長さ4の配列で表現しています。数は1次元化したフィールドの相対位置。IchigoJamでも使えそうなテクです! B=[[-7,-20,6,h=17,-9,3,3][t=++t%7]-4,0,1,t-6?-A:2] 真ん中と右隣はどのブロックも共通なので0,1、4つ一直線のもの以外はそのもうひとつ右も共通。4つ目のブロック位置を相対位置で表してできあがり。 マイナスが付くことによる文字数増加を防ぐため、共通で-4する工夫と。ブロック出現ポイントを表す変数hに17をついでに入れているのもニクイ!

JavaScriptなので、1行にもできます。たった、464文字(470byte)しかありません。IchigoJamの1ファイル上限、約1,000文字より短い! <body onload='onkeydown=e=>K=parseInt(e.key[5]||6,28)/3-8;Z=X=[B=A=12];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:B=C;i=K=q--;f+=Z[A+p])X[p=h+B[q]]=1;h+=A;if(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++,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;setTimeout(Y,i-P)};Y(h=K=t=P=0)'id=D> コピペして、適当なHTMLファイルとして保存し、ブラウザで開くだけ。ぜひ自分のパソコン上で動かしてご確認ください。

こうしたプログラムを工夫するテクニックはMSX譲り。こどもの頃のMSXとの出会いに感謝!
MSXユーザーのためのIchigoJam入門 - MSX Advent Calendar 2015


先日開催された「高専インカレチャレンジ
Nikko Open Innovation Labの磯野さん、鈴木さんと福井高専ご訪問。報告と今後についてご相談。 高専生たちが変わるきっかけになったことがうれしい!もっと実装力が上がるときっともっとスゴイ。 開発力を上げたい高専生「jigインターン」へどうぞ!


未来の創る人を創ろう「すべてのこどもたちにプログラミングを」の「PCN」年1のおまつり「PCNサミット」は、今年もひとまずオンライン開催。 全国のいろんなチャレンジと想いを持ったつながりが熱い!今年は日を分けて3日程開催、全国の地域ICTクラブとの交流も楽しみ!


本日の装備、いちごマスク別バージョン。
鯖江の呉服屋さん、まるよさんが創ってつくれました!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS