Tracks
/
F#
F#
/
Ejercicios
/
Observador de aves
Observador de aves

Observador de aves

Ejercicio de aprendizaje

Introducción

Arreglos

Un array en F# es una colección mutable de cero o más valores con una longitud fija. Esto significa que una vez que se ha creado un array, su tamaño no puede cambiar, pero sus valores sí. Los valores de un array deben ser todos del mismo tipo. Los arrays se pueden definir de la siguiente manera:

let empty = [| |]
let emptyAlternative = Array.empty

let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5

let threeValues = [| "a"; "b"; "c" |]

Se pueden asignar elementos a un array u obtenerlos de él usando un índice. Los arrays de F# están basados en cero, lo que significa que el índice del primer elemento siempre es cero:

let numbers = [| 2; 3; 5 |]

// Update value in array
numbers[2] <- 9

// Read value from array
numbers[2]
// => 9

Los arrays se manipulan ya sea con funciones y operadores definidos en el módulo Array, o manualmente usando coincidencia de patrones con el patrón array:

let describe array =
    match array with
    | [| |] -> "Empty"
    | [| 1; 2; three |] -> sprintf "1, 2, %d" three
    | _ -> "Other"

describe [| |]         // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"

También puedes descartar un valor al hacer coincidencia de patrones; cuando no te importa un valor en un caso específico (es decir, no vas a usar un valor) puedes usar un guion bajo ('_') para indicar esto:

let describe array =
    match array with
    | [| |] -> "Empty array"
    | [| x |] -> "Array with one item"
    | [| _; y |] -> "Array with two items (first item ignored)"
    | _ -> "Array with many items (all items ignored)"

describe [| |]          // => "Empty array"
describe [| 1 |]        // => "Array with one item"
describe [| 5; 7 |]     // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |]  // => "Array with many items (all items ignored)"

El '_' solo debe ir siempre al final al hacer coincidencia de patrones; todo valor que no coincida con ninguno de los otros casos será manejado por este caso.

Instrucciones

Eres un ávido observador de aves que lleva la cuenta de cuántas aves han visitado tu jardín en los últimos siete días.

Tienes seis tareas, todas relacionadas con la cantidad de aves que visitaron tu jardín.

1. Revisa cuáles fueron los conteos de la semana pasada

Para poder comparar, siempre tienes cerca una copia de los conteos de la semana pasada, que fueron: 0, 2, 5, 3, 7, 8 y 4. Define el enlace lastWeek que contiene los conteos de la semana pasada:

lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]

2. Revisa cuántas aves visitaron ayer

Implementa la función yesterday para que devuelva cuántas aves visitaron tu jardín ayer. Los conteos de aves están ordenados por día: el primer elemento es el conteo del día más antiguo y el último elemento es el conteo de hoy.

yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4

3. Calcula el total de aves que visitaron el jardín

Implementa la función total para que devuelva la cantidad total de aves que han visitado tu jardín:

total [| 3; 5; 0; 7; 4; 1 |]
// => 20

4. Revisa si hubo un día sin aves visitantes

Implementa la función dayWithoutBirds que devuelve true si hubo un día en el que ninguna ave visitó el jardín; de lo contrario, devuelve false:

dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true

5. Incrementa el conteo de hoy

Implementa la función incrementTodaysCount para incrementar el conteo de hoy y devolver los conteos actualizados:

let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]

6. Revisa si la semana es inusual

Durante el último año, has notado que algunas semanas comparten los mismos patrones inusuales:

  • En cada día par de la semana, no hubo aves
  • En cada día par de la semana, se avistaron exactamente 10 aves
  • En cada día impar de la semana, se avistaron exactamente 5 aves

Implementa la función unusualWeek que devuelve true si el patrón de conteo de aves de esta semana coincide con uno de los patrones inusuales:

unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true

unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true

(Fíjate que la paridad de los días se cuenta desde 1, no desde 0: el primer elemento del array corresponde a un día impar)

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
F# Exercism

¿Todo listo para empezar Observador de aves?

Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.