2 votes

F# Deux tableaux - Premier tableau produit filtré par index sur le deuxième tableau

J'ai trois tableaux - first est un tableau de flottants, second est un tableau de chaînes de caractères, et fltr est un tableau de chaînes de caractères. J'ai besoin de générer un produit des éléments dans le premier tableau filtré par la correspondance de l'index dans le deuxième tableau contenant tous les caractères des éléments du tableau de filtre :

module SOQN = 

   open System

   let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
   let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
   let fltr    = [| "AC";   "BD";   "CE" |]

   let result =
      first
      |> Array.filter second // filter for elements containing characters in second array
      |> Seq.reduce (fun x y -> x * y)

   // Résultat attendu : let result = [| 42.00; 110.00; 231.00 |]

Comment générer le tableau des produits ?

2voto

xuanduc987 Points 749

Quelque chose comme ça

let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
let fltr    = "AC"

Array.zip first second
|> Array.filter (fun (_, s) ->
    Seq.forall (fun c -> s.Contains (string c)) fltr)
|> Array.map fst
|> Array.reduce (*)

1voto

matekus Points 392

Le snippet suivant (bien que non idiomatique) fournit la réponse complète que je cherchais et inclut la solution de @xuanduc987 :

module SOANS = 

open System

let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
let fltr    = [| "AC";   "BD";   "CE" |]

let filterProduct (first:float[]) (second:string[]) (fltr:string) = 
    Array.zip first second
    |> Array.filter (fun (_, s) ->
        Seq.forall (fun c -> s.Contains (string c)) fltr)
    |> Array.map fst
    |> Array.reduce (*)

let third = 
    [for i in [0..fltr.Length - 1] do
        yield (filterProduct first second fltr.[i])]
    |> List.toArray

printfn "Third: %A" third

// Résultat attendu: Troisième : [| 42.0; 110.0; 231. 0 |]
// Résultat réel : Troisième : [| 42.0; 110.0; 231.0 |]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X