土曜日, 5月 24, 2025
No menu items!
ホーム ブログ ページ 3263

アバック横浜、ECLIPSE「TD510シリーズ」の5.2.4chマルチチャンネル試聴会を4/12-20開催



アバック横浜、ECLIPSE「TD510シリーズ」の5.2.4chマルチチャンネル試聴会を4/12-20開催

アバック横浜は、ECLIPSEブランドのスピーカーシステムによる5.2.4chマルチチャンネル試聴会を、4月12日(土)から4月20日(日)まで開催する。全日にわたって事前予約を推奨している。



Source link

Views: 1

東京全660駅に対応! NAVITIME「エレベーター優先ルート」検索可能に



東京全660駅に対応! NAVITIME「エレベーター優先ルート」検索可能に

総合ナビゲーションアプリ『NAVITIME』と乗換案内アプリ『乗換NAVITIME』で4月7日、バリアフリー情報が拡充した。東京全駅のエレベーター情報を考慮し、階段を避けたルート検索が可能になった。



Source link

Views: 0

クリスのコーナー:Monaspace – Codepen


私は新しいコーディングフォントの吸盤です。私は通常、あなたが使用するコーディングフォントが生産性に大きな影響を与えるとは思わないので(気を散らしていない限り)、おならをして切り替えるのは楽しいことです。部屋の家具を押しのけたり、別の自転車ルートをとって仕事をしています。

だから私を数えてください Githubの新しいモノスペースコーディングフォントのセットで遊ぶため: モナスパース

(言及せずに遠くに行く前に、あなたはあなたの訪問だけでCodePenでそれらを使用できます エディター設定 そして1つを選んでください。)

5つの異なる様式化されたバージョンだけが存在するという事実は、かなり価値のあるメモですが、かなりクールな他のさまざまな機能があります。 テクスチャヒーリング 構成された用語のように感じますが、それがすることは理解するのが非常に簡単で、はっきりと便利です。

基本的には、ワイドレターは自分自身を削る必要がなく、狭い文字は自分自身を誇張する必要はありません。彼らは言う:

テクスチャヒーリングは、より多くのスペースが必要であり、多すぎる隣接する文字の各ペアを見つけることで機能します。狭いキャラクターは、白人の一部を譲るものと交換され、より広い文字は、箱の端まで伸びるものと交換されます。

これは、OpenType機能「コンテキスト代替」で行われます。それは、特定のキャラクターの組み合わせが一緒に最適に機能する新しいグリフにフロップして、わずかに異なります。

モナスパースにも結晶があります。合字は、フォントのコーディングではかなり物議を醸しています。たとえば、一部の人々は本当にそれを嫌っています != に変わるかもしれません それはあなたが書いているかもしれない言語の文字通りの構文からの逸脱のような結晶として。彼らは私のお気に入りではありませんが、それはしっかりと保持されている意見ではなく、それらを使用しないだけで簡単です。 (CodePenでは、一部の初心者にとっては混乱しているように見えるため、有効になっていません。)

それらは可変フォントとして来ます。これは、可変フォントがルールするため、私が気に入っています。そして、それは1つのわずかな軸を持つ可変フォントに電話されたものではなく、重量です、 そして 幅、 そして スラント、それは素晴らしいです。

ダウンロードには、可変バージョンと非変動バージョンの両方が付属しています。可変性を使用する予定がない場合、可変フォントは桁違いに大きいため、おそらく変数バージョンを使用してください。ウェブ上にない場合、おそらく問題ではありません。また、彼らは出荷しただけです .woff そしてそうではありません .woff2

彼らがこの「スーパーファミリー」の周りに持っている私の非常に好きなアイデアは、同じUIでさまざまな理由でそれらを混合して一致させるというアイデアです。

斜体の単階建てを持つという考えは、ますます一般的になり始めています。 OGを叫ぶ必要があります オペレーター その地面を壊すために。斜体でコメントを設定することは、私にとって非常にクールなアイデアです。今、私たちはそのためにラドンを使用することができました。上の画像では、XenonとGithub Copilotを使用してKryptonを使用したJSDOCスタイルのコメントを提案しています。大好きです。それを出荷します。 (しかし、VSコードではまだ可能だとは思いませんが、Microsoftが両方を作ることを考慮すると、それが来ると思います。)

それを可能にするには、基本的に、コードのさまざまな側面を簡単に識別できるトークン/クラスを提供するための構文強調表示ツールが必要です。それは確かに可能であり、おそらくそれほど難しいことではありませんが、おそらく非常に多くのサードパーティのテーマで展開するのはややトリッキーなことです。

とにかく、これはどれほど素晴らしいですか?


さまざまなコーディングフォントで再生されている場合は、Codepenに20を超えるものがあるという事実を確認してください。しかし、もちろん、野生にはそれ以上のものがあります。 「遊び心と楽しい」コーディングフォントの風景についての素晴らしい読み物は ダグ・ウィルソンのキャラクターのコーディング。 Doug Dug(ha)IBMの「Selectric」タイプのサンプルのこの素晴らしい例(文字通り異なるタイプライターフォントは、タイプライターの金属ボールを交換することで交換できます):

とてもかっこいい!この新しいコーディングフォントの波は、誰もがそれを認識しているかどうかにかかわらず、ここで起こっていることへのコールバックのようなものであることが大好きです。ダグが最初に言及しているのは、私が使用したオペレーターです 年と年 それが出てきて、まだ愛している後。 2番目はコミックコードです:

私の最初の考え:これは冗談でなければなりませんよね?!コミックサン 評判が悪い そして、コーディングに使用することを意図したことはありませんでしたが、どうすれば…?それが狂った首謀者のトシ・オマガリが尋ねたように思われたことです。

