Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Como saber se um número é par de forma complicada - II

Uma coletânea sobre diversas formas de descobrir se um número é par ou não em Go, II

Definição de um número par

https://pt.wikipedia.org/wiki/Paridade

Parte II, a missão

No primeiro artigo, listei alguns meios de saber se um número é par, que fogem do convencional, e sem qualquer compromisso sério. O objetivo era buscar soluções absurdas.

Essa de hoje, é a campeã, mas eu não achei mais o autor, para dar o devido crédito.

Baseado na escrita do último dígito

Exato! Baseado em como se escreve por extenso o último dígito, decide-se se o número é par. Mas isso já foi feito. Agora, isso será decidido pela última letra da palavra em inglês que designa o número, observem a tabela a seguir:


número    par    ímpar
======================
zero       o
----------------------
one                e
----------------------  
two        o
----------------------
three              e
----------------------
four       r
----------------------
five               e
----------------------
six        x
----------------------
seven              n
----------------------
eight      t
----------------------
nine               e
----------------------

Os números pares terminam com as letras 'o', 'r', 'x' e 't'. Já os ímpares finalizam com 'e' ou 'n', apenas. Obviamente, por questões de "otimização" :), irei montar a condição a partir dos ímpares:


package main

import (
        "strconv"

        "github.com/paulohrpinheiro/mytest"
)

func inFull(c byte) string {
        switch c {
        case '0':
                return "zero"
        case '1':
                return "one"
        case '2':
                return "two"
        case '3':
                return "three"
        case '4':
                return "four"
        case '5':
                return "five"
        case '6':
                return "six"
        case '7':
                return "serven"
        case '8':
                return "eight"
        case '9':
                return "nine"
        default:
                panic("wrong value")
        }
}

func isEven(n int) bool {
        s := strconv.Itoa(n)
        l := s[len(s)-1]
        f := inFull(l)
        last := f[len(f)-1]

        return last != 'e' && last != 'n'
}

func main() {
        mytest.Run(1000, isEven)
}

Funcionou bonitinho:

Execução sem problemas do programa no terminal

Lembrando que o pacote de testes está no texto anterior.