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

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

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

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

アルゴリズム

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

Q&A

解決済

1回答

441閲覧

Ruby のアルゴリズム問題 〜?時間前は何時〜

supa-ysk8

総合スコア2

Ruby

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

アルゴリズム

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

0グッド

0クリップ

投稿2020/06/29 15:49

Rubyのアルゴリズム問題について、助言いただきたく思います。
〜問題〜
入力された時刻から7時間前が24時間表記で何時になるかという問題です。
標準入力から
h:m
というフォーマットで入力がされます。
条件は
0<=h<=12
0<=m<=59

〜例〜
入力
6:30
とされたときに7時間前なので
出力
23:30
となるようにしたいです。

〜例2〜
入力
12:59
出力
5:59

Rubyの初級問題に取り組んでいるレベルなのですが、アプローチの仕方が全くわかりませんでした。
配列や文字列で受けとって不要な部分(分やコロン)を削除しようと考えましたが、入力の時間が二桁か一桁
かもわからないのでどのように削除すべきか・・・ などと考えたのですが、そもそもの考え方も違うのかもという状況です。
説明不足でしたら申し訳ございませんが、どのように解決すべきでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

split で、時と分の数値をそれぞれ分解すると楽だと思いました。
解答例を載せます。

ruby

1str = gets 2str = "6:30" 3# str = "12:59" 4 5# splitメソッドでコロンで区切って配列["6", "30"]にする。 6# 次に、mapとto_iで、数値の配列[6, 30]にする。 7# 2通り書いておきます。 8h, m = str.split(":").map(&:to_i) 9h, m = str.split(":").map{|t| t.to_i} 10 11# マイナス7 をして24で割れば、7時間前の24時間表記になります。 12h = ( h - 7 ) % 24 13 14# 文字列の構成について、2通り書いておきます。 15res = "#{h}:#{m}" 16res = h.to_s + ":" + m.to_s 17 18puts res 19

投稿2020/06/29 16:59

shisha

総合スコア86

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

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

supa-ysk8

2020/06/29 20:04

返信ありがとうございました。 コロンで区切れば桁数は気にせずに分割できますね。言われてみればすぐ納得できました。 しかし、マイナス7をして24で割るところの発想が自分にはまったくわかりませんでした。。 というか未だに -1 % 24 が23になるところが謎です。。 素早い回答ありがとうございました!
shisha

2020/06/29 20:17

正確には、24で割るではなく、24で割ったときの余りを求めるでしたね。 rubyの場合は 0 % 24 #=> 0 -1 % 24 #=> 23 -2 % 24 #=> 22 -3 % 24 #=> 20 ︙ -23 % 24 #=> 1 -24 % 24 #=> 0 -25 % 24 #=> 23 となり、割る数を固定したときに(負の値を含めて)サイクルを作れる感じです。 今回でいえば、割る数を24で固定してるので、余りは0-23となり、24時間表記が作れます。 なお、負の値が絡む余りは言語によっては別の定義(挙動)となっており、 C言語・Javaでは次のような結果が返るので注意が必要です。 -1 % 24 // -1 -2 % 24 // -2 -3 % 24 // -3 ︙ -25 % 24 // -1
supa-ysk8

2020/06/29 20:33

追加で返信ありがとうございます。 これは覚えておこうと思います! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問