金曜日, 5月 23, 2025
No menu items!
ホーム ブログ ページ 3134

「ライドカメンズ」初の大型リアルイベントが東京で6月29日に開催決定。声優陣がトークショーや朗読劇などを繰り広げる



「ライドカメンズ」初の大型リアルイベントが東京で6月29日に開催決定。声優陣がトークショーや朗読劇などを繰り広げる

 バンダイカード事業部は本日,スマホアプリ「ライドカメンズ」初の大型リアルイベント「ライドカメンズ1stAnniversaryParty〜仮面の宴2025〜」を,東京都のベルサール新宿グランドで2025年6月29日に開催すると発表した。イベントでは,声優陣がトークショーや朗読劇などを繰り広げる。



Source link

Views: 0

『ゼンレスゾーンゼロ』新たにXbox版がリリース決定!実は“エイプリルフールネタと見せかけた伏線”で匂わせていた



『ゼンレスゾーンゼロ』新たにXbox版がリリース決定!実は“エイプリルフールネタと見せかけた伏線”で匂わせていた

『ゼンレスゾーンゼロ』新たにXbox版がリリース決定!実は“エイプリルフールネタと見せかけた伏線”で匂わせていた



Source link

Views: 0

Ruby練習問題:教室予約システム(複数教室・分割割当対応) #プログラミング – Qiita



Ruby練習問題:教室予約システム(複数教室・分割割当対応) #プログラミング - Qiita

はじめに

この記事では、Ruby を使って「教室の予約システム」を実装します。
複数の教室を使って希望人数を収容するために、時間の重なりや定員制限を考慮したロジックを組み立てていきます。

このコードは、正直に言うと自分もスラスラとは書けませんでした。
でも、繰り返し読み解き、何も見ずに実装できるようになることを目指して練習しています。

Ruby の基本はわかっていても、設計力・論理的思考を磨きたい方にとっても実践的な題材になるはずです。

問題概要

あなたは学校の予約システムの開発を任されました。
このシステムでは、複数の教室を組み合わせて予約人数を満たすことが求められます。
各教室には定員があり、空いている時間帯かつ定員内であれば、複数の教室に分けて予約可能です。

仕様

  • 教室は複数存在し、各教室には定員があります。
  • 予約は次の情報を持ちます:
    • date:予約日(文字列 “2025-04-20” など)
    • start_time:開始時刻(文字列 “10:00” など)
    • end_time:終了時刻(文字列 “11:00” など)
    • people:予約人数(整数)

条件

  • 教室は 収容人数の少ない順に 優先して利用されます(例:A → B → C)
  • 予約の時間帯が他の予約と重なっている教室は使用できません
  • 予約人数を満たすために、複数の教室を分割して組み合わせて使用可能
  • すべての教室を使っても人数が足りない場合、予約は失敗
  • 処理後、予約成功/失敗の結果を出力し、教室ごとの予約スケジュールも一覧表示

入力例

以下の教室と定員が設定されています:

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

解説

全体構成と思考の流れ

この問題で実現したいことは?

  1. 複数の教室を使って、希望人数を満たす予約処理
  2. 重複(時間帯の重なり)がない教室を優先的に使う
  3. なるべく定員が小さい順に割り当てる
  4. 予約できたらログへ追加、できなければ失敗と出力
  5. 最終的に教室別の予約状況を一覧表示

コード解説:ブロックごとに丁寧に

1. 教室の定義と予約データ

# 教室定義(小さい順)
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] = [] }

解説

  • classroom_capacity: 教室ごとの定員(ここでは3教室)
  • reservations_log: 教室ごとの予約履歴を保持するハッシュ
    • Hash.new { |h, k| h[k] = [] } は、教室名ごとに空配列を初期化できるテク

2. 重複チェックのヘルパー関数

# 新しい予約と既存の予約が同じ日で、かつ時間帯が重なっているかを判定する。重なっているときは 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

思考のポイント

  • 同じ日の予約だけを比較
  • Rubyの Time.parse を使って時間比較を行う
  • 時間の重なり判定の定番パターン
    → “終了時間

