terça-feira, 7 de novembro de 2017

Problema do Relógio Digital

Supondo um relógio digital de 24 horas, quantas vezes um determinado dígito aparece durante 1 dia?

Esse interessante problema li em NRICH enriching mathematics.
Lá o problema é apresentado fazendo a pergunta sobre o dígito 5.
Se bem observarmos, o dígito 5 aparece 16 vezes em cada hora normal.
00:05 - 1
00:15 - 2
00:25 - 3
00:35 - 4
00:45 - 5
00:50 - 6
00:51 - 7
00:52 - 8
00:53 - 9
00:54 - 10
00:55 - 11
00:55 - 12
00:56 - 13
00:57 - 14
00:58 - 15
00:59 - 16

E aparece 76 vezes às 05:mm e às 15:mm, pois nesses horários há repetição em 05:05, 05:15,... e também em 05:55.
Assim, o cálculo é feito somando-se:
  • 22 horas em que o 5 aparece 16 vezes
  • MAIS
  • 2 horas em que o 5 aparece 76 vezes
  • Ou seja, (22x16) + (2x76) = 352 + 152 = 504
O dígito 5 aparece 504 vezes em um relógio digital de 24 horas durante 1 dia.

Então, tive a ideia de escrever um programinha em Powershell que calcule quantas vezes cada dígito 0,1,2,3,... aparece no relógio digital durante 1 dia e ao final exiba um relatório.

Function QuantoApareceEm24Horas([Int32] $digito) {
    [Int32] $dig1, $dig2, $dig3, $dig4, $contador=0

    ## Primeiro Horários 0h:mm e 1h:mm
    For ($dig1=0; $dig1 -le 1; $dig1++) { ## 0,1
        ########## $dig2 ############
        For ($dig2=0; $dig2 -le 9; $dig2++) { ## 0,1,2,3,4,5,6,7,8,9
            ########## $dig3 ############
            For ($dig3=0; $dig3 -lt 6; $dig3++) { ## 0,1,2,3,4,5
                ########## $dig4 ############
                For ($dig4=0; $dig4 -le 9; $dig4++) { ## 0,1,2,3,4,5,6,7,8,9
                    If ($dig1 -eq $digito) { 
                        $contador++
                        Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                    }
                    If ($dig2 -eq $digito) { 
                        $contador++
                        Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                    }
                    If ($dig3 -eq $digito) {
                        $contador++ 
                        Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                    }
                    If ($dig4 -eq $digito) {
                        $contador++ 
                        Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                    }
                } ##$dig4
            } ## dig3
        } ## dig2
    } ## dig1


    ## Horários 20, 21, 22, 23
    $dig1=2
    For ($dig2=0; $dig2 -le 3; $dig2++) { ## 0,1,2,3
        For ($dig3=0; $dig3 -le 5; $dig3++) { ## 0,1,2,3,4,5
            For ($dig4=0; $dig4 -le 9; $dig4++) { ## 0,1,2,3,4,5,6,7,8,9
                If ($dig1 -eq $digito) {
                    $contador++ 
                    Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                }
                If ($dig2 -eq $digito) {
                    $contador++ 
                    Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                }
                If ($dig3 -eq $digito) {
                    $contador++ 
                    Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                }
                If ($dig4 -eq $digito) {
                    $contador++ 
                    Write-Host $dig1$dig2":"$dig3$dig4" - "$contador
                }
            } ## $dig4
        } ## $dig3
    } ## $dig2

    Return $contador
} ##Function

Clear-Host
$Numeros=@()
[Int32] $i

For ($i=0; $i -le 9; $i++) {
    Write-Host -ForegroundColor Yellow "######################################"
    Write-Host -ForegroundColor Yellow "Calculando quantas vezes o dígito"$i
    Write-Host -ForegroundColor Yellow "aparece em relógio digital em 1 dia"
    Write-Host -ForegroundColor Yellow "######################################"
    $Numeros += QuantoApareceEm24Horas $i
}
Write-Host -ForegroundColor Green "######################################"
Write-Host -ForegroundColor Green "Relatório de Execução:"
For ($i=0; $i -le 9; $i++) {
    Write-Host -ForegroundColor Cyan "O dígito" $i "aparece" $Numeros[$i]"vezes em 24 horas."
}

Nenhum comentário:

Postar um comentário