Exercício – codificação e decodificação

A codificação é importante para transformar qualquer coisa mensurável (texto, imagens, sons) em números computáveis.

Digamos que a tabela com a codificação utilizada seja a da figura abaixo.

Se temos 26 letras no alfabeto, 5 bits binários são suficientes para descrever todas as letras (2⁵ = 32, que é maior do que 26). Acrescentemos o espaço em branco como o primeiro da lista.

Pelo código acima:

“lua”011001010100001

Pois

“l” = 01100 

“u” = 10101

“a” =00001

Importante: ignorar acentos, letras maiúsculas e pontuação, a bem da simplicidade.

Pela mesma lógica,

“ceu”000110010110101
“dom casmurro”001000111101101000000001100001100110110110101100101001001111

O exercício é decifrar a mensagem codificada abaixo.

Decifre:011110000001001011100011001001011100100110100011110000001110000010000010000000010110001101000010000000100001010000010011101010000100000011010000101111

É possível fazer no braço, ou apenas com Excel, embora seja trabalhoso.

Desenho de padrões com círculos

Quando eu era adolescente, vi uma espécie de régua, que permitia fazer padrões bonitos a partir de elipses.

Era um negócio desse tipo:

Ver a imagem de origem

Dá para fazer algo mais ou menos parecido, com apenas um comando VBA: o de plotar círculos. O formato é o seguinte:

ActiveSheet.Shapes.AddShape(msoShapeOval, x, y, comprim, largura)

Para plotar um círculo, devemos saber a posição dele (x,y), o comprimento e largura. Se é um círculo e não uma elipse, comprimento = largura = raio.

O resto dos comandos serve apenas para apagar desenhos antigos, colorir e posicionar os novos círculos.

Algumas convenções:

  • Número de círculos é o número de círculos a plotar.
  • O raio menor é o raio desses círculos.
  • O raio maior é o raio em torno da qual os círculos são plotados
  • E o ângulo, em graus, é o ângulo entre um círculo e outro.

A ilustração a seguir dá uma ideia desses parâmetros.

Obs. Como o ângulo é divisor de 360 graus, tem hora que os círculos ficam um sobre o outro.

Com apenas esses conceitos, é possível gerar algumas variações interessantes.

Planilha para download no Github. Para rodar, é necessário ativar macros.

Outras sugestões são bem-vindas.

Versão web em SVG:

https://asgunzi.github.io/CirculosSVG/

https://ideiasesquecidas.com/

Triângulo de Pascal em Excel

O triângulo de Pascal, em homenagem ao matemático Blaise Pascal, tem uma regra de formação bastante simples. Download aqui.

Cada linha começa e termina com 1. Os demais valores são a soma dos dois números acima da célula.

Ex. O valor 4 abaixo é a soma de 1 e 3, da linha acima.

Pascal - research

É bem simples criar um triângulo desses em Excel. É basicamente, colocar células de somar na posição correta.

A implementação em anexo utiliza macros, mas é a mesma ideia. Para colorir, é só usar formatação condicional.

Fica como exercício para casa: criar uma implementação do triângulo de Pascal.

Curiosidade: o mesmo triângulo é conhecido desde a antiguidade, sendo redescoberto em várias culturas.

Ideias técnicas com uma pitada de filosofia

https://ideiasesquecidas.com/

Como criar um timer no Excel

O método Pomodoro – vide este post – precisa de um timer para funcionar.

Há timer no celular, apps, etc, mas é um projetinho interessante para fazer em Excel (alguém tem outras formas de fazer? Sugestões são sempre bem-vindas).

1) Basicamente, o timer utiliza a função Sleep (de dormir). É uma função que não faz nada enquanto não passar o tempo estabelecido.

Por exemplo:

    Sleep (1000) ‘Espera 1000 milisegundos, ou seja, 1 segundo

É uma função do Windows, então é necessário importar a dll. Segue um exemplo de código a seguir, também na planilha anexa.

Public Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal Milliseconds As LongPtr)

Sub teste()

    Sleep (2000) ‘Espera 2000 milisegundos

    executar

End Sub

Sub executar()

    MsgBox (“Teste”)

End Sub

2) Sobre o timer.

A macro lê o número de minutos a esperar. Multiplica por 60 para transformar em segundos.

Depois, manda atualizar o mostrador uma vez por segundo, decrescendo o valor a esperar.

O resto das contas é só para transformar o número de segundos de volta para minutos.

Por exemplo, 244 segundos = 4 minutos e mais 4 segundos.

Divido 244 por 60 e pego a parte inteira, utilizando um arrendondar para baixo.

intMin = Math.Round((Nminutos * 60 – counter) / 60 – 0.49999999, 0)

Se faltam 4 minutos, e 4*60 =240, então são 4 segundos para completar o valor original.

Portanto, estabeleça o número de minutos a esperar, ligue o timer, e concentre-se somente no trabalho a ser realizado durante este período.

Vide arquivo https://lnkd.in/eBxyAQZ.

Joguinho de luzes

