Langtonの蟻をpythonで作って遊ぶ

## 1. Langtonの蟻とは？
Langtonの蟻とはアメリカの計算機科学者で、"Artificial Life" という用語を生み出したChristopher Langtonが発明した単純な二次元チューリングマシンのことです。簡単に言えば、何種類かの色で塗られた格子状を蠢く蟻が、自分の乗っているマス目の色に応じて格子状の色を変化させながら進んでいくシミュレーションです。一番単純なものは次のルールで動きます:

 1. 白いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。

2. 黒いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。

ここで、色を白→黒→白 に限らず他の状態を追加したり、回転角度を変更したりすることによって、違った振る舞いを見せます。色の変化がサイクリックに定義され拡張されたLangtonの蟻はそのサイクリックな色の並びで右に行くか左に行くかに応じてそれぞれR、Lを並べて表現されます。例えば、この記法では上記のルールがRLRと表記されます。最後のRは1つ目に戻ることを意味していることに注意してください。

https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%82%B0%E3%83%88%E3%83%B3%E3%81%AE%E3%82%A2%E3%83%AA

## 2. 方法
プログラミング初心者でよくわからないので、以下のサイトから大枠を拝借させていただきました:

https://www.geeksforgeeks.org/python-langtons-ant/

こちらのコードはturtle graphicsというライブラリを用いてpythonで記述されています。単純な動きを繰り返す図形の描画に向いているプログラムなので、Langtonの蟻をシンプルに記述することができます。

## 3. コード

```# importing turtle module 
import turtle 

def langton(): 

	# Initializing the Window 
	window = turtle.Screen() 
	window.bgcolor('white') 
	window.screensize(1000,1000) 

	# Contains the coordinate and colour 
	maps = {} 

	# Initializing the Ant 
	ant = turtle.Turtle() 
	
	# shape of the ant 
	ant.shape('square')	 
	
	# size of the ant 
	ant.shapesize(0.5) 
	
	# speed of the ant 
	ant.speed('fastest')								 
	
	# gives the coordinate of the ant				 
	pos = coordinate(ant)
	
	arg = input("Input the type of the ant: ")
	
	step = 10
	
	i = 0
	if arg == "RL":
		while True: 
    
			i= i + 1
			print(i)

			if pos not in maps or maps[pos] == "white": 
				pos = turn(maps, pos, ant, "black", step, 270) 
    
			elif maps[pos] == "black": 
				pos = turn(maps, pos, ant, "white", step, 90)
  
	elif arg == "RLU":
		while True: 
    
			i= i + 1
			print(i)
			
			if pos not in maps or maps[pos] == "white": 
				pos = turn(maps, pos, ant, "black", step, 270)
    
			elif maps[pos] == "black": 
				pos = turn(maps, pos, ant, "red", step, 90)
    
			elif maps[pos] == "red": 
					pos = turn(maps, pos, ant, "white", step, 180)
  
	if arg == "RRLL":
		while True: 
    
			i= i + 1
			print(i)					
			
			if pos not in maps or maps[pos] == "white": 
				pos = turn(maps, pos, ant, "black", step, 270)
				
			elif maps[pos] == "black": 
				pos = turn(maps, pos, ant, "red", step, 270) 
    
			elif maps[pos] == "red": 
				pos = turn(maps, pos, ant, "blue", step, 90)
    
			elif maps[pos] == "blue":
				pos = turn(maps, pos, ant, "white", step, 90)

def invert(graph, ant, color): 
	graph[coordinate(ant)] = color 

def coordinate(ant): 
	return (round(ant.xcor()), round(ant.ycor())) 

def turn(graph, position, ant, post_color, step, degree):
	ant.fillcolor(post_color)
	invert(graph, ant, post_color)
	ant.stamp() 
	ant.left(degree) 
	ant.forward(step) 
	position = coordinate(ant)
	return position

langton()
```

## 4. コードの内容

このコードではRLの他、RLBとRRLLを実装しました。
ステップ6200くらいでのRLはこのようになりました。この蟻は結構頑張り屋さんで、陣地をじわじわと広げていく様が面白いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773677/91ec861f-19c7-1e5f-025d-218ab6e6c5f9.png)

ステップ2300くらいのRRLLは以下の鬼の仮面みたいなのが出てきました。この蟻はとても慎重で、まるでなるべく左右対称性を崩さないように努力しているかのように見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773677/b56c736e-effc-af32-2a29-111013500daa.png)

以下がステップ900ぐらいのRLUです。待てど暮らせどちっこいスペースでちまちま動き回り続けるなんとも謙虚なこの蟻は休日にベッドから離れられない私の姿とそっくりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773677/215f4452-7ed4-8380-cf84-d86a62818b20.png)

## 5. 他の蟻
今回の例には出てきませんでしたが、しばらく待つと真ん中の方でいじけていた蟻が突然一念発起したかのように一方向に向かって突進しだすことがあるようです。これはRLUがそうだったように繰り返しのパターンができるときに発生します。RLUと違い例えばRLRLRLRL...のようにある方向に進み続けるような対称性の時蟻は道を作り出します。また、今回は縦と横の4方向のみにしか動かないものしか見てきませんでしたが、斜めに移動させたり蟻を六角形にしたりするとまた面白いことが起こるようです。

## 6. まとめと展望
pythonでLangtonの蟻を書くと、かなりシンプルなコードで動かせて楽しかったです。しかし、やはりステップが進むのが遅すぎてだんだん飽きてしまうので何とか早くできる方法を見つけ、もっと複雑な蟻を作ったりしてみたいです。また、これを見ていると月並みながらも生物は複雑化されたLangtonの蟻でしかないのではないかという考えに取りつかれました。たまにはいつもの習慣を変えてRLからRLLの蟻になってみると、大きな違いが現れるかもしれません。