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/

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.

Calculadora de IMC

Segue um projetinho simples.

Como fazer uma calculadora de IMC (Índice de massa corporal), utilizando formulários em Excel.

Com Alt + F11, abrimos o editor do VBA.

Inserir -> Userform

Vai abrir um formulário. Este formulário tem várias propriedades. Mudar a propriedade Caption (título) para IMC.

Na caixinha de controles, um deles é o label (um texto simples) e outro é uma caixa de texto (para input de dados).

Basta clicar no controle e inserir no formulário.

Inserir os elementos e posicionar no formulário.

No botão rodar, vai o código  que faz o cálculo.

Se a caixinha de texto se chama TxtPeso, para acessar o valor é TxtPeso.Value.

O IMC é o peso pela altura ao quadrado.

imc = peso / (altura ^ 2)

Pela tabela abaixo, temos a recomendação do IMC.

Resultado de imagem para imc tabela

E o resultado final é algo assim:

Link para download: https://drive.google.com/file/d/1DwMTDTahuvRk7JLeInMgdviUexA6bVuq/view?usp=sharing

Private Sub CommandButton1_Click()

Dim imc As Double

Dim peso As Double

Dim altura As Double

Dim texto As String

Dim txtAlt As String

If Information.IsNumeric(TxtPeso.Value) Then

    peso = TxtPeso.Value

Else

    MsgBox “Informar valor numérico para o peso”

    Exit Sub

End If

If Information.IsNumeric(TxtAltura.Value) Then

     altura = TxtAltura.Value

Else

    MsgBox “Informar valor numérico para a altura”

    Exit Sub

End If

imc = Math.Round(peso / (altura ^ 2), 1)

If imc < 17 Then

    texto = “IMC = ” & imc & “, Peso muito abaixo do ideal”

ElseIf imc < 18.5 Then

    texto = “IMC = ” & imc & “: Peso  abaixo do ideal”

ElseIf imc < 25 Then

    texto = “IMC = ” & imc & “: Peso normal”

ElseIf imc < 30 Then

    texto = “IMC = ” & imc & “: Acima do peso”

ElseIf imc < 35 Then

    texto = “IMC = ” & imc & “: Obesidade I”

ElseIf imc < 40 Then

    texto = “IMC = ” & imc & “; Obesidade II (severa)”

Else

    texto = “IMC = ” & imc & “: Obesidade III (mórbida)”

End If

Label3.Caption = texto

End Sub

Ideias técnicas com uma pitada de filosofia

http://ideiasesquecidas.com

2020 ao quadrado

Como encontrar pares de inteiros (não-negativos e maiores do que zero), tais que a^2 + b^2 = 2020^2?

Este tópico trouxe várias respostas criativas.

Resposta: são 4 pares (a,b) tais que a^2+b^2 = 2020^2:

 400 e 1980

868 e 1824

1212 e 1616

1344 e 1508

Seguem 4 resoluções, partindo da mais fácil para a mais elegante.

  1. O Arthur Bratti (de Santa Catarina) fez um tabelão, com as linhas e colunas variando de 1 a 2020, fez as contas para todas as alternativas, e ficou somente com as que davam 2020^2 = 4.080.400. Infelizmente, o excel ficou grande demais para enviar por e-mail. Como usa somente fórmulas de Excel, a lógica é bem simples.

O print abaixo é uma ilustração do método.

  1. Em VBA dá para fazer um loop for dentro de outro. Se for igual a 2020^2, guardo a solução, senão, vou para a próxima.

For i = 1 To 2019

    For j = i + 1 To 2019

        If i ^ 2 + j ^ 2 = 2020 ^ 2 Then

            c = c + 1

            sol(c, 1) = i

            sol(c, 2) = j

        End If

    Next

