Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- States = [true, false, truefalse], %% [правдивец, лжец, может лгать или говорить правду]
- 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, не так уж и много)
- %% Условие 1: один всегда говорит правду; трое – всегда лгут, а двое могут говорить правду или ложь.
- 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,
- %% Условие 2(исключаем парадоксальные варианты): Вася сказал, что он всегда говорит правду, Петя – что он не лжец и не правдивец, Костя – что он лжец, Дима – что он не правдивец, Стас – что он или лжец или правдивец, а Олег – что он не лжец.
- CheckCond2 = fun({[{v, V}, {p, P}, {k, K}, {d, D}, {s, S}, {o, O}]}) ->
- (lists:member(V, [true, false, truefalse])) and
- (lists:member(P, [false, truefalse])) and
- (lists:member(K, [truefalse])) and
- (lists:member(D, [truefalse])) and
- (lists:member(S, [true, truefalse])) and
- (lists:member(O, [true, false, truefalse])) end,
- lists:filter(CheckCond2, lists:filter(CheckCond1, AllVariants)).
- %% Получаем список решений:
- %% [{[{v,false}, {p,false}, {k,truefalse}, {d,truefalse}, {s,true}, {o,false}]}] %% Всего одно решение, следовательно только Стас - правдивец. Ответ: 19.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement