[英]Char value in 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
真正起作用。
你所擁有的是體面的; 這是另一個版本:
#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非常適合此操作。
我還展示了一個使用地圖的示例,不確定您對什么感興趣。
如果“映射”更為隨意,則可以使用下面的代碼之類的策略,在其中可以指定每個字母映射到的值的數據結構。
#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")
我發現了一種使用字符的ascii值來做到這一點的怪異方法,並從那里獲取了數字,但我認為可能會有更好的方法。
let tcalculate name =
name.ToString().ToLower().ToCharArray()
|> Seq.map (fun char -> Convert.ToInt32 char - 96)
|> Seq.sum
工作精美,甚至可能比“映射”更有效,但我想查看我要求的解決方案
謝謝大家
您需要做的就是使字符串變成小寫字母,像完成一樣將其變成一個char數組,遍歷每個字母,獲取每個char的值並減去'a'的值並加一個。 這將使每個字母都具有其在字母表中的位置值。
我意識到這已經很老了,但是最近我正在學習F#,並正在研究這個問題中的想法。 也許有人會發現它有用:
let table =
Seq.zip ['A'..'Z'] (Seq.initInfinite((+) 1))
|> Map.ofSeq
let calc (input : string) =
let s = input.ToUpper()
match s with
| _ when Seq.forall System.Char.IsLetter s ->
Some (Seq.sumBy (fun c -> table.[c]) s)
| _ -> None
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.