彼は言う、「コミックコード 最も過剰に嫌われている書体のモノスパースの適応です。」私は尋ねたことはありませんが、彼の思考プロセスは次のようだったと感じています このGIF

信じられないかもしれません、 私はそれが実際に機能すると思います そして確かにあなたの顔に笑顔、または少なくともにやにや笑いをもたらします

完全に同意します!それは動作します!


私がコードベースにいる間、モナスパースフォントを入れている間、もちろん、一般的なコードのクリーンアップを行うことに抵抗することはできませんでした。 Monaspaceは発送のみをフォントします .woff、だから @font-face CSSでは、次のように簡単です。

@font-face {
  font-family: 'Font Name';
  src: url('./fonts/font.woff') format('woff');
}

あなたは逃げることができます のみ 最近のWoff2での出荷なので、その形式を持っているフォントのいくつかは、まさに私がやっていることです。これは、以前は大量のフォーマットを備えた過去にこのような複雑なコードであったため、そこでのシンプルさは素晴らしいと感じています。

それから私は最近学びました Ollie Williamsのブログ投稿から フォーマットを文字列としてもう配置する必要がないこと、キーワードは動作します。

@font-face {
  font-family: 'Font Name';
  src: url('./fonts/font.woff2') format(woff2);
}

それらのささいなことを感謝しなければなりません😍。他のクリーンアップについてはOllieの投稿をご覧ください @font-face 変数フォント、カラーフォント、その他のフォント「Tech」の指定方法を含みます。



Source link

Views: 0

「リネージュ2 Evaパッケージ」のリリース記念イベントをレポート。エルフに扮したコスプレイヤーのソフィー・Sさんが来場者をお出迎え



「リネージュ2 Evaパッケージ」のリリース記念イベントをレポート。エルフに扮したコスプレイヤーのソフィー・Sさんが来場者をお出迎え

 エヌ・シー・ジャパンは2025年4月5日,PC向けMMORPG「リネージュ2」の「Evaパッケージ」リリース記念イベントを,東京・ビックカメラ池袋にて開催した。会場ではコスプレイヤーやモデルとして活躍中のソフィー・S(ピーチミルキー)さんが来場者を出迎えてくれた。



Source link

Views: 0

[Ruby] 2次元配列とハッシュの操作を覚えよう #プログラミング – Qiita



[Ruby] 2次元配列とハッシュの操作を覚えよう #プログラミング - Qiita

はじめに

「配列とハッシュを相互変換する場面がよくあるのに、毎回ググってしまう…」
「ネストした構造になると一気に手が止まる…」
そんな方も多いのではないでしょうか?

このシリーズでは、Rubyでよく出てくる配列やハッシュの操作を整理しながら、実践的なコーディング問題を通じて着実に身につけることを目指します。

第1章:基礎固め

問題1:2次元配列の初期化と要素アクセス

問題文
3行4列の2次元配列を作り、すべての要素を0で初期化し、特定の要素にアクセスしてみましょう。

解説
Rubyでは、2次元配列は配列の配列として表現します。たとえば、matrix[1][2]は「2行目の3列目」にアクセスするという意味です。

コード例

rows = 3
cols = 4
matrix = Array.new(rows) { Array.new(cols, 0) }

p matrix #=> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

puts matrix[1][2] #=> 0

ポイント

  • Array.new(rows) { Array.new(cols, 0) } を使うと各行が独立した配列になります(重要)

  • Array.new(rows, Array.new(cols, 0)) は全行が同じオブジェクト参照になるので注意

問題2:ハッシュの基本操作(追加・更新・削除)

問題文
名前と年齢を持つハッシュを作成し、データの追加・更新・削除をしてみましょう。

コード例

people = { "Alice" => 25, "Bob" => 30 }

# 追加
people["Carol"] = 28

# 更新
people["Alice"] = 26

# 削除
people.delete("Bob")

puts people  #=> {"Alice"=>26, "Carol"=>28}

ポイント

  • people[“新しいキー”] = 値 で追加・更新
  • .delete(キー) で削除

問題3:2次元配列からハッシュへの変換

問題文
[[“Alice”, 25], [“Bob”, 30]] のような配列を、{ “Alice” => 25, “Bob” => 30 } に変換しましょう

コード例

array = [["Alice", 25], ["Bob", 30]]
hash = array.to_h
p hash  #=> {"Alice"=>25, "Bob"=>30}

ポイント

  • Rubyでは to_h で「配列の配列」からハッシュへの変換が簡単にできます
  • Hash[array] でも同様の変換が可能

問題4:ネストしたハッシュから値を取り出す

問題文
次のようなネスト構造のハッシュから、メールアドレスを取り出しましょう。

user = {
  name: "John",
  contact: {
    email: "[email protected]",
    phone: "090-1234-5678"
  }
}

puts user[:contact][:email]  #=> [email protected]

ポイント

  • Rubyでは :シンボル でアクセスすることが多い。
  • .dig(:contact, :email) を使えば、途中がnilでもエラーになりにくい。

問題5:ハッシュの値による並び替え

scores = { "A"=>3, "B"=>1, "C"=>2 }

sorted = scores.sort_by { |_, v| v }
p sorted #=> [["B", 1], ["C", 2], ["A", 3]]
puts sorted.to_h  #=> {"B"=>1, "C"=>2, "A"=>3}

ポイント

  • .sort_by { |k, v| v } で値でソート 配列を返す
  • .to_h でソートされた配列をハッシュに戻せる

基礎問題6:ハッシュから2次元配列への変換

問題文
以下のハッシュを、2次元配列に変換してください。

hash = { "Alice" => 25, "Bob" => 30 }
# 期待する出力:[["Alice", 25], ["Bob", 30]] 
hash = { "Alice" => 25, "Bob" => 30 }
array = hash.to_a
p array  #=> [["Alice", 25], ["Bob", 30]]

