2009-02-09 6 views
1

Допустим, у меня есть строка "COLIN".Значение знака в F #

Числовое значение этой строки будет стоит:

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

Так

А = 1, В = 2, C = 3 и т. Д.

Я понятия не имею, как начать с F # для этого.

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

Вот что у меня есть. seq.length находится только для тестирования, чтобы проверить, действительно ли работает toCharArray.

ответ

3

Если «отображение» более произвольно, вы могли бы использовать стратегию, как в коде ниже, где вы можете указать структура данных о том, к какому значению относится каждая буква.

#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") 
+0

Вопрос, что означает «let dictionary = dict table», означает то, что именно делает «dict» в этом контексте? – masfenix

+0

'dict' - это функция, которая выдает IDictionary из последовательности пар ключ-значение. http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/FSharp.Core/Microsoft.FSharp.Core.Pervasives.html – Brian

1

Я нашел хакерский способ сделать это, используя значение ascii персонажа, и получить номер оттуда, но я думаю, что может быть лучший способ.

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

красиво и, возможно, даже более эффективно, чем «отображение» работа, но я хотел бы посмотреть на решение, которое я просил

спасибо всем.

1

все, что вам нужно сделать, это сделать строчку в нижнем регистре, превратить ее в массив символов, как вы это делали, пропустить каждую букву, принять значение каждого символа и вычесть значение «a» и добавить его. что каждая буква будет иметь значение своего положения в алфавите.

+0

Да, вот что я придумал, но я учусь язык, поэтому я хочу, если есть способ сделать «отображение» – masfenix

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 идеально подходит для этого.

Я также показать пример использования карты, не уверен, что вы заинтересованы в.

+0

Thankyou, я думаю, я забуду о «сопоставлении» на данный момент. – masfenix

0

Я понимаю, что это очень старый, но я недавно изучаю 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 
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 
Смежные вопросы