2016-10-08 2 views
0
#ask user for string input 
puts "Enter Text" 
# text user has entered 
text = "Test text" 
#put text into a array - "split" by just words and spaces 
words = text.downcase.split('') 
#array of letters a to z in array 
a_z = ('a'..'z').to_a 

#idealy - take each letter in text string and match them to a_z's index from 0-25 
#space values in text are replaced in array with " " instead of nil 

words.map { |x| a_z.index(x) } 

텍스트를 분할하고, 텍스트를 분할하여 ~ z 인덱스를 기반으로하는 숫자로 텍스트를 전환하려고합니다. 해당 숫자를 이동하고 텍스트를 다시 결합하여 텍스트로 되돌립니다. ..배열에서 nil을 변경하는 방법

내가 지금 직면하고있는 문제는 내 텍스트 배열의 공백이 az 색인의 nil에 대한 숫자 값이 아니기 때문에 nil로 표시된다는 것입니다.

내 배열 예를 들어 다음과 같이 할 수 있도록 내가 ""무기 호를 대체 할 수있는 방법

:

#=> [1,2," "] 

대신 :

#=> [1,2,nil] 
+0

입력과 출력이 일치하지 않습니다. 문자를 포함하는 변수를 '단어'라고 혼동하는 것도 혼란 스럽습니다. – Stefan

+0

여기에서 달성하고자하는 것이 정확히 무엇인지 확실하지 않지만'split ("")'을 사용해도 좋습니다. 즉, 문자 배열이 아닌 단어 배열을 가져 오는 것이 좋습니다. (이것은 변수 이름'words'를 사용 했으므로 더 적절합니다!) –

답변

0

코드

def shift_and_remove(str, shift) 
    h = make_hash 'a'..'z', shift 
    h.default_proc = ->(h,k) {' '} 
    str.gsub(/./,h) 
end 

def make_hash(r, shift) 
    base = r.first.ord 
    r.each_with_object({}) { |c,h| h[c] = (base + (c.ord-base+shift) % 26).chr } 
end  

str = "Now is the time for 007 to appear!" 
shift_and_remove(str, 0) #=> " ow is the time for  to appear " 
shift_and_remove(str, 1) #=> " px jt uif ujnf gps  up bqqfbs " 
shift_and_remove(str, 4) #=> " sa mw xli xmqi jsv  xs ettiev " 
shift_and_remove(str, -1) #=> " nv hr sgd shld enq  sn zoodzq " 
shift_and_remove(str, -2) #=> " mu gq rfc rgkc dmp  rm ynncyp " 

주의 사항이 모든 경우 "N", 공간에 "지금", "a"는 "표시"의 세 번째 예와 "A"에왔다 위해 이동되었습니다의 "W"변환 된에 마지막 두 예제에서 각각 "z"와 "y"로 이동했습니다.

h[c] = ('a'.ord + (c.ord-'a'.ord+shift) % 26).chr } 
    #=> {"a"=>"c", "b"=>"d", "c"=>"e", "d"=>"f", "e"=>"g", "f"=>"h", "g"=>"i", 
    # "h"=>"j", "i"=>"k", "j"=>"l", "k"=>"m", "l"=>"n", "m"=>"o", "n"=>"p", 
    # "o"=>"q", "p"=>"r", "q"=>"s", "r"=>"t", "s"=>"u", "t"=>"v", "u"=>"w", 
    # "v"=>"x", "w"=>"y", "x"=>"z", "y"=>"a", "z"=>"b"} 

모든 문자 "A"를 "X", 다음 문자로 맵핑하는 반면된다하는 "Y"및 "Z를 : 설명

shift #=> 2는 해시 다음과 같다

"는 각각"a "및"b "에 매핑됩니다. 마찬가지로 shift #=> -1 인 경우 "a"는 "z"로 매핑되고 다른 모든 문자는 앞의 문자에 매핑됩니다.

문자열의 각 문자 (/./)의 대체를 결정하기 위해 해시를 사용하는 String#gsub의 형식을 사용합니다. Hash#default_proc= 메서드는 h[k]의 값을 제공하며 h 해시에 k의 공백이없는 해시를 생성하는 proc를 만듭니다.

대문자

존재하는 대문자가 (공간으로 전환보다는) 대문자로 전환 할 경우는 단지 약간의 수정이 필요합니다.

def shift_and_remove(str, shift) 
    h = make_hash('a'..'z', shift).merge make_hash('A'..'Z', shift) 
    h.default_proc = ->(h,k) {' '} 
    str.gsub(/./,h) 
end 

shift_and_remove(str, 0) #=> "Now is the time for  to appear " 
shift_and_remove(str, 1) #=> "Opx jt uif ujnf gps  up bqqfbs " 
shift_and_remove(str, 4) #=> "Rsa mw xli xmqi jsv  xs ettiev " 
shift_and_remove(str, -1) #=> "Mnv hr sgd shld enq  sn zoodzq " 
shift_and_remove(str, -2) #=> "Lmu gq rfc rgkc dmp  rm ynncyp " 
+0

감사합니다.이 코드를 공부할 시간을 갖습니다! 이것은 정확히 내가하려고 한 일이다. –

+0

OLadi, 당신이 도움이 된 것을 기쁘게 생각합니다. 방금 몇 가지 사항을 변경했습니다. –

관련 문제