Next

  1. Python é a linguagem padrão em análise de dados (vide comentário aqui:

https://www.linkedin.com/posts/arnaldogunzi_as-linguagens-de-analytics-no-%C3%BAltimo-f%C3%B3rum-activity-6611608415540137984-48zg)

O mesmo código, em Python:

sol =[]

for a in range(2020):

    for b in  range(a+1,2020):

        if a**2 + b**2 == 2020**2:

            sol.append([a,b])

print(sol)

Note como Python é conciso e direto ao ponto.

  1. A solução mais elegante de todas for enviada pelo grande Marcos Melo. Utiliza matemática, ao invés de computação. Transcrevo aqui suas palavras.

A fórmula que engloba todos os números Pitagóricos é:

A= k*(X^2-Y^2)

B=k*(2*X*Y)

C= k*(X^2+Y^2)

Onde X e Y são primos entre si.

Como 2020 é 1*2*2*5*101

A chave é encontrar os resultados de hipotenusa X^2+Y^2=5: =101 e =505;

A hipotenusa 5 é do bem conhecido triângulo 3, 4 e 5 resultado do par X=2 e Y=1; multiplicado por 404 será de hipotenusa 2020.

(ou seja, resultado 1212 e 1616).

A hipotenusa 101 é do 20, 99 e 101 resultado do par X=10 e Y=1; multiplicado por 20 será de hipotenusa 2020.

(ou seja, o par 400 e 1980).

A hipotenusa 505 tem dois: o formado por X=21 e Y=8 e o X=19 e Y=12, que resultam nos triângulos 336, 377 e 505; e 217, 456.e 505; ambos multiplicados por 4 serão de hipotenusa 2020;

(ou seja, os dois pares faltantes: 868 e 1824; 1344 e 1508).

Qual a probabilidade de ganhar a Mega-Sena da virada?

São 60 números possíveis, e uma aposta tem 6 números. A fórmula é combinação(60,6). Isto dá uma chance em 50 milhões.

Com mais apostas, melhor a probabilidade.

Na loteria, é possível marcar mais números na mesma cartela.

Digamos, com 7 dezenas assinaladas, há o equivalente à Combinação(7,6) apostas = 7 apostas. É como se eu preenchesse 7 cartelas individuais e as submetessem, e multiplico a minha chance de ganhar por 7 (e também o custo de jogar).

É o mesmo resultado calculado neste site: https://www.sorteonline.com.br/mega-sena/probabilidades

Segue planilha para download aqui, para quem quiser mexer.

Entrando nas formulinhas, para quem gosta.

Da análise combinatória:

Combinação(n,p)  = n! / (p! * (n-p)!)

Onde ! denota a função fatorial.

O Excel tem as funções combinação e fatorial pré-definidas, porém, é mais divertido reescrevê-las:

Function fact(n)

    If n = 1 Then

        fact = 1

    Else

        fact = n * fact(n – 1)

    End If

End Function

Esta é uma função recursiva, bastante poderosa. Porém, ela esbarra no limite do tipo double.

Ex. calcular fatorial(60) ele aguenta: 8,2*10^81.

Porém, calcular fatorial(2020) o VBA não aguenta:

O Python é melhor que o VBA para números grandes. Isto porque, no Python, o programa vai armazenando o número na quantidade de bytes necessária, até o limite da memória do computador.

def fator(n):

    if n == 1:

        return(1)

    else:

        return(n*fator(n-1))

print(“Fatorial “, fator(2020))

A função combinatória é só aplicar a fórmula, utilizando a função fatorial definida acima.

Em VBA:

Function comb(n As Long, p As Long)

comb = fact(n) / (fact(p) * fact(n – p))

End Function

Em Python:

def comb(n,p):

    return(fator(n)/(fator(p)*fator(n-p)))

Para fechar, 2020! é igual a:

386096951826724872377527755309254829575652833764136996704568320001962744375418996245016343070140495922821200614629613676056064037951380768693631095293969806083283419391122768593135371533669789505644746708636245286071667761717496505605794126236016354348784410240335472055757629538266448781423997420044753128592681490931155652500393981945786030349664533711594345568989302186320705026331591010701401806321162676014168267730443127229747356930582741007966787455099581158386524638372751639313267766129679555735375331455412649323831848690561911358863665291691253184884758093169216097558804246779418405854622335480512182276766264945125914275956103428084284556933827302002697216249895052496440541172520541257873419634034161103824199316296993063661010122247477806751684315159325496718242301326410047304634788457407629483612153384782033983257542806498117448100169850242485622135551834378243035590642352839055096183047501262709727667023809372071930180723811416036636750921242111077253225291490924545632327925057149716099795229733989622278323677405784299876565959582090676790727740307049077225508605566490968403536385735238912741726753153654163800192588170739101544001978507890178193666229850683801023093469605890012191345770905436000032556827322145416135640856057548854287333531160062595436210299154833029310707445362782649537335586073636441409352069691324058033881627521130303343921325446543099236423768017622330952822024309856222944411670467670029292434583401736238439303991700945727580238299750982559170548833139100553910689597287121942263594164151082680213395221663587816012606720015052645832622621471333102685422392447559330215438244237647008830170109515277728376740158127469507982306996887556451828368694363732003992198093879746125762368988032934128856143997941342867059780561839990632437177907064694382432079447096605996943877612866685823347086095028180222170710715928986388757360066746071573539728102642573049976996579847448174187164026466837941823296708220196587010386827277994485087677372620093957914089258169972214872563807439573846201771190457487767436383507920863265001158985530332683629614342467843804937221206800149726658420435494370022064907930073825842356140820286864504429150801511854514365890388184309207375633689423525046829286070427382305637485912596973375367419760345739950217980127302509287481854594278265427658981413690677647108075218848723615631183228998263867303745241836596694419145869217246024705077412378592333080136866437588005631900741990955327512376380828834010898865112109122200117679929527578871952101638590795253704401058529870302842722801768976320289167271902599225625767622305121280203492060037659871687735744553956446891872856397638184308752827275833141465241377237087280607247672227911921476510099466427100947464296939925307947903326972670620615266725024373992589830067802295068263706563543372266200657231075725406225813916087447037257516901879820294473007469699120258797394881069240769625444137446394025363698666039205630857709229029682411964627222481342313835400760000248298282014684789191216782161001313299389221096618273488723978734883910176473532912398103689047801184926163882078889516242948227926207222798398599415190198383379958023224921700008504785581886491831617089767423337158587605657695370924035915232465034278959481229277255278641922703818140279236081674495149412290836894544282115179683616118844191583046672479060000997496671880332878428953950612778358032083448023516233258828937364836898528863330898553728662430714476112310836556548819026772896916666672491022632933230082044594787660656479369609508622352899543941383995692550547567969679794689990261140429300073943357022253659335410345587776835600085239314982274092032142617241600285547606153599286848476863161163541783080974843391064827635422937416295803320652151693691769908939733927283127338535832997562295235291634892349205745118756949780889187123971284330764415768476973033998802916258114465575907763749305205635060986278491975514474464672254458806857234410272869494209351555904987662052843555593641077334735000243185871626166435489995567743531839402525319028777252590673740070657146817606781166399960411132861682002655514447098043836381875601009788125213646389121448684764478666800367960493084953255241805961090727464679546615218982157594620688546771982908471364789755878887707044374010944486692997646137003523014144478339200998768863760703237203498326237220307578035692438887844741169784356786186401985299971489879829923194004083856969480041497397289465262863214647978593940815429794201584815761969377077597754446250785589118819688309472535988847810731264852902520018791994847255177619133199103397784696304617128344478292442325121108591633318029061667864784808515527387560252024100796176430107903015131441779467272344895619105502295519265018507118428238756968370367729287885962903983789250413811180716741127223957387264111710541149510905192956624428207083391894030881029258437087456354854256388583861141432235437699695203894352189291895609764592583127247584093330090479305172063745326415499877435366649909958866611266850377258481988425964258871356114398124542854504460141256012894066714195604604296809443585918770552117029738264919661512180130075143844966812954224436082616963714987190523714733696955227936508156266340713059106114761487944040893851195897985233581632996731726844059926287692271399731200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Inteligência artificial no Pedra-Papel-Tesoura

A seguir, ilustração de como criar alguns algoritmos para o jogo Pedra-Papel-Tesoura.

Evito usar o termo “Inteligência artificial”, por ser muito amplo, englobando desde técnicas conhecidas há décadas até descobertas bem mais recentes. Pode-se dizer que as técnicas a seguir são parte do toolkit de inteligência artificial.

1) O modo mais simples é fazer o computador jogar aleatoriamente. A função randbetween(1,3) fornece um número aleatório entre 1, 2 e 3. Em outra parte do código, há uma decofidicação de 1 para Pedra, 2 para Papel e 3 para Tesoura.

    Application.WorksheetFunction.RandBetween(1, 3)

