Mostrando postagens com marcador invertendo string. Mostrar todas as postagens
Mostrando postagens com marcador invertendo string. Mostrar todas as postagens

quinta-feira, 9 de novembro de 2017

Decimal para Binário

Este é um post bem simples, onde o objetivo é de apenas ilustrar como poderia ser implementado com o Powershell a conversão de um número decimal para binário através de um função recursiva. Não se quer, com isso, demonstrar o melhor método, nem tão pouco o mais otimizado.

$Global:Bin=""
Function Dec2Bin([Int32]$Num) {
    If ($Num -lt 0) {Return "Número a converter deve ser positivo"}
    If ($Num -lt 2) {Return (($Global:Bin+=$Num)|%{-join $_[$_.Length..0]})}
    $Global:Bin += ($Num % 2)
    If ($Num -eq 2) {Return (($Global:Bin+=1)|%{-join $_[$_.Length..0]})}
    Return Dec2Bin ([math]::Truncate($Num/2))
}

Clear-Host
[Int32]$Dec = Read-Host "Insira um número para converter em binário"
Write-Host "O equivalente em binário de $Dec é:" (Dec2Bin $Dec)

Sabemos que uma maneira de ser realizada a conversão é através dos restos sucessivos da divisão por 2. Por exemplo, na conversão do número 19.


Se bem observarmos na implementação proposta, são utilizadas chamadas recursivas à função Dec2Bin. Ainda (usando uma função recursiva), os valores de resto são empilhados em uma variável global do tipo String. Assim sendo, no teste de parada da recursividade, efetuamos uma inversão da pilha, ou seja, da String que armazena os restos.

Se colocarmos como entrada o número 19 no script, o resultado será:

Insira um número para converter em binário: 19
O equivalente em binário de 19 é: 10011

segunda-feira, 9 de outubro de 2017

Invertendo String e Palíndromos

Não há em System.String um método para inverter uma string, mas nem por isso é difícil consegui-lo.

Vamos enumerar 5 maneiras de inverter strings:
  1. $string | %{-join $_[$_.Length..0]}
  2. -join([System.Linq.Enumerable]::Reverse($string))
  3. -join($string).ForEach({[Regex]::Matches($_ , ‘.’ , ‘RightToLeft’)})
  4. $string[-1..-($pal.Length)] -join ""
  5. -join (($pal.Length-1)..0 | ForEach-Object { $pal[$_]})
$pal = "Powershell"
$reverseV1 = $pal | %{-join $_[$_.Length..0]}
Write-Host -ForeGroundColor Yellow $pal":" -NoNewline
Write-Host -ForeGroundcolor Cyan $reverseV1

$pal = "Inverte"
$reverseV2 = -join([System.Linq.Enumerable]::Reverse($pal))
Write-Host -ForeGroundColor Yellow $pal":" -NoNewline
Write-Host -ForeGroundcolor Cyan $reverseV2

$pal = "Strings"
$reverseV3 = -join($pal).ForEach({[Regex]::Matches($_ , ‘.’ , ‘RightToLeft’)})
Write-Host -ForeGroundColor Yellow $pal":" -NoNewline
Write-Host -ForeGroundcolor Cyan $reverseV3

$pal = "Muito"
$reverseV4 = $pal[-1..-($pal.Length)] -join ""
Write-Host -ForeGroundColor Yellow $pal":" -NoNewline
Write-Host -ForeGroundcolor Cyan $reverseV4

$pal = "Facilmente"
$reverseV5 = -join (($pal.Length-1)..0 | ForEach-Object { $pal[$_]})
Write-Host -ForeGroundColor Yellow $pal":" -NoNewline
Write-Host -ForeGroundcolor Cyan $reverseV5


Palíndromos são palavras ou frases que podem ser lidas da esquerda para a direita ou da direita para a esquerda, como por exemplo RODADOR.

Vamos utilizar o Powershell para escrever uma função que receba uma palavra como parâmetro e nos diga se ela é um palíndromo. Para tanto, a lógica que vamos utilizar é a de inverter a string e compará-la com ela mesma.

Function ehPalindromo($pal) {
    $reversePal = -join([System.Linq.Enumerable]::Reverse($pal))
    if ($pal -eq $reversePal) {
        Write-Host -ForegroundColor Green $pal "é palíndromo"
    }
    else {
        Write-Host -ForegroundColor Red $pal "não é palíndromo"
    }
}

$palavras = @("RELER","REVIVER","RADAR","ARARA","AMORA","SALAS",`
"ANILINA","MUSSUM","CASACA","OSSO","RIR","MIRIM")

Write-Host "----------------------------------"
Write-Host "   P A L Í N D R O M O S"
Write-Host "----------------------------------"

ForEach ($pal in $palavras) { ehPalindromo($pal) }