Erlang Tuple соответствия типов элементов - PullRequest
2 голосов
/ 08 декабря 2011

Итак, я пытаюсь написать крестики-нолики для эрланга с помощью тупл (учебное упражнение). Я всегда хочу, чтобы переменная Board была кортежем из девяти элементов. У меня совпадение побед, но совпадение с кошачьей игрой оказывается трудным. Я хочу сделать {_,_,_,_,_,_,_,_,_} -> «Кошачья игра!»; , но это будет соответствовать другим элементам, таким как [] или "", когда я хочу, чтобы он совпадал только с x ИЛИ y, но больше ничего. Пример:

{(x||y),(x||y),(x||y),(x||y),(x||y),(x||y),(x||y),(x||y),(x||y)} -> "Cat's game!"

- это, по сути, то, что я хочу сделать, но я не знаю, как это сделать с помощью кортежей Эрланга, и это трудно для Google.

-module(d2bonus).
-export([status/1]).

status(Board) ->
    case Board of
{x,x,x,_,_,_,_,_,_} -> "X Wins!";
{o,o,o,_,_,_,_,_,_} -> "O Wins!";
{_,_,_,x,x,x,_,_,_} -> "X Wins!";
{_,_,_,o,o,o,_,_,_} -> "O Wins!";
{_,_,_,_,_,_,x,x,x} -> "X Wins!";
{_,_,_,_,_,_,o,o,o} -> "O Wins!";
{x,_,_,x,_,_,x,_,_} -> "X Wins!";
{o,_,_,o,_,_,o,_,_} -> "O Wins!";
{_,x,_,_,x,_,_,x,_} -> "X Wins!";
{_,o,_,_,o,_,_,o,_} -> "O Wins!";
{_,_,x,_,_,x,_,_,x} -> "X Wins!";
{_,_,o,_,_,o,_,_,o} -> "O Wins!";
{x,_,_,_,x,_,_,_,x} -> "X Wins!";
{o,_,_,_,o,_,_,_,o} -> "O Wins!";
{_,_,x,_,x,_,x,_,_} -> "X Wins!";
{_,_,o,_,o,_,o,_,_} -> "O Wins!";
({P1,P2,P3,P4,P5,P6,P7,P8,P9}) when (P1 =:= x orelse P1 =:= y), (P2 =:= x orelse P2 =:= y), (P3 =:= x orelse P3 =:= y), (P4 =:= x orelse P4 =:= y), (P5 =:= x orelse P5 =:= y), (P6 =:= x orelse P6 =:= y), (P7 =:= x orelse P7 =:= y), (P8 =:= x orelse P8 =:= y), (P9 =:= x orelse P9 =:= y) -> "Cat's Game!";
_ -> "No winner yet"
end
.

Ответы [ 4 ]

3 голосов
/ 08 декабря 2011

Если вы хотите быть строгим, вы можете сделать:

f({P1,P2,...}) when (X1 =:= x orelse X1 =:= y), (P2 =:= x orelse P2 =:= y), ... ->
  "Cat's game!".

Я бы сделал что-то вроде:

f(Board) when is_tuple(Board), size(Board) =:= 9 ->
   true = lists:all(fun(x) -> true; 
                       (y) -> true; 
                       (_) -> false 
                    end, 
                    tuple_to_list(Board)),
   "Cat's Game".

Но это в основном потому, что у меня низкая терпимость к длинным набитымчеки.

1 голос
/ 08 декабря 2011

еще пара

is_cats_game1(Board) when is_tuple(Board), size(Board) =:= 9 ->
  [] =:= [Z || Z <- tuple_to_list(Board), Z =/= x andalso Z =/= y].

-define(is_yx(E), (E =:= x orelse E =:= y)).
is_cats_game2({Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9} = __Board)
   when ?is_yx(Z1)
        andalso ?is_yx(Z2)
        andalso ?is_yx(Z3)
        andalso ?is_yx(Z4)
        andalso ?is_yx(Z5)
        andalso ?is_yx(Z6)
        andalso ?is_yx(Z7)
        andalso ?is_yx(Z8)
        andalso ?is_yx(Z9) ->
  true;
is_cats_game2(_) -> false.
1 голос
/ 08 декабря 2011

Вы можете проверить свои входные значения, прежде чем они попадут в ваш кортеж, например:

make_move(Pos, Z, StateTuple) when Pos >= 1, Pos =< 9, (Z =:= x orelse Z =:= y)  ->
  erlang:setelement(Pos, StateTuple, Z).
0 голосов
/ 12 декабря 2011

-модуль (d2bonus). -export ([статус / 1]). * * тысяча один

статус (Board) -> Корпус Совета {x, x, x, , , _, , , _} -> "X Wins!"; {o, o, o, , , _, , , _} -> "O Wins!"; {, , _, x, x, x, , , _} -> «X Wins!»; {, , _, o, o, o, , , _} -> "O Wins!"; {, , _, , , _, x, x, x} -> «X Wins!»; {, , _, , , _, o, o, o} -> "O Wins!"; {x, , , x, , , x, , } -> "X Wins!"; {o, , , o, , , o, , } -> "O Wins!"; {, x, , _, x, , , x, } -> «X Wins!»; {, o, , , o, , , o, } -> "O Wins!"; {, _, x, , , x, , , x} -> «X Wins!»; {, , o, , , o, , , o} -> "O Wins!"; {x, , , _, x, , , _, x} -> «X Wins!»; {o, , , _, o, , , _, o} -> "O Wins!"; {, , x, , x, , x, , } -> "X Wins!"; {, , o, , o, , o, , } -> "O Wins!"; {P1, P2, P3, P4, P5, P6, P7, P8, P9}, когда (P1 =: = x orelse P1 =: = o), (P2 =: = x orelse P2 =: = o), (P3 =: = x orelse P3 =: = o), (P4 =: = x orelse P4 =: = o), (P5 =: = x orelse P5 =: = o), (P6 =: = x orelse P6 =: = o), (P7 =: = x orelse P7 =: = o), (P8 =: = x orelse P8 =: = o), (P9 =: = x orelse P9 =: = o) -> "Кошачья игра" ! "; _ -> «Пока нет победителя» конец .

...