• Nenhum resultado encontrado

O Jogo do 24 - digressões com o Maple

N/A
N/A
Protected

Academic year: 2021

Share "O Jogo do 24 - digressões com o Maple"

Copied!
20
0
0

Texto

(1)
(2)
(3)

O Jogo do 24 – digress˜

oes com o Maple

Delfim F. M. Torres

delfim@mat.ua.pt

Departamento de Matem´

atica

Universidade de Aveiro

3810-193 Aveiro, Portugal

http://www.mat.ua.pt/delfim

1

A guisa de introdu¸

`

ao

H´a tempos tomei conhecimento do “Jogo 24”. As regras s˜ao simples: ganha quem primeiro conseguir obter o n´umero 24 usando todos os n´umeros dados, uma e uma s´o vez, e as quatro opera¸c˜oes +, −, ×, e ÷. O jogo 24 foi inventado por Robert Sun em 1988, com o objectivo de mostrar que “a matem´atica pode ser poderosa, aliciante e, acima de tudo, divertida”. Parece--me que Robert Sun foi muito bem sucedido. Constatei que o desafio ´e extremamente popular entre estudantes do ensino b´asico e secund´ario. N˜ao vos vou contar a minha experiˆencia em pormenor para n˜ao ficar embara¸cado: os pequerruchos gostam tanto do jogo, praticam-no com tal entusiasmo, que acabam por desenvolver um “c´alculo mental 24” verdadeiramente surpreendente. Joguei duas ou trˆes vezes e tive de desistir para n˜ao fazer m´a figura: os pequenos levavam-me sempre a melhor! Afastei-me e liguei o port´atil para fazer um programa que jogasse por mim e que, acima de tudo, satisfizesse a minha curiosidade. Decidi partilhar convosco as minhas experiˆencias: o ano 2004 foi escolhido pela Associa¸c˜ao de Professores de Matem´atica como o ano da Matem´atica e Jogo e, qui¸c´a, alguns de v´os se sintam motivados a colocar novas quest˜oes, a fazer novas experiˆencias e a obter respostas novas...

2

O Jogo 24

Na sua vers˜ao mais simples s˜ao dados quatro n´umeros inteiros de um a nove. A tarefa consiste em formar uma express˜ao matem´atica, com valor 24, usando os quatro n´umeros dados uma e uma s´o vez e qualquer conjunto de operadores aritm´eticos +, −, ×, ÷ (e possivelmente parˆenteses). Por exemplo, dados os n´umeros 1, 3, 4 e 8 s˜ao poss´ıveis quatro express˜oes n˜ao equivalentes com resultado 24. Se introduzirmos a nota¸c˜ao x1= 1, x2= 3, x3= 4, x4= 8, as 4 express˜oes-solu¸c˜ao

s˜ao:

• x4+ x3× (x1+ x2) = 8 + 4 × (1 + 3),

• x4/(x3/x2− x1) = 8/(4/3 − 1),

• x3× (x1+ x4− x2) = 4 × (1 + 8 − 3),

• (x3+ x4) × (x2− x1) = (4 + 8) × (3 − 1).

Claro que o n´umero de solu¸c˜oes n˜ao varia se trocarmos a ordem com que indicamos os n´umeros: o jogo [1, 3, 4, 8] ´e precisamente o mesmo que o jogo [8, 4, 3, 1] ou qualquer uma das suas permuta¸c˜oes!

(4)

3

O Maple

O Maple faz parte de uma fam´ılia de ambientes cient´ıficos apelidados de “Sistemas de Computa¸c˜ao Alg´ebrica” (Computer Algebra Systems nos pa´ıses anglo-sax´onicos). Trata-se de uma ferramenta matem´atica muito poderosa, que permite realizar uma mir´ıade de c´alculos simb´olicos e num´ericos. ´

E o laborat´orio de “Matem´atica Experimental” que tenho adoptado na disciplina de Computadores no Ensino da Matem´atica da licenciatura em Ensino de Matem´atica da Universidade de Aveiro.

Depois de se iniciar uma sess˜ao Maple, o sistema oferece-nos uma “linha de comandos”: >

O Maple encontra-se ent˜ao `a espera de ordens... Seguem-se algumas das minhas experiˆencias. O leitor interessado em compreender ao pormenor os comandos Maple utilizados, pode encontrar todo o material de estudo necess´ario em [3].

4

Breve an´

alise do jogo e digress˜

oes em Maple

Come¸camos por relembrar um resultado b´asico de combinat´oria.

Teorema 1. Se admitirmos elementos repetidos, h´a n+m−1n  combina¸c˜oes de n elementos esco-lhidos de um conjunto de cardinalidade m.

Por exemplo, se considerarmos o conjunto dos n´umeros inteiros de um a trˆes (m = 3), existem 15 combina¸c˜oes diferentes de quatro n´umeros (n = 4).

> with(combinat):

> t := (n,m) -> binomial(n+m-1,n): > t(4,3);

15 ´

E f´acil, usando o Maple, enumerar todas as combina¸c˜oes poss´ıveis mencionadas no Teorema 1. Vamos definir em Maple a fun¸c˜ao P (n, m) que, dado n e m, devolve todas as poss´ıveis combina¸c˜oes.

> L := (n,m) -> [seq(op(j),j=seq([seq(i,k=1..n)],i=1..m))]: > L(4,3); [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] > P := (n,m) -> choose(L(n,m),n): > P(4,3); [[1, 2, 2, 2], [1, 2, 2, 3], [1, 1, 2, 2], [1, 1, 2, 3], [1, 1, 1, 3], [1, 1, 1, 2], [1, 2, 3, 3], [3, 3, 3, 3], [2, 2, 2, 2], [1, 1, 1, 1], [1, 1, 3, 3], [1, 3, 3, 3], [2, 2, 2, 3], [2, 2, 3, 3], [2, 3, 3, 3]] > nops(P(4,3)); 15

