2016-04-23 10 views
0

私は数値を取って、奇数の周りにダッシュを入れた文字列を返そうとしています。また、文字列はダッシュで開始または終了してはいけません。なぜこのルビコードは何も返しませんか?

私は次のことを書いたが、それは何も返しません:

def dasherize_number(num) 
    string = num.to_s 
    i = 0 

    while i<string.length 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
    end 

    if string[0] == '-' 
    string.pop(1) 
    end 

    if (string.length - 1) == '-' 
    string.pop(1) 
    end 

    string 
end 

私が正しく理解していればそれが無限ループしているように見えます。コンソールは出力を表示せず、リフレッシュしない限り何もすることができません。私はそれぞれのキャラクターでコードを見直しましたが、どこが間違っているのか分かりません。

+0

著者が質問したとおり、このメソッドはコンソールで呼び出されました。 @ hac13下記の私の答えを見てください。問題は 'while'ループのようです。 – Uzbekjon

+0

@Uzbekjon OPはどこでメソッドがコンソールで呼び出されたと言いますか? – sawa

+0

私はメソッドが意味するものが何を意味するかはあまりよく分かりませんが、それが実行されていることを意味するならば 'dasherize_number(4567)'と入力してコンソールは私に多くのことを許可しません – hac13

答えて

1

コードには多くの論理的な問題がありました。 は、ここで、文字列の長さがあるため、まず、あなたは、あなたのwhileループ機能しませんi < string.length でこの条件を持っていたあなたのためだけに

def dasherize_number(num) 
    string = num.to_s 
    str_len = string.length 

    i = 0 

    while i < str_len 
    next if string[i] == '-' 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
     str_len = string.length 
     i += 3 
    else 
     i += 1 
    end 
    end 

    if string[0] == '-' 
    string = string[1..-1] 
    end 

    if (string[string.length - 1]) == '-' 
    string = string[0..-2] 
    end 

    string.gsub('--', '-') 
end 

、について説明

  1. を働くかもしれない何か変化し続けるだから私は値を格納し、文字列が更新された場合は、変数を更新する変数を使用しました。

  2. 文字列が更新された場合、次の2つのインデックスをスキップできることを確認できます。 例:数値入力 - > 122 最初の反復後、文字列は-1-22 になるので、次のインデックスに対して同じ条件を実行しないようにします。つまり、1、つまり無限ループになります。

  3. popは、配列のようにインデックスを使用して文字にアクセスできるため、文字列には使用できません。popを文字列に使用できません。

  4. ダッシュが連続していないことを確認するために、gsubを使用してダッシュを1つ置き換えました。

+0

それはすべて意味があります。私は今それを見る。唯一の問題は、お互い隣に2つの奇数がある場合、私は1つの余分なダッシュを得ることです。そこに明確にしていない私のせいです。 (333)の関数を呼び出すと、 '3-3-3'の代わりに '3-3--3'が得られます。その間には1つのダッシュだけが必要です。 – hac13

+0

@ hac13最後の編集をご覧ください。これでダッシュが連続して消えます。 – Alfie

+0

Magic!それは欠けている部分だったし、別の新しいことを学んだ – hac13

0

問題は、このコードの一部であるように思わ:

while i<string.length 
    if (string[i].to_i % 2) != 0 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
end 

あなたstringが奇数が含まれている場合、それは2つの以上文字(2倍-)によってその長さを増加させるが、1(i+=1)で、それをインクリメント。

初期文字列の長さをvarに割り当て、その長さをwhileループでチェックします。

string_length = string.length 

while i < string_length 
    if ((string[i].to_i % 2) != 0) 
     string[i] = '-' + string[i] + '-' 
    end 
    i += 1 
end 
+1

このコードをテストしましたか?私はあなたのためにここに驚きがあると思う... :) –

+0

いいえ、私はしませんでした。私が見つけた論理的な問題を指摘しました。残りの部分は、質問者の仕事です。しかし、今あなたは私に興味を持っています! :)他に何を見つけることができますか? – Uzbekjon

+0

私は 'if 'の周りに'() 'を見ます!イェップ! :) – Uzbekjon

関連する問題