ポイント

  • .to_a を使えば、ハッシュは自動的に [key, value] ペアの配列になります。
  • この2次元配列は each でループしても扱いやすい。

応用例(ソート付き)
値の昇順に並べてから2次元配列に変換したい場合:

sorted_array = hash.sort_by { |k, v| v }
puts sorted_array.inspect  #=> [["Alice", 25], ["Bob", 30]]

キーの降順にソートするには (sort_by)

hash = { "Alice" => 25, "Bob" => 30, "Charlie" => 22, "Dave" => 28 }
# キーの文字コードを使った降順
array = hash.to_a.sort_by { |k, _v| -k.ord } 
p array  #=> [["Dave", 28], ["Charlie", 22], ["Bob", 30], ["Alice", 25]]

キーの降順にソートするには (sort)

hash = { "Alice" => 25, "Charlie" => 22, "Bob" => 30,  "Dave" => 28 }
array = hash.to_a.sort { |a, b| b[0]  a[0] }
p array  #=> [["Dave", 28], ["Charlie", 22], ["Bob", 30], ["Alice", 25]]

値の降順にソートするには (sort)

hash = { "Alice" => 25, "Charlie" => 22, "Bob" => 30,  "Dave" => 28 }
array = hash.to_a.sort { |a, b| b[1]  a[1] }
p array  #=> [["Bob", 30], ["Dave", 28], ["Alice", 25], ["Charlie", 22]]

第2章:実技演習

問題1:表形式のデータ整形(2次元配列 → 条件付き出力)

問題文
以下のような生徒データがある。
それぞれ「名前・点数・学年」が格納された2次元配列から、80点以上かつ3年生の生徒だけを出力してください。

students = [
  ["Alice", 85, 3],
  ["Bob", 78, 3],
  ["Carol", 92, 2],
  ["Dave", 88, 3]
]

期待する出力:

コード例

students = [
  ["Alice", 85, 3],
  ["Bob", 78, 3],
  ["Carol", 92, 2],
  ["Dave", 88, 3]
]

students.each do |name, score, grade|
  puts name if score >= 80 && grade == 3
end

問題2:単語出現カウント(ハッシュで集計)

問題文
与えられた単語のリストから、それぞれの単語が何回出現したかをカウントしてください。

words = ["dog", "cat", "dog", "bird", "cat", "dog"]

期待する出力:

コード例

words = ["dog", "cat", "dog", "bird", "cat", "dog"]

counter = Hash.new(0) # {}

words.each do |word|
  counter[word] += 1
end

# p counter # {"dog"=>3, "cat"=>2, "bird"=>1}

counter.each do |word, count|
  puts "#{word} #{count}"
end

問題3:2次元配列の転置(行と列を入れ替える)

問題文
次のような行列を、**転置(行と列を反転)**した配列として出力してください。

matrix = [
  [1, 2, 3],
  [4, 5, 6]
]

期待する出力:

[
  [1, 4],
  [2, 5],
  [3, 6]
]

コード例

matrix = [
  [1, 2, 3],
  [4, 5, 6]
]

transposed = matrix.transpose
puts transposed.inspect #=> [[1, 4], [2, 5], [3, 6]]

問題4:条件フィルター付き検索(複合構造の操作)

問題文
次のような商品一覧から、「カテゴリが ‘book’ かつ 価格が1000円以下」の商品の名前を出力してください。

items = [
  { name: "Ruby Book", category: "book", price: 980 },
  { name: "T-Shirt", category: "clothes", price: 1500 },
  { name: "JS Guide", category: "book", price: 1200 },
  { name: "Notebook", category: "book", price: 700 }
]

期待する出力:

コード例

items = [
  { name: "Ruby Book", category: "book", price: 980 },
  { name: "T-Shirt", category: "clothes", price: 1500 },
  { name: "JS Guide", category: "book", price: 1200 },
  { name: "Notebook", category: "book", price: 700 }
]

items.each do |item|
  if item[:category] == "book" && item[:price]  1000
    puts item[:name]
  end
end

問題5:スコアランキング作成(ハッシュ+ソート)

問題文
次のようなプレイヤー名とスコアのハッシュから、スコアの降順でランキングを出力してください。

scores = {
  "Alice" => 300,
  "Bob" => 500,
  "Carol" => 400
}

期待する出力:

1: Bob - 500
2: Carol - 400
3: Alice - 300

コード例

scores = {
  "Alice" => 300,
  "Bob" => 500,
  "Carol" => 400
}

sorted_scores = scores.sort { |a, b| b[1]  a[1] }

sorted_scores.each.with_index(1) do |(name, score), rank|
  puts "#{rank}位: #{name} - #{score}点"
end

第3章:発展編

問題1:ログデータから日付ごとのアクセス数を集計(Date型+並び替え)

問題文
次のようなログデータの配列があります。各ログはユーザーがアクセスした日時を文字列として持っています。
Dateドキュメント
https://docs.ruby-lang.org/ja/latest/class/Date.html

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "bob", accessed_at: "2025-04-01 12:15" },
  { user: "carol", accessed_at: "2025-04-02 09:00" },
  { user: "alice", accessed_at: "2025-04-01 18:50" },
  { user: "bob", accessed_at: "2025-04-02 20:15" }
]

やること:

  • accessed_at を Date 型に変換(※日付だけ取り出す)
  • 日付ごとのアクセス数をカウント
  • 日付の昇順に並び替えて出力

期待する出力:

2025-04-01: 3
2025-04-02: 2

コード例

require "date"

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "bob", accessed_at: "2025-04-01 12:15" },
  { user: "carol", accessed_at: "2025-04-02 09:00" },
  { user: "alice", accessed_at: "2025-04-01 18:50" },
  { user: "bob", accessed_at: "2025-04-02 20:15" }
]
# p Date.parse(logs[0][:accessed_at]) #=> #
# puts Date.parse(logs[0][:accessed_at]) #=> 2025-04-01

