0
0

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.

wslでelixir その12

Last updated at Posted at 2023-01-03

概要

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
>
ここ、破綻してる。





以上。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?