假设我有一个字符串“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
是否真的有效。
答案 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