Secure,Crack,Programme.

何かよくわからないもの置き場。競プロとかCTFとかそこらへん?

Esolangって、知ってる?

------

この記事はGUT Advent Calender(https://www.c-sqr.net/c/todaigensokyo/Circle_detailReport.html?report_id=405032)へ向けて書かれた記事です。

-----

 

東方ファンの皆さま、こんにちは。東方NewbieのiLiss.です。

アドカレの記事を遅刻しました。どうして?遅刻癖?

東方関連の記事は他の方に任せまして、私は少々趣味を語りたいと思います。

技術関連のお話です。

 

 

 

それでは...

 

「Esolang」について....

 

お話しします.....

 

みなさん.....

 

「Esolang」って....

 

ご存知ですか...?

 

「Esolang」っていうのはですね.....

 

プログラミング言語の....

 

言語仕様を難しくすると....

 

「気持ちがいい」とか....

 

可読性を完全に無視して言語を作ると....

 

「気持ちがいい」だとか.....

 

あるいは....

 

命令数を極端に少なくすると.....

 

「気持ちがいい」

 

といったことを....

 

「Esolang」というんですね。

 

[結局どういうことだよ]

Esolang、略さずには"Esoteric Programming Language"。

日本語でいうと、「難解プログラミング言語」。

名前からして難しそうですね。実際難しいんですが。

 

基本的に、Esolangっていうのは、難しいようにできています。

難しいので、ちゃーんと、言語仕様を読まないと...

プログラミングができません。

そんな「難しい言語」、Esolangの魅力を...ちょっとだけ語ろうと思います。

 

まあ、Esolangって一口に言ってもいろんなものがあるんですね。

それぞれの言語でこれが簡単とか難しいとかあるし。

今回は、全て紹介し切ることが不可能な言語たちから...

ちょっとセレクトして...

言語を紹介していきながら...

その魅力を語りたいと思います。

 

今回は、言語紹介とともに、よく紹介されるサンプルコード(Wikiのもの)を載せたりするよ。

 

[Brainf*ck]

Brainf*ck。名前の時点で伏せ字されていますが大丈夫だろうか。

この言語、とにかく言語仕様が簡単である。どのくらい簡単かというとWikipediaのみで言語仕様の記述が済んでしまうレベルで、

処理系は次の要素から成る: Brainfuckプログラム、インストラクションポインタ(プログラム中のある文字を指す)、少なくとも30000個の要素を持つバイトの配列(各要素はゼロで初期化される)、データポインタ(前述の配列のどれかの要素を指す。最も左の要素を指すよう初期化される)、入力と出力の2つのバイトストリーム。

Brainfuckプログラムは、以下の8個の実行可能な命令から成る(他の文字は無視され、読み飛ばされる)。

  1. > ポインタインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
  2. < ポインタをデクリメントする。C言語の「ptr--;」に相当。
  3. + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
  4. - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
  5. . ポインタが指す値を出力に書き出す。C言語の「putchar(*ptr);」に相当。
  6. , 入力から1バイト読み込んで、ポインタが指す先に代入する。C言語の「*ptr=getchar();」に相当。
  7. [ ポインタが指す値が0なら、対応する ] の直後にジャンプする。C言語の「while(*ptr){」に相当。
  8. ] ポインタが指す値が0でないなら、対応する [ (の直後[1])にジャンプする。C言語の「}」に相当[2]

これだけ。たったこれだけ。は?

1度でもプログラミングを触ったことのある方であれば、言語仕様の理解に苦労したり、関数をリファレンスで調べたりと色々苦労があったと思われる。Brainf*ckはそれがない。これだけ!

 

簡単にするっていうのは...本当に難しい。

 

これは実際にプログラムを記述すれば理解できると思われる。

是非一度、AtCoderの最初の問題、"Welcome to AtCoder"にチャレンジしてほしい。

https://atcoder.jp/contests/practice/tasks/practice_1

これ、めちゃくちゃ難しい。通常言語では感じなかった難しさがある。

時間のある方、是非...やってみてください。

僕は諦めました。

 

こちら、所属サークルTSGのEsolangマスターうら氏によるAC

わかりません。

 

[><>]

ウオウオ・フィッシュ・ライフ!"Fish"と読むこのうおな言語、><^vの4つで言語を読む方向を指定し、|/\_が言語を読む方向を反射させるというとんでもない言語!

自分の思い通りに進行方向を指定できます。

先程のBrainf*ckと異なりAtCoder非対応。そもそも対応EsolangがBrainf*ckのみ

 個人的に好きな言語です。名前オチだけど。

こちらはEsolang Wiki(https://esolangs.org/wiki/Main_Page)から拝借したFizzBuzzソースコード

0voa                            ~/?=0:\
 voa            oooo'Buzz'~<     /
 >1+:aa*1+=?;::5%:{3%:@*?\?/'zziF'oooo/
 ^oa                 n:~~/

たのしいですね。 ええとても。

 

[Starry]

またとんでもない言語が登場します。言語仕様は、

Spaces Final Description
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements.
4 + Pop top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y.
4 mod 5 * Pop y, pop x, push mod y.
0 mod 2 . Pop a value and print it as a number.
1 mod 2 . Pop a value and print it as an ASCII character.
0 mod 2 , Read a number from input.
1 mod 2 , Read an ASCII value from input.
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.

 

空白の数で同じ文字の意味が変わるのは楽しいですね。

それではHelloWorldを見ていきましょう。

 

            +               +  *       +    
 * + .        +              +  *       +   
  *     * + .            +     * + . + .    
    +     * + .              +            + 
 *         +     * * + .                 + *
 + .              + +  *           +     *  
   * + .             + * + .        +     * 
+ .           + * + .             + * + .   
           +            +  *         +     *
 * + .

  満 天 の 星 空

 

Starryという英単語は"星空"を意味します。みんなも星空をプログラムしてみよう!は?

 

[Shakespeare Programming Language(SPL)]

これはなに?


色々とよく分からなすぎて面白い言語。いつかコードゴルフ大会に出ないかな...

プログラミング知識の他にシェイクスピア(教養、らしい)の知識と台本を書く力(は?)が要求されてそう。人間そんなに多く才能を持てるようにできていませんが...

 

[Piet]

まずはHelloWorldのソースコードを見てもらおう。それが一番手っ取り早い。

 

Piet Program Hello World(1).gif
Thomas Schoch - own work at http://www.retas.de/thomas/computer/programs/useless/piet/explain.html (with detailed explanation), CC 表示-継承 3.0, リンクによる

 

...は?

 

意味が分からない、と思われた方もいらっしゃると思われる。

このEsolang、ソースコードはなんと画像でできている

この画像を読み込むとHelloWorldが出力されるらしい...

にわかに信じがたい話ではあるが...

 

[Whitespace]

こちらもソースコードを見ていただいた方が早い。

   	  	   
		    	
   		  	 	
		    	 
   		 		  
		    		
   		 		  
		    	  
   		 				
		    	 	
   	 		  
		    		 
   	     
		    			
   			 			
		    	   
   		 				
		    	  	
   			  	 
		    	 	 
   		 		  
		    	 		
   		  	  
		    		  
   	     
		    		 	
   		 				
		    			 
   		  		 
		    				
   	     
		    	    
   			  		
		    	   	
   			    
		    	  	 
   		    	
		    	  		
   		   		
		    	 	  
   		  	 	
		    	 	 	
   			  		
		    	 		 
   	    	
		    	 			
    
		     

 	 			 			 			  	  		 	  	 			 	   		  	 	

 	 		 			  		  	 	 			 			 		 		   		 	  	 		 			  		  	 	




   		    	 		  	   		  	  
	   
	

   			 			 			  	  		 	  	 			 	   		  	 	
 
 			 
 
	  			 			 			  	  		 	  	 			 	   		  	 	 	 					 		  	 	 		 			  		  	  
	
     	
	   
 
 			 			 			  	  		 	  	 			 	   		  	 	

   			 			 			  	  		 	  	 			 	   		  	 	 	 					 		  	 	 		 			  		  	  
 

 


	

   			  	  		  	 	 		    	 		  	  
 
  
 	
	 			 
    	 	 
	  	
	  			  	  		  	 	 		    	 		  	   	 					 		  	 	 		 			  		  	  
 

   	
	   
 
 			  	  		  	 	 		    	 		  	  

   			  	  		  	 	 		    	 		  	   	 					 		  	 	 		 			  		  	  
 

   	
	       
		 
	

   		 			  		  	 	 			 			 		 		   		 	  	 		 			  		  	 	
   	 	 
   		 	
	
  	
  
	

....もうなんだこれ....

ちなみに、このソースコードちゃんと動きます。本当に?????

"Hello,world of spaces!"なる文字列が出てくる。どうしてこれで動くんだ....

 

Whitespace、それは空白、Tab、改行のみで記述される人類に見ることが不可能な言語。プログラムを見ることのできない人類のために、オンラインのプログラム環境が存在する。

色がついて見えるようになったね!!!!

 

[おわりに]

正直、もう少しEsolang力を上げてから記事を書くべきだったかなあと思っている。

こういう場面ってさ、自分でコード書いてこんな感じだよー、とかするところじゃん?と思っていたり。

 

Esolangは...楽しいですよ....

何故って... 「誰も知らない」 .... からなんですね....

突然新たな言語が提示されて.... 言語仕様を読んで....

みんなが同じスタートラインから...

一斉に.... プログラミングを始めるんですよ....

 

そう...

#全人類はEsolangの下に平等 なのです。

 

楽しいと....  思いませんか....?

 

そのうちEsolangでやる楽しい遊び、「コードゴルフ」についても記事を書きたいと思います。

でも、今回はこのへんでおしまいにしましょう。

ではでは。