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

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

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

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

Q&A

解決済

3回答

934閲覧

Rubyの標準入力について。

yume0409

総合スコア45

Ruby

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

0グッド

1クリップ

投稿2020/04/12 14:53

入力

2 4 8 22 30 15

出力

4

#やりたい内容
2,4,8,22,30と下にある15と小さい順に並び替えたら
2,4,8,15,22,30となります。
下の15は並び替えた時に何番目に来るかを求めたいです。
この場合は並び替えた時に15は4番目に来るので出力は4としたいです。

a = gets.split(" ") b = gets.to_i

ほとんど分からない状態です。
sortを使うかもと思いましたが、どうやって使うのか分かりません。
教えて下さると嬉しいです。よろしくお願いします。

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

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

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

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

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

otn

2020/04/12 15:03

・Rubyを知らない ・Rubyを知っているがやり方が思いつかない のどちらでしょうか?
yume0409

2020/04/12 15:20

説明不足ですみません。 Rubyを知っているがやり方が思いつかないです。
hoshi-takanori

2020/04/12 15:39

2,4,8,22,30 があらかじめソート済みなら、二分探索ってやつを使うと良いかも。
guest

回答3

0

Rubyを知っているがやり方が思いつかないです。

ということなので、やり方だけ。

簡単には、ソートして、index(2行目の値)で位置を求める。

1行目のデータがソート済みであることが前提なら、1行目のデータ.find_index{ }で「2行目の値よりも大きい」という条件をブロックで指定すれば、ソートするより効率が良いです。2行目の値を追加する前なので+1する。
結果がnilなら2行目の値が最大であったということで、1行目のデータ.sizeですね。

どちらの方法でも求まるのは配列の添え字なので、最初を1番目としたいと言うことなら+1する。

投稿2020/04/12 15:58

otn

総合スコア85901

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

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

0

xx.rb

ruby

1nums = gets.split(' ').map(&:to_i) 2n = gets.to_i 3 4p nums 5nums << n 6p nums 7p nums.sort 8 9index = nums.sort.find_index(n) 10p index + 1

実行例
イメージ説明

投稿2020/04/12 20:19

katoy

総合スコア22324

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

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

0

ベストアンサー

hoshi-takanoriさんが指摘しているように、ソート済みならbsearch_indexが使えます。

Array#bsearch_index (Ruby リファレンスマニュアル)

Ruby

1puts gets.split.map(&:to_i).each_with_object(gets.to_i).to_a 2 .then {|a| a.bsearch_index {_1>=_2} || a.size} + 1

もうちょっと噛み砕いた表現しましょう。上と下はほぼ同じことをしています。

Ruby

1# 一行目を読み込んで、空白で分割して、`to_i`で整数化 2arr = gets.split.map(&:to_i) 3# 二行目を読み込んで、`to_i`で整数化 4target = gets.to_i 5# バイナリサーチのfind-minimum モードで**最初に`true`になる位置**を探索 6# インデックスは0から始まり、見つからないときは`nil`を返す事に注意 7pos = arr.bsearch_index {|x| x >= target } 8# nilの場合は見つからなかったと言うことなので、配列の長さにする 9pos ||= arr.size 10# 0から始まっているので、1追加し、1から始まるようにする 11pos += 1 12# 出力 13puts pos

もし、ソートされてない場合があり得るなら、arrを適当にsortしておいてください。
O(n)のfind_indexに比べて、bsearch_indexはO(log n)であるため、サイズが大きくなっても高速です。

投稿2020/04/12 20:15

raccy

総合スコア21739

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

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

yume0409

2020/04/14 07:39

ご丁寧にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問