Com as nossas defini¸c˜oes, ´e agora muito f´acil gerar as 495 diferentes combina¸c˜oes de quatro n´umeros (n = 4) de um a nove (m = 9):

> t(4,9);

495 > nops(P(4,9));

(5)

495

Para obtermos todas as solu¸c˜oes poss´ıveis para todas as poss´ıveis configura¸c˜oes do Jogo 24 vamos formar, para cada uma das 495 combina¸c˜oes acima, todas as poss´ıveis express˜oes aritm´eticas.

> tira := proc(T,L) > local t, i, R: > R := L:

> for t in T do

> for i to nops(R) while R[i] <> t do od:

> if i <= nops(R) then R := subsop(i=NULL,R) fi: > od: > return(R); > end proc: > tira([1,2,2],[1,2,1,2,3,1]); [1, 3, 1] > tira([3],[1,2]); [1, 2] > f2 := proc(LN,LO)

> local i, j, L, o1, o2, t, z1, z2: > L := NULL: > for i in LO do > for j in choose(LN,2) do > z1 := false: z2 := false: > if i <> ‘/‘ or not(simplify(j[2] = 0)) then > o1 := simplify(apply(i,j[1],j[2])): > else > z1 := true: > fi: > if i <> ‘/‘ or not(simplify(j[1] = 0)) then > o2 := simplify(apply(i,j[2],j[1])): > else > z2 := true: > fi: > t := tira(j,LN):

> if (z2 and not(z1)) or (simplify(o1 = o2)) then > L := L, [[o1],t]:

> elif not(z1) and not(z2) and not(simplify(o1 = o2)) then > L := L, [[o1],t], [[o2],t]:

> elif not(z2) then > L := L, [[o2],t]: > fi: > end do: > end do: > return([L]); > end proc: > t2 := f2([x1,x2],[‘+‘,‘-‘,‘*‘,‘/‘]); t2 :=  [[x1 + x2], []], [[x1 − x2], []], [[x2 − x1], []], [[x1x2], []], [[x1 x2], []], [[ x2 x1], []]  > t3 := f2([x1,x2,x3],[‘+‘,‘-‘,‘*‘,‘/‘]);

(6)

t3 := [[[x1 + x2], [x3]], [[x1 + x3], [x2]], [[x2 + x3], [x1]], [[x1 − x2], [x3]], [[x2 − x1], [x3]], [[x1 − x3], [x2]], [[x3 − x1], [x2]], [[x2 − x3], [x1]], [[x3 − x2], [x1]], [[x1x2], [x3]], [[x1x3], [x2]], [[x2x3], [x1]], [[x1 x2], [x3]], [[ x2 x1], [x3]], [[ x1 x3], [x2]], [[x3 x1], [x2]], [[ x2 x3], [x1]], [[ x3 x2], [x1]]] > f2([x3+x4,x1+x2],[‘+‘,‘-‘,‘*‘,‘/‘]); [[[x3 + x4 + x1 + x2], []], [[x3 + x4 − x1 − x2], []], [[x1 + x2 − x3 − x4], []], [[(x3 + x4)(x1 + x2)], []], [[x3 + x4 x1 + x2], []], [[ x1 + x2 x3 + x4], []]] > todos := proc(LP,LO) > local i, R: > if LP[1][2] = [] then > R := {seq(op(LP[i][1]),i=1..nops(LP))}; > else > R := []; > for i in LP do > R := [op(R),op(f2([op(i[1]),op(i[2])],LO))]; > od: > R := todos(R,LO); > fi: > return(R); > end proc:

> all := (LN,LO) -> todos(f2(LN,LO),LO): > all([x1,x2],[‘+‘,‘-‘,‘*‘,‘/‘]);  x1 + x2, x1x2, x1 − x2, x2 − x1,x1 x2, x2 x1 

Com 4 inc´ognitas existem 1170 express˜oes matem´aticas n˜ao equivalentes (´e poss´ıvel formar mais express˜oes matem´aticas com os operadores aritm´eticos +, −, ∗, /, mas essas express˜oes s˜ao equi-valentes a umas destas 1170):

> nops(all([x1,x2,x3,x4],[‘+‘,‘-‘,‘*‘,‘/‘])); 1170

Claro que se algumas das inc´ognitas forem iguais, o n´umero de express˜oes matem´aticas n˜ao equi-valentes diminui. Se duas das inc´ognitas forem iguais s˜ao poss´ıveis 609:

> nops(all([x1,x1,x2,x3],[‘+‘,‘-‘,‘*‘,‘/‘])); 609

Para certos valores concretos de x1 algumas das 609 possibilidades resultam equivalentes, e o

n´umero total de possibilidades diminui, enquanto para outros n˜ao: > nops(all([1,1,x2,x3],[‘+‘,‘-‘,‘*‘,‘/‘]));

277 > nops(all([2,2,x2,x3],[‘+‘,‘-‘,‘*‘,‘/‘]));

(7)

> nops(all([3,3,x2,x3],[‘+‘,‘-‘,‘*‘,‘/‘])); 609

J´a vimos que ´e poss´ıvel obter 24 a partir de [1, 3, 4, 8]. Podemos facilmente verificar este facto: > member(24,all([1,3,4,8],[‘+‘,‘-‘,‘*‘,‘/‘]));

true

A nossa fun¸c˜ao all permite-nos muito mais. Podemos obter respostas a perguntas como: (i) Quais os inteiros positivos poss´ıveis de serem obtidos a partir dos n´umeros 1,3,4 e 8 por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷?

> select(i->type(i,posint),all([1,3,4,8],[‘+‘,‘-‘,‘*‘,‘/‘]));

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 40, 43, 44, 45, 48, 49, 55, 56, 57, 63, 64, 72, 84, 88, 92, 93,

95, 96, 97, 99, 100, 104, 108, 120, 128}

(ii) Quais os inteiros n˜ao positivos poss´ıveis de serem obtidos a partir dos n´umeros 1,3,4 e 8 por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷?

> select(i->type(i,nonposint),all([1,3,4,8],[‘+‘,‘-‘,‘*‘,‘/‘]));

{−95, −93, −92, −88, −84, −72, −64, −55, −49, −48, −43, −40, −37, −35, −34, −33, −32, −31, −30, −29, −28, −27, −25, −24, −23, −22, −21, −20, −19, −17, −16, −15,

−14, −13, −12, −11, −10, −9, −8, −7, −6, −5, −4, −3, −2, −1, 0}

(iii) Quantos racionais positivos n˜ao inteiros, diferentes, s˜ao poss´ıveis de serem obtidos a partir dos n´umeros 1,3,4 e 8 por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷?

> nops(select(i->type(i,fraction) and i > 0,all([1,3,4,8],[‘+‘,‘-‘,‘*‘,‘/‘]))); 198

(iv) Quantos racionais negativos n˜ao inteiros, diferentes, s˜ao poss´ıveis de serem obtidos a partir dos n´umeros 1,3,4 e 8 por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷?

> nops(select(i->type(i,fraction) and i < 0,all([1,3,4,8],[‘+‘,‘-‘,‘*‘,‘/‘]))); 120

Ao todo ´e poss´ıvel obterem-se 427 (= 62 + 47 + 198 + 120) valores diferentes a partir do quaterno [1,3,4,8] por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷:

> numValores := L -> nops(all(L,[‘+‘,‘-‘,‘*‘,‘/‘])): > numValores([1,3,4,8]);

427

Vamos definir uma fun¸c˜ao NumVal que nos permite associar a cada uma das diferentes com-bina¸c˜oes, o n´umero de valores distintos poss´ıveis de serem alcan¸cados por interm´edio das opera¸c˜oes aritm´eticas +, −,× e ÷. Antes disso introduzimos uma nota¸c˜ao mais compacta para as com-bina¸c˜oes do Jogo 24.

> num := L -> add(j,j=seq(L[i]*10^(nops(L)-i),i=1..nops(L))): > num([1,2,3]);

(8)

> lista := n -> [seq(iquo(irem(n,10^(length(n)-i+1)),10^(length(n)-i)), > i=1..length(n))]: > lista(123); [1, 2, 3] > ordena := LL -> [seq(lista(j),j=sort([seq(num(i),i=LL)]))]: > ordena(P(4,3)); [[1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 1, 3], [1, 1, 2, 2], [1, 1, 2, 3], [1, 1, 3, 3], [1, 2, 2, 2], [1, 2, 2, 3], [1, 2, 3, 3], [1, 3, 3, 3], [2, 2, 2, 2], [2, 2, 2, 3], [2, 2, 3, 3], [2, 3, 3, 3], [3, 3, 3, 3]] > NumVal := LL -> [seq([num(q),numValores(q)],q=ordena(LL))]: > NV15 := NumVal(P(4,3)); N V 15 := [[1111, 11], [1112, 20], [1113, 36], [1122, 38], [1123, 66], [1133, 83], [1222, 46], [1223, 101], [1233, 139], [1333, 99], [2222, 24], [2223, 65], [2233, 118], [2333, 108], [3333, 49]]

Olhando para o resultado anterior, conclu´ımos que de entre todas as 15 combina¸c˜oes diferentes de quatro n´umeros de um a trˆes, a que conduz a um menor n´umero de valores poss´ıveis de serem obtidos ´e a combina¸c˜ao [1, 1, 1, 1] (11 valores poss´ıveis de serem obtidos por interm´edio das opera¸c˜oes +, −, ×, e ÷); enquanto a combina¸c˜ao que conduz ao maior n´umero de possibilidades ´

e a [1, 2, 3, 3] (139 valores poss´ıveis). Vamos definir em Maple as fun¸c˜oes minimo e maximo que nos permitem determinar estas combina¸c˜oes (a mais est´eril e a mais fecunda) no caso geral.

> minMax := proc(f,LNV) > local i,m,R: > m := apply(f,seq(i[2],i=LNV)); > R := NULL: > for i in LNV do > if i[2] = m then > R := R,i: > fi: > od: > return(R): > end proc: > minimo := L -> minMax(min,L): > maximo := L -> minMax(max,L):

Como j´a sabemos, a combina¸c˜ao de quatro n´umeros de 1 a 3 que conduz a um menor n´umero de valores poss´ıveis ´e a combina¸c˜ao [1, 1, 1, 1]: apenas ´e poss´ıvel, por interm´edio das quatro opera¸c˜oes aritm´eticas +, −,× e ÷ obter 11 valores diferentes:

> minimo(NV15);

[1111, 11] Os valores poss´ıveis de serem obtidos s˜ao:

> all(lista(1111),[‘+‘,‘-‘,‘*‘,‘/‘]);  −2, −1, 0, 1, 2, 3, 4,1 2, 1 3, − 1 2, 3 2 

Em particular n˜ao ´e poss´ıvel jogar o Jogo do 24 com a configura¸c˜ao [1, 1, 1, 1].

A combina¸c˜ao de quatro n´umeros de 1 a 3 que conduz a um maior n´umero de valores poss´ıveis ´e, como vimos, a combina¸c˜ao [1, 2, 3, 3]: ´e poss´ıvel, por interm´edio das quatro opera¸c˜oes aritm´eticas +, −,× e ÷, obter 139 valores diferentes:

(9)

> maximo(NV15);

[1233, 139] Dos 139 valores poss´ıveis, apenas 40 s˜ao inteiros:

> select(i->type(i,integer),all(lista(1233),[‘+‘,‘-‘,‘*‘,‘/‘])); {−17, −16, −15, −14, −12, −11, −10, −9, −8, −7, −6, −5, −4, −3, −2, −1, 0, 1, 2,

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 27} Vemos que um dos valores poss´ıveis de ser obtido ´e o “nosso” 24.

Vamos agora considerar todas as 495 combina¸c˜oes de quatro n´umeros de 1 a 9. > NV495 := NumVal(P(4,9)):

A combina¸c˜ao menos prof´ıcua cont´ınua a ser o quaterno [1, 1, 1, 1], com as seus 11 valores poss´ıveis de serem obtidos:

> minimo(NV495);

[1111, 11]

A combina¸c˜ao que conduz a mais possibilidades ´e a [5, 6, 8, 9] > maximo(NV495);

[5689, 922]

Dos 922 valores poss´ıveis de serem obtidos a partir da combina¸c˜ao [5,6,8,9], 212 s˜ao inteiros: > nops(select(i->type(i,integer),all(lista(5689),[‘+‘,‘-‘,‘*‘,‘/‘])));

212 Um deles ´e o 24:

> member(24,all(lista(5689),[‘+‘,‘-‘,‘*‘,‘/‘])); true

J´a a partir da combina¸c˜ao [1,1,1,1], como vimos, n˜ao ´e poss´ıvel obter 24. > member(24,all(lista(1111),[‘+‘,‘-‘,‘*‘,‘/‘]));

f alse Vamos agora tentar dar resposta `a seguinte quest˜ao:

Para quais das 495 combina¸c˜oes de quatro n´umeros de um a nove ´e realmente poss´ıvel obter 24?

Melhor ainda: quais as combina¸c˜oes de quatro n´umeros de um a nove para as quais n˜ao ´e poss´ıvel obter v? O seguinte procedimento permite-nos obter as respostas desejadas.

> falham := proc(v) > local L495,q,R: > L495 := ordena(P(4,9)): > R := NULL: > for q in L495 do > if not(member(v,all(q,[‘+‘,‘-‘,‘*‘,‘/‘]))) then > # printf("%a\n",q): > R := R,q: > fi: > od: > return(seq(num(q),q=[R])): > end proc:

(10)

Descobrimos que o Jogo 24 admite solu¸c˜ao para 404 dos 495 poss´ıveis quaternos. Os 91 quaternos que n˜ao admitem solu¸c˜ao s˜ao (logo `a cabe¸ca aparece a caso [1, 1, 1, 1] que j´a conhec´ıamos):

> F24 := falham(24); F 24 := 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1119, 1122, 1123, 1124, 1125, 1133, 1159, 1167, 1177, 1178, 1179, 1189, 1199, 1222, 1223, 1299, 1355, 1499, 1557, 1558, 1577, 1667, 1677, 1678, 1777, 1778, 1899, 1999, 2222, 2226, 2279, 2299, 2334, 2555, 2556, 2599, 2677, 2777, 2779, 2799, 2999, 3358, 3467, 3488, 3555, 3577, 4459, 4466, 4467, 4499, 4779, 4999, 5557, 5558, 5569, 5579, 5777, 5778, 5799, 5899, 5999, 6667, 6677, 6678, 6699, 6777, 6778, 6779, 6788, 6999, 7777, 7778, 7779, 7788, 7789, 7799, 7888, 7899, 7999, 8888, 8889, 8899, 8999, 9999 > nops([F24]); 91

Das 91 configura¸c˜oes para as quais n˜ao existe solu¸c˜ao para o Jogo 24, apenas duas possuem os quatro algarismos diferentes:

> select(i->nops({op(lista(i))})=4,[F24]); [1678, 3467]

Vamos guardar, de modo ordenado, numa lista de nome PC, todas as 404 Poss´ıveis Configura¸c˜oes para o Jogo do 24.

> PC := [seq(lista(j),j=sort(tira([F24],[seq(num(i),i=P(4,9))])))]: > nops(PC);

404

A fun¸c˜ao tau(n), dispon´ıvel no Maple por interm´edio do package de teoria de n´umeros numtheory, devolve o n´umero de divisores positivos de n.

> with(numtheory): > tau(24);

8

Se quisermos saber quais s˜ao os 8 divisores positivos de 24, podemos recorrer `a fun¸c˜ao Maple divisors.

> divisors(24);

{1, 2, 3, 4, 6, 8, 12, 24}

O n´umero 24 n˜ao foi escolhido, com toda a certeza, ao acaso por Robert Sun. Existir˜ao outras possibilidades interessantes? O n´umero 24 ´e o menor inteiro positivo no intervalo [1, 35] a ter o maior n´umero de divisores.

> seq(tau(i),i=1..36);

1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, 3, 4, 4, 6, 2, 8, 2, 6, 4, 4, 4, 9

A quantidade de divisores n˜ao ´e, no entanto, o ´unico ingrediente a ter em conta. O menor inteiro positivo, de entre todos os inteiros positivos com menos de 3 d´ıgitos, com o maior n´umero de divisores positivos ´e o 60 (tem 12 divisores positivos):

> LD := seq(tau(i),i=1..99): > max(LD);

(11)

12 > member(12,[LD],’p’):

> p;

60

No entanto para o “Jogo do 60” existem muito menos configura¸c˜oes admiss´ıveis do que para o Jogo do 24: o n´umero de configura¸c˜oes admiss´ıveis ´e de 495 − 219 = 276, contra as 404 poss´ıveis no Jogo 24.

> F60 := falham(60): > nops([F60]);

219

Um jogo interessante, que vou propor como alternativa a pr´oxima vez que for desafiado por pequerruchos bem treinados no Jogo do 24, ´e o Jogo do 6 ;-) O Jogo do 6 admite solu¸c˜ao para 469 dos 495 poss´ıveis quaternos: mais 65 hip´oteses de jogo do que no conhecido Jogo do 24. Os 26 quaternos para os quais n˜ao existe solu¸c˜ao s˜ao:

> F6 := falham(6);

F 6 := 1111, 1179, 1188, 1189, 1199, 1559, 1669, 1999, 3588, 3667, 4499, 4599, 4667, 4778, 5599, 5668, 5669, 5788, 6789, 7779, 7788, 7799, 7899, 8889, 8899, 9999

> nops([F6]);

26

Notamos, no entanto, que dos 26 quaternos que n˜ao admitem solu¸c˜ao para o Jogo do 6, exactamente metade deles admite solu¸c˜ao para o Jogo do 24. As 13 combina¸c˜oes que n˜ao admitem solu¸c˜ao para o Jogo do 6, mas admitem solu¸c˜ao para o Jogo do 24, s˜ao:

> tira([F24],[F6]);

[1188, 1559, 1669, 3588, 3667, 4599, 4667, 4778, 5599, 5668, 5669, 5788, 6789]

Vejamos mais alguns valores al´em do 6 que conduzem a jogos com um n´umero de configura¸c˜oes admiss´ıveis maior que no Jogo 24.

> F8 := falham(8): > nops([F8]); 40 > F12 := falham(12): > nops([F12]); 51 > F18 := falham(18): > nops([F18]); 90

Os jogos do 8, do 12 e do 18 s˜ao, por conseguinte, tamb´em jogos interessantes a considerar. O 30 tem o mesmo n´umero de divisores que 24 (ambos tˆem 8 divisores positivos), enquanto 36 ´

e o menor natural com um n´umero de divisores superior ao de 24 (tem, como vimos, 9 divisores positivos). O facto de estarmos a considerar apenas configura¸c˜oes formadas por n´umeros de um a nove, faz com que estes casos sejam menos interessantes (o n´umero de configura¸c˜oes admiss´ıveis ´e menor, em ambos os casos, do que no Jogo do 24):

(12)

> F30 := falham(30): > nops([F30]); 158 > F36 := falham(36): > nops([F36]); 120

O nosso objectivo ser´a agora o de definir em Maple a fun¸c˜ao jogo24 que, dados 4 n´umeros, nos devolva todas as solu¸c˜oes do Jogo 24 para essa combina¸c˜ao. Vˆe-se facilmente que muitas express˜oes associadas a uma dada combina¸c˜ao correspondem, na verdade, ao mesmo m´etodo de solu¸c˜ao. Vejamos, a t´ıtulo ilustrativo, o exemplo dado no in´ıcio deste trabalho: [1, 3, 4, 8]. O programa disponibilizado em www.wxs.nl/~edejong/24-game d´a-nos 12 solu¸c˜oes! A saber:

24-Game Oplossingen - www.wxs.nl/~edejong/24-game 1348 : ((1+3)*4)+8 = 24 1348 : ((1+8)-3)*4 = 24 1348 : ((1-3)+8)*4 = 24 1348 : ((3+1)*4)+8 = 24 1348 : ((8+1)-3)*4 = 24 1348 : ((8-3)+1)*4 = 24 1348 : (4+8)*(3-1) = 24 1348 : (8+4)*(3-1) = 24 1348 : 4*(1-(3-8)) = 24 1348 : 4*(8-(3-1)) = 24 1348 : 8+(4*(1+3)) = 24 1348 : 8+(4*(3+1)) = 24

Muitas delas s˜ao repetidas... Para a combina¸c˜ao [1, 3, 4, 8] apenas existem, na verdade, como indi-cado na Sec¸c˜ao 2, quatro solu¸c˜oes verdadeiramente distintas. O programa “24-Game Oplossingen” parece dar muitas solu¸c˜oes, mas na verdade n˜ao as descobre todas! Apenas indica 3 das 4 poss´ıveis – podemos agrupar as 12 solu¸c˜oes acima em trˆes grupos, de tal modo que as f´ormulas associadas ao primeiro grupo s˜ao todas elas equivalentes `a express˜ao x4+x3*(x1+x2); as do segundo grupo a x3*(x1+x4-x2); e as do ´ultimo grupo a (x3+x4)*(x2-x1); com x1=1, x2=3, x3=4, x4=8:

((1+3)*4)+8 = ((3+1)*4)+8 = 8+(4*(1+3)) = 8+(4*(3+1))

((1+8)-3)*4 = ((1-3)+8)*4 = ((8+1)-3)*4 = ((8-3)+1)*4 = 4*(1-(3-8)) = 4*(8-(3-1)) (4+8)*(3-1) = (8+4)*(3-1)

O “24-Game Oplossingen” deixa de fora a solu¸c˜ao x4/(x3/x2− x1) = 8/(4/3 − 1). Poder´ıamos

pensar que este programa apenas considera solu¸c˜oes que envolvam inteiros. Isso n˜ao ´e, no entanto, verdade, como rapidamente se confirma, por exemplo, com a combina¸c˜ao [1, 4, 5, 6]:

24-Game Oplossingen - www.wxs.nl/~edejong/24-game 1456 : 4/(1-(5/6)) = 24

Tamb´em aqui existe uma solu¸c˜ao que n˜ao ´e descoberta pelo “24-Game Oplossingen”: 6/((5/4)-1). N´os estamos interessados em obter, apenas, as solu¸c˜oes estruturalmente diferentes. Como explicado por Xu X.J. em http://eppe.tamu.edu/~xuxj/prog/download/24game.htm, eliminar os casos duplicados n˜ao ´e uma tarefa f´acil. Xu X.J. desenvolveu, no ano 2000, um programa para o Jogo do 24, disponibilizando o seu c´odigo fonte em C e o respectivo execut´avel, que faz alguma elimina¸c˜ao, usando para isso uma representa¸c˜ao das express˜oes em ´arvore (vide [1, Cap. 5]). A elimina¸c˜ao n˜ao ´e, no entanto, completa e o autor apresenta, inclusive, alguns exemplos em que o seu m´etodo de elimina¸c˜ao n˜ao funciona bem. Para a combina¸c˜ao [1, 3, 4, 8] este programa d´a-nos 8 solu¸c˜oes:

(13)

Please input 4 integer numbers: 1 3 4 8 ((1+3)*4)+8 ((1-3)+8)*4 (1-(3-8))*4 ((1+8)-3)*4 (1+(8-3))*4 (3-1)*(4+8) 4*(8-(3-1)) 8/((4/3)-1) total 8 solutions

N´os s´o estamos interessados em obter as 4 solu¸c˜oes verdadeiramente diferentes (que provˆem de express˜oes matem´aticas n˜ao equivalentes):

(4+8)*(3-1) 4*(1+8-3) 8+4*(1+3) 8/(4/3-1)

O Maple, com as suas capacidades simb´olicas, permite-nos verificar facilmente a igualdade de express˜oes matem´aticas que, sendo equivalentes, est˜ao escritas de forma diferente, permitindo-nos abordar o problema de uma maneira alternativa, na nossa opini˜ao mais simples, elegante e com algumas vantagens.

A nossa defini¸c˜ao em Maple do jogo24 ´e feita de modo incremental. Come¸camos por introduzir primeiro algumas fun¸c˜oes auxiliares. O modus operandi destas fun¸c˜oes auxiliares ´e explicado por interm´edio de alguns exemplos.

> afecta := (LN,LX) -> {seq(LX[i]=LN[i],i=1..nops(LN))}: > afecta([1,2,3],[x1,x2,x3]); {x1 = 1, x2 = 2, x3 = 3} > afecta([4,4,7,8],[x1,x1,x2,x3]); {x1 = 4, x2 = 7, x3 = 8} > divisaoZero := proc(e,a) > local d, D, flag: > flag := false: > D := [seq(denom(j),j=select(i->denom(i)<>1,[op(e)]))]; > for d in D while not flag do

> if simplify(subs(a,d) = 0) then > flag := true

> fi: > od:

> if not(flag) and whattype(e) = ‘^‘

> and subs(a,op(2,e)) < 0

> and subs(a,op(1,e)) = 0 then

> flag := true: > fi: > return(flag); > end proc: > divisaoZero(x1*x2/x3,{x1=1,x2=2,x3=3}); f alse > divisaoZero(x1/(x2-x3),{x1=1,x2=2,x3=2});

(14)

true > divisaoZero((x1-x2)^(-1),{x1=2,x2=2}); true > variaveis := proc(LN) > local i, j, p,LX: > LX := []: > j := 0: > for i to nops(LN) do > if member(LN[i],LN[1..i-1],’p’) then > LX := [op(LX), LX[p]]: > else > j := j + 1: > LX := [op(LX), x||j]: > fi: > od: > return(LX); > end proc: > variaveis([1,4,6,9]); [x1, x2, x3, x4] > variaveis([1,2,1,4]); [x1, x2, x1, x3] > variaveis([8,8,4,4]); [x1, x1, x2, x2]

Com a ajuda das fun¸c˜oes afecta, divisaoZero e variaveis, que acab´amos de definir, estamos agora em condi¸c˜oes de implementar o t˜ao almejado jogo24.

> jogo := proc(LN,LO,v) > local LX, CE, e, a, i: > LX := variaveis(LN); > CE := todos(f2(LX,LO),LO); > a := afecta(LN,LX); > i := 0; > printf("---\n"); > printf("%a = %a\n",LX,LN); > for e in CE do

> if not(divisaoZero(e,a)) and subs(a,e) = v then > i := i + 1:

> printf("Solucao %a: %a\n",i,e); > fi:

> od: > end proc:

> jogo24 := L -> jogo(L,[‘+‘,‘-‘,‘*‘,‘/‘],24):

Para obtermos todas as solu¸c˜oes para todas as poss´ıveis configura¸c˜oes do Jogo 24, basta agora executar o seguinte comando:

(15)

N˜ao apresentamos o resultado, apenas porque ele ocupa v´arias (muitas!) p´aginas (s˜ao 404 as configura¸c˜oes poss´ıveis e cada uma tem, em geral, mais do que uma solu¸c˜ao). Mostramos aqui apenas alguns exemplos. A combina¸c˜ao [1, 1, 2, 7] tem apenas uma solu¸c˜ao.

> jogo24([1,1,2,7]);

---[x1, x1, x2, x3] = [1, 1, 2, 7] Solucao 1: (x1+x2)*(x1+x3)

O pr´oximo exemplo mostra que a simplifica¸c˜ao das express˜oes exige, por vezes, uma an´alise do resultado da nossa parte:

> jogo24([1,1,3,8]); ---[x1, x1, x2, x3] = [1, 1, 3, 8] Solucao 1: x2*x3/x1^2 Solucao 2: x1^2*x2*x3 Solucao 3: x2*x3

A express˜ao x2*x3 resulta da simplifica¸c˜ao de express˜oes como x1*x2*x3/x1, x2*x3+x1-x1, x2*(x3+x1-x1), ou x3*(x2+x1-x1).

Podia dar muitos outros exemplos do Jogo 24, mas para que n˜ao digam que ando a treinar para conseguir fazer boa figura entre os alunos do Liceu :-) quero avan¸car para outras quest˜oes. Vamos definir em Maple uma fun¸c˜ao que nos permite obter o n´umero de solu¸c˜oes distintas associadas a uma dada configura¸c˜ao.

> ns := proc(LN,LO,v) # Numero Solucoes > local LX, CE, e, a, i: > LX := variaveis(LN); > CE := todos(f2(LX,LO),LO); > a := afecta(LN,LX); > i := 0; > for e in CE do

> if not(divisaoZero(e,a)) and subs(a,e) = v then > i := i + 1: > fi: > od: > return(i); > end proc: > nsj24 := L -> ns(L,[‘+‘,‘-‘,‘*‘,‘/‘],24): > nsj24([1,3,4,8]); 4

O objectivo ´e sermos capazes de descobrir uma configura¸c˜ao do Jogo 24 com exactamente um dado n´umero de solu¸c˜oes distintas.

> digitos := n -> seq(iquo(irem(n,10^i),10^(i-1)),i=1..length(n)): > digitos(1223);

(16)

> descobre := proc(ns) # ns = numero solucoes > local i, f:

> f := false: > i := 1111:

> while i <= 9999 and not(f) do

> if (nsj24([digitos(i)]) = ns) then > f := true: > else > i := i + 1: > fi: > od: > return(sort([digitos(i)])); > end proc:

A primeira configura¸c˜ao com apenas uma solu¸c˜ao distinta ´e a [1, 1, 1, 8]: > descobre(1); [1, 1, 1, 8] A ´unica solu¸c˜ao ´e (1+1+1)*8: > jogo24([1, 1, 1, 8]); ---[x1, x1, x1, x2] = [1, 1, 1, 8] Solucao 1: 3*x1*x2

Notar que a express˜ao matem´atica (x1+x1+x1)×x2´e equivalente a 3x1x2. A primeira configura¸c˜ao

com exactamente duas solu¸c˜oes distintas ´e a [1, 1, 2, 6]: > descobre(2);

[1, 1, 2, 6]

com solu¸c˜oes 2*6*(1+1) e 6*(1+1+2). Com trˆes solu¸c˜oes distintas temos a configura¸c˜ao [1, 1, 3, 8] > descobre(3);

[1, 1, 3, 8]

cujas solu¸c˜oes foram j´a analisadas anteriormente. As combina¸c˜oes com mais solu¸c˜oes s˜ao a [1, 2, 4, 8], com 14 solu¸c˜oes, e a [1, 7, 8, 9] com 15 (´e capaz de descobrir essas solu¸c˜oes sem recorrer ao nosso jogo24?):

> descobre(14);

[1, 2, 4, 8] > descobre(15);

[1, 7, 8, 9] Uma an´alise ao resultado do comando

> for c in PC do jogo24(c) od:

que devolve todas as solu¸c˜oes para todas as poss´ıveis combina¸c˜oes do Jogo 24, revela que n˜ao existem outras configura¸c˜oes com 14 e 15 solu¸c˜oes, e nenhuma com mais de 15 solu¸c˜oes.

(17)

5

Generaliza¸

oes do Jogo 24

O seguinte paradoxo ´e bem conhecido entre os matem´aticos e os cientistas da computa¸c˜ao: ´e, muitas vezes, mais f´acil e natural demonstrar um resultado mais geral, ou resolver um problema gen´erico, do que um seu caso particular... O nosso programa Maple jogo(LN,LO,v) recebe uma Lista LN de “N´umeros”; uma Lista LO de Operadores aritm´eticos bin´arios; e o valor final v preten-dido. Podemos, deste modo, resolver muitos outros problemas para al´em da coloca¸c˜ao inicial do problema do Jogo 24. Vejamos alguns. Podemos considerar (e respectivas combina¸c˜oes):

(i) n´umeros com mais que um d´ıgito

> jogo([13,4,5,6],[‘+‘,‘-‘,‘*‘,‘/‘],24);

---[x1, x2, x3, x4] = [13, 4, 5, 6] Solucao 1: -(x2+x3-x1)*x4

(ii) n´umeros positivos e negativos

> jogo([13,-4,5,-6],[‘+‘,‘-‘,‘*‘,‘/‘],24);

---[x1, x2, x3, x4] = [13, -4, 5, -6] Solucao 1: (x3-x1-x2)*x4

(iii) n´umeros racionais

> jogo([9,2,5/8,4],[‘+‘,‘-‘,‘*‘,‘/‘],24);

---[x1, x2, x3, x4] = [9, 2, 5/8, 4] Solucao 1: (x1+x2+x4)/x3

(iv) outro conjunto de operadores aritm´eticos bin´arios > jogo([3,7,5,1],[‘+‘,‘-‘,‘*‘],24); ---[x1, x2, x3, x4] = [3, 7, 5, 1] Solucao 1: (x3+x4)*(x2-x1) Solucao 2: -(x4-x1)*(x2+x3) > jogo([3,7,5,1],[‘+‘,‘-‘,‘*‘,‘/‘],24); ---[x1, x2, x3, x4] = [3, 7, 5, 1] Solucao 1: -(x4-x1)*(x2+x3) Solucao 2: (x3+x4)*(x2-x1) > jogo([3,7,5,1],[‘+‘,‘-‘,‘*‘,‘/‘,‘^‘],24); ---[x1, x2, x3, x4] = [3, 7, 5, 1] Solucao 1: (x3+x4)*(x2-x1) Solucao 2: -(x4-x1)*(x2+x3) Solucao 3: x1*(x4^x3+x2)

(18)

(v) configura¸c˜oes com mais ou menos que quatro n´umeros > jogo([3,7,1],[‘+‘,‘*‘],24); ---[x1, x2, x3] = [3, 7, 1] Solucao 1: (x2+x3)*x1 > jogo([3,3,5,5,1],[‘+‘,‘*‘],24); ---[x1, x1, x2, x2, x3] = [3, 3, 5, 5, 1] Solucao 1: x1+x2+x3+x1*x2

(vi) outros valores que n˜ao 24 (inteiros ou n˜ao, positivos ou negativos): > jogo([13,4,5,6],[‘+‘,‘-‘,‘*‘,‘/‘],20); ---[x1, x2, x3, x4] = [13, 4, 5, 6] Solucao 1: x1+x3+x4-x2 > jogo([13,4,5,6],[‘+‘,‘-‘,‘*‘,‘/‘],2/3); ---[x1, x2, x3, x4] = [13, 4, 5, 6] Solucao 1: -(x2+x3-x1)/x4 > jogo([13,4,5,6],[‘+‘,‘-‘,‘*‘,‘/‘],-12); ---[x1, x2, x3, x4] = [13, 4, 5, 6] Solucao 1: (x3-x1)*x4/x2

(vii) inc´ognitas

> jogo([2,2,2*a,-4*b],[‘+‘,‘-‘,‘*‘,‘/‘],2*(a+b));

---[x1, x1, x2, x3] = [2, 2, 2*a, -4*b] Solucao 1: -(x3-x1*x2)/x1

Outras variantes podem ser facilmente consideradas em Maple. Por exemplo, uma variante muito conhecida entre os alunos do 2o ciclo s˜ao os “Cart˜oes Mist´erio”. Trata-se do Jogo 24

introduzido no in´ıcio do nosso estudo, mas em que apenas s˜ao dados 3 n´umeros de 1 algarismo. O aluno deve ent˜ao encontrar um quarto n´umero entre 1 e 9, que est´a em falta, e depois formar uma express˜ao matem´atica que lhe permita chegar a 24. O interessante ´e considerar v´arios cart˜oes mist´erio em simultˆaneo, e encontrar um ´unico n´umero de um algarismo que permita resolver o Jogo 24 para todos os cart˜oes mist´erio em jogo. No liceu consideram-se apenas dois, mas n˜ao custa muito mais implementar uma solu¸c˜ao gen´erica que permita n cart˜oes mist´erio, n ≥ 1:

> junta := (L,N) -> sort([op(L),N]): > junta([1,2,3],2);

[1, 2, 2, 3]

> juntaV := LL -> [seq(map(junta,LL,i),i=1..9)]: > juntaV([[1,2],[3,4]]);

(19)

[[[1, 1, 2], [1, 3, 4]], [[1, 2, 2], [2, 3, 4]], [[1, 2, 3], [3, 3, 4]], [[1, 2, 4], [3, 4, 4]], [[1, 2, 5], [3, 4, 5]], [[1, 2, 6], [3, 4, 6]], [[1, 2, 7], [3, 4, 7]], [[1, 2, 8], [3, 4, 8]], [[1, 2, 9], [3, 4, 9]]] > confBoa := CM -> evalb(nops(select(L->member(L,PC),CM))=nops(CM)): > confBoa([[1,1,1,1],[1,3,4,5]]); f alse > confBoa([[1,1,1,8],[1,3,4,5]]); true > confBoas := LL -> select(confBoa,juntaV(LL)): > misterio := CM -> seq(seq(jogo24(L),L=LL),LL=confBoas(CM)):

Vejamos um exemplo com duas cartas mist´erio: [1, 1, 1] e [4, 5, 6]. Neste caso existe apenas uma possibilidade: adicionar um 8. > confBoas([[1,1,1],[4,5,6]]); [[[1, 1, 1, 8], [4, 5, 6, 8]]] > misterio([[1,1,1],[4,5,6]]); ---[x1, x1, x1, x2] = [1, 1, 1, 8] Solucao 1: 3*x1*x2 ---[x1, x2, x3, x4] = [4, 5, 6, 8] Solucao 1: -(x3-x1-x2)*x4

No pr´oximo exemplo s˜ao dadas 5 cartas mist´erio: [4, 4, 4], [4, 5, 6], [5, 5, 7], [2, 3, 4] e [1, 2, 1]. Exis-tem 3 possibilidades: adicionar um 6, um 7 ou um 8.

> confBoas([[4,4,4],[4,5,6],[5,5,7],[2,3,4],[1,2,1]]);

[[[4, 4, 4, 6], [4, 5, 6, 6], [5, 5, 6, 7], [2, 3, 4, 6], [1, 1, 2, 6]], [[4, 4, 4, 7], [4, 5, 6, 7], [5, 5, 7, 7], [2, 3, 4, 7], [1, 1, 2, 7]], [[4, 4, 4, 8], [4, 5, 6, 8], [5, 5, 7, 8], [2, 3, 4, 8], [1, 1, 2, 8]]]

Ferramentas como o Maple s˜ao boas auxiliares neste tipo de investiga¸c˜oes (vide [2]). Fico `a espera das vossas experiˆencias e das vossas descobertas.

Agradecimentos

Agrade¸co `a Professora Rosa Am´elia Martins, Coordenadora da Licenciatura em Ensino de Ma-tem´atica da Universidade de Aveiro, e respons´avel pela disciplina de Pr´atica Pedag´ogica, o convite que me endere¸cou para, em 29 de Mar¸co de 2004, proferir uma palestra aos Estagi´arios e Orien-tadores das Escolas e Universidade.

(20)

Referˆ

encias

[1] Delfim F. M. Torres, Introdu¸c˜ao `a Programa¸c˜ao em L´ogica, Universidade de Aveiro, 2000 (ISBN 972–8021–93–3).

[2] Delfim F. M. Torres, N´umeros Felizes e Sucess˜oes Associadas: Digress˜oes com o Maple, revista Educa¸c˜ao e Matem´atica da Associa¸c˜ao de Professores de Matem´atica, No 77, Mar¸co/Abril

2004.

[3] Delfim F. M. Torres, Notas da disciplina de Computadores no Ensino da Matem´atica http://webct.ua.pt/public/cem1sem/index.html

Referências

Documentos relacionados

TST, AIRR 406/1990-038-01-40.0, DJ 08/10/2004: AGRAVO DE INSTRUMENTO. RECURSO DE REVISTA. EMBARGOS DECLARATÓRIOS INTERPOSTOS EM DESFAVOR DE DESPACHO DENEGATÓRIO

In conclusion, our study establishes that cytokines, important airway inflammation modulators, produced by different cell sources, can also contribute to the establishes that

Essa diferenciação se dá por suas formas geológicas geoformas, composição litológica, localização, acesso, utilização pela sociedade, além de outros parâmetros, que

Conclui-se que o processo formativo sobre humanização da saúde foi construído, predominantemente, por meio das relações sociais e no espaço de trabalho, sendo imprescindível

Para garantir a sustentabilidade de uma atividade típica de longo prazo, a Pradaria utiliza procedimentos operacionais compatíveis com as melhores práticas de uso do solo

Assim como Cardoso (2010) aponta os principais fatores causadores de atraso, foi possível encontrar neste estudo alguns fatores que foram causa do atraso no

Chora Peito Chora Joao Bosco e Vinicius 000 / 001.. Chão De Giz Camila e

Dos tratados, três ovos não estavam galados, três vivos, sendo que um deles apresentava tamanho reduzido e malformação ocular (diferença no tamanho dos olhos), e quatro