counter = Hash.new(0)

logs.each do |log|
  date = Date.parse(log[:accessed_at])
  counter[date] += 1
end

# p counter # {#=>3, #=>2}

counter.sort.each do |date, count|
  puts "#{date}: #{count}件"
end

問題2:ユーザーごとの最終ログイン日時を取得

問題文
次のログ配列から、各ユーザーが最後にアクセスした日時を求めてください。
https://docs.ruby-lang.org/ja/latest/method/Time/s/parse.html

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "bob", accessed_at: "2025-04-01 12:15" },
  { user: "alice", accessed_at: "2025-04-03 14:00" },
  { user: "bob", accessed_at: "2025-04-02 09:45" }
]

期待する出力:

alice: 2025-04-03 14:00
bob: 2025-04-02 09:45

コード例

require 'time'

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "bob", accessed_at: "2025-04-01 12:15" },
  { user: "alice", accessed_at: "2025-04-03 14:00" },
  { user: "bob", accessed_at: "2025-04-02 09:45" }
]

latest = {}

logs.each do |log|
  time = Time.parse(log[:accessed_at]) #=> 例1: 2025-04-01 10:32:00 +0900
  user = log[:user] #=> "alice"
  # そのユーザーのアクセス時刻が今までより新しければ更新する
  latest[user] = time if latest[user].nil? || latest[user]  time
end

latest.each do |user, time|
  puts "#{user}: #{time.strftime('%Y-%m-%d %H:%M')}"
end

問題3:カテゴリ別の売上合計を集計

問題文
以下のような売上データから、カテゴリごとの売上合計を算出してください。
https://docs.ruby-lang.org/ja/latest/method/Hash/i/each.html

sales = [
  { name: "Book A", category: "book", price: 1200 },
  { name: "Pen", category: "stationery", price: 150 },
  { name: "Book B", category: "book", price: 1500 },
  { name: "Eraser", category: "stationery", price: 100 }
]

期待する出力:

book: 2700円
stationery: 250円

コード例

sales = [
  { name: "Book A", category: "book", price: 1200 },
  { name: "Pen", category: "stationery", price: 150 },
  { name: "Book B", category: "book", price: 1500 },
  { name: "Eraser", category: "stationery", price: 100 }
]

totals = Hash.new(0) #=> {}

sales.each do |item|
  totals[item[:category]] += item[:price]
end

# p totals #=> {"book"=>2700, "stationery"=>250}

totals.each do |category, price|
  puts "#{category}: #{price}円"
end

問題4:1日ごとのユニークユーザー数を数える

問題文
ログデータから、各日付ごとにアクセスしたユニークユーザー数を数えてください。

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:00" },
  { user: "bob", accessed_at: "2025-04-01 11:00" },
  { user: "alice", accessed_at: "2025-04-01 20:00" },
  { user: "bob", accessed_at: "2025-04-02 10:00" },
  { user: "carol", accessed_at: "2025-04-02 12:00" }
]

期待する出力:

2025-04-01: 2人
2025-04-02: 2人

コード例

require 'date'
require 'set'

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:00" },
  { user: "bob", accessed_at: "2025-04-01 11:00" },
  { user: "alice", accessed_at: "2025-04-01 20:00" },
  { user: "bob", accessed_at: "2025-04-02 10:00" },
  { user: "carol", accessed_at: "2025-04-02 12:00" }
]

# 初めてのキーにアクセスした時に、自動で初期値として Set.new(空集合)を入れるという動作になるらしい
# 重複した要素は存在しないようにするためにSet(集合)クラスを使う。
daily_users = Hash.new { |h, k| h[k] = Set.new }
# p daily_users #=> {}

logs.each do |log|
  date = Date.parse(log[:accessed_at])
  daily_users[date]  log[:user]
end

daily_users.each do |date, users|
  puts "#{date}: #{users.size}人"
end

問題5:月別の投稿数をカウントし、月の昇順で表示

問題文
ブログ投稿データから、月ごとの投稿数をカウントして、古い順に表示してください。

posts = [
  { title: "Post 1", published_at: "2025-01-15" },
  { title: "Post 2", published_at: "2025-01-20" },
  { title: "Post 3", published_at: "2025-02-01" },
  { title: "Post 4", published_at: "2025-02-25" },
  { title: "Post 5", published_at: "2025-03-05" }
]

期待する出力:

2025-01: 2
2025-02: 2
2025-03: 1

コード例

require "date"

posts = [
  { title: "Post 1", published_at: "2025-01-15" },
  { title: "Post 2", published_at: "2025-01-20" },
  { title: "Post 3", published_at: "2025-02-01" },
  { title: "Post 4", published_at: "2025-02-25" },
  { title: "Post 5", published_at: "2025-03-05" }
]

monthly = Hash.new(0)

posts.each do |post|
  date = Date.parse(post[:published_at])
  # 年-月までに絞った上でkeyにする
  key = date.strftime("%Y-%m")
  monthly[key] += 1
end

monthly.sort.each do |month, count|
  puts "#{month}: #{count}件"
end

問題6:同一ユーザーの1日あたりのアクセス数を集計(2次元ハッシュ)

問題文
以下のログデータから、ユーザーごと・日付ごとのアクセス数を数えてください。

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "alice", accessed_at: "2025-04-01 12:10" },
  { user: "bob",   accessed_at: "2025-04-01 14:00" },
  { user: "alice", accessed_at: "2025-04-02 09:00" },
  { user: "bob",   accessed_at: "2025-04-02 10:00" }
]

期待する出力:

alice 2025-04-01: 2件
alice 2025-04-02: 1件
bob 2025-04-01: 1件
bob 2025-04-02: 1件

