2014-05-14 1 views
0

나는 뒤죽박죽 된 일련의 문자를 취하여 영어를 반환하는 함수를 만들려고합니다. 웬일인지 word = (word.ord-4).chr을 제대로 작동시키지 못합니다. 코드의 비밀은 글자가 4 슬롯 뒤로 이동한다는 것입니다. 그래서 정수로 먼저 변환하고 4를 뺀 다음 다시 문자열로 변환합니다.루프에서 .ord 및 .chr을 올바르게 사용하는 방법은 무엇입니까?

루프는 또한 특수 문자 인 경우 단어를 건너 뛰라고 말한 사실을 무시하는 것처럼 보입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

이 문제를 해결하는 데 도움이되는 제안이나 출처는 무엇입니까?

def north_korean_cipher(coded_mesage) 
    input = coded_mesage.split('') # splits the coded message into array of letters 

    input.each do |word| 
    word = (word.ord - 4).chr 

    if word == '@' || '#' || '$' || '%' || '^' || '&' || '*' 
     next 
    end 
    end 

    print input 
end 

north_korean_cipher('m^aerx%e&gsoi!') 
+0

은 BTW, 당신은에 * 회전 * 알파벳 가지고있다 -> w','B의'를 - > x,'c -> y','d -> z','e -> a' 등등 – Stefan

+0

힌트를 주셔서 감사합니다, @Stefan,하지만 Array의 메서드 만 회전시키지 않습니까? –

+0

'("a".ord - 4) .chr'은''''''',''w "'를 반환하지 않습니다. 그리고 네, 회전 된 배열을 사용하여 매핑을 만들 수 있습니다. – Stefan

답변

2

당신이 원하는 다음과 같은 매핑 :

input: abcdefghijklmnopqrstuvwxyz 
output: wxyzabcdefghijklmnopqrstuv 

불행히도 귀하의 접근 방식은 첫 번째 4 ters :

("a".ord - 4).chr #=> "]" 
("b".ord - 4).chr #=> "^" 
("c".ord - 4).chr #=> "_" 
("d".ord - 4).chr #=> "`" 

String#tr을 사용하고 싶습니다. 그것은 두 번째 문자열의 해당 문자로 첫 번째 문자열의 각 발생을 대체

"m^aerx%e&gsoi!".tr("abcdefghijklmnopqrstuvwxyz", "wxyzabcdefghijklmnopqrstuv") 
#=> "i^want%a&coke!" 

"문자의 범위를 나타 내기 위해 C1-C2 표기"도 있습니다 :

"m^aerx%e&gsoi!".tr("a-z", "w-za-v") 
#=> "i^want%a&coke!" 

문서는 추가로 말합니다 :

to_str이 보다 짧은 경우 유지하기 위해 마지막 문자로 채 웁니다. 서신. 그래서 쉽게 공백으로 "특수 문자"를 대체 할 수

:

"m^aerx%e&gsoi!".tr("[email protected]#$%^&*", "w-za-v ") 
#=> "i want a coke!" 
+0

당신은 경이 롭습니다. 내가 StackOverflow에서받은 최고의 대답. 정말 고맙습니다. tr 메소드가 알고있는 것입니까? 아니면 찾았습니까? 문서를보다 효과적으로 탐색하려면 어떻게해야합니까? –

+0

첫날부터 모든 방법을 알 필요는 없습니다. 문자를 대체 할 수있는 많은 방법이 있습니다 :) – Stefan

1

이 : 조건으로 '#' 항상 true 될 것이기 때문에

if word == '@' || '#' || '$' || '%' || '^' || '&' || '*' 

, 당신은 그것을 할 기대하지 않습니다. 그런 것들을 비교할 수는 없습니다. 당신은 물어

if word == '@' || word == '#' || word == '$' || word == '%' || word == '^' || word == '&' || word == '*' 

당신은 더 간결 방법으로 그것을 쓸 수 같은 것을 수행해야합니다

word 옵션의 컬렉션에 있는지 확인
if %w(@ # $ %^& *).include? word 

...

+0

감사합니다. –

관련 문제