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

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

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

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

Q&A

3回答

1068閲覧

Rubyの標準入力。

yume0409

総合スコア45

Ruby

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

1グッド

1クリップ

投稿2020/04/14 09:53

入力 2 5
出力 2 7 12 17 22 27 32 37 42 47

この場合は入力の左の2から始まって、5ずつ足していって出力は全部で10個の数値を出すようにしたいです。
#やってみた内容

a = gets.split.map(&:to_i) b = a[0] while b <= a[1]*9+a[0] print ("#{b} ") b += a[1] end

これで一応、条件には満たしているので計算は出来るはずです。
今回したい内容としては4行目に("#{b} ")と
あるので出力した時に一番最後の47の後ろにも空白が入ってしまいます。
数値と数値の間には空白があっていいのですが、一番後ろは入りません。
そのためのコードが分かりません。
条件分岐で分ける方法を考えました。
bが一番大きい数値だったら後ろに空白はいらない。
とすると

if b.max puts b.strip

こうするとエラーになりますし、そもそもputsが違います。
大きい値でも数値と数値の間の空白はいるのでどうしたらいいのか分からなくなりました。
ヒントでも大丈夫なので教えて下さると嬉しいです。
もし、コードを書いて下さるのあれば、何故そうなるのか?の説明があれば幸いです。
よろしくお願いします。

DrqYuto👍を押しています

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

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

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

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

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

gentaro

2020/04/14 10:09

「タイトルには要件を書きましょう」 https://teratail.com/help/question-tips#questionTips3-1 同じタイトルで何度も質問してますが、直接的には質問内容に関係ないタイトルだと思います。(標準入力じゃなくてファイルからその値を読んでも同じ質問になる)
gouf

2020/05/03 13:03

解決した場合、他者の回答ないし自己回答として内容をまとめて それをベストアンサーに設定することで、この質問を解決済みにすることができます
guest

回答3

0

こういうのはいかがでしょう?

#入力 #2 5 #出力 #2 7 12 17 22 27 32 37 42 47 a,b = gets.split.map(&:to_i) puts a.step(by: b).take(10).join(" ")

入力
2 5

出力
2 7 12 17 22 27 32 37 42 47

参考

@scivola

2019-04-14 19:05
等差数列は Numeric#step と Enumerable#take を使って,

num = 7 # 初項 diff = 2 # 公差 length = 3 # 数列の長さ num.step(by: diff).take(length) # => [7, 9, 11]

とすることも。

3.step(by:2, to:10){|n| p n}

3

5
7
9

投稿2020/04/15 13:31

DrqYuto

総合スコア432

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

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

0

現状のコードをなるべく変更せずに書いた場合、つぎのように書くとよいかもしれません

result = '' while b <= a[1] * 9 + a[0] result << "#{b} " b += a[1] end puts result.strip # => 2 7 12 17 22 27 32 37 42 47

String をどんどん結合していくことで、最終的な文字列に余分な空白があっても、.strip で除去することができます

別解

たとえば、再帰的な処理を定義することで、メインとする計算部分と出力部分との処理を分離して書くことができるようになるかもしれません

ruby

1def solver(current_value, succ_value, ret = []) 2 return ret if ret.size.eql?(10) 3 4 solver( 5 ret.last + succ_value, 6 succ_value, 7 ret + [current_value + succ_value] 8 ) 9end 10 11a, b = '2 5'.split.map(&:to_i) 12 13puts solver(a, b, [a]).join(' ') 14# => 2 7 12 17 22 27 32 37 42 47

solver に初期値を渡し、計算を始めてもらいます

solver の中では定義した引数にならって、次に計算してほしい値を渡し、 solver 自身をまた呼び出します

関数の最初の行で終了条件を定義することで、無限ループを予防します
(最終的には.. ret のサイズが 10 になったときに、 ret の値がほしい)

呼び出し回数を追うごとに、 (succ_value を除いて)値が変化していきます

動作イメージとしては 次のようになるかと思います

ruby

1solver( 2, 5, [2]) 2solver( 7, 5, [2, 7]) 3solver(12, 5, [2, 7, 12]) 4solver(17, 5, [2, 7, 12, 17]) 5# ... 6puts [2, 7, 12, 17, 22, 27, 32, 37, 42, 47].join(' ') # solver から返ってきた値を利用する

solver によって生成された配列に対して .join(' ') をすることでスペース区切りの文字列に変換し、それを puts に渡すことで標準出力に表示させる、という処理が完成します

なにか参考になれば幸いです

Links

投稿2020/04/15 07:40

編集2020/04/15 07:50
gouf

総合スコア2321

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

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

0

ヒントでも大丈夫なので教えて下さると嬉しいです。

出力すべき値を配列に貯めておいて、最後に.join(' ')のようにすれば、間にだけスペースを入れられます。

投稿2020/04/14 09:55

maisumakun

総合スコア146018

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

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

yume0409

2020/04/14 10:15

ありがとうございます。 配列に格納するやり方がちょっと分からないんです・・・
maisumakun

2020/04/14 10:53

<<なりpushなり、ツールはもちろん用意されています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問