コード例

require "date"

logs = [
  { user: "alice", accessed_at: "2025-04-01 10:32" },
  { user: "alice", accessed_at: "2025-04-01 12:10" },
  { user: "bob",   accessed_at: "2025-04-01 14:00" },
  { user: "alice", accessed_at: "2025-04-02 09:00" },
  { user: "bob",   accessed_at: "2025-04-02 10:00" }
]

counter = Hash.new { |h, k| h[k] = Hash.new(0) }

logs.each do |log|
  user = log[:user]
  date = Date.parse(log[:accessed_at])
  counter[user][date] += 1
end

# p counter
# {"alice"=>{#=>2, #=>1},
# "bob"=>{#=>1, #=>1}}


counter.each do |user, date_map|
  date_map.each do |date, count|
    puts "#{user} #{date}: #{count}件"
  end
end

一部解説 簡単な例

# 二重ハッシュ(二段構えのHash)」を作っています
counter = Hash.new { |h, k| h[k] = Hash.new(0) }

counter["alice"][:2025_04_01] += 1

このとき、counter[“alice”] はまだ存在していません。

counter[“alice”] にアクセスしようとすると:

  • Ruby は alice というキーがないことに気づく
  • すると、Hash.new { |h, k| h[k] = Hash.new(0) } のブロックが呼ばれる!
  • h は今の counter 自体
  • k はアクセスしようとしたキー “alice”

ブロックの中身はこう:

つまり:

counter["alice"] = Hash.new(0)

これで “alice” に対して空のサブハッシュが入り、そのサブハッシュは Hash.new(0) なので、さらに未定義のキーに対してもデフォルトで 0 が返る。

最終的な構造イメージ:

counter = {
  "alice" => {
    # この中も Hash.new(0) になってる
    Date.new(2025, 4, 1) => 3,
    Date.new(2025, 4, 2) => 1
  },
  "bob" => {
    Date.new(2025, 4, 1) => 2
  }
}

問題6:曜日別のアクセス数カウント(Date#wday を使う)

問題文
ログデータから、曜日ごとのアクセス数をカウントしてください。曜日は日本語表記(月〜日)で出力。

前提ログ

logs = [
  { user: "alice", accessed_at: "2025-04-01" }, # 火
  { user: "bob",   accessed_at: "2025-04-01" },
  { user: "carol", accessed_at: "2025-04-02" }, # 水
  { user: "alice", accessed_at: "2025-04-06" }  # 日
]

期待する出力:

火: 2件
水: 1件
日: 1件

コード例

require "date"

logs = [
  { user: "alice", accessed_at: "2025-04-01" }, # 火
  { user: "bob",   accessed_at: "2025-04-01" },
  { user: "carol", accessed_at: "2025-04-02" }, # 水
  { user: "alice", accessed_at: "2025-04-06" }  # 日
]

WEEKDAYS_JP = %w[日 月 火 水 木 金 土]
counter = Hash.new(0)

logs.each do |log|
  date = Date.parse(log[:accessed_at])
  weekday = WEEKDAYS_JP[date.wday]
  counter[weekday] += 1
end

# p counter #=> {"火"=>2, "水"=>1, "日"=>1}

counter.each do |day, count|
  puts "#{day}: #{count}件"
end

問題7:時間帯(午前/午後/深夜)による分類カウント

問題文
次のログデータから、アクセスが「午前・午後・深夜」のどれに分類されるかをカウントしてください。

image.png

logs = [
  { user: "alice", accessed_at: "2025-04-01 05:00" }, # 深夜
  { user: "bob",   accessed_at: "2025-04-01 09:30" }, # 午前
  { user: "carol", accessed_at: "2025-04-01 14:45" }, # 午後
  { user: "alice", accessed_at: "2025-04-01 00:15" }, # 深夜
  { user: "bob",   accessed_at: "2025-04-01 11:59" }  # 午前
]

期待する出力:

深夜: 2件
午前: 2件
午後: 1件

コード例

require "time"

logs = [
  { user: "alice", accessed_at: "2025-04-01 05:00" }, # 深夜
  { user: "bob",   accessed_at: "2025-04-01 09:30" }, # 午前
  { user: "carol", accessed_at: "2025-04-01 14:45" }, # 午後
  { user: "alice", accessed_at: "2025-04-01 00:15" }, # 深夜
  { user: "bob",   accessed_at: "2025-04-01 11:59" }  # 午前
]

zones = Hash.new(0)

logs.each do |log|
  hour = Time.parse(log[:accessed_at]).hour

  if hour >= 0 && hour  5
    zones["深夜"] += 1
  elsif hour >= 6 && hour  11
    zones["午前"] += 1
  else
    zones["午後"] += 1
  end
end

zones.each do |zone, count|
  puts "#{zone}: #{count}件"
end

第4章:発展編(ロジック重視・条件分岐系)

問題1:マス目の最頻値とその出現回数を求めよ

問題文*
以下のような2次元配列が与えられる。全体で最も多く登場する値と、その出現回数を出力せよ。
複数ある場合は値の小さい方を選ぶ。

matrix = [
  [1, 2, 2],
  [3, 1, 2],
  [4, 2, 1],
  [1, 4, 3]
]

期待される出力:

解答コード

matrix = [
  [1, 2, 2],
  [3, 1, 2],
  [4, 2, 1],
  [1, 4, 3]
]

counts = Hash.new(0)

matrix.each do |row|
  row.each do |val|
    counts[val] += 1
  end
end

max_count = counts.values.max

most_frequent = counts.select { |_, v| v == max_count }.keys.min

puts "#{most_frequent} #{max_count}"

問題2:2次元配列の「山」(周囲より高いセル)の個数を求めよ

問題文*
上下左右の4方向すべてより値が大きいセルの数を数えてください。

grid = [
  [1, 3, 2],
  [5, 4, 6],
  [3, 2, 1]
]

期待される出力:

(セル(1,0)の5と、(1,2)の6が「山」)

解答コード

# 入力となる2次元配列(グリッド)
grid = [
  [1, 3, 2],
  [5, 4, 6],
  [3, 2, 1]
]

# グリッドのサイズ(行数と列数)を取得
rows = grid.size         # 行数(縦の数)→ 3
cols = grid[0].size      # 列数(横の数)→ 3

# 「山」の個数をカウントするための変数
count = 0

# 上下左右への方向を表すベクトル(行・列の変化量)
# [dx, dy] -> dxは行の変化、dyは列の変化
dirs = [
  [-1, 0],  # 上(1つ上の行)
  [1, 0],   # 下(1つ下の行)
  [0, -1],  # 左(1つ左の列)
  [0, 1]    # 右(1つ右の列)
]

# グリッドのすべてのセルを調べる
rows.times do |i|        # i は行のインデックス(縦方向)
  cols.times do |j|      # j は列のインデックス(横方向)
    current = grid[i][j] # 現在注目しているセルの値

    # 上下左右のセルすべてと比較して、全てより大きければ「山」
    is_peak = dirs.all? do |dx, dy|
      ni = i + dx # 隣接セルの行番号(dx分だけ移動) 上下
      nj = j + dy # 隣接セルの行番号(dy分だけ移動) 左右

      # 配列の外にはみ出る場合は比較せずスキップ(trueで無視)
      # 今のループをスキップして、次のループに進む
      next true if ni  0 || nj  0 || ni >= rows || nj >= cols

      # 現在の値が隣接セルより大きいかを判定
      current > grid[ni][nj]
    end

    # すべての方向で現在のセルの方が大きければ「山」としてカウント
    count += 1 if is_peak
  end
end

# 結果(山の数)を出力
puts count

問題3:対角線上にある同じ値のペアを数える(右下方向)

問題文*
2次元配列の中で、右下方向に位置する同じ値のペアの数を数えてください。

matrix = [
  [1, 2, 3],
  [4, 1, 6],
  [7, 8, 1]
]

期待される出力:

((0,0)-(1,1)、(1,1)-(2,2) が「1」)

解答コード

matrix = [
  [1, 2, 3],
  [4, 1, 6],
  [7, 8, 1]
]

count = 0
size = matrix.size

(0...size-1).each do |i|
  (0...matrix[i].size-1).each do |j|
    count += 1 if matrix[i][j] == matrix[i+1][j+1]
  end
end

puts count

問題4:条件付きブロックのカウント

問題文*
次の2次元配列において、2×2のブロックをすべて調べ、
その中に 0 が2個以上含まれるブロックの個数を数えてください。

grid = [
  [1, 0, 1, 1],
  [0, 0, 1, 0],
  [1, 1, 0, 1]
]

期待される出力:

解答コード

grid = [
  [1, 0, 1, 1],
  [0, 0, 1, 0],
  [1, 1, 0, 1]
]

count = 0

(0..grid.size-2).each do |i|
  (0..grid[0].size-2).each do |j|
    block = [
      grid[i][j], grid[i][j+1],
      grid[i+1][j], grid[i+1][j+1]
    ]
    count += 1 if block.count(0) >= 2
  end
end

puts count

問題5:周囲がすべて1に囲まれている「安全な0」の個数を求めよ

問題文*
次の2次元配列において、上下左右にすべて1が隣接している 0 の数を数えてください。

grid = [
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 0, 1, 0, 1, 1],
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 0, 1, 0, 1, 1],
  [1, 1, 1, 1, 1, 1, 0],
]

