🏄♂️
基礎練習
問題1
# 1から100までの数字の配列が与えられます。
# 配列の各要素について、以下のルールに基づいて特定のメッセージを出力するRubyスクリプトを作成してください。
# 数字が3の倍数の場合は "Fizz" を出力します。
# 数字が5の倍数の場合は "Buzz" を出力します。
# 数字が15の倍数(すなわち、3と5の両方の倍数)の場合は "FizzBuzz" を出力します。
# それ以外の場合、数字自体を出力します。
# この問題は「FizzBuzz」と呼ばれ、プログラミングの初学者が制御フローを理解するためによく使用されます。
x = (1..45)
for num in x do
if num % 15 == 0
puts "FizzBuzz"
elsif num % 3 == 0
puts "Fizz"
elsif num % 5 == 0
puts "Buzz"
else
puts num
end
end
問題2
# 以下のように、実数(浮動小数点数)temperatureと文字列scaleが与えられます。
# scaleは、temperatureが摂氏か華氏かを示すため、'C'(摂氏)または'F'(華氏)のいずれかです。
# あなたのタスクは、与えられたtemperatureとscaleに基づいて
# 次の基準に従って気温の範囲を出力するRubyプログラムを書くことです。
# scaleが摂氏の場合
# temperatureが0未満の場合、出力は"Below freezing point"とします。
# temperatureが0から100の範囲内の場合、出力は"Normal range for water"とします。
# temperatureが100を超える場合、出力は"Above boiling point"とします。
# scaleが華氏の場合
# temperatureが32未満の場合、出力は"Below freezing point"とします。
# temperatureが32から212の範囲内の場合、出力は"Normal range for water"とします。
# temperatureが212を超える場合、出力は"Above boiling point"とします。
temperature = -1
scale = 'C'
if scale == 'C'
if temperature < 0
puts "Below freezing point"
elsif (0..100).include?(temperature)
puts "Normal range for water"
else
puts "Above boiling point"
end
elsif scale == 'F'
if temperature < 32
puts "Below freezing point"
elsif (32..212).include?(temperature)
puts "Normal range for water"
else
puts "Above boiling point"
end
end
= と == と === の違い
代入演算子
右辺の値を左辺の変数に代入します。
x = 5 # xに5を代入します。
等価演算子
左辺と右辺が等しいかどうかを評価します。等しい場合はtrue、等しくない場合はfalseを返します。
5 == 5 # true、数字5は5と等しい
5 == 4 # false、数字5は4とは等しくない
'foo' == 'foo' # true、文字列'foo'は'foo'と等しい
'foo' == 'bar' # false、文字列'foo'は'bar'とは等しくない
範囲チェック演算子/ケース等価演算子
特定のオブジェクトが特定のクラスやモジュール、または範囲に属しているかどうかをチェックします。
case 文において、when節の条件に使用されます。
(1..5) === 3 # true、3は範囲1..5に含まれる
(1..5) === 6 # false、6は範囲1..5に含まれない
String === 'foo' # true、'foo'はStringクラスのインスタンス
# case文における使用例
case 'foo'
when String
puts "It's a string!"
when Integer
puts "It's a number!"
else
puts "It's something else!"
end
# 出力: "It's a string!"
==は「等しいか」をチェックし、===は「属するか(範囲内にあるか/特定の型であるか)」をチェックします。
問題3
# 与えられた文字列が以下の条件を満たすかどうかを判定するプログラムを作成してください:
# 文字列がアルファベットの大文字だけで構成されている場合は "All uppercase" を出力します。
# 文字列がアルファベットの小文字だけで構成されている場合は "All lowercase" を出力します。
# 文字列が数字だけで構成されている場合は "All numeric" を出力します。
# それ以外の場合は "Mixed" を出力します。
# ヒント: Rubyの String クラスの upcase, downcase, to_i メソッドおよび Integer クラスの to_s メソッドを利用してこの問題を解くことができます。
# 例えば str.upcase == str は、文字列 str が大文字だけで構成されているかどうかを判定します。
# なぜなら、str.upcase は str の全ての文字を大文字に変換した新しい文字列を生成し、
# それが str 自身と一致するかどうかをチェックします。
# 同様に、 str.downcase == str は str が小文字だけで構成されているかどうかを判定します。
# また、str.to_i.to_s == str は str が数字だけで構成されているかどうかを判定します。
# なぜなら、 str.to_i は str を整数に変換し、その結果を .to_s で再度文字列に戻します。
# それが元の str と一致する場合、 str は数字だけで構成されていると判断できます。
# これらのヒントを利用して問題を解いてみてください。
str = "1111"
if str.to_i.to_s == str.to_s
puts "All numeric"
elsif str.downcase == str.to_s
puts "All lowercase"
elsif
str.upcase == str.to_s
puts "All uppercase"
else
puts "Mixed"
end
upcaseメソッド
upcaseメソッドは、文字列の中のすべてのアルファベット文字を大文字に変換します。
str = "Hello World!"
str.upcase # "HELLO WORLD!" を返します
downcaseメソッド
downcaseメソッドは、文字列の中のすべてのアルファベット文字を小文字に変換します。
str = "Hello World!"
str.downcase # "hello world!" を返します
問題4
# 配列内の各数字を2倍にした新しい配列を生成してください。ただし、数字が10以上の場合はその数字をそのまま残し、10未満の数字だけを2倍にします。
# 例えば、以下のような配列が与えられた場合:
# ruby
# Copy code
# numbers = [4, 10, 15, 6, 8]
# 出力結果は以下のようになるべきです:
# ruby
# Copy code
# [8, 10, 15, 12, 16]
# この問題を解決するためには、forループとifステートメントを組み合わせて使用します。以下に、問題を解決するための一部分のヒントを示します:
# ruby
# Copy code
# new_numbers = []
# for number in numbers
# # ここで if ステートメントを使用して条件を書く
# end
# 上記のコードを完成させて、期待される結果を得られるようにしてみてください。
numbers = [4, 10, 15, 6, 8]
new_numbers = []
for number in numbers do
if number < 10
new_numbers.push(number * 2)
elsif number >= 10
new_numbers.push(number)
end
end
print "#{new_numbers}\n"
pushメソッド
push メソッドは配列に要素を追加するためのメソッドです。
配列の末尾に一つ以上の要素を追加することができます!
numbers = [1, 2, 3]
numbers.push(4)
puts numbers # => [1, 2, 3, 4]
push メソッドは複数の引数を受け取ることが可能で、複数の要素を一度に追加することもできます!
numbers = [1, 2, 3]
numbers.push(4, 5, 6)
puts numbers # => [1, 2, 3, 4, 5, 6]
printメソッド
print メソッドは、指定したオブジェクトを標準出力(通常はコンソールや端末)に出力するメソッドです。
putsとprintは配列を出力する方法が異なります。
puts [1, 2, 3]
# 1
# 2
# 3
# と出力されます。
print [1, 2, 3]
# [1, 2, 3]
# と出力されます。
改行の扱い
putsは出力した後に自動的に改行を追加しますが、printは改行を追加しません。
つまり、putsは出力する文字列の後ろに\n(改行文字)を自動的に追加します。
puts "Hello" # "Hello"と出力した後に改行が追加されます。
print "Hello" # "Hello"と出力するだけで、改行は追加されません。
問題5
# students = [
# { name: "Alice", grade: 90 },
# { name: "Bob", grade: 80 },
# { name: "Charlie", grade: 85 },
# { name: "David", grade: 95 },
# { name: "Eve", grade: 87 }
# ]
# # 全ての学生の平均点を算出し、平均点以上の点数を取った学生のみを出力するプログラムを作成してください。
# # その際、学生の名前と点数を表示してください。
# この問題では、学生全体の平均点を算出し、その平均点を超えた学生のみを出力することが求められています。学生の情報は、名前と点数を含むハッシュの配列として与えられています。
# この問題に取り組む際には、まず学生全体の平均点を算出すること、次にその平均点を超える学生を選び出すこと、そして最後にその学生の名前と点数を出力すること、という3つのステップに分けて考えることができます。この各ステップを、forループを使ってどのように実装するかを考えてみてください。
# なお、平均点の計算では合計点と学生の数が必要になりますが、これらは配列のメソッドを使って取得することができます。また、出力の際には、学生の名前と点数が一緒に出力されるように注意してください。
students = [
{ name: "Alice", grade: 90 },
{ name: "Bob", grade: 80 },
{ name: "Charlie", grade: 85 },
{ name: "David", grade: 95 },
{ name: "Eve", grade: 87 }
]
average = students.inject(0) {|sum, hash| sum + hash[:grade]} / students.length
for student in students
if average <= student[:grade]
puts "#{student[:name]}:""#{student[:grade]}"
end
end
問題6
# あなたは以下の配列が与えられています:
# ruby
# Copy code
# students = [
# { name: "Alice", scores: [88, 76, 93, 85, 93] },
# { name: "Bob", scores: [78, 79, 85, 86, 85] },
# { name: "Charlie", scores: [95, 96, 92, 88, 92] },
# { name: "David", scores: [92, 90, 83, 78, 88] },
# { name: "Eve", scores: [91, 92, 85, 88, 86] }
# ]
# 各生徒の平均得点を計算し、平均が90以上の生徒の名前とその平均得点を表示するRubyプログラムを作成してください。さらに、それぞれの生徒の最高得点と最低得点も表示してください。
# ヒント:
# eachメソッドを使用して配列を反復処理します。各生徒について、スコア配列を使用して平均を計算します。平均が90以上の場合、その生徒の名前と平均得点、最高得点、最低得点を表示します。
students = [
{ name: "Alice", scores: [88, 76, 93, 85, 93] },
{ name: "Bob", scores: [78, 79, 85, 86, 85] },
{ name: "Charlie", scores: [95, 96, 92, 88, 92] },
{ name: "David", scores: [92, 90, 83, 78, 88] },
{ name: "Eve", scores: [91, 92, 85, 88, 86] }
]
students.each do |student|
average = student[:scores].sum.to_f / student[:scores].length
max = student[:scores].max
min = student[:scores].min
if average >= 90
puts "#{student[:name]}: Average:#{average} Max:#{max} Min:#{min}"
end
end
学生の時、こんな数学なんて将来どこで使うんとか思ってたけど、
無駄な勉強ってやっぱりないんだなって思い知らされてます笑
基礎中の基礎なので実際解けるかはわかりませんが、
やれるとこまで頑張ろう〜
Discussion
継続して記事書いてて尊敬!
最近、内輪でアルゴリズムが賑わいだしてるから参考までに!
コメントありがとうございます!
なんとか続いてます笑
あの時の三項演算子!めちゃスリムなりますね!
書き方気を配れてなかったので助かります🙇🏻♀️
わたしも慣れていかなければです🫡