Tracks
/
Crystal
Crystal
/
Ejercicios
/
Computadora de navegación
Computadora de navegación

Computadora de navegación

Ejercicio de aprendizaje

Introducción

Crystal tiene una variedad de tipos de números distintos para diversos propósitos. Por ejemplo, algunos tipos son más rápidos, pero tienen un rango más pequeño de valores posibles que otros. Otros tienen un rango más amplio de valores posibles, pero son más lentos.

En Crystal existen tanto tipos de enteros con signo como tipos de enteros sin signo. Los tipos de enteros con signo pueden ser positivos o negativos. Los tipos de enteros sin signo solo pueden ser positivos.

Tipos de enteros con signo

Estos son los tipos de enteros con signo en Crystal:

Tipo Tamaño (bits) Rango
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

Los tipos más pequeños usan menos memoria y son más rápidos que los tipos más grandes, pero tienen un rango más pequeño de valores posibles.

Cuando sabes que los valores van a estar dentro de cierto rango, lo mejor es usar el tipo más pequeño posible para ahorrar memoria y mejorar el rendimiento.

El tipo de entero predeterminado es Int32. Para declarar un entero con un tipo específico, puedes usar el nombre del tipo como sufijo agregando <number>_I <bit>.

1_i8.class
# => Int8

Puedes usar el método to_i<bit> para convertir entre distintos tipos de enteros. El método to_i convierte al tipo de entero predeterminado, Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

Tipos de enteros sin signo

Estos son los enteros sin signo en Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

La única diferencia entre los enteros con signo y los enteros sin signo es que los enteros sin signo solo pueden ser positivos. Para declarar un entero sin signo con un tipo específico, puedes usar el nombre del tipo como sufijo agregando <number>_u<bit>. Puedes usar el método to_u<bit> para convertir entre distintos tipos de enteros sin signo. El método to_u convierte al tipo de entero sin signo predeterminado, UInt32.

1_u8.to_u16.class
# => UInt16

Tipos de punto flotante

Estos son los tipos de punto flotante en Crystal:

Tipo Tamaño (bits) Rango
Float32 32 1.2E-38 a 3.4E+38
Float64 64 2.3E-308 a 1.7E+308

Hay dos tipos de punto flotante distintos, uno es más preciso que el otro.

El tipo de punto flotante predeterminado es Float64.

Puedes usar el método to_f<bit> para convertir entre distintos tipos de punto flotante. El método to_f convierte al tipo de punto flotante predeterminado, Float64.

Instrucciones

La ESA (Exercism Space Agency) está a toda marcha planificando una nueva misión a Fobos, una luna de Marte. El objetivo de la misión es aterrizar una sonda en la superficie de Fobos y enviar datos sobre esa superficie. La ESA solicita tu ayuda para construir la computadora de navegación de la sonda. La computadora de navegación tiene memoria limitada, así que necesitamos mantener el uso de memoria lo más bajo posible. Por lo tanto, necesitamos usar los tipos de datos adecuados.

1. Constantes de navegación

La computadora de navegación necesita conocer la distancia entre algunos objetos del espacio para hacer los cálculos correctos; la distancia se mide en km.

Define las siguientes constantes:

  • NEPTUNE_DISTANCE con el valor 4_400_000_000, que debe almacenarse como un Int64
  • MARS_DISTANCE con el valor 227_940_000, que debe almacenarse como un Int32
  • ATMOSPHERE_DISTANCE con el valor 10_000, que debe almacenarse como un Int16

2. Análisis correcto del área

La computadora de navegación necesita conocer el área de algunos objetos del espacio para hacer los cálculos correctos. Un área NO puede ser negativa. Los ingenieros planearon que el programa generara un error de desbordamiento cuando el área fuera negativa. Sin embargo, los ingenieros olvidaron cambiar el entero con signo por un entero sin signo.

Por lo tanto, los ingenieros quieren un programa que convierta un entero con signo en un entero sin signo.

Implementa el método Navigation#correct_area_analysis, que recibe measurement como argumento y devuelve el área como un entero sin signo de 32 bits.

Note

El área dada siempre cabrá como un entero sin signo de 32 bits.

measurement = 52554
measurement.class
# => Int32

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

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

3. Calcula la velocidad

La computadora de navegación necesita conocer la velocidad de la sonda. La velocidad se mide en m/s.

Para calcular la velocidad, necesitamos conocer la distancia recorrida y el tiempo que tomó recorrer esa distancia. Luego, toma la distancia y divídela por el tiempo.

La velocidad puede no ser exacta y nunca será un número considerable. Por lo tanto, podemos usar un Float32.

Implementa el método Navigation#calculate_velocity, que recibe distance y time como argumentos y devuelve la velocidad como un 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 en GitHub El enlace se abre en una ventana o una pestaña nuevas
Crystal Exercism

¿Todo listo para empezar Computadora de navegación?

Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.