Trilhas
/
Crystal
Crystal
/
Exercícios
/
Computador de navegação
Computador de navegação

Computador de navegação

Exercício de aprendizagem

Introdução

O Crystal tem uma variedade de tipos numéricos diferentes para diversas finalidades. Por exemplo, alguns tipos são mais rápidos, mas têm um intervalo menor de valores possíveis do que outros. Alguns têm um intervalo maior de valores possíveis, mas são mais lentos.

No Crystal, existem tanto tipos inteiros com sinal quanto tipos inteiros sem sinal. Os tipos inteiros com sinal podem ser positivos ou negativos. Os tipos inteiros sem sinal só podem ser positivos.

Tipos de inteiros com sinal

Estes são os tipos de inteiros com sinal do Crystal:

Tipo Tamanho (bits) Intervalo
Int8 8 -128 a 127
Int16 16 -32_768 a 32_767
Int32 32 -2_147_483_648 a 2_147_483_647
Int64 64 -9_223_372_036_854_775_808 a 9_223_372_036_854_775_807
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 a 170_141_183_460_469_231_731_687_303_715_884_105_727

Os tipos menores usam menos memória e são mais rápidos que os tipos maiores, mas têm um intervalo menor de valores possíveis.

Quando você sabe que os valores vão estar dentro de um certo intervalo, o melhor é usar o menor tipo possível para economizar memória e melhorar o desempenho.

O tipo inteiro padrão é Int32. Para declarar um inteiro com um tipo específico, você pode usar o nome do tipo como sufixo adicionando <number>_I <bit>.

1_i8.class
# => Int8

Você pode usar o método to_i<bit> para converter entre diferentes tipos inteiros. O método to_i converte para o tipo inteiro padrão, Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

Tipos de inteiros sem sinal

Estes são os tipos inteiros sem sinal do Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

A única diferença entre inteiros com sinal e sem sinal é que os inteiros sem sinal só podem ser positivos. Para declarar um inteiro sem sinal com um tipo específico, você pode usar o nome do tipo como sufixo adicionando <number>_u<bit>. Você pode usar o método to_u<bit> para converter entre diferentes tipos de inteiros sem sinal. O método to_u converte para o tipo inteiro sem sinal padrão, UInt32.

1_u8.to_u16.class
# => UInt16

Tipos de ponto flutuante

Estes são os tipos de ponto flutuante do Crystal:

Tipo Tamanho (bits) Intervalo
Float32 32 1.2E-38 a 3.4E+38
Float64 64 2.3E-308 a 1.7E+308

Existem dois tipos de ponto flutuante diferentes, um é mais preciso que o outro.

O tipo de ponto flutuante padrão é Float64.

Você pode usar o método to_f<bit> para converter entre diferentes tipos de ponto flutuante. O método to_f converte para o tipo de ponto flutuante padrão, Float64.

Instruções

A ESA (Exercism Space Agency) está a todo vapor planejando uma nova missão para Phobos, uma lua de Marte. O objetivo da missão é pousar uma sonda na superfície de Phobos e enviar de volta dados sobre a superfície. A ESA pediu sua ajuda para construir o computador de navegação da sonda. O computador de navegação tem memória limitada, então precisamos manter o uso de memória o mais baixo possível. Por isso, precisamos usar os tipos de dados adequados.

1. Constantes de navegação

O computador de navegação precisa saber a distância entre alguns objetos no espaço para fazer os cálculos corretos. A distância é medida em km.

Defina as seguintes constantes:

  • NEPTUNE_DISTANCE com o valor 4_400_000_000, que deve ser armazenado como um Int64
  • MARS_DISTANCE com o valor 227_940_000, que deve ser armazenado como um Int32
  • ATMOSPHERE_DISTANCE com o valor 10_000, que deve ser armazenado como um Int16

2. Análise correta de área

O computador de navegação precisa saber a área de alguns objetos no espaço para fazer os cálculos corretos. Uma área NÃO pode ser negativa. Os engenheiros planejaram o programa para gerar um erro de overflow quando a área fosse negativa. No entanto, os engenheiros esqueceram de trocar o inteiro com sinal por um inteiro sem sinal.

Por isso, os engenheiros gostariam de um programa que converta um inteiro com sinal em um inteiro sem sinal.

Implemente o método Navigation#correct_area_analysis, que recebe uma measurement como argumento e retorna a área como um inteiro sem sinal de 32 bits.

Note

A área dada sempre caberá como um inteiro sem sinal de 32 bits.

measurement = 52554
measurement.class
# => Int32

Navigation.new.correct_area_analysis(measurement)
# => 52554

Navigation.new.correct_area_analysis(measurement).class
# => UInt32

3. Calcular a velocidade

O computador de navegação precisa saber a velocidade da sonda. A velocidade é medida em m/s.

Para calcular a velocidade, precisamos saber a distância percorrida e o tempo que levou para percorrer essa distância. Depois, pegue a distância e divida pelo tempo.

A velocidade pode não ser exata e nunca será um número considerável. Portanto, podemos usar um Float32.

Implemente o método Navigation#calculate_velocity, que recebe distance e time como argumentos e retorna a velocidade como um Float de 32 bits.

distance = 52554
time = 2.5

Navigation.new.calculate_velocity(distance, time)
# => 21021.6

Navigation.new.calculate_velocity(distance, time).class
# => Float32
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar Computador de navegação?

Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.