2) Uma forma também simples é usar o histórico do jogador para predizer qual será a sua jogada, e assim tentar vencer.

A ideia é ir armazenando todas as jogadas do oponente. Digamos que, em dez jogadas, o oponente tenha jogado:

Pedra: 5

Papel: 3

Tesoura: 2

O algoritmo vai estimar que a jogada do adversário seja a mais frequente, Pedra, e então vai jogar Papel (que ganha de Pedra).

Há formas mais complicadas, como contar combinações de jogadas:

Pedra e Pedra:

Pedra e Papel:

Pedra e Tesoura:

Papel e Pedra:

Papel e Papel:

Papel e Tesoura:

Tesoura e Pedra:

Tesoura e Papel:

Tesoura e Tesoura:

A lógica é a mesma.

Há inúmeras outras técnicas, como treinar uma rede neural para predizer a jogada do adversário – mas não é muito simples fazer no Excel, nem vai dar um ganho tão melhor que as técnicas acima.

3) O desafio mesmo é vencer o computador no método “Trapaceiro”. Quero ver quem consegue!

Performance VBA – worksheet function

Esta é uma dica de performance um pouco mais avançada.

Existem várias funções no VBA que também existem no Excel, e são chamadas por um comando do tipo appplication.worksheetfunction. Alguns exemplos são funções como arredondar, mínimo, máximo, etc…

Porém, nos casos que precisamos de alta performance, faz sentido essas funções ou utilizar a versão VBA delas, se houver.

Isto porque o worksheetfunction faz o equivalente a jogar na planilha, aplicar a função e voltar para o código.

Um exemplo simples.

A macro1 utiliza application.worksheetfunction.round 25 milhões de vezes. No meu computador, demora 139 segundos, ou seja, mais de 2 minutos.

For i = 1 To 5000

    For j = 1 To 5000

        y = Application.WorksheetFunction.Round(i / j, 0)

    Next j

Next i

Já a macro2 utiliza math.round (função nativa VBA), demorando 2 segundos.

For i = 1 To 5000

    For j = 1 To 5000

        y = Math.Round(i / j, 0)

    Next j

Next i

Segue link da planilha para testar.

Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Forecast simples

Segue um exercício / desafio.

Dadas séries históricas, como a do print abaixo, como fazer o forecast para os próximos 12 meses?

Forecast é um assunto extremamente difícil, pelo simples motivo de que não conseguimos prever o futuro.

Há vários tipos de técnicas, média móvel, ARMA, ARIMA, cada uma adequada a uma situação específica. Em particular, o R tem muitos métodos.

Como fazer direto no Excel?

Ou utilizando um misto de Excel / R / python?

Uma solução possível. Uma macro que faz decomposição clássica (tendência + sazonalidade).

A sazonalidade considerada é de 12 meses.

Exemplo. Uma das séries era sazonal. O forecast vai seguir isto.

Link para download: https://1drv.ms/x/s!Aumr1P3FaK7jkWqkK0Xx3RgNLZ__?e=JNoCDG


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Função para detectar campos numéricos

Em relatórios, digamos do BI ou SAP, muitas vezes a informação numérica vem com um # ou alguma outra informação não numérica. Isto pode dar um erro de “Tipos incompatíveis” no código subquente.

Para tratar, podemos utilizar a função “IsNumeric”. Ela retorna verdadeiro se o campo for numérico, e falso se não for numérico (string, data).

If Information.IsNumeric( variável ) Then          

                ‘se for numérico, vai em frente

Else

                ‘se não for, faz algum tratamento

endif

Vide exemplo aqui.


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/

Sobre o problema de Josephus

A macro simula várias rodadas do jogo, até sobrar só um.

Link para download.

Um array para armazenar quem está vivo ou não:

ReDim arrMorto(1 To n)

Rodar isso n-1 vezes

For i = 1 To n – 1 ‘Para cada rodada

    count = 0

    While count < passo

        ‘A formula complicada abaixo é para considerar quando a contagem dá a volta no círculo e volta para o primeiro

        pos = ((pos + 1 – 1) Mod (n)) + 1

       ‘só incrementa o contador se a pessoa na posição estiver viva

        If arrMorto(pos) = 0 Then

            count = count + 1

        End If

      ‘A pessoa que estiver exatamente na posição escolhida para ser eliminada, executa a instrução abaixo

        If count = passo Then

            arrMorto(pos) = 1 ‘A pessoa nesta posição morre

            colore (pos) ‘subrotina para colorir a bolinha

            timeout (0.5) ‘espera 0,5 segundo para criar efeito de animação

        End If

    Wend

Next i


Ideias técnicas com uma pitada de filosofia: https://ideiasesquecidas.com

Ferramentas Excel-VBA: https://ferramentasexcelvba.wordpress.com/