wslでelixir その12

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
オセロを実装せよ。

# 方針
勝敗の判定しない。
試合の終了を検知しない。
パスは許さない。

# サンプルコード

```

defmodule Vb do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			0
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def cls() do
		Agent.update(__MODULE__, fn v ->
			0
		end)
	end
	def set() do
		Agent.update(__MODULE__, fn v ->
			1
		end)
	end
end
defmodule Ban do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def get(p) do
		Agent.get(__MODULE__, fn v ->
			Enum.at(v, p)
		end)
	end
	def set(p, x) do
		Agent.update(__MODULE__, fn v ->
			List.update_at(v, p, fn _ ->
				x
			end)
		end)
	end
end
defmodule Isi do
	use Agent
	def start_link() do
		Agent.start_link(fn ->
			[]
		end, name: __MODULE__)
	end
	def get() do
		Agent.get(__MODULE__, fn v ->
			v
		end)
	end
	def len() do
		Agent.get(__MODULE__, fn v ->
			Enum.reduce(v, 0, fn x, n ->
				n + 1
			end)
		end)
	end
	def cls() do
		Agent.update(__MODULE__, fn v ->
			[]
		end)
	end
	def put(x) do
		Agent.update(__MODULE__, fn v ->
			v ++ [x]
		end)
	end
end
defmodule Osero do
  @moduledoc """
  Documentation for `Osero`.
  """

  @doc """
  Hello world.

  ## Examples

	  iex> Osero.hello()
	  :world

  """
  def hello do
	:world
  end
	def ban() do
		IO.puts "   1 2 3 4 5 6 7 8"
		Ban.get
		|> Enum.reduce(1, fn x, n ->
			if rem(n, 8) == 1 do
				IO.write " #{floor(n / 8) + 1}"
			end
			case x do
			0 ->
				IO.write " o"
			2 ->
				IO.write " x"
			_ ->
				IO.write "  "
			end
			if rem(n, 8) == 0 do
				IO.puts ""
			end
			n + 1
		end)
	end
	def check(p, d) do
		x = rem(p, 8)
		y = floor(p / 8) + 1
		cond do
		(x == 0 && (d == -9 || d == -1 || d ==  7)) ->
			false
		(x == 7 && (d == -7 || d ==  1 || d ==  9)) ->
			false
		(y == 0 && (d == -9 || d == -8 || d == -7)) ->
			false
		(y == 7 && (d ==  7 || d ==  8 || d ==  9)) ->
			false
		true ->
			true
		end
	end
	def kuro(p, x) do
		Isi.cls()
		Isi.put(p)
		p = p + x
		if check(p, x) && Ban.get(p) == 0 do
			Isi.put(p)
			p = p + x
			cond do
			check(p, x) && Ban.get(p) == 0 ->
				Isi.put(p)
				p = p + x
				cond do
				check(p, x) && Ban.get(p) == 0 ->
					Isi.put(p)
					p = p + x
					cond do
					check(p, x) && Ban.get(p) == 0 ->
						Isi.put(p)
						p = p + x
						cond do
						check(p, x) && Ban.get(p) == 0 ->
							Isi.put(p)
							p = p + x
							cond do
							check(p, x) && Ban.get(p) == 0 ->
								true
							check(p, x) && Ban.get(p) == 2 ->
								Vb.set()
								Enum.map(Isi.get(), fn y ->
									Ban.set(y, 2)
								end)
							true ->
								true
							end
						check(p, x) && Ban.get(p) == 2 ->
							Vb.set()
							Enum.map(Isi.get(), fn y ->
								Ban.set(y, 2)
							end)
						true ->
							true
						end
					check(p, x) && Ban.get(p) == 2 ->
						Vb.set()
						Enum.map(Isi.get(), fn y ->
							Ban.set(y, 2)
						end)
					true ->
						true
					end
				true
				check(p, x) && Ban.get(p) == 2 ->
					Vb.set()
					Enum.map(Isi.get(), fn y ->
						Ban.set(y, 2)
					end)
				true ->
					true
				end
			check(p, x) && Ban.get(p) == 2 ->
				Vb.set()
				Enum.map(Isi.get(), fn y ->
					Ban.set(y, 2)
				end)
			true ->
				true
			end
		end
	end
	def oku(x, y) do
		p = y * 8 + x - 9
		[-9, 9, -7, 7, -1, 1, -8, 8]
		|> Enum.map(fn x ->
			k = kuro(p, x)
		end)
	end
	def siro(p, x) do
		Isi.cls()
		Isi.put(p)
		p = p + x
		if check(p, x) && Ban.get(p) == 2 do
			Isi.put(p)
			p = p + x
			cond do
			check(p, x) && Ban.get(p) == 2 ->
				Isi.put(p)
				p = p + x
				cond do
				check(p, x) && Ban.get(p) == 2 ->
					Isi.put(p)
					p = p + x
					cond do
					check(p, x) && Ban.get(p) == 2 ->
						Isi.put(p)
						p = p + x
						cond do
						check(p, x) && Ban.get(p) == 2 ->
							Isi.put(p)
							p = p + x
							cond do
							check(p, x) && Ban.get(p) == 2 ->
								true
							check(p, x) && Ban.get(p) == 0 ->
								Vb.set()
								Enum.map(Isi.get(), fn y ->
									Ban.set(y, 0)
								end)
							true ->
								true
							end
						check(p, x) && Ban.get(p) == 0 ->
							Vb.set()
							Enum.map(Isi.get(), fn y ->
								Ban.set(y, 0)
							end)
						true ->
							true
						end
					check(p, x) && Ban.get(p) == 0 ->
						Vb.set()
						Enum.map(Isi.get(), fn y ->
							Ban.set(y, 0)
						end)
					true ->
						true
					end
				true
				check(p, x) && Ban.get(p) == 0 ->
					Vb.set()
					Enum.map(Isi.get(), fn y ->
						Ban.set(y, 0)
					end)
				true ->
					true
				end
			check(p, x) && Ban.get(p) == 0 ->
				Vb.set()
				Enum.map(Isi.get(), fn y ->
					Ban.set(y, 0)
				end)
			true ->
				true
			end
		end
	end
	def sasu() do
		Vb.cls()
		[0, 7, 56, 63, 18, 21, 42, 45, 2, 16, 5, 23, 40, 58, 47, 61, 3, 4, 11, 12, 19, 20, 24, 25, 26, 32, 33, 34, 29, 30, 31, 37, 38, 39, 43, 44, 51, 52, 59, 60, 1, 8, 9, 10, 17, 6, 13, 14, 15, 22, 41, 48, 49, 50, 57, 46, 53, 54, 55, 62]
		|> Enum.map(fn p ->
			if Ban.get(p) == 1 do
				if Vb.get == 0 do
					[-9, 9, -7, 7, -1, 1, -8, 8]
					|> Enum.map(fn x ->
						k = siro(p, x)
					end)
				end
			end
		end)
	end
	def run() do
		Osero.ban
		l = IO.gets("> ")
		l = String.replace(l, "\n", "")
		s = String.split(l, " ")
		Osero.oku(String.to_integer(Enum.at(s, 0)), String.to_integer(Enum.at(s, 1)))
		Osero.ban
		Osero.sasu
		run()
	end
	def main(args \\ "") do
		Ban.start_link
		Isi.start_link
		Vb.start_link
		run()
	end
end





```

# 実行結果

```
$ ./osero
   1 2 3 4 5 6 7 8
 1
 2
 3
 4       o x
 5       x o
 6
 7
 8
> 4 3
   1 2 3 4 5 6 7 8
 1
 2
 3       x
 4       x x
 5       x o
 6
 7
 8
   1 2 3 4 5 6 7 8
 1
 2
 3     o x
 4       o x
 5       x o
 6
 7
 8
> 3 4
   1 2 3 4 5 6 7 8
 1
 2
 3     o x
 4     x x x
 5       x o
 6
 7
 8
   1 2 3 4 5 6 7 8
 1
 2
 3     o o o
 4     x x o
 5       x o
 6
 7
 8
> 3 2
   1 2 3 4 5 6 7 8
 1
 2     x
 3     x o o
 4     x x o
 5       x o
 6
 7
 8
   1 2 3 4 5 6 7 8
 1
 2     x
 3     x o o
 4     x x o
 5       o o
 6     o
 7
 8
> 6 3
   1 2 3 4 5 6 7 8
 1
 2     x
 3     x x x x
 4     x x o
 5       o o
 6     o
 7
 8
   1 2 3 4 5 6 7 8
 1
 2     x o
 3     x o x x
 4     x o o
 5       o o
 6     o
 7
 8
> 6 4
   1 2 3 4 5 6 7 8
 1
 2     x o
 3     x o x x
 4     x x x x
 5       o o
 6     o
 7
 8
   1 2 3 4 5 6 7 8
 1
 2     x o o
 3     x o o x
 4     x x o x
 5       o o
 6     o
 7
 8
> 3 1
   1 2 3 4 5 6 7 8
 1     x
 2     x x o
 3     x o x x
 4     x x o x
 5       o o
 6     o
 7
 8
   1 2 3 4 5 6 7 8
 1     x o
 2     x o o
 3     x o x x
 4     x x o x
 5       o o
 6     o
 7
 8
> 5 1
   1 2 3 4 5 6 7 8
 1     x x x
 2     x x x
 3     x o x x
 4     x x o x
 5       o o
 6     o
 7
 8
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x x
 4     x x o x
 5       o o
 6     o
 7
 8
> 5 6
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x x
 4     x x x x
 5       x x
 6     o   x
 7
 8
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x x
 4     o x x x
 5   o   x x
 6     o   x
 7
 8
> 2 4
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x x
 4   x x x x x
 5   o   x x
 6     o   x
 7
 8
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x o
 4   x x x x x o
 5   o   x x
 6     o   x
 7
 8
> 1 6
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x o
 4   x x x x x o
 5   x   x x
 6 x   o   x
 7
 8
   1 2 3 4 5 6 7 8
 1     x x x o
 2     x x o
 3     x o x o
 4   x o x x x o
 5   o   x x
 6 o   o   x     o
 7
 8
>
ここ、破綻してる。





```


以上。