✅ 重ならないパターン(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

3. メイン処理:予約を教室に振り分ける

# 予約管理
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 = []

4. 教室を1つずつ見て、予約できるか判断

 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

思考ポイント

  • 教室ごとに、既存の予約と重ならないかチェック
  • people_left と教室のキャパ cap の小さい方だけ割り当て
  • この段階では予約ログに追加せず、一時的に保留しておくのが肝!

5. 予約が成功か失敗かを判断し、ログに反映

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

思考の流れ

  • people_left == 0 → すべての人数を割り当てられた!
    • ⇒ 一時ログを本物のログへ追加
  • 満たせなかったら puts だけして、ログには何も追加しない!

これが最も重要な修正ポイントでした。

6. 最後に予約スケジュールを教室別に出力

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 のストーリーもご覧いただけるととても嬉しいです!





Source link

Views: 0

ローソン、「崩壊スターレイル」キャンペーンを本日4月8日より開催 – GAME Watch


 ローソンは、HoYoverseのRPG「崩壊:スターレイル」とコラボレーションしたキャンペーンを本日4月8日より実施する。

 キャンペーンでは、期間中に全国のローソン店舗にて対象の商品を購入すると、「崩壊:スターレイル」のキャラクターたちがデザインされたオリジナルの「クリアファイル」・「ステッカー」が先着・数量限定でもらえる。

 また、コラボパッケージのオリジナルフード「きのこの山」と「たけのこの里」、「ガルボ」シリーズが4月8日より順次登場。オリジナルフードを購入すると、ゲーム内アイテムが手に入る。他にも、キャラクターたちがデザインされたオリジナルグッズの店頭販売および予約販売が行なわれる。

「オリジナルクリアファイル」が先着・数量限定でもらえる!

 対象の菓子を3点購入すると、「オリジナルクリアファイル」が1枚もらえる。1人1店舗の買い物につき各種1枚、計6枚まで。

全6種(各店計24枚)

※サイズ:約220×310mm
※素材:PP(再生PP含む)

対象商品はこのPOPが目印

「オリジナルクリアファイル」が先着・数量限定でもらえる!

 対象のゼリー飲料を2点購入すると、「オリジナルクリアファイル」が1枚もらえる。1人1店舗の買い物につき各種1枚、計6枚まで。

全6種(各店計24枚)

※サイズ:約52×156mm
※素材:合成紙

コラボパッケージのオリジナルフードが登場!

 コラボパッケージのオリジナルフード「きのこの山」と「たけのこの里」、「ガルボ」シリーズが4月8日より順次発売される。

「きのこの山」

ローソン標準価格:899円
オリジナルクリアカード1パック入り 全2種

「たけのこの里」

ローソン標準価格:899円
オリジナルクリアカード1パック入り 全2種

※サイズ:約89×63mm
※素材:PP
※オリジナルクリアカードはランダムとなっており、絵柄は選べない。
※画像はイメージ。
※商品名、デザイン、仕様、売価、発売日などは変更になる場合がある。

「ガルボ」シリーズ

「ガルボ チョコポケットパック」

ローソン標準価格:899円
オリジナルマグネットシート1枚入り 全2種

「ガルボ つぶ練り苺ポケットパック」

ローソン標準価格:899円
オリジナルマグネットシート1枚入り 全2種

「ガルボ ほろにがポケットパック」

ローソン標準価格:899円
オリジナルマグネットシート1枚入り 全2種

※サイズ:約70×70mm
※素材:紙・磁石
※オリジナルマグネットシートはランダムとなっており、絵柄は選べない。
※画像はイメージ。
※商品名、デザイン、仕様、売価、発売日などは変更になる場合がある。

オリジナルフード購入でゲーム内アイテムがもらえる!

 オリジナルフードには、ゲーム内アイテムが手に入るシリアルコードが同梱されている。シリアルコードの有効期限は5月21日23時59分まで。

※1つのシリアルコードは、1回のみ使用可能。同じキャラクターは5回まで交換することができる。

数量限定! オリジナルグッズが登場

店頭販売

4月8日~順次発売
※北海道・九州・中国地域と愛媛県は4月9日からの発売

アクリルバッジ(全6種)

価格:各880円
販売場所:コミック棚

※サイズ:約60×90mm
※素材:アクリル
※@Loppi・HMV&BOOKS onlineではキャラクターごとのアクリルバッジ+アクリルキーホルダーでの販売(税込1,870円)となる。

アクリルキーホルダー(全6種)

価格:各990円
販売場所:コミック棚

※サイズ:(大パーツ)約70×60mm内、(小パーツ)約20×50mm内
※素材:アクリル
※@Loppi・HMV&BOOKS onlineではキャラクターごとのアクリルバッジ+アクリルキーホルダーでの販売(税込1,870円)となる。

予約販売(@Loppi・HMV 限定グッズ)

【@Loppi・HMV 販売スケジュール】
受付期間:4月8日10時~5月12日23時30分
お渡し日:9月18日

キャンバスボード(全6種)

価格:各3,630円

デスクマット(全6種)

価格:各3,850円

ステンレスタンブラー(全6種)

価格:各3,300円

※コラボ店にて数量限定で先行販売を実施。

予約販売(ローソン・@Loppi・HMV 限定グッズ)

【@Loppi・HMV 販売スケジュール】
受付期間:4月8日10時~5月12日23時30分
お渡し日:9月18日

キャラセット(全6種)

価格:各1,870円
セット内容
・アクリルバッジ
・アクリルキーホルダー





Source link

Views: 0

「日本ゲーム大賞2025」年間作品部門の一般投票が6月9日より開始。昨年4月1日~今年5月31日までに発売されたゲームを対象に、ここ1年を代表するゲームを決める




昨年4月1日~今年5月31日までに発売されたゲームを対象に、ここ1年を代表するゲームを決める。投票すると抽選でPS5 ProやNintendo Switchが当たるキャンペーンも



Source link

Views: 0

「ファントムバスターズ×ファボテリア」5月9日よりコラボ決定!ネオショコ先生の描き下ろしが爆イケ


「ファントムバスターズ×ファボテリア」

「ファントムバスターズ×ファボテリア」コラボ決定

2025年5月9日(金)〜6月3日(火)の期間に、池袋店となんば店にてテイクアウトドリンクとグッズが販売されます。

 

また本コラボでは、作者・ネオショコ先生描き下ろしの宍喰野虎落・是岸遊人・観崎薫・多聞康太郎が登場しますよ。

 

Xでは「かわいー!たのしみ」「嬉しすぎる」といった反応が寄せられていました。

 

詳細は2025年4月18日(金)12:00に解禁されますので、公式Xの更新をお見逃しなく!

 



Source link

Views: 1

「スイッチ2」画面保護フィルムやポーチ、カードケースなど19種のアイテムが本体と同日発売!新しいゲーム機を傷から守ろう



「スイッチ2」画面保護フィルムやポーチ、カードケースなど19種のアイテムが本体と同日発売!新しいゲーム機を傷から守ろう

「スイッチ2」画面保護フィルムやポーチ、カードケースなど19種のアイテムが本体と同日発売!新しいゲーム機を傷から守ろう



Source link

Views: 0

日本製鉄のUSスチール買収計画 トランプ大統領 再審査を指示



日本製鉄のUSスチール買収計画 トランプ大統領 再審査を指示

アメリカのバイデン前大統領が禁止命令を出した、日本製鉄による大手鉄鋼メーカー、USスチールの買収計画をめぐってトランプ大統領は買収計画を審査するアメリカ政府のCFIUS=対米外国投資委員会に対し、再び審査を実施するよう指示する文書に署名しました。



Source link

Views: 0

NYダウ乱高下 関税巡り虚偽報道



NYダウ乱高下 関税巡り虚偽報道

NYダウ乱高下 関税巡り虚偽報道



Source link

Views: 0