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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

解決済

1回答

903閲覧

Ruby ローカルでエラーを吐くコードがAOJを通過するのは何故?

shirou

総合スコア15

Ruby

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

0グッド

0クリップ

投稿2018/10/02 06:22

編集2018/10/02 06:35

前提・実現したいこと

Aizu Online Judgeにて提出したコードが、提出先の環境では動くのに対して、ローカルで実行するとエラーを吐く。
Paiza.ioを利用した場合でも同様のエラーが発生。
具体的には入力値を受け取る際のsplitメソッドが要因。
記述や処理の順番を前後するなどすると消えるエラーではあるが、今回質問させて頂きたい内容は、なぜpaiza.ioやlocal環境ではエラーが発生してしまうのか。
また、何故エラーが出ているにも関わらず、Aizu Online Judgeに提出した際には問題なく通過するのか?

加えてlocal環境で, 作成したコードを実行する際にフリーズしてしまっている原因も宜しければご教授お願いします。
解決しました。エラーが出ているにも関わらずプログラムの処理は期待通りに実行されているのは、どういうことでしょう・・?

発生している問題・エラーメッセージ

terminal

1#paiza.io かつ atom-runnerでの実行結果 2Main.rb:2:in `block in <main>': undefined method `split' for nil:NilClass (NoMethodError) 3 from Main.rb:1:in `loop' 4 from Main.rb:1:in `<main>'

該当のソースコード

ruby

1# paiza.ioでのコード 2loop do 3 x=gets.split(" ").map(&:to_i) 4 if x[0]==0 and x[1]==0 5 break 6 end 7 puts x.sort.join(" ") 8end

ruby

1#File.open('text.txt') do 修正 2 loop do 3 x = gets.split.map(&:to_i) 4 break if (x[0] == 0) && (x[1] == 0) 5 6 puts x.sort.join(' ') 7end 8#end 修正

txt

10 1 21 0 310 10 45758 6838 57515 113 65627 1051 77419 3010 84086 6212 92767 2749 102060 9084 117543 2225 121183 5089 135566 5137 144978 6966 15311 495 1654 1367 173145 7031 185736 9882 198505 524 202102 8394

試したこと

terminalにて
ruby Sample.rbを実行=>何も変化なし。ctr+Cで抜け出すと以下のエラー

terminal

1^CTraceback (most recent call last): 2 6: from Sample.rb:1:in `<main>' 3 5: from Sample.rb:1:in `open' 4 4: from Sample.rb:2:in `block in <main>' 5 3: from Sample.rb:2:in `loop' 6 2: from Sample.rb:3:in `block (2 levels) in <main>' 7 1: from Sample.rb:3:in `gets' 8Sample.rb:3:in `gets': Interrupt

=> ruby Sample.rb < text.txtとすることで解決。結果も正しく表示されたが・・

terminal

154 1367 23145 7031 35736 9882 4524 8505 52102 8394 6Traceback (most recent call last): 7 2: from Sample.rb:2:in `<main>' 8 1: from Sample.rb:2:in `loop' 9Sample.rb:3:in `block in <main>': undefined method `split' for nil:NilClass (NoMethodError)

期待通りの処理を実行しているが、エラーは引き続き出ている。これはどういうことでしょうか・・?

補足情報(FW/ツールのバージョンなど)

Mac OS
Ruby 2.5.1
Atom editor

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Kernel.#getsは、標準入力がクローズした場合nilを返します(るりま)。ローカルでの実行が、標準入力の開かれない方法であった場合、最初からnilとなります。

paiza.ioの場合、標準入力はインタラクティブに行われるのではなく、いちばん下の「入力」欄から読み取っていきます。入力欄に入力した以上に読もうとすればnilを返します。

加えてlocal環境で, 作成したコードを実行する際にフリーズしてしまっている原因

getsでの入力待ちです。File.openはしていますが、そのインスタンスは使っておらず、getsは標準入力から入力を取ろうとします。

投稿2018/10/02 06:30

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shirou

2018/10/02 06:41

迅速な回答ありがとうございます。標準入力についての理解があんぽんたんでした・・。 ・フリーズしていた原因は `do` 以降に `|変数|` を使用していないこと ・ `no method error` が返って来ているのは、 `text.txt` 内にループの終了を告げる `0 0`の記述が抜けていることですね。 テストケースの入力値を抜粋した形で `0 0` が抜けていたことが原因でした。 詳しい解説ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問