2011-04-22 3 views
0

나는 문자열과 시프트 양을 가져 와서 암호문으로 암호화하는 시저 암호를 코딩해야하는 프로젝트가있다. 나는 JavaScript에서 이것을 쉽게했지만 지금은 F #에서해야만한다. 또한 루프는 재귀 만 허용하지 않습니다. 나는 완전히 스트레스를 받고 혼란스럽고 시간이 없으므로 여기 최후의 수단으로 게시합니다. 이것은 및 파이프 라이닝 (이 경우 Array.Map()에) 매핑 기능을 사용하는 것이 더 의미가 있습니다이 경우카이사르 암호 in f #

let rec encrypt str shiftAmount = 
if str.length > 0 then 
    strChar = str.ToUpper().Chars(0) 
    strUni = int strChar 
    strCoded = (((strUni + shiftAmount - 65) %26) +65) 
else 

답변

0

... 내가 지금까지 가지고 내가 완전히 잘못된 방향으로 향하고 같은 느낌 전부입니다 재귀 대신에 문자열의 각 문자에 함수 (문자 이동)를 적용해야하기 때문입니다. 다음은 대문자을 위해 일해야합니다

let shift(c, shiftAmount) = 
    let num = int(c) - int('A') 
    let offsetNum = (num+shiftAmount)%26 
    let result = offsetNum + int('A') 
    if offsetNum < 0 then 
     char(int('Z') + offsetNum + 1) 
    else 
     char(offsetNum + int('A')) 

let encrypt(str:string, shiftAmount) = 
    str.ToCharArray() 
    |> Array.map (fun c -> shift(int(c), shiftAmount)) 
    |> String.Concat 

은 훨씬 더 우아한 해결책은 여전히 ​​자신을 배우고, (특히 모두 시계 방향과 반 시계 현명한 이동 다루)가있을 수 있습니다. 의

0

는 순진 시저 인코딩입니다 정확히 내가 원하는 것. 이것은 내일 기한이고 나는 F #으로 길을 잃는다.
+0

... 당신이 당신을 위해 모든 일을 할 다른 사람보다 다른 요구하는지 나에게 분명하지 않다, 그 너머

let encode (str:string) shift = let inline flipzip a b = b, a str |> String.map (fun ch -> ch |> int |> flipzip (int 'A') ||> (-) |> (+) shift |> flipzip 26 ||> (%) |> (+) (int 'A') |> char) 

: 여기 – rangers8905

+0

그리고 프로그래머는 교육 comp sci 학생들이 받고있는 것에 대해 불평합니다 ... – Daniel