期待される出力:

解答コード

# 入力となる2次元配列。各要素は 1 または 0。
# この中から「上下左右+斜め8方向すべてが1に囲まれている0」を探す。
grid = [
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 0, 1, 0, 1, 1],
  [1, 1, 1, 1, 1, 1, 1],
  [1, 1, 0, 1, 0, 1, 1],
  [1, 1, 1, 1, 1, 1, 0],
]

# 安全な0の数を数える変数
count = 0

# 行数と列数を取得(汎用性のため)
rows = grid.size
cols = grid[0].size

# チェックする8方向の相対座標(上下左右+斜め)
directions = [
  [-1,  0],  # 上
  [1, 0],    # 下
  [0, -1],   # 左
  [0, 1],    # 右
  [-1, -1],  # 左上
  [-1, 1],   # 右上
  [1, -1],   # 左下
  [1, 1]     # 右下
]

# 外周のマスは判定対象外なので、1〜rows-2 / 1〜cols-2 の範囲でループ
(1...rows-1).each do |i|
  (1...cols-1).each do |j|
    # 対象のセルが0でなければスキップ
    next unless grid[i][j] == 0

    # 8方向すべての隣接セルの値を取得
    neighbors = directions.map do |di, dj|
      grid[i + di][j + dj]
    end

    # 隣接する8マスすべてが1なら「安全な0」としてカウント
    if neighbors.all? { |v| v == 1 }
      count += 1
    end
  end
end

# 結果を出力(安全な0の個数)
puts count

終わりに

株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
この記事が少しでも学びになったという方は、ぜひ wantedly のストーリーもご覧いただけるととても嬉しいです!





Source link

Views: 0

【モンハンワイルズ小ネタ】遂に再戦できるようになった「ゾ・シア」攻略のススメ – GAME Watch


 カプコンのプレイステーション 5/Xbox Series X|S/PC(Steam)用ハンティングアクションゲーム「モンスターハンターワイルズ」における白熾龍「ゾ・シア」の攻略情報を紹介する。

 「ゾ・シア」は「モンハンワイルズ」のストーリーにおけるラスボス的立ち位置の存在で、今までは一度狩猟すると再戦できなかったモンスターだ。しかし4月4日の無料タイトルアップデート第1弾にてついに再登場を果たし、しっかり上級クエスト級の攻撃力と難易度に進化した事で多くのハンターたちを楽しませている。

 ストーリーで相対した時以上に各種攻撃やギミックが苛烈になっているため初見殺しを喰らうプレーヤーも多く、歴戦ゴア・マガラに匹敵する強敵となっているのだ。今回はそんな進化した「ゾ・シア」の攻略に役立つ情報を紹介していこう。

【『モンスターハンターワイルズ』無料タイトルアップデート第1弾 紹介映像】

「ゾ・シア」へ挑む前の準備

 まずは狩猟の前の準備だ。始めに防具やスキルに関してだが、慣れない内はしっかり火耐性と雷耐性が高い物を装備し、装飾品等で「精霊の加護」などの生存率を高めるスキルを積む事が重要になる。大体の攻撃が一撃級かつ、火属性系のスリップダメージも多様してくるため、例えクリア後の最強防具であっても生存系スキルが無いとあっと言う間に1乙する難易度となっているのだ。

 特にDLCが来る前にアルシュベルドの乱獲をしていたハンターは、攻撃力を尖らせたスキル構成とゴアマガラ装備等を愛用していたと思われるのだが、見事にそこを刈り取るような攻撃属性と破壊力となっているので注意が必要。慣れて来たら攻撃重視のスキル構成や防具に戻しても問題無いが、最初の内は無理せず生存率を高めるスキル構成をオススメしたい。

流行りのゴア装備は火耐性が著しく低いためブレス攻撃で一撃死しやすい。火力面では申し分ないので、空いているスロットで防御面を補おう

 武器の属性に関しては基本的に攻撃力の高い龍属性が推奨されるが、毒・麻痺などの状態異常も通るためオススメだ。「ゾ・シア」は既存モンスターより圧倒的に体力が多く長期戦になるため、マルチであれば攻撃用とサポート用で上記2属性の武器を持っていくのもアリだ。

 また「ゾ・シア」は至近距離で戦っている際に回避が難しい広範囲攻撃を多々行なうため、ガードアクションが無い武器種に関しては回避性能や回避距離アップのスキルを着けておいた方が安全だろう。

麻痺属性等は繰り返し使うと効果が薄まるため、序盤は麻痺、終盤は龍属性といった形で持ち変えるのもオススメだ

特に危険なのが至近距離で放つブレス攻撃。ガードできる武器でも「ガード強化」が無いと防げなかったり、そもそも盾が無い武器だと立ち位置によっては不可避になるのでスキルによる対策は必須

結晶ギミック/フィールドギミック等を活用する

 「ゾ・シア」を狩猟するフィールドには幾つかハンターが利用できるギミックが存在している。中でも狩猟中に意識しておきたいのがフィールドに沸き続ける結晶のギミックだ。

 「ゾ・シア」が攻撃を行うたびに生まれる結晶は「ゾ・シア」の一部攻撃に反応して爆発し、攻撃範囲と威力を拡大させる力を持っている。本来なら届かないであろう攻撃も、この結晶を中継する事によって被弾する攻撃に早変わりしてしまうのだ。

フィールドにできる結晶

「ゾ・シア」の一部攻撃に反応して爆発し、攻撃範囲と威力を拡大させる

 しかしこの結晶はハンター側も利用する事ができ、属性スリンガー弾を結晶に当てる事で先んじて爆破させる事が可能。加えてこの爆破を「ゾ・シア」に当てればそこそこ良いダメージを与える事ができ、場合によっては怯みを狙う事もできる。「ゾ・シア」戦では属性スリンガー弾を常にキープするように心がけ、隙を見て結晶でダメージを与えていくことが重要となる。

防御面、攻撃面においても結晶の爆破は必須のテクニックとなっている

 また終盤戦に差し掛かると「ゾ・シア」はフィールド全体を攻撃する大技を繰り出してくる。その際フィールドには多くの結晶が現れるのだが、先述した通り「ゾ・シア」戦の結晶は攻撃を拡散する物のため、間違ってもこの結晶の後ろに隠れるといった行動をしてはいけない。「ジン・ダハド」の時とは逆のアクションが求められるのだ。

 大技の予備動作に入り結晶が現れ始めたら、「ゾ・シア」が攻撃モーションに入る前にできる限り属性スリンガー弾で結晶を破壊しよう。結晶を破壊したポイントには攻撃が届かなくなるため安全地帯ができ、大技後は隙も長いため近くで待機できれば大きなアドバンテージになる。

【ゾ・シアの大技】

被弾するとほぼ確実に一撃で倒れてしまう最強技

事前に属性スリンガー弾を用意しておけば安全なエリアをゾ・シアの近くに確保できる

スリンガー弾を用意できていない場合は「ゾ・シア」に背を向ける形で画面端に全力ダッシュしても避ける事は可能。攻撃後の隙を狙う事はできないが、緊急時でも回避する方法があるのはありがたい

 他にもフィールドのギミックとしては落石が用意されている。第2形態へ移行した後に天井を確認するとスリンガーで狙えるスポットが2カ所生まれ、当てれば当てれば大ダメージ+ダウンを狙える。時間経過で再び使えるようになるため、見つけたら積極的に活用しよう。

【2つの落石スポット】

アクションのススメ

 続いて「ゾ・シア」戦で意識したいアクションについて紹介しよう。まず狩猟開始後に多くのハンターが真っ先に狙う「奇襲攻撃」についてだが、「ゾ・シア」には奇襲攻撃の際に有効な「隠れ身の装衣」が爆速で看破されるため狙うのが少し難しくなっている。成功させるコツとしては、狩猟エリアに到着したらセクレトで一気に後ろへ回り込み、素早く奇襲攻撃を成功させること。ゆっくり近づくのではなくスピーディーに処理しよう。

 被弾した際に「セクレト復帰」を使って安全に距離を取る事も重要だ。「ゾ・シア」の攻撃は隙が生じない二段構えのモノが殆どで、攻撃範囲も持続性も高いため普通に復帰しようとすると回復前に体力を刈り取られてしまう。その点「セクレト復帰」であれば即座に戦線離脱でき、回復なども攻撃を回避しながら行えるので安全性が高いのだ。

 また「ゾ・シア」戦はエリア移動が存在しないので、砥石を使用する際もセクレトで移動しながら行うのがベターだ。他にも本当にどうしようも無くピンチになったり、アイテムが底を尽きた場合は隙を見てファストトラベルを使用すれば簡易キャンプに帰還できるので敵前逃亡も視野に入れるべきだろう。

ダウンしたら基本的にセクレト復帰を叩き込ませた方が良いレベルで「ゾ・シア」は起き上がりを刈る攻撃が多い

ちょっとした攻撃ならセクレトは回避してくれるので、安全面を重視するなら砥石・回復行為の全てをセクレト騎乗中に行うぐらいでも良い

 またギミックの爆破にスリンガーを用いるため、武器を構えたままスリンガー弾を撃てる「L2+L3」のショートカット操作も慣れておくと便利だ。吹っ飛ばされた際に結晶に囲まれているとブレス攻撃の範囲が凄まじくなるため、武器をしまってスリンガーを撃ってるような暇が無く、この操作を知ってるか知らないかで生存確率が段違いなのだ。攻撃の合間に爆破ダメージを狙えるのも美味しいため、「ゾ・シア」を狩猟する際には必須のアクションといえる。

 他にも「ゾ・シア」の一部ブレス攻撃は通常のガードではガードできないため「ガード強化」を付けたり、「早食い」と「広域化」を着けて味方の生存率を高めるなど様々な戦法が試せるだろう。

 しっかりと準備をしないと倒せない感覚は正にモンハンといった感じで、非常に楽しいコンテンツとなっている。ラスボスとして申し分ない超強力なボスとして復活した「ゾ・シア」に、ぜひ挑んでみてほしい。





Source link

Views: 0

実写映画版『マイクラ』米国オープニング興行収入が約1億5,700万ドル突破!「マリオ」超え、ビデオゲーム映画史上最高記録




批評家からの評価は芳しくなく、ユーザーからは高評価という傾向は、映画「マリオ」や「ソニック」に似た傾向となっている模様です。



Source link

Views: 0

「ベイマックス×Happyくじ」5月2日より発売!A賞は全高50cm特大サイズのベイマックスぬいぐるみ


「Happyくじ『ベイマックス』vol.2.0」

「Happyくじ『ベイマックス』vol.2.0」発売決定!

孤独な少年「ヒロ」と、ヒロの兄が作った心とカラダの健康を守るケアロボット「ベイマックス」との絆や仲間との冒険を描いた映画『ベイマックス』。

 

今回の目玉は全高50cmの特大サイズ「ベイマックス ぎゅっとハグ!ぬいぐるみ」。

 

お腹にポケットがある特別仕様で、映画の名シーンを再現したようなベイマックスとのハグをあなたの日常に!

 

他にもTシャツやフード付きタオルなど、いつでもどこでもあなたの心と体を包み込んでくれるベイマックスアイテムがラインナップ。

 

最後のくじを引いた方が手に入れられるLast賞には、本物のベイマックスの約1/4スケールとなる全高45cmの『ベイマックス BIGソフビフィギュア』が用意されました。

 

また、セブン−イレブンの店内マルチコピー機では2025年5月1日(木)から『ベイマックス』デザインのブロマイドを販売開始。

 

全8種類のデザインの中からランダムで1枚がプリントされるランダムブロマイドです。

 

第1弾〜第4弾で全32種のポストカードがラインナップ予定となっていますよ。

 

 

A賞 ベイマックス ぎゅっとハグ!ぬいぐるみ[全1種]

A賞 ベイマックス ぎゅっとハグ!ぬいぐるみ[全1種]

 

 

B賞 Tシャツ[全1種]

B賞 Tシャツ[全1種]

 

 

C賞 フード付きブランケット[全1種]

C賞 フード付きブランケット[全1種]

 

 

D賞 まんまるポーチ[全2種]

D賞 まんまるポーチ[全2種] 

 

 

E賞 フィギュアキーホルダー[全3種]

E賞 フィギュアキーホルダー[全3種] 

 

 

F賞 アクリルスタンド[全7種]

F賞 アクリルスタンド[全7種]

 

 

G賞 ⽸バッジ[全9種]

G賞 ⽸バッジ[全9種]

 

 

H賞 ラバーコレクション[全6種]

H賞 ラバーコレクション[全6種]

 

 

I賞 ダイカットステッカーセット[全6種]

I賞 ダイカットステッカーセット[全6種]

 

 

Last賞 ベイマックスBIGソフビフィギュア[全1種]

Last賞 ベイマックスBIGソフビフィギュア[全1種]

 

詳細は公式サイトをご確認ください。

 



Source link

Views: 0

『モンハンワイルズ』ハンターが最も選んだ“メイン&サブ武器”結果発表! βテスト時との比較で、大きく躍進した武器種も【アンケ結果】



『モンハンワイルズ』ハンターが最も選んだ“メイン&サブ武器”結果発表! βテスト時との比較で、大きく躍進した武器種も【アンケ結果】

『モンハンワイルズ』ハンターが最も選んだ“メイン&サブ武器”結果発表! βテスト時との比較で、大きく躍進した武器種も【アンケ結果】



Source link

Views: 0