バンダイカード事業部は本日,スマホアプリ「ライドカメンズ」初の大型リアルイベント「ライドカメンズ1stAnniversaryParty〜仮面の宴2025〜」を,東京都のベルサール新宿グランドで2025年6月29日に開催すると発表した。イベントでは,声優陣がトークショーや朗読劇などを繰り広げる。
Source link
Views: 0
バンダイカード事業部は本日,スマホアプリ「ライドカメンズ」初の大型リアルイベント「ライドカメンズ1stAnniversaryParty〜仮面の宴2025〜」を,東京都のベルサール新宿グランドで2025年6月29日に開催すると発表した。イベントでは,声優陣がトークショーや朗読劇などを繰り広げる。
Source link
Views: 0
『ゼンレスゾーンゼロ』新たにXbox版がリリース決定!実は“エイプリルフールネタと見せかけた伏線”で匂わせていた
Source link
Views: 0
この記事では、Ruby を使って「教室の予約システム」を実装します。
複数の教室を使って希望人数を収容するために、時間の重なりや定員制限を考慮したロジックを組み立てていきます。
このコードは、正直に言うと自分もスラスラとは書けませんでした。
でも、繰り返し読み解き、何も見ずに実装できるようになることを目指して練習しています。
Ruby の基本はわかっていても、設計力・論理的思考を磨きたい方にとっても実践的な題材になるはずです。
あなたは学校の予約システムの開発を任されました。
このシステムでは、複数の教室を組み合わせて予約人数を満たすことが求められます。
各教室には定員があり、空いている時間帯かつ定員内であれば、複数の教室に分けて予約可能です。
以下の教室と定員が設定されています:
classroom_capacity = {
"A" => 25,
"B" => 20,
"C" => 25
}
予約のリストは以下です:
reservations = [
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 25 },
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 40 },
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 10 },
{ date: "2025-04-20", start_time: "11:00", end_time: "12:00", people: 50 },
{ date: "2025-04-21", start_time: "09:00", end_time: "10:00", people: 70 },
{ date: "2025-04-21", start_time: "10:00", end_time: "11:00", people: 71 }
]
予約成功: 2025-04-20 10:00〜11:00 → 教室A (25人)
予約成功: 2025-04-20 10:00〜11:00 → 教室B (20人) + 教室C (20人)
予約失敗: 教室が満室か、収容人数オーバーです
予約成功: 2025-04-20 11:00〜12:00 → 教室A (25人) + 教室B (20人) + 教室C (5人)
予約成功: 2025-04-21 09:00〜10:00 → 教室A (25人) + 教室B (20人) + 教室C (25人)
予約失敗: 教室が満室か、収容人数オーバーです
--- 教室別予約スケジュール ---
[教室A]
2025-04-20 10:00〜11:00 (25人)
2025-04-20 11:00〜12:00 (25人)
2025-04-21 09:00〜10:00 (25人)
[教室B]
2025-04-20 10:00〜11:00 (20人)
2025-04-20 11:00〜12:00 (20人)
2025-04-21 09:00〜10:00 (20人)
[教室C]
2025-04-20 10:00〜11:00 (20人)
2025-04-20 11:00〜12:00 (5人)
2025-04-21 09:00〜10:00 (25人)
require "time"
# 教室定義(小さい順)
classroom_capacity = {
"A" => 25,
"B" => 20,
"C" => 25
}
# テストデータ
reservations = [
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 25 }, # A(25)
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 40 }, # A(使えない), B(20), C(20)
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 10 }, # 全教室重複→失敗
{ date: "2025-04-20", start_time: "11:00", end_time: "12:00", people: 50 }, # A(25) + B(20) + C(5)
{ date: "2025-04-21", start_time: "09:00", end_time: "10:00", people: 70 }, # A + B + Cぴったり
{ date: "2025-04-21", start_time: "10:00", end_time: "11:00", people: 71 } # オーバー → 失敗
]
# 教室別の予約ログ
reservations_log = Hash.new { |h, k| h[k] = [] }
# 重複チェック
def overlaps?(new_res, existing_res)
# 日付が違えば時間帯が重なることはないので、すぐに false(重なっていない)を返す。
return false if new_res[:date] != existing_res[:date]
new_start = Time.parse(new_res[:start_time])
new_end = Time.parse(new_res[:end_time])
existing_start = Time.parse(existing_res[:start_time])
existing_end = Time.parse(existing_res[:end_time])
# 重なっているときは true を返す
!(new_end existing_start || existing_end new_start)
end
# 予約処理
reservations.each do |res|
people_left = res[:people]
reserved_rooms = []
temp_log = []
classroom_capacity.each do |room, cap|
conflict = reservations_log[room].any? { |exist| overlaps?(res, exist) }
next if conflict
allocatable = [people_left, cap].min
next if allocatable == 0
temp_log [room, res.merge(people: allocatable)]
reserved_rooms [room, allocatable]
people_left -= allocatable
end
if people_left 0
temp_log.each { |room, entry| reservations_log[room] entry }
rooms_output = reserved_rooms.map { |r, n| "教室#{r} (#{n}人)" }.join(" + ")
puts "予約成功: #{res[:date]} #{res[:start_time]}〜#{res[:end_time]} → #{rooms_output}"
else
puts "予約失敗: 教室が満室か、収容人数オーバーです"
end
end
# スケジュール出力
puts "\n--- 教室別予約スケジュール ---\n\n"
classroom_capacity.keys.each do |room|
puts "[教室#{room}]"
sorted = reservations_log[room].sort_by { |r| [r[:date], r[:start_time]] }
if sorted.empty?
puts "なし"
else
sorted.each do |r|
puts "#{r[:date]} #{r[:start_time]}〜#{r[:end_time]} (#{r[:people]}人)"
end
end
puts
end
# 教室定義(小さい順)
classroom_capacity = {
"A" => 25,
"B" => 20,
"C" => 25
}
# テストデータ
reservations = [
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 25 }, # A(25)
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 40 }, # A(使えない), B(20), C(20)
{ date: "2025-04-20", start_time: "10:00", end_time: "11:00", people: 10 }, # 全教室重複→失敗
{ date: "2025-04-20", start_time: "11:00", end_time: "12:00", people: 50 }, # A(25) + B(20) + C(5)
{ date: "2025-04-21", start_time: "09:00", end_time: "10:00", people: 70 }, # A + B + Cぴったり
{ date: "2025-04-21", start_time: "10:00", end_time: "11:00", people: 71 } # オーバー → 失敗
]
# 教室別の予約ログ
reservations_log = Hash.new { |h, k| h[k] = [] }
解説
# 新しい予約と既存の予約が同じ日で、かつ時間帯が重なっているかを判定する。重なっているときは true を返す。
# new_res は新しく予約しようとしているデータ、existing_res は既に予約されているデータ
def overlaps?(new_res, existing_res)
# 日付が違えば時間帯が重なることはないので、すぐに false(重なっていない)を返す。
return false if new_res[:date] != existing_res[:date]
new_start = Time.parse(new_res[:start_time])
new_end = Time.parse(new_res[:end_time])
existing_start = Time.parse(existing_res[:start_time])
existing_end = Time.parse(existing_res[:end_time])
!(new_end existing_start || existing_end new_start)
end
思考のポイント
✅ 重ならないパターン(false)
# パターン①:新しい予約が前に終わってる(new_end
new: ┌──────┐
10:00 11:00
exist: ┌──────┐
12:00 13:00
# パターン②:新しい予約が後から始まる(existing_end
exist: ┌──────┐
9:00 10:00
new: ┌──────┐
10:30 11:30
❌ 重なるパターン(true)
# パターン①:完全に中に入ってる
exist: ┌──────────────┐
9:00 12:00
new: ┌──────┐
10:00 11:00
# パターン②:少しだけかぶってる(前)
exist: ┌──────┐
10:00 11:00
new: ┌──────┐
9:30 10:30
# パターン③:少しだけかぶってる(後)
exist: ┌──────┐
9:30 10:30
new: ┌──────┐
10:00 11:00
# パターン④:完全にかぶってる
exist: ┌──────┐
10:00 11:00
new: ┌──────┐
10:00 11:00
# 予約管理
reservations.each do |res|
# 残りの予約人数(最初は希望人数そのまま) 例: 70
p "default_people_left"
p people_left = res[:people]
# 成功時の出力用に記録 例: [["A", 25], ["B", 20], ["C", 25]]
reserved_rooms = []
# 実際に予約ログへ追加する前に、一時保存しておく
# 例: [["A", {:date=>"2025-04-20", :start_time=>"11:00", :end_time=>"12:00", :people=>25}], ["B", {:date=>"2025-04-20", :start_time=>"11:00", :end_time=>"12:00", :people=>20}]]
temp_log = []
classroom_capacity.each do |room, cap|
# その教室の予約ログに、今回の予約と時間が重なる予約が1つでもあるかをチェック
conflict = reservations_log[room].any? { |exist| overlaps?(res, exist) }
# 重なっていたら、この教室はスキップ
next if conflict
# その教室に割り当て可能な人数(残り人数と教室の定員の小さい方)
allocatable = [people_left, cap].min
# 割り当て可能人数が0なら、この教室もスキップ
next if allocatable == 0
# この教室に予約を一時的に記録(実際に確定するのは後)
# mergeでpeopleを教室に割り当てる人数に上書きする (ハッシュ.merge)
p "temp_log"
p temp_log [room, res.merge(people: allocatable)]
# 教室と人数の組を予約済みリストに追加(出力用)
p "reserved_rooms"
p reserved_rooms [room, allocatable]
# 割り当てた分だけ残りの人数を減らす 例: 46
p "people_left"
p people_left -= allocatable
end
思考ポイント
if people_left 0
# 一時的に記録しておいた予約情報 temp_log を、実際の予約ログ reservations_log に書き込む。
temp_log.each { |room, entry| reservations_log[room] entry }
# 予約に使われた教室と人数の情報を文字列に整形して出力用にする。
# 例:[["A", 25], ["B", 20]] → "教室A (25人) + 教室B (20人)"
rooms_output = reserved_rooms.map { |r, n| "教室#{r} (#{n}人)" }.join(" + ")
puts "予約成功: #{res[:date]} #{res[:start_time]}~#{res[:end_time]} → #{rooms_output}"
else
puts "予約失敗: 教室が満室か、収容人数オーバーです"
end
end
思考の流れ
これが最も重要な修正ポイントでした。
puts "\n--- 教室別予約スケジュール ---\n\n"
classroom_capacity.keys.each do |room|
puts "[教室#{room}]"
sorted = reservations_log[room].sort_by { |r| [r[:date], r[:start_time]] }
if sorted.empty?
puts "なし"
else
sorted.each do |r|
puts "#{r[:date]} #{r[:start_time]}〜#{r[:end_time]} (#{r[:people]}人)"
end
end
puts
end
解説
株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら
弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
この記事が少しでも学びになったという方は、ぜひ wantedly のストーリーもご覧いただけるととても嬉しいです!
Views: 0
ローソンは、HoYoverseのRPG「崩壊:スターレイル」とコラボレーションしたキャンペーンを本日4月8日より実施する。
キャンペーンでは、期間中に全国のローソン店舗にて対象の商品を購入すると、「崩壊:スターレイル」のキャラクターたちがデザインされたオリジナルの「クリアファイル」・「ステッカー」が先着・数量限定でもらえる。
また、コラボパッケージのオリジナルフード「きのこの山」と「たけのこの里」、「ガルボ」シリーズが4月8日より順次登場。オリジナルフードを購入すると、ゲーム内アイテムが手に入る。他にも、キャラクターたちがデザインされたオリジナルグッズの店頭販売および予約販売が行なわれる。
対象の菓子を3点購入すると、「オリジナルクリアファイル」が1枚もらえる。1人1店舗の買い物につき各種1枚、計6枚まで。
※サイズ:約220×310mm
※素材:PP(再生PP含む)
対象のゼリー飲料を2点購入すると、「オリジナルクリアファイル」が1枚もらえる。1人1店舗の買い物につき各種1枚、計6枚まで。
※サイズ:約52×156mm
※素材:合成紙
コラボパッケージのオリジナルフード「きのこの山」と「たけのこの里」、「ガルボ」シリーズが4月8日より順次発売される。
オリジナルフードには、ゲーム内アイテムが手に入るシリアルコードが同梱されている。シリアルコードの有効期限は5月21日23時59分まで。
※1つのシリアルコードは、1回のみ使用可能。同じキャラクターは5回まで交換することができる。
4月8日~順次発売
※北海道・九州・中国地域と愛媛県は4月9日からの発売
価格:各880円
販売場所:コミック棚
※サイズ:約60×90mm
※素材:アクリル
※@Loppi・HMV&BOOKS onlineではキャラクターごとのアクリルバッジ+アクリルキーホルダーでの販売(税込1,870円)となる。
【@Loppi・HMV 販売スケジュール】
受付期間:4月8日10時~5月12日23時30分
お渡し日:9月18日
価格:各3,630円
価格:各3,850円
価格:各3,300円
※コラボ店にて数量限定で先行販売を実施。
【@Loppi・HMV 販売スケジュール】
受付期間:4月8日10時~5月12日23時30分
お渡し日:9月18日
価格:各1,870円
セット内容
・アクリルバッジ
・アクリルキーホルダー
【予告】4/8(火)より「崩壊:スターレイル」のキャンペーンが開始!
対象商品購入でオリジナルグッズがもらえるなど、企画が盛りだくさんです♪
詳細はキャンペーンサイトをチェックしてみてください(^^)#ローソン#崩壊スターレイルhttps://t.co/WJMeTSyjdhpic.twitter.com/2GKkZV4w3V— ローソン (@akiko_lawson)March 31, 2025
Views: 0
昨年4月1日~今年5月31日までに発売されたゲームを対象に、ここ1年を代表するゲームを決める。投票すると抽選でPS5 ProやNintendo Switchが当たるキャンペーンも
Source link
Views: 0
プレイできるのは1分程度でゲームで遊ぶというより、雰囲気を味わう程度のデモ版です。
Source link
Views: 0
2025年5月9日(金)〜6月3日(火)の期間に、池袋店となんば店にてテイクアウトドリンクとグッズが販売されます。
また本コラボでは、作者・ネオショコ先生描き下ろしの宍喰野虎落・是岸遊人・観崎薫・多聞康太郎が登場しますよ。
Xでは「かわいー!たのしみ」「嬉しすぎる」といった反応が寄せられていました。
詳細は2025年4月18日(金)12:00に解禁されますので、公式Xの更新をお見逃しなく!
Views: 1
「スイッチ2」画面保護フィルムやポーチ、カードケースなど19種のアイテムが本体と同日発売!新しいゲーム機を傷から守ろう
Source link
Views: 0
アメリカのバイデン前大統領が禁止命令を出した、日本製鉄による大手鉄鋼メーカー、USスチールの買収計画をめぐってトランプ大統領は買収計画を審査するアメリカ政府のCFIUS=対米外国投資委員会に対し、再び審査を実施するよう指示する文書に署名しました。
Source link
Views: 0