Advertisement
jazzmonster

Бубенчик

Dec 26th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.04 KB | None | 0 0
  1. States = [true, false, truefalse], %% [правдивец, лжец, может лгать или говорить правду]
  2.  
  3. AllVariants = [{[{v, X1}, {p, X2}, {k, X3}, {d, X4}, {s, X5}, {o, X6}]} || X1 <- States, X2 <- States, X3 <- States, X4 <- States, X5 <- States, X6 <- States], %% Получаем все возможные комбинации (729, не так уж и много)
  4.  
  5.  
  6. %% Условие 1: один всегда говорит правду; трое – всегда лгут, а двое могут говорить правду или ложь.
  7. CheckCond1 = fun({Guys}) -> (length(lists:filter(fun({El,State}) -> case State of true -> true; false -> false; truefalse -> false end end, Guys)) == 1) and (length(lists:filter(fun({El,State}) -> case State of true -> false; false -> true; truefalse -> false end end, Guys)) == 3) and (length(lists:filter(fun({El,State}) -> case State of true -> false; false -> false; truefalse -> true end end, Guys)) == 2) end,
  8.  
  9. %% Условие 2(исключаем парадоксальные варианты): Вася сказал, что он всегда говорит правду, Петя – что он не лжец и не правдивец, Костя – что он лжец, Дима – что он не правдивец, Стас – что он или лжец или правдивец, а Олег – что он не лжец.
  10. CheckCond2 = fun({[{v, V}, {p, P}, {k, K}, {d, D}, {s, S}, {o, O}]}) ->
  11. (lists:member(V, [true, false, truefalse])) and
  12. (lists:member(P, [false, truefalse])) and
  13. (lists:member(K, [truefalse])) and
  14. (lists:member(D, [truefalse])) and
  15. (lists:member(S, [true, truefalse])) and
  16. (lists:member(O, [true, false, truefalse])) end,
  17.  
  18. lists:filter(CheckCond2, lists:filter(CheckCond1, AllVariants)).
  19.  
  20. %% Получаем список решений:
  21. %% [{[{v,false}, {p,false}, {k,truefalse}, {d,truefalse}, {s,true}, {o,false}]}] %% Всего одно решение, следовательно только Стас - правдивец. Ответ: 19.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement