sexta-feira, 8 de dezembro de 2017

Pensamento Computacional: uma competência para o futuro

Magnífico, o artigo de Arlindo Oliveira no Público de hoje.
Felizmente, começam a ser notórios os sinais de que a sociedade civil, os actores do processo educativo, estão a despertar para as novas mentalidades essenciais para compreender o mundo de hoje, o estranho mundo de hoje, para aí viver e sobreviver, para compreender os fenómenos emergentes, desde a "inteligência" artificial às cripto-moedas e às notícias "falsas", para perceber como se podem "roubar" 54 milhões de Euros em bitcoins, para perceber como um "jogo" como os CryptoKitties pode ser um sucesso.
Cada vez mais, é essencial compreender a posição relativa do homem e da máquina, do "Program or be Programmed", do pensamento computacional, da capacidade de entender os problemas e de formular soluções numa linguagem que uma máquina seja capaz de executar.

domingo, 8 de outubro de 2017

Diz respeito a todos!

Nos tempos de hoje, e cada vez mais, exige-se que cada um que compreenda a nova realidade que os computadores e as redes determinam, e com os quais todos nos defrontamos no dia a dia, quer quando usamos o Google e o Facebook, quando recebemos as recomendações da Amazon ou do Netflix, quando nos interrogamos sobre o que serão algoritmos, ou que é a inteligência artificial, ou se um dia uma máquina adquirirá consciência própria...
Não pode haver um aluno bem formado que não tenha reflectido sobre estes assuntos, que não compreenda como os computadores funcionam, que não tenha consciência da quantidade de informação que hoje é gerada em cada minuto, que desconheça as posições relativas do homem e da máquina, por mais fantásticas e surpreendentes que sejam as notícias que todos os dias nos batem à porta.
Hoje há enormes progressos nos domínios do processamento da voz, da análise da imagem, do processamento de linguagem natural, da interpretação da realidade, seja em drones ou em veículos auto-guiados, da informação e da contra-informação, que têm e terão impacto nas vidas futuras dos nossos jovens.
Seria desejável que todos estivessem preparados para contribuir para esta nova realidade, não obviamente através da especificação ou programação de computadores, mas através da sua capacidade de descrever processos e tarefas num linguagem que possa ser compreendida por uma máquina, por um dispositivo automático, e executada de uma forma automática.
Brevemente, nenhum curso será interessante, e eventualmente mesmo aprovado, se não contiver esta componente de formação de uma forma clara.
Ou não será assim?

quinta-feira, 15 de setembro de 2016

Criar "novos" "hábitos"

Li recentemente no Google Research Blog uma entrada sobre pensamento computacional como a capacidade de olhar para a realidade de uma forma objectiva, compreender a capacidade da mente humana para criar ideias, dispositivos, construções e algoritmos complexos, passar de meros utilizadores para criadores de ferramentas, informáticas ou não.
Começando pelos conceitos chave do pensamento computacional
os autores mostram como estes conceitos ajudam a cada um adquirir competências essenciais à vida de hoje que, com a prática desde a idade escolar, se podem tornar "hábitos" de análise que abrem novas perspectivas de interacção com a realidade e com a inovação e a criatividade.
Essa disposição para olhar para a realidade como ela efectivamente é, simples e complexa, perfeita e imperfeita, previsível e imprevisível, vai ser cada vez mais indispensável.
Esta figura resume as ideias chave do artigo
Sermos capazes de lidar com a complexidade, de aceitar a ambiguidade, de ser persistentes perante os problemas mais difíceis, de entender que há problemas abertos, de trabalhar com os outros, de conhecer as forças e fraquezas próprias, são hoje atitudes essenciais.
Passa por aqui o nosso futuro, e desde a idade escolar.

domingo, 19 de abril de 2015

O problema do teste de Singapura

De repente, não se fala de outra coisa...
Num exame para miúdos de 14 anos, em Singapura, saiu o seguinte problema:


Albert e Bernard ficaram amigos de Cheryl, e querem saber a data do seu aniversário. A Cheryl faz uma lista de 10 datas possíveis

Maio: 15, 16, 19
Junho: 17, 18
Julho: 14, 16
Agosto: 14, 15, 17

e diz, separadamente, a Albert o mês do seu aniversário e a Bernard o dia.
Albert diz: não sei qual é o dia, mas sei que o Bernard também não sabe.
Bernard diz: inicialmente, não sabia, mas agora já sei.
Albert conclui: então também sei!
Qual é a data de aniversário de Cheryl?

(solução segue dentro de momentos...)

Vamos então a isso!
Albert diz: não sei qual é o dia, mas sei que o Bernard também não sabe.
Albert sabe o mês. Se o mês fosse Maio ou Junho, não podia ser peremptório relativamente ao facto de Bernard também não saber, pois em Maio há o dia 19 e em Junho o dia 18, que só ocorrem nesses meses. Então o mês é Julho ou Agosto.
Bernard diz: inicialmente, não sabia, mas agora já sei.
Bernard sabe o dia. Se fosse 14, não podia saber a data, pois podia ser em Julho ou Agosto. Assim, é 16 de Julho ou 15 ou 17 de Agosto.
Albert conclui: então também sei!
Albert sabe o mês! Então o dia é 16 de Julho, pois se fosse um dia de Agosto ainda restariam duas possibilidades para a data!

sábado, 18 de abril de 2015

Torre de Hanói

