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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

4回答

744閲覧

Ruby 文字を段違いで出力する方法について

supa-ysk8

総合スコア2

Ruby

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/06/18 21:49

編集2020/06/18 21:52

前提・実現したいこと

Ruby のプログラミング問題に取り組んでいるところです。
A ~ Z の文字列を、標準入力から受け取ったスペース区切りの数値3行分に分けて表示したいという問題です。

例)
受け取る数値 = 5 7 14 

結果)
ABCDE
FGHIJKL
MLOPQRSTUVWXYZ

これをスマートに実現する良い方法があればアドバイスいただきたいです。

〜私のコード〜
alphabet = ("A".."Z").to_a
line = gets.chomp.split(' ').map(&:to_i)

puts alphabet.slice!(0, line[0]).join
puts alphabet.slice!(0, line[1]).join
puts alphabet.slice!(0, line[2]).join

これで出力はできるのですが、putsを一行で書いたとしても長ったらしいのと、配列を破壊してしまっています。
なにか良い方法や別のアプローチがあればアドバイスいただければと思います。よろしくお願いします。

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

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

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

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

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

guest

回答4

0

Stringにもslice!はあるので、joinは1回に出来ます。

Ruby

1alphabet = ("A".."Z").to_a.join 2line = gets.chomp.split(' ').map(&:to_i) 3 4puts line.map{|n| alphabet.slice!(0,n)}

あとは、わかりにくくなりますが、非破壊だと、

Ruby

1alphabet = ("A".."Z").to_a.join 2line = gets.chomp.gsub(/^|\s+/,"A") 3 4puts alphabet.unpack(line)

投稿2020/06/18 22:40

otn

総合スコア84645

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

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

supa-ysk8

2020/06/26 03:10

返信遅くなり大変申し訳ございません。 非破壊もとてもシンプルでこの方法を参考にしてみようと思いました。 ありがとうございました。
guest

0

ベストアンサー

ruby

1letters = ('A'..'Z').to_a.join 2 3nums = [0] + gets.chomp.split.map(&:to_i) 4pos = nums.size.times 5 .map { |i| nums[0..i].inject(:+) } 6 .map { |x| [0, x, letters.size].sort[1] } 7p pos 8 9puts pos.each_cons(2).map { |p| letters[p[0]...p[1]] }.join("\n")

実行例
イメージ説明

要は letters[p[0]...p[1]] です。
望んだように部分文字を取り出せるように p の値を作り出すことを、その上の部分で行っています。
1 5 14 が入力されたら、 [1, 5 ,14] をつくり、
次に、 [0, 1, 5, 14] -> [0, 1, 6, 25] の累計した値にします。
これを each_cons で [0, 1], [1, 6], [6, 25] と 2 つずつ切り出しています。

途中で [-, x, letters.size].sort[1] としているには、 pos の各値が 0 から 26 の間に収まるようにしています(入力値が 1 以上 であることが確実で 0 以下の値がはいったらエラーにしていまうのなら不要です)
この処理をすしているので どんな数字が入っても処理中にエラーになることはないです。

投稿2020/06/18 23:35

katoy

総合スコア22324

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

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

supa-ysk8

2020/06/26 03:08

返信遅くなり大変申し訳ございません。 コードを読むのに検索を要したので大変勉強になりました。 それと例外的な処理にまで目を向けるところもとても参考になりました。
guest

0

前置きが増えますが、こんなのもあります

ruby

1alphabet = ("A".."Z").to_a.join 2line = gets.chomp.split(' ').map(&:to_i) 3ary=line.inject([[0,0]]){|a,v| a<< [a.last.sum,v]} 4ary[1..-1].each{|s,l| puts alphabet[s,l]}

投稿2020/06/18 23:08

winterboum

総合スコア23360

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

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

supa-ysk8

2020/06/26 03:13

返信遅くなり大変申し訳ございません。 実力不足で一発で読めなかったですが、ググるきっかけになりました。 なかなかシンプルで参考にさせていただきました。 ありがとうございました。
guest

0

やり方はいろいろありますが
Array#shiftを利用するのが楽かなと思います。

投稿2020/06/18 22:03

編集2020/06/18 22:08
asm

総合スコア15147

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

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

supa-ysk8

2020/06/26 03:06

返信遅くなり大変申し訳ございません。ありがとうございました。 Array#shiftでやってみたところ自分の実力だとなかなか冗長的になってしまいましたが実現できました。 shiftも破壊的なのですね、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問