質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Ruby

    7704questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

書いたコードのどこが間違っているのか分かりません

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 525

tsukacchan

score 10

num = gets.chomp.split("").map(&:to_i)

while 1
flag = true
(0..num.size-2).each do |i|

diff = num[i + 1] - num[i]  ←ここでエラー 

if diff==1 || diff==-1
num.delete_at(i+1)
num.delete_at(i)
flag = false
end
end
break if flag==true
end

(0..num.size-1).each do |i|
print num[i]
end

趣味でコード書いている者です。
上コードで問題なく動作すると思っていたのですが、実行すると下ののエラーが発生しうまくいきません。
もしぱっと見て分かる方教えていただけないでしょうか?
今までエラー発生してなぜなのかわからなかったことがないので
どうしていいか分かりません。
よろしくお願いします。

Main.rb:7:in block in <main>': undefined method -' for nil:NilClass (NoMethodError)
from Main.rb:5:in each'     from Main.rb:5:in <main>'

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/02/15 22:07 編集

    numに何を入力したのか教えていただけると助かります。 あとstrという配列の内容を教えてほしいです。

    キャンセル

  • tsukacchan

    2017/02/15 22:11

    数値の列です。 もし隣り合う数値が連続した数値(差が1)であればその2つの数値を消すといったことを繰り返しています

    キャンセル

  • tsukacchan

    2017/02/15 22:17

    申し訳ありません入力ミスですstrではなく全てnumです。申し訳ありません以後質問時は気をつけます

    キャンセル

回答 4

checkベストアンサー

+1

何をしたいのかよく分かりませんが、0からnum.size-2までのループの中で、num自体を切り縮めているので、添え字がそのときの切り縮められたnumからはみ出てしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

回答ありがとうございました1行修正で正常に動作しました

num = gets.chomp.split("").map(&:to_i) 

while 1 
flag = true 
(0..num.size-2).each do |i| 

diff = num[i + 1] - num[i]   

if diff==1 || diff==-1 
num.delete_at(i+1) 
num.delete_at(i) 
flag = false
break ←ここだけ修正 
end 
end 
break if flag==true 
end 

(0..num.size-1).each do |i| 
print num[i] 
end 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

なにが起こっているかを調べる方法を2つ示してみます。

1. print 文をいれて状況の変化を知る。

プログラムに次のように、状態を表示する行を追加して実行してみます。

z.rb

num = gets.chomp.split(' ').map(&:to_i)

while 1
  flag = true
  (0..num.size - 2).each do |i|
   p i                         # これを追加
    p num                       # これを追加
    diff = num[i + 1] - num[i]  # ←ここでエラー
    if diff == 1 || diff == -1
      num.delete_at(i + 1)
      num.delete_at(i)
      flag = false
    end
  end
  break if flag == true
end

(0..num.size - 1).each do |i|
  print num[i]
end


走らせてみます。

$ ruby z.rb
1 2 3
0
[1, 2, 3]
1
[3]
z.rb:8:in `block in <main>': undefined method `-' for nil:NilClass (NoMethodError)
    from z.rb:5:in `each'
    from z.rb:5:in `<main>'

i = 1 になったとき、 num が [3] とサイズ1の配列になっていることがわかります。
この状態で  num[1], num[2] にアクセスしようとすることになるので、エラーが発生しているのです。

2. デバッガで、エラーが起こったときブレークさせて、状況を調べる。

プログラムにつぎにように ブレークポイントを設定します。

num = gets.chomp.split(' ').map(&:to_i)

while 1
  flag = true
  (0..num.size - 2).each do |i|
    binding.pry if num[ i + 1].nil?  # これを追加
    diff = num[i + 1] - num[i]  # ←ここでエラー
    if diff == 1 || diff == -1
      num.delete_at(i + 1)
      num.delete_at(i)
      flag = false
    end
  end
  break if flag == true
end

(0..num.size - 1).each do |i|
  print num[i]
end

走らせてみます。

$ ruby -r pry z.rb
1 2 3

From: /Users/katoy/zzz/zzz4/z.rb @ line 7 :

     2: 
     3: while 1
     4:   flag = true
     5:   (0..num.size - 2).each do |i|
     6:     binding.pry if num[ i + 1].nil?  # これを追加
 =>  7:     diff = num[i + 1] - num[i]  # ←ここでエラー
     8:     if diff == 1 || diff == -1
     9:       num.delete_at(i + 1)
    10:       num.delete_at(i)
    11:       flag = false
    12:     end

[1] pry(main)> i
=> 1
[2] pry(main)> num
=> [3]
[3] pry(main)> num[i + 1] - num[i]
NoMethodError: undefined method `-' for nil:NilClass
from (pry):3:in `block in <main>'
[4] pry(main)> num[i + 1]
=> nil

↑では pry というデバッガをつかっています。
$ gem install pry とすることで、pry が利用可能になります。

pry については、 google で "ruby pry" などで検索すれば、たくさんの情報を得ることができます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

num = gets.chomp.split("").map(&:to_i)

while 1
flag = true
(0..num.size-2).each do |i|

diff = num[1] - num[0]

if diff==1 || diff==-1
num.delete_at(i+1)
num.delete_at(i)
flag = false
end
end
break if flag==true
end

(0..num.size-1).each do |i|
print num[i]
end


これで動くかもしれません。

補足

やっぱり無理かもしれません。

input = gets.chomp.split("").map(&:to_i)

i = 0
loop{
  if input[i + 1] == nil
    break
  end
  if (input[i] - input[i + 1]).abs == 1
    input.delete_at(i)
    input.delete_at(i)
  else
    i += 1
  end
}
print input.join


自己満足のために追記
332211に対応しています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7704questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。