Uma aplicação de vba para colorir shapes.

Download aqui.

Cada seta troca as cores das luzes nos círculos – se estiver apagada, acende, e vice-versa.

O joguinho é deixar todas as luzes verde com o menor número de cliques.

É necessário ativar macros.

O joguinho ficou fácil demais. Se alguém tiver alguma ideia interessante, favor indicar.

Ler arquivo e salvar

Segue um desafiozinho.

Criar um código (vba, python, etc), que leia a lista de números em Lista.xlsx, acrescente 1 a cada valor da lista, e salve um segundo arquivo, Lista2.xlsx com os novos valores.

Lista.xlsx

Segue uma solução possível.

wbAtual = ThisWorkbook.Name

ReDim vetor(1 To 59) ‘Vetor para conter a lista

‘Comando workbooks.open para abrir o arquivo

‘Fornecer o endereço (ou colocar na mesma pasta)

Set wkb = Workbooks.Open(“C:\Analytics\Lista.xlsx”)

‘Abre a planilha 1 do workbook Lista.xlsx

wkb.Worksheets(“Planilha1”).Activate

For i = 1 To 59

    vetor(i) = Range(“a” & i + 1) ‘Para ler cada linha

Next i

‘Fecha o workbook

wkb.Close SaveChanges:=True

‘===================

‘Volta ao workbook original

Workbooks(wbAtual).Activate

‘Adiciona um e cola na planilha

For i = 1 To 59

    Range(“a” & i + 1) = vetor(i) + 1

Next i

‘salva com o nome Lista2

ThisWorkbook.SaveAs “Lista2”

Se for executado mais de uma vez, vai aparecer um pop up, perguntando se quer sobrescrever o arquivo existente. Clique em Sim, e está concluído.

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df[‘Lista’] = df[‘Lista’].apply(lambda x: x+1)

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)

2) Código semelhante no python. Note que são apenas 4 linhas para fazer a mesma coisa.

import pandas as pd

#Le o arquivo utilizando o módulo pandas

df = pd.read_excel(io=’Lista.xlsx’, sheet_name=’Planilha1′, usecols = “A”)

#A manipulação de dataframes tem a sua própria lógica, mas o código a seguir funciona

df.to_excel(“Lista2.xlsx”, sheet_name=’Planilha1’)

Pi de Leibniz

O número Pi (3,1415…), é um dos mais estudados da matemática.

A fórmula a seguir converge (lentamente) para Pi. É  conhecida como fórmula de Leibniz.

Exercício: escrever uma função (em Excel, Vba, Python, qualquer coisa), que calcule o valor da fórmula.

Seguem algumas respostas:

  1. Por fórmula.

Primeiro, gero a sequência 1,3,5, 7, etc. Multiplico alternadamente por -1 e 1, via fórmula, se n é ímpar, multiplico por 1, se par, por 1.

Somando tudo, vai (lentamente) convergindo para Pi (3.1415…)

  1. VBA: essencialmente, a mesma coisa. Recebo um número (o número de termos a somar), e aplico a fórmula do somatório (    soma = soma + (-1) ^ (i + 1) * (1 / (2 * (i – 1) + 1))

Function leibnizPi(N)

Dim i As Integer

Dim soma As Double

For i = 1 To N

    soma = soma + (-1) ^ (i + 1) * (1 / (2 * (i – 1) + 1))

Next i

leibnizPi = 4 * soma

End Function

  1. O mesmo código, em Python:

N = 5 #Definir o número de termos

soma =0

for i in range(1,N+1):

    soma += (-1) ** (i + 1) * (1 / (2 * (i – 1) + 1))   

print(4*soma)

  1. Há uma forma completamente diferente de fazer o cálculo de Pi, via método de Monte Carlo.

Imagine um círculo de raio 1, que tem raio pi*r^2. Este círculo, inscrito num quadrado de lado 2 (área 4).

A razão entre a área do círculo e a área do quadrado é de pi/4 = 0.78539…

Se eu “disparar” um número de tiros aleatórios neste alvo, e contar quantos pontos ficaram dentro do círculo x total de pontos, a proporção tem que ir convergindo para a proporção da fórmula. Assim, com um número infinito de tiros, consigo estimar o valor de Pi.

Computacionalmente é fácil fazer a conta. Basta um gerador de número aleatórios.

Na prática, esta técnica é usada ao contrário. Como o valor de Pi é conhecido com milhares de casas decimais (através de séries como a apresentada), este teste visa saber se o gerador de números aleatórios é realmente bom.

Em Python:

import random

import math

Npontos = 50000

cIn = 0

cOut = 0

for i in range(Npontos):

    x = random.uniform(-1,1)

    y = random.uniform(-1,1)

    if math.sqrt(x**2+y**2 <= 1):

        cIn +=1

    else:

        cOut +=1

print( cIn / Npontos)

#Rodando, dá valores em torno de pi/4 = 0.78539

Para download, no Google Drive:

Leibniz Pi

Monte Carlo Pi