Um problema que muitas vezes se usa para ilustrar o poder da recursividade é o da torre de Hanói.
Segundo a lenda, numa cidade no centro do mundo, um monge realiza a tarefa de mover 64 discos de um pilar para outro, usando apenas um pilar auxiliar, e de acordo com duas regras simples: só pode mover um disco de cada vez e nunca pode colocar um disco sobre outro de menor diâmetro. Quando terminar a tarefa, será o fim do mundo...


Este problema pode ser analisado sob o prisma da recursividade. Realmente, se soubermos resolver o problema para n-1 discos, sabemos facilmente resolvê-lo para n discos!
Como? Aplicando a solução para os n-1 discos duas vezes: primeiro, movendo todos os discos menos o de maior diâmetro para o pilar auxiliar, em seguinda movendo o disco de maior diâmetro para o pilar de destino, e finalmente movendo os n-1 discos que estão no pilar auxiliar para  o pilar de destino...
E já está? Estaria se soubéssemos efectivamente mover os n-1 discos. E se não soubermos? Segundo a mesma lógica, bastaria saber mover n-2 discos, etc.
Repetindo o raciocínio, devemos chegar ao ponto em que basta saber mover 2 discos, e isso sabemos facilmente, com 3 movimentos: mover o disco de menor diâmetro para o pilar auxiliar, mover o disco de maior diâmetro para o pilar de destino, e finalmente mover disco de menor diâmetro do pilar auxiliar para o pilar de destino.
E quantos movimentos serão necessários para mover os 64 discos? Se representarmos por mov(n) o número de movimentos necessários para transportar n discos, ter-se-á:

mov(2) = 3
mov(3) = mov(2) + 1 + mov(2) = 3 + 1 + 3 = 7
mov(4) = mov(3) + 1 + mov(3) = 7 + 1 + 7 = 15 = 2^4 - 1
mov(5) = mov(4) + 1 + mov(4) = 15 + 1 + 15 = 31 = 2^5 - 1
...
mov(64) = 2^64 -1

o que dá exactamente 18 446 744 073 709 551 615 movimentos! Se o monge conseguisse realizar um movimento por segundo, demoraria aproximadamente 5849 milhões de séculos para concluir a tarefa...
Ora aqui está outro belo tema para uma página Web a desenvolver por alunos do 7º ano do nosso ensino secundário.

Recursividade

A recursividade, a capacidade de formular de forma recursiva a solução de um problema, é uma das dimensões do chamado pensamento computacional.
Sempre que se fala de recursividade, costuma usar-se a função factorial para a ilustrar.
Realmente, como fact(n) = n x fact(n-1), acrescentando uma condição de paragem, fact(1) = 1, temos a função factorial definida de uma forma recursiva:

def fact(n):
    if (n <= 1):
        return 1
    else:
        return n * fact(n - 1)

Encontrei recentemente uma ideia muito interessante para ilustrar a recursividade, sem recorrer a estes conceitos de programação.
Imagine o leitor que está sentado numa fila de um anfiteatro, a assistir a um espectáculo, e pretende saber qual é o número da fila em que está sentado.

Image result for anfiteatro

Uma solução será perguntar a um espectador sentado na fila à sua frente em que fila está, e somar 1 à resposta obtida. Se este espectador não souber, ele próprio pode proceder de modo idêntico relativamente ao espectador da fila seguinte, e assim sucessivamente, até um saber a resposta (eventualmente um espectador sentado na primeira fila!). Nesse momento, o problema fica resolvido.

E que tal desafiar um grupo de alunos de TIC, 7º ano de escolaridade, a entender este conceito e explicá-lo numa página Web de sua autoria? Também é assim que se desenvolve o pensamento computacional...

sexta-feira, 30 de janeiro de 2015

PACC

O selecionador nacional convocou 17 jogadores para o próximo jogo de futebol. Destes 17 jogadores, 6 ficarão no banco como suplentes. Supondo que o selecionador pode escolher os seis suplentes sem qualquer critério que restrinja a sua escolha, poderemos afirmar que o número de grupos diferentes de jogadores suplentes (A) não se relaciona com o número de grupos diferentes de jogadores efetivos. (B) é superior ao número de grupos diferentes de jogadores efetivos. (C) é igual ao número de grupos diferentes de jogadores efetivos. (D) é inferior ao número de grupos diferentes de jogadores efetivos.
Aqui está um exemplo de uma pergunta mal escolhida e mal formulada.
Imagem retirada de aqui.
Na cabeça do autor da pergunta está aquela ideia simples de que C(n, m) = C(n, n - m), isto é, de que o número de combinações possíveis de m elementos retirados de um conjunto de n é exactamente igual ao número de combinações dos n - m não retirados: C(17, 6) = C(17, 11). Qualquer treinador de futebol sabe: retirados os suplentes, ficam os efectivos.
O problema é que no futebol os jogadores ocupam posições no campo, isto é, com 11 jogadores é possível fazer mais que uma equipa, trocando-os de posição. Não se trata de combinações, mas de arranjos! E na verdade A(17, 11) é maior que A(17, 6), pelo que, nesta óptica, a resposta certa seria a resposta (D), e não a resposta (C) como o IAVE propõe.
Ao perguntar o número de grupos, fica a dúvida. Grupo, é uma palavra dúbia, neste contexto. A sugestão de que se trata de futebol, e não corta-mato, por exemplo, sugere que a posição conta.
E isto não pode acontecer. E não é exemplo de pensamento computacional.
Tivesse eu realizado a prova e respondido (D), não me calava...