Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Pascal:
- //Решение 19 задания нового формата
- function f(S, turn : integer) : boolean;
- begin
- if (s>=40) and (turn <> 2) then
- result := False
- else if (s<40) and (turn = 2) then
- result := False
- else if (s>=40) and (turn = 2) then
- result := True
- else if (turn mod 2 = 0) then //Для решения задачи с неудачным ходом достаточно не проверять ходы на чётность
- //И вызывать новых ход всегда с "or". Но для решения 21 задания полностью расписывать данную функцию.
- result := f(S*2, turn+1) and f(S+1, turn+1) and f(S+4, turn+1)
- else if (turn mod 2 <> 0) then
- result := f(S*2, turn+1) or f(S+1, turn+1) or f(S+4, turn+1);
- end;
- //Решение 20 задания
- function g(S, turn : integer) : boolean;
- begin
- if (s>=40) and (turn <> 3) then
- result := False
- else if (s<40) and (turn = 3) then
- result := False
- else if (s>=40) and (turn = 3) then
- result := True
- else if (turn mod 2 <> 0) then
- result := g(S*2, turn+1) and g(S+1, turn+1) and g(S+4, turn+1)
- else if (turn mod 2 = 0) then
- result := g(S*2, turn+1) or g(S+1, turn+1) or g(S+4, turn+1);
- end;
- //Решение 21 задания (лишь с той оговоркой, что нужно отсеять варианты условием not f(S,0))
- function h(S, turn : integer) : boolean;
- begin
- if (s>=40) and ((turn = 4) or (turn = 2)) then
- result := True
- else if (s>=40) and (turn <> 4) then
- result := False
- else if (s<40) and (turn = 4) then
- result := False
- else if (turn mod 2 = 0) then
- result := h(S*2, turn+1) and h(S+1, turn+1) and h(S+4, turn+1)
- else if (turn mod 2 <> 0) then
- result := h(S*2, turn+1) or h(S+1, turn+1) or h(S+4, turn+1);
- end;
- begin
- for var s := 0 to 40 do
- if f(S,0) then
- print('19:', S);
- for var s := 0 to 40 do
- if g(S,0) then
- print('20:', S);
- for var s := 0 to 40 do
- if h(S,0) and not f(S,0) then
- print('21:', S);
- end.
- ----------------------------------------------------------------------------------------------------------
- Pascal LINQ:
- ###
- function f(S,turn: int):boolean:=(S>=94) and (turn=2) ? True : (S<94) and (turn=2) ? False : (S>=94) and (turn<>2) ? False : turn.Divs(2) ? f(S*2,turn+1) and f(S+1,turn+1) : f(S*2,turn+1) or f(S+1,turn+1);
- function g(S,turn:int):boolean:=(S>=94) and (turn <> 3) ? False : (S<94) and (turn = 3) ? False : (S>=94) and (turn=3) ? True : turn.divs(2) ? g(S*2,turn+1) or g(S+1,turn+1) : g(S+1, turn+1) and g(S*2,turn+1);
- function h(S,turn:int):boolean:=(S>=94) and ((turn=2) or (turn=4)) ? True : (S<94) and (turn=4) ? False : (S>=94) and (turn<>4) ? False: turn.Divs(2) ? h(S*2,turn+1) and h(S+1,turn+1) : h(S*2,turn+1) or h(S+1,turn+1);
- begin
- for var i:=1 to 93 do
- if f(i,0) then begin print('19:',i);
- end;
- end;
- begin
- for var i:=1 to 93 do
- if g(i,0) then begin print('20:',i);
- end;
- end;
- begin
- for var i:=1 to 93 do
- if h(i,0) and not f(i,0) then begin print('21:',i);
- end;
- end;
- ----------------------------------------------------------------------------------------------------------------
- Pascal, но через множества
- ##
- var w1 := new HashSet<integer>;
- for var i := 0 to 45 do
- if ((i+1)>46) or ((i+2)>46) or((i3)>46) then w1.Add(i);
- var L1 := new HashSet<integer>;
- for var i := 0 to 45 do
- if ((i+1) in w1) and ((i+2) in w1) and ((i*3)in w1) then L1.Add(i);
- var w2 := new HashSet<integer>;
- for var i := 0 to 45 do
- if ((i+1) in L1) or ((i+2) in L1) or ((i*3) in L1) then w2.Add(i);
- var L2 := new HashSet<integer>;
- for var i := 0 to 45 do
- if (((i+1) in w1) or ((i+1) in w2)) and (((i+2) in w1) or ((i+2) in w2)) and (((i*3) in w1) or ((i*3) in w2)) then L2.Add(i);
- print(w1,l1,w2,l2);
- ----------------------------------------------------------------------------------------------------------------------------------
- Pyhton:
- def f(stones : int, current_turn : int , limit_for_person : int) -> int:
- #stones - кол-во камней с самого начала, current_turn - текущий ход,
- #limit_for_person - ходы, за которые должен победить нужный нам игрок
- if stones >= 34: return current_turn % 2 == limit_for_person % 2 #уникальная проверка для каждого задания.
- #Например, если у нас игра должна завершиться за 2 хода (победа Вани), то и текущий ход должен иметь такую же четность
- if current_turn == limit_for_person: return 0 #Если мы не набрали нужное кол-во камней, то нам такой расклад не по нраву.
- #Все последующие ходы
- next_turns = [f(stones + 1, current_turn + 1, limit_for_person),
- f(stones + 2, current_turn + 1, limit_for_person),
- f(stones + 3, current_turn + 1, limit_for_person),
- f(stones * 2, current_turn + 1, limit_for_person)]
- # Если это ход нужного нам игрока, то достаточно победы в одном из вариантов, иначе победа должна быть во всех вариантах
- return any(next_turns) if (current_turn + 1) % 2 == limit_for_person % 2 else all(next_turns)
- for stones in range(1, 34):
- for limit_for_person in range(1,5):
- if f(stones, 0, limit_for_person) == True:
- if limit_for_person == 2: #любое число ходов, которое указано в условии
- print(f'Старт. кол-во камней {stones} для победы опр. персоны за {limit_for_person} хода/ходов игры')
- break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement