Rutas
/
F#
F#
/
Ejercicios
/
Observador de pájaros
Observador de pájaros

Observador de pájaros

Ejercicio de aprendizaje

Introducción

Arrays

Un array en F# es una colección mutable de cero o más valores con una longitud fija. Esto significa que, una vez creado un array, su tamaño no puede cambiar, pero sus valores sí. Todos los valores de un array deben tener el 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 o recuperarlos de él mediante 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 con funciones y operadores definidos en el módulo Array, o manualmente mediante la coincidencia de patrones usando 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 usar la coincidencia de patrones; cuando no te importa un valor en un caso concreto (es decir, no vas a usar un valor), puedes usar un guion bajo ('_') para indicarlo:

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 '_' siempre debe ir al final al usar la coincidencia de patrones; todo valor que no coincida con ninguno de los otros casos será gestionado por este caso.

Instrucciones

Eres un aficionado a la observación de aves que lleva la cuenta de cuántos pájaros han visitado tu jardín en los últimos siete días.

Tienes seis tareas, todas relacionadas con el número de pájaros que han visitado tu jardín.

1. Comprueba cuáles eran los recuentos de la semana pasada

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

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

2. Comprueba cuántos pájaros visitaron ayer

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

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

3. Calcula el número total de pájaros que han visitado tu jardín

Implementa la función total para que devuelva el número total de pájaros que han visitado tu jardín:

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

4. Comprueba si hubo algún día en el que no visitara ningún pájaro

Implementa la función dayWithoutBirds que devuelve true si hubo un día en el que ningún pájaro visitó el jardín; en caso contrario, devuelve false:

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

5. Incrementa el recuento de hoy

Implementa la función incrementTodaysCount para que incremente el recuento de hoy y devuelva los recuentos actualizados:

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

6. Comprueba si hay una semana inusual

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

  • En cada día par de la semana no había pájaros
  • En cada día par de la semana se avistaban exactamente 10 pájaros
  • En cada día impar de la semana se avistaban exactamente 5 pájaros

Implementa la función unusualWeek que devuelve true si el patrón de recuento de pájaros 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

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

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

¿Listo para empezar Observador de pájaros?

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