Mostrando postagens com marcador par. Mostrar todas as postagens
Mostrando postagens com marcador par. Mostrar todas as postagens

segunda-feira, 4 de dezembro de 2017

Project Euler 2

Implementaremos 2 soluções para o problema de nº 2 do Project Euler:


Estamos implementando uma solução através do uso de recursividade (RecursiveFibonacciEvenSum) e outra utilizando um loop (FibonacciEvenSum).

Function RecursiveFibonacciEvenSum([Long]$pre, [Long]$cur, [Long]$evenSum) {
    If ($cur -gt 4000000) { Return $evenSum}
    If ($cur %2 -eq 0) { $evenSum = $evenSum + $cur }
    [Long]$tmp = $pre + $cur
    $pre = $cur
    $cur = $tmp
    RecursiveFibonacciEvenSum $pre $cur $evenSum
}
 
Function FibonacciEvenSum([Long]$pre, [Long]$cur) {
    [Long]$tmp = 0
    [Long]$evenSum = 0
 
    While($tmp -lt 4000000) {
        $tmp = $pre + $cur
        If ($tmp % 2 -eq 0) { $evenSum = $evenSum + $tmp }
        $pre = $cur
        $cur = $tmp
    }
    Return $evenSum
}
 
Clear-Host
$time = New-Object System.Diagnostics.Stopwatch
$time.Start()
RecursiveFibonacciEvenSum 1 1 0
$time.Stop()
$ts = $time.Elapsed
Write-Host "Tempo calculado com Recursividade:"
Write-Host $ts.Seconds "segundos e" $ts.Milliseconds "milisegundos"
 
$time2 = New-Object System.Diagnostics.Stopwatch
$time2.Start()
FibonacciEvenSum 1 1
$time2.Stop()
$ts2 = $time2.Elapsed
Write-Host "Tempo calculado com Loop:"
Write-Host $ts2.Seconds "segundos e" $ts2.Milliseconds "milisegundos"

Calculamos a soma dos números pares na Série de Fibonacci, obtendo 4613732 como resultado. Com relação ao tempo gasto, observamos que a implementação através de loop teve melhor desempenho do que a solução que utiliza recursividade.

4613732
Tempo calculado com Recursividade:
0 segundos e 157 milisegundos

4613732
Tempo calculado com Loop:
0 segundos e 28 milisegundos

domingo, 8 de outubro de 2017

String Par ou String Ímpar

Dizer que uma determinada String é par ou é ímpar soa bastante estranho, mas essa ideia me ocorreu ao lembrar da cantora Ana Carolina, já que ela possui essa "mania" de classificar palavras, nomes, ou mesmo frases inteiras como sendo "par" ou "ímpar".

Eu até consegui encontrar dois vídeos no YouTube comprovando o fato. Um deles é um trecho de uma entrevista no programa Estrelas, da Angélica. Outro, um trecho de uma entrevista no programa do Jô Soares.
A propósito, Ana Carolina é ímpar!

Então, pensei: powershell pode nos ajudar a informar se uma determinada palavra é par ou é ímpar.

Para tanto, vamos precisar identificar:
  1. Quantas letras tem uma determinada palavra: isso é bastante fácil porque o powershell já tem a propriedade length na classe String.
  2. Se um número é par ou ímpar: também é fácil, verificando o resto da divisão do número por 2. Se o resto for zero, o número é par, senão é ímpar.

A implementação é bastante simples, porém divertida.
Inicialmente, vamos criar uma função, que recebe como parâmetro uma String e retorna se ela é par ou é ímpar.
Function StrPoI([string]$str) {
    if (($str.Length % 2) -eq 0) {
        return "PAR"
    }
    else { return "ÍMPAR" }
}

Vamos criar um array para armazenar as palavras (ou frases) que desejamos que o powershell verifique.
$palavras = @("Futebol","Jogador","Música","PowerShell","Oftalmologista",`
"Inconstitucional","Paralelepípedos", "Ana Carolina")

Na sequência, usamos ForEach para percorrer cada palavra do array e chamar a função StrPoI que retorna se é par ou se é ímpar. Observação: os espaços em branco não são levados em consideração, somente as letras, por isso o replace.
ForEach ($palavra in $palavras) {
    $r = StrPoI($palavra -replace (' ',''))
    Write-Host -ForegroundColor Cyan $palavra" - " -NoNewline
    Write-Host -ForegroundColor Yellow $r
}

Ao executarmos o script, o resultado é seguinte.