Grãos

Grãos

Fácil

Introdução

Era uma vez um servo sábio que salvou a vida de um príncipe. O rei prometeu pagar tudo o que o servo conseguisse imaginar. Sabendo que o rei adorava xadrez, o servo disse ao rei que gostaria de receber grãos de trigo. Um grão na primeira casa de um tabuleiro de xadrez, com o número de grãos a duplicar em cada casa seguinte.

Instruções

Calcula o número de grãos de trigo num tabuleiro de xadrez.

Um tabuleiro de xadrez tem 64 casas. A casa 1 tem um grão, a casa 2 tem dois grãos, a casa 3 tem quatro grãos, e assim por diante, duplicando a cada casa.

Escreve código que calcule:

  • o número de grãos numa determinada casa
  • o número total de grãos no tabuleiro de xadrez

GNU awk e a aritmética de precisão arbitrária

Por omissão, os números em awk são representados como números de vírgula flutuante de precisão dupla. Isto dá 53 bits de precisão (ver a Tabela 16.3 no manual). Infelizmente, isto não chega para completar este exercício (aviso de spoiler: um dos testes exige 63 bits de precisão).

Uma precisão insuficiente tem este aspeto:

$ gawk 'BEGIN {
  n = 2 ^ 54
  if (n == n + 1)
    print "not enough precision"
  else
    print "OK"
}'
not enough precision

O GNU awk tem a capacidade de usar números de precisão arbitrária, desde que as bibliotecas relevantes tenham sido compiladas no executável awk. Verifica a tua versão do awk e procura por "GNU MPFR":

$ gawk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
...

Se estiver presente, ativa essa capacidade com a opção -M:

$ gawk -M 'BEGIN {
  n = 2 ^ 54
  if (n == n + 1)
    print "not enough precision"
  else
    print "OK"
}'
OK

E se o meu awk não tiver a opção -M? Vais ter de chamar um programa externo capaz de fazer aritmética de precisão arbitrária, como o bc. Vê a secção Usar o getline numa variável a partir de um pipe para veres um exemplo de como fazer isto.

Leitura adicional: Aritmética de precisão arbitrária

Editar via GitHub A ligação abre numa nova janela ou separador
AWK Exercism

Estás pronto para começar Grãos?

Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.