北山宏光が7月から9月にかけて全国ツアー「HIROMITSU KITAYAMA LIVE 2025」を開催することが決定した。
Source link
Views: 0
北山宏光が7月から9月にかけて全国ツアー「HIROMITSU KITAYAMA LIVE 2025」を開催することが決定した。
Source link
Views: 0
モニターの傾きを確かめるツール「エビスダイヤモンド クリスタルレベル」の使用レビュー。
モニターの角度を正しく調整でき、首や肩こりの疲れ対策にもなります。使い方やメリットをお届けします。
Source link
Views: 0
昼間に死んだBlood Moonイベントが戻ってきましたが、今回はまったく新しい驚きがあります。毎年恒例のお祝いは、すべての稼ぎと支出、可能な限り最もブラッドポイントであることを意味します。これは、新しい、リターン、長年のプレイヤーにとってより速い進歩を意味します。ただし、今回は、動作インタラクティブには、まったく新しいタイプのジェネレーターの形でエースが袖にあります。
ストーリーの残りの部分を読んでください…
関連リンク:
DBDは、その時代遅れの課題に別れを告げ、新しいクエストシステムを明らかにします
DBD Twitchドロップと請求方法
DBD Tokyo Ghoul Updateリリース時間、FNAF支部、PTB、および最新ニュース
Source link
Views: 0
私はあなたのことを知りませんが、私のゲームのプレイは検疫中に急上昇しました。友達と一緒に出かけたり、レストランで食事をしたり、太陽を見たりするのは今、私のゲームの時間です。幸いなことに、これを読んでいるすべての人にとって、私は素晴らしいゲームから素晴らしいゲームを整理することができ、いくつかの本当の宝石を選んで準備ができています。
https://www.youtube.com/watch?v=T8SS6DGM4WY
あなたが魅力的なテーマと魅力的なビジュアルを備えた見事に作成されたパズルゲームが好きな人のような人なら、私はあなたに推薦をしますか?モンスターの遠征は、魅力的なテーマと魅力的なビジュアルを備えた見事に作成されたパズルゲームです。
Draknekの他のゲーム(Sokobond and Cosmic Expressは私のお気に入りの2つです)をプレイした場合、Monsterの遠征が同様のかゆみをかくことを期待できます。ここでは、バックパックと自分で丸太をすべて切り倒す能力だけで、顔のないモンスターです。すべての素晴らしいパズルゲームと同様に、これは単純な前提であり、その後、パズルデザインを通じてさまざまなコンテキストに入れられ、そのツールセットのすべての可能性に関与させます。今回は、ある方向に丸太を転がすことで、ある小さな島(パズル)から別の島に移動するために橋といかだを建設しようとしています。それでおしまい!本当に洗練されています!
さて、モンスターの遠征を本当にユニークにしているのは、開発者が「リラックスしたオープンワールドパズルアドベンチャー」と呼んでいることです。最初は、これはある種のマーケティングの専門用語だと思いましたが、実際にはすべてのパズルゲームが今後採用されることを願っています。遠征のセットアップは、小さな島から小さな島に移動していることです。これは、小さなパズルの束を解決しなければならないための宇宙内の正当化です。オープンワールドが登場するのは、多くの島々があなたをさまざまな島に押し寄せ、自分のゆったりとしたペースでオーバーワールドマップを探索できるという解決策を持っているからです。これは、作業中のあらゆるパスにこだわっている場合、ほとんど常に別のパズルを見つけることができることを意味します。
私はそれを売り過ぎたくありませんが、2020年の私のお気に入りのゲームの1つとしてモンスターの遠征が年を終えるという本当のチャンスがあります。
https://www.youtube.com/watch?v=2nnclkqcosa
Spiritfarerが「死についての居心地の良いゲーム」だったことを読んだとき、私は興味をそそられました。グループとして、私たちは道路の終わりに私たちを待っているものについて話すのがかなりひどいので、ゲームに死を含めると、それは通常、プレイヤーのキャラクターに捨てられたり、賭け金を上げる場合に友人にめったにありません。 Spiritfarerは、Spiritfarerが死についての親切なゲームであり、死を分配しているということではありません。あなたのボートはあなたが期待するかもしれない小さなフェリーではなく、完全にカスタマイズ可能なはしけです。ある種の収穫の月のようなひねりを加えて、あなたはあなたが輸送している友人やキッチンや庭のような施設のために宿舎のような新しいものを建設するためにあなたの旅の間にさまざまな素材を集めています。それは本当に大きなボートですね
しかし、Spiritfarerが本当に大きくなる地域は、それが時間をどのように扱うかです。私が言われたことが正確である場合(私はSpiritfarerでクレジットになっていません)、ゲームは20〜30時間実行されますが、ランタイム全体に完全に関与する必要はありません。実際に船を航海するわけではありませんが、地図上の目的地を選択して、船が自動的にナビゲートするのを待ちます。この時間(通常は距離に応じて30秒から数分まで)、釣りから釣り(そして抱きしめて!)までのあらゆる種類の活動に自由に従事することができます。このダウンタイムは、ゲームをリラックスしたペースでプレイし、あなたが船の上に建てている世界に住んでいます。本当に素晴らしいです。
過去数週間にわたってどこにでもオンラインで行っていれば、旅行のどこかで私たちの間に出くわしたでしょう。それは、船の一部を固定し、エアロックから殺されたり撃たれたりするのは、その中に迷った宇宙船のゲームです。インターネット上のその遍在は、説明するのが少し不必要に感じますが、とにかく飛び込みます。
ここでのセットアップは簡単です。あなたとあなたのチームメイトは、行き詰まった宇宙船で立ち往生しており、それを走らせるのはあなた次第です。残念ながら、あなたのチームメイトの中には、彼らが誰であるかではなく、船を始めるのではなく、あなたとあなたの仲間を殺すことでゲームに勝つ詐欺師である人もいます。 WerewolfやMafiaのようなゲームをプレイしたことがあるなら、おそらくHidden Choreゲームのアイデアに精通しているのでしょうか。あなたがそれを一人で行って、アリバイを持っていない、パートナーと一緒に行って殺害される可能性があるか、またはより安全な進歩のためにトリオに行くことができるので、あなたが誰に近づいたかについての戦略があります。これらの小さな変化はあまり変わらないように見えますが、私たちの間ではこれまでで最高の隠されたロールゲームの1つとなり、友人のグループと遊ぶための爆発です。
https://www.youtube.com/watch?v=_dady6vrjac
テトリスを取り、45度回転させ、すべてのピースを正方形にします。今、それを歌うように教えてください。これはMixolumiaです。
形状でボードを配置する代わりに、4つの別々の「ピース」で構成される正方形を使用しています。これらの作品にはさまざまな色があり、着陸方法に応じてバラバラになります。あなたの目標は、少なくとも3つの同じ色のピースのグループを一致させて、それらが消えて画面の上部に届かないようにすることです。それはかなり標準的なものですが、Mixolumiaがユニークになるのはプレゼンテーションにあります。そのmanのブロックの配置が主にサウンドトラックとカスタマイズの裏にあるにもかかわらず、非常にリラックスしたゲームです。ゲームには3つの素晴らしいサウンドトラックが登場しますが、カスタムビジュアルパレットだけでなく、独自のサウンドトラックを追加することもできます。一部の人々はこれを使用してスピードメタルやネオンのようなよりストレスの多いものを入れると確信していますが、私の目的のために、それは本当に瞑想的な体験を可能にします
Views: 0
アバック横浜は、ECLIPSEブランドのスピーカーシステムによる5.2.4chマルチチャンネル試聴会を、4月12日(土)から4月20日(日)まで開催する。全日にわたって事前予約を推奨している。
Source link
Views: 1
総合ナビゲーションアプリ『NAVITIME』と乗換案内アプリ『乗換NAVITIME』で4月7日、バリアフリー情報が拡充した。東京全駅のエレベーター情報を考慮し、階段を避けたルート検索が可能になった。
Views: 0
私は新しいコーディングフォントの吸盤です。私は通常、あなたが使用するコーディングフォントが生産性に大きな影響を与えるとは思わないので(気を散らしていない限り)、おならをして切り替えるのは楽しいことです。部屋の家具を押しのけたり、別の自転車ルートをとって仕事をしています。
だから私を数えてください で 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」の指定方法を含みます。
Views: 0
エヌ・シー・ジャパンは2025年4月5日,PC向けMMORPG「リネージュ2」の「Evaパッケージ」リリース記念イベントを,東京・ビックカメラ池袋にて開催した。会場ではコスプレイヤーやモデルとして活躍中のソフィー・S(ピーチミルキー)さんが来場者を出迎えてくれた。
Source link
Views: 0
「配列とハッシュを相互変換する場面がよくあるのに、毎回ググってしまう…」
「ネストした構造になると一気に手が止まる…」
そんな方も多いのではないでしょうか?
このシリーズでは、Rubyでよく出てくる配列やハッシュの操作を整理しながら、実践的なコーディング問題を通じて着実に身につけることを目指します。
問題文
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)) は全行が同じオブジェクト参照になるので注意
問題文
名前と年齢を持つハッシュを作成し、データの追加・更新・削除をしてみましょう。
コード例
people = { "Alice" => 25, "Bob" => 30 }
# 追加
people["Carol"] = 28
# 更新
people["Alice"] = 26
# 削除
people.delete("Bob")
puts people #=> {"Alice"=>26, "Carol"=>28}
ポイント
問題文
[[“Alice”, 25], [“Bob”, 30]] のような配列を、{ “Alice” => 25, “Bob” => 30 } に変換しましょう
コード例
array = [["Alice", 25], ["Bob", 30]]
hash = array.to_h
p hash #=> {"Alice"=>25, "Bob"=>30}
ポイント
問題文
次のようなネスト構造のハッシュから、メールアドレスを取り出しましょう。
user = {
name: "John",
contact: {
email: "[email protected]",
phone: "090-1234-5678"
}
}
puts user[:contact][:email] #=> [email protected]
ポイント
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}
ポイント
問題文
以下のハッシュを、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]]
ポイント
応用例(ソート付き)
値の昇順に並べてから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次元配列から、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
問題文
与えられた単語のリストから、それぞれの単語が何回出現したかをカウントしてください。
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
問題文
次のような行列を、**転置(行と列を反転)**した配列として出力してください。
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]]
問題文
次のような商品一覧から、「カテゴリが ‘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
問題文
次のようなプレイヤー名とスコアのハッシュから、スコアの降順でランキングを出力してください。
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
問題文
次のようなログデータの配列があります。各ログはユーザーがアクセスした日時を文字列として持っています。
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" }
]
やること:
期待する出力:
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
問題文
次のログ配列から、各ユーザーが最後にアクセスした日時を求めてください。
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
問題文
以下のような売上データから、カテゴリごとの売上合計を算出してください。
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
問題文
ログデータから、各日付ごとにアクセスしたユニークユーザー数を数えてください。
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
問題文
ブログ投稿データから、月ごとの投稿数をカウントして、古い順に表示してください。
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
問題文
以下のログデータから、ユーザーごと・日付ごとのアクセス数を数えてください。
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”] にアクセスしようとすると:
ブロックの中身はこう:
つまり:
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
}
}
問題文
ログデータから、曜日ごとのアクセス数をカウントしてください。曜日は日本語表記(月〜日)で出力。
前提ログ
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
問題文
次のログデータから、アクセスが「午前・午後・深夜」のどれに分類されるかをカウントしてください。
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
問題文*
以下のような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}"
問題文*
上下左右の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
問題文*
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
問題文*
次の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
問題文*
次の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 のストーリーもご覧いただけるととても嬉しいです!
Views: 0