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