Track
/
Crystal
Crystal
/
Esercizi
/
Computer di navigazione
Computer di navigazione

Computer di navigazione

Esercizio di apprendimento

Introduzione

Crystal ha diversi tipi di numeri per vari scopi. Per esempio, alcuni tipi sono più veloci ma hanno un intervallo di valori possibili più piccolo rispetto ad altri. Altri hanno un intervallo di valori possibili più ampio ma sono più lenti.

In Crystal esistono sia tipi interi con segno che tipi interi senza segno. I tipi interi con segno possono essere positivi o negativi. I tipi interi senza segno possono essere solo positivi.

Tipi interi con segno

Questi sono i tipi interi con segno in Crystal:

Type Size (bits) Range
Int8 8 -128 to 127
Int16 16 -32_768 to 32_767
Int32 32 -2_147_483_648 to 2_147_483_647
Int64 64 -9_223_372_036_854_775_808 to 9_223_372_036_854_775_807
Int128 128 -170_141_183_460_469_231_731_687_303_715_884_105_728 to 170_141_183_460_469_231_731_687_303_715_884_105_727

I tipi più piccoli usano meno memoria e sono più veloci di quelli più grandi, ma hanno un intervallo di valori possibili più piccolo.

Quando sai che i valori rientreranno in un certo intervallo, la cosa migliore è usare il tipo più piccolo possibile per risparmiare memoria e migliorare le prestazioni.

Il tipo intero predefinito è Int32. Per dichiarare un intero con un tipo specifico, puoi usare il nome del tipo come suffisso aggiungendo <number>_I <bit>.

1_i8.class
# => Int8

Puoi usare il metodo to_i<bit> per convertire tra tipi interi diversi. Il metodo to_i converte al tipo intero predefinito, Int32.

1_i8.to_i16.class
# => Int16

2_i16.to_i.class
# => Int32

Tipi interi senza segno

Questi sono i tipi interi senza segno in Crystal:

UInt8, UInt16, UInt32, UInt64, UInt128

L'unica differenza tra interi con segno e interi senza segno è che quelli senza segno possono essere solo positivi. Per dichiarare un intero senza segno con un tipo specifico, puoi usare il nome del tipo come suffisso aggiungendo <number>_u<bit>. Puoi usare il metodo to_u<bit> per convertire tra tipi interi senza segno diversi. Il metodo to_u converte al tipo intero senza segno predefinito, UInt32.

1_u8.to_u16.class
# => UInt16

Tipi in virgola mobile

Questi sono i tipi in virgola mobile in Crystal:

Type Size (bits) Range
Float32 32 1.2E-38 to 3.4E+38
Float64 64 2.3E-308 to 1.7E+308

Esistono due tipi in virgola mobile diversi, uno è più preciso dell'altro.

Il tipo in virgola mobile predefinito è Float64.

Puoi usare il metodo to_f<bit> per convertire tra tipi in virgola mobile diversi. Il metodo to_f converte al tipo in virgola mobile predefinito, Float64.

Istruzioni

L'ESA (Exercism Space Agency) sta pianificando a pieno ritmo una nuova missione verso Phobos, una luna di Marte. L'obiettivo della missione è far atterrare una sonda sulla superficie di Phobos e inviare dati sulla superficie. L'ESA ha chiesto il tuo aiuto per costruire il computer di navigazione della sonda. Il computer di navigazione ha memoria limitata, quindi dobbiamo mantenere l'utilizzo della memoria il più basso possibile. Per questo, dobbiamo usare i tipi di dati adatti.

1. Costanti di navigazione

Il computer di navigazione deve conoscere la distanza tra alcuni oggetti nello spazio per eseguire i calcoli corretti. La distanza è misurata in km.

Definisci le seguenti costanti:

  • NEPTUNE_DISTANCE con il valore 4_400_000_000, che dovrebbe essere memorizzato come Int64
  • MARS_DISTANCE con il valore 227_940_000, che dovrebbe essere memorizzato come Int32
  • ATMOSPHERE_DISTANCE con il valore 10_000, che dovrebbe essere memorizzato come Int16

2. Analisi corretta dell'area

Il computer di navigazione deve conoscere l'area di alcuni oggetti nello spazio per eseguire i calcoli corretti. Un'area NON può essere negativa. Gli ingegneri avevano progettato il programma in modo che generasse un errore di overflow quando l'area era negativa. Tuttavia, gli ingegneri hanno dimenticato di cambiare l'intero con segno in un intero senza segno.

Perciò, gli ingegneri vorrebbero un programma che converta un intero con segno in un intero senza segno.

Implementa il metodo Navigation#correct_area_analysis che prende measurement come argomento e restituisce l'area come intero senza segno a 32 bit.

Note

L'area fornita rientrerà sempre in un intero senza segno a 32 bit.

measurement = 52554
measurement.class
# => Int32

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

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

3. Calcolare la velocità

Il computer di navigazione deve conoscere la velocità della sonda. La velocità è misurata in m/s.

Per calcolare la velocità, dobbiamo conoscere la distanza percorsa e il tempo impiegato per percorrerla. Poi, prendi la distanza e dividila per il tempo.

La velocità può non essere precisa e non sarà mai un numero considerevole. Perciò, possiamo usare un Float32.

Implementa il metodo Navigation#calculate_velocity che prende distance e time come argomenti e restituisce la velocità come Float a 32 bit.

distance = 52554
time = 2.5

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

Navigation.new.calculate_velocity(distance, time).class
# => Float32
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Crystal Exercism

Vuoi iniziare Computer di navigazione?

Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.