Rutas
/
Crystal
Crystal
/
Ejercicios
/
Ordenador de navegación
Ordenador de navegación

Ordenador de navegación

Ejercicio de aprendizaje

Introducción

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

En Crystal hay tipos de números enteros tanto con signo como 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 de 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 más grandes, pero tienen un rango de valores posibles más pequeño.

Cuando sabes que los valores estarán dentro de un rango determinado, 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 añadiendo <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 tipos de enteros sin signo de Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

La única diferencia entre enteros con signo y 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 añadiendo <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 coma flotante

Estos son los tipos de coma flotante de 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 coma flotante distintos; uno es más preciso que el otro.

El tipo de coma flotante predeterminado es Float64.

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

Instrucciones

La ESA (Exercism Space Agency) está a pleno rendimiento planificando una nueva misión a Fobos, una luna de Marte. El objetivo de la misión es posar una sonda en la superficie de Fobos y enviar datos sobre dicha superficie. La ESA ha solicitado tu ayuda para construir el ordenador de navegación de la sonda. El ordenador 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

El ordenador 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

El ordenador 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 el programa para que generase un error de desbordamiento cuando el área fuese negativa. Sin embargo, los ingenieros olvidaron cambiar el entero con signo por un entero sin signo.

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

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

Note

El área proporcionada 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. Calcular la velocidad

El ordenador 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 se tardó en recorrerla. Después, toma la distancia y divídela entre el tiempo.

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

Implementa el método Navigation#calculate_velocity, que toma 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 pestaña nueva
Crystal Exercism

¿Listo para empezar Ordenador de navegación?

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