簡體   English   中英

F#中的Char值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM