F#中的字符值

时间:2009-02-09 02:11:37

标签: f#

假设我有一个字符串“COLIN”。

此字符串的数值值得:

  

3 + 15 + 12 + 9 + 14 = 53.

所以

  

A = 1,B = 2,C = 3,依此类推。

我不知道如何以F#开头。

let mutable nametotal = 0
let rec tcalculate name =
    name.ToString().ToCharArray()
    |> Seq.length

这是我到目前为止所拥有的。 seq.length只是用来测试toCharArray是否真的有效。

6 个答案:

答案 0 :(得分:8)

你拥有的是体面的;这是另一个版本:

#light

let Value (c:char) = 
    (int c) - (int 'A') + 1

let CalcValue name =
    name |> Seq.sum_by Value

printfn "COLIN = %d" (CalcValue "COLIN")
// may be of interest:
printfn "%A" ("COLIN" |> Seq.map Value |> Seq.to_list)

假设原始输入为大写。 “int”是一个将char(或其他)转换为int的函数; Seq.sum_by非常适合这个。

我还展示了使用地图的示例,不确定您感兴趣的内容。

答案 1 :(得分:3)

如果'mapping'更随意,你可以使用类似下面代码的策略,你可以在其中指定每个字母映射到的值的数据结构。

#light

let table = [
    'C', 3
    'O', 15
    'L', 12
    'I', 9
    'N', 14
    ]

let dictionary = dict table

let Value c = 
    match dictionary.TryGetValue(c) with
    | true, v -> v
    | _ -> failwith (sprintf "letter '%c' was not in lookup table" c)

let CalcValue name =
    name |> Seq.sum_by Value

printfn "COLIN = %d" (CalcValue "COLIN")

答案 2 :(得分:1)

我找到了一种使用角色的ascii值来做这个的hackish方法,并从那里得到数字,但我认为可能有更好的方法。

let tcalculate name =
    name.ToString().ToLower().ToCharArray()
    |> Seq.map (fun char -> Convert.ToInt32 char - 96)
    |> Seq.sum 

工作精美,可能比“映射”更有效但我想查看我要求的解决方案

谢谢大家。

答案 3 :(得分:1)

你需要做的就是把字符串变成小写,把它变成你已经完成的char数组,循环遍历每个字母,取每个字符的值并减去'a'的值并加一个。这将使每个字母具有其在字母表中的位置值。

答案 4 :(得分:0)

我意识到这已经很老了,但我最近正在学习F#并且在这个问题上玩这些想法。也许有人会发现它很有用:

> mapply( "rnorm", c(2, 0), c(10,100), c(3, 1) )
[[1]]
[1]  8.125727 13.609617

[[2]]
numeric(0)

答案 5 :(得分:0)

let sumOfChar name =                                                // F# functional answer
  name 
  |> List.ofSeq                                                     // to char array 
  |> List.map (fun c -> int (System.Char.ToUpper c) - int 'A' + 1)  // to value
  |> List.fold (+) 0                                                // sum

sumOfChar "Herb"                                                    // 33

// Or simply this version:
let sumOfCharBy name =
  let value c = int (System.Char.ToUpper c) - int 'A' + 1
  List.sumBy value (List.ofSeq name)

sumOfCharBy "HerbM"                                                 // 46

// or simply:
let sumOfCharBy name =
  name |> Seq.sumBy (fun c -> int (System.Char.ToUpper c) - int 'A' + 1)

sumOfCharBy "HMartin"                                              // 83