2016-12-17 1 views
1

나는 Elixir에서 행맨을 구현하려고하는데 정확하게 생각 나지 않는 문자 (적절한 색인)를 사용하여 자리 표시 자 단어의 대시를 어떻게 바꾸어야하는지 혼란 스럽습니다. 나는 많은 행운없이 slice/3replace/4 함수를 사용하려고 시도했다.Elixir의 행맨 게임에서 대시를 문자로 바꿉니다.

def check_match(word, guess) do 
    len = String.length(word) 
    str = String.duplicate("_ ", len) 
    if String.contains? word, guess do 
     {index, length} = :binary.match(word, guess) 
     #String.slice(str, index, len) <> guess <> String.slice(str, index+1, len) 
     IO.puts String.replace(str, " ", guess) 
    else 
     IO.puts str 
    end 
end 

나는 또한 포함 guess_word/2 내부 check_match/2을 (전화 : I는 사용자가 입력 한 문자가 비밀 단어에 있는지 확인하고 난 자리에 해당 문자가 포함 대시를 삽입하려고 어디 어디 여기 기능입니다 내 게임 로직) :

def guess_word(word, duration) do 
    gs = IO.gets("enter letter: ") 
    guess = String.trim(gs) 
    put(duration, guess) 
    update_letters() 
    check_match(word, guess) 
    if duration > 0 && !check_win(word, guess) do 
     guess_word(word, duration - 1) 
    end  
end 

아마 내가 프로그램의 잘못된 부분에서 대시를 교체하려고합니다. 올바른 색인에서 대시를 교체하는 방법은 무엇입니까?

예를 들어, 비밀 단어 foo는 것입니다 :

_ _ _

사용자가 추측 f

f _ _

여기

전체 코드 : http://pastebin.com/JkSefm1S

답변

1

찾을 문자열을 검색하려면 하나의 편지가 사용될 수도있다. Regex.run/3 및/또는 Regex.scan/3return: :index 옵션과 함께 사용하십시오.

iex> word = "barbaz" 
iex> letter = "b" 
iex> Regex.scan ~r/#{letter}/, word, return: :index 
[[{0, 1}], [{3, 1}]] 

사람들은 {index, length}을 대표 튜플입니다 : 단어에서 문자의 많은 발생이있을 수 있기 때문에, scan 여기에 더 나은 후보가 될 것으로 보인다. 이제 사용자에게 보여줄 단어를 수정할 수 있습니다. 상상, 사용자는 이미 "a" 열했고, 그녀는 지금 "r"을 추측 : 물론

iex> guessed = "_a__a_" 
iex> letter = "r" 
iex> [[{idx, _}]] = Regex.scan ~r/#{letter}/, word, return: :index 
[[{2, 1}]] 

iex> String.slice(guessed, 0..idx-1) <> 
...>  letter <> 
...>  String.slice(guessed, idx+1..String.length(guessed)) 
"_ar_a_" 

, 여러 번 처리하기 위해, 업데이트하는 데 필요한 코드를하지만, 주요 개념, 나는 희망 분명하다.

관련 문제