TOMOCHIN4 Claude Opus 4.5 commited on
Commit
c71b90b
·
1 Parent(s): 51b5521

release: v2.0.0 STABLE リリース完了

Browse files

## v2.0.0 主要機能
- 2教科×10問の一括LLM生成(generateBatchQuestions)
- LLM検証パート(validateBatchQuestions)
- 4択クイズUI(選択後自動進行、最終問題後自動採点)
- CORS対応(Content-Type: text/plain)
- sessionStorageによるデータ受け渡し

## デプロイ情報
- GAS: @54
- HuggingFace: edc211d

## バックアップ
- V2.0.0/ に完全バックアップ作成
- RECOVERY.md 復旧手順書作成

## 今後の予定(v2.x マイナーアップデート)
- GASトリガー設定(朝6:00/夕15:00)
- 回答権管理(1ユーザー1回限り)
- ステータス表示(回答済み/未回答/未配信/期限切れ)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .serena/memories/project_overview.md +118 -10
  2. ChoTensai_Deli +1 -0
  3. PLAN.md +264 -53
  4. STATUS.md +258 -32
  5. V1.8.1/RECOVERY.md +161 -0
  6. V1.8.1/app.py +691 -0
  7. V1.8.1/gas/.clasp.json +4 -0
  8. V1.8.1/gas/Code.js +2251 -0
  9. V1.8.1/gas/DifyService.js +458 -0
  10. V1.8.1/gas/GenreMaster.js +431 -0
  11. V1.8.1/gas/appsscript.json +15 -0
  12. V1.8.1/gas/questiondb_functions.js +1166 -0
  13. V1.8.1/gas/setup_dify_properties.js +468 -0
  14. V1.8.1/gas/setup_sheets_v2.js +524 -0
  15. V1.8.1/gas/setup_sheets_v3.js +401 -0
  16. V1.8.1/knowledge/v1.8.1/QuestionDatabase.csv +0 -0
  17. V1.8.1/knowledge/v1.8.1/jp/JP01.json +702 -0
  18. V1.8.1/knowledge/v1.8.1/jp/JP02.json +702 -0
  19. V1.8.1/knowledge/v1.8.1/jp/JP03.json +352 -0
  20. V1.8.1/knowledge/v1.8.1/jp/JP04.json +352 -0
  21. V1.8.1/knowledge/v1.8.1/jp/JP05.json +72 -0
  22. V1.8.1/knowledge/v1.8.1/jp/JP06.json +72 -0
  23. V1.8.1/knowledge/v1.8.1/jp/JP07.json +282 -0
  24. V1.8.1/knowledge/v1.8.1/jp/JP08.json +282 -0
  25. V1.8.1/knowledge/v1.8.1/math/MA01.json +282 -0
  26. V1.8.1/knowledge/v1.8.1/math/MA02.json +282 -0
  27. V1.8.1/knowledge/v1.8.1/math/MA03.json +282 -0
  28. V1.8.1/knowledge/v1.8.1/math/MA04.json +282 -0
  29. V1.8.1/knowledge/v1.8.1/math/MA05.json +282 -0
  30. V1.8.1/knowledge/v1.8.1/math/MA06.json +282 -0
  31. V1.8.1/knowledge/v1.8.1/math/MA07.json +282 -0
  32. V1.8.1/knowledge/v1.8.1/math/MA08.json +284 -0
  33. V1.8.1/knowledge/v1.8.1/math/MA09.json +282 -0
  34. V1.8.1/knowledge/v1.8.1/math/MA10.json +282 -0
  35. V1.8.1/knowledge/v1.8.1/sci/SC01.json +240 -0
  36. V1.8.1/knowledge/v1.8.1/sci/SC02.json +240 -0
  37. V1.8.1/knowledge/v1.8.1/sci/SC03.json +233 -0
  38. V1.8.1/knowledge/v1.8.1/sci/SC04.json +233 -0
  39. V1.8.1/knowledge/v1.8.1/sci/SC05.json +240 -0
  40. V1.8.1/knowledge/v1.8.1/sci/SC06.json +233 -0
  41. V1.8.1/knowledge/v1.8.1/sci/SC07.json +233 -0
  42. V1.8.1/knowledge/v1.8.1/sci/SC08.json +233 -0
  43. V1.8.1/knowledge/v1.8.1/sci/SC09.json +233 -0
  44. V1.8.1/knowledge/v1.8.1/sci/SC10.json +240 -0
  45. V1.8.1/knowledge/v1.8.1/sci/SC11.json +233 -0
  46. V1.8.1/knowledge/v1.8.1/sci/SC12.json +233 -0
  47. V1.8.1/knowledge/v1.8.1/soc/SO01.json +282 -0
  48. V1.8.1/knowledge/v1.8.1/soc/SO02.json +282 -0
  49. V1.8.1/knowledge/v1.8.1/soc/SO03.json +282 -0
  50. V1.8.1/knowledge/v1.8.1/soc/SO04.json +282 -0
.serena/memories/project_overview.md CHANGED
@@ -11,7 +11,10 @@
11
  - **uvicorn** - ASGI Server
12
 
13
  ### AI/LLM
14
- - **Google Gemini API** (gemini-2.5-flash)
 
 
 
15
  - **google-genai SDK** - thinking_budget対応の新SDK
16
 
17
  ### Frontend
@@ -83,20 +86,102 @@ Google Sheets (データ永続化)
83
 
84
  ## デプロイ情報
85
 
86
- - **バージョン**: v1.6.15 STABLE
 
87
  - **HF Space**: leave-everything/ChoTensai_V3
88
- - **GAS デプロイID**: @42 (v1.6.15)
89
- - **GAS URL**: `https://script.google.com/macros/s/AKfycbw52gHnVanyvr91As9BhXd2Tv-2bYjwns8dR-6tt59FR3K2xfktMLoiTPsEAIffJ5ED/exec`
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  ## バックアップ
92
 
 
 
93
  - **V1.6.15/**: 完全復旧可能なバックアップ(RECOVERY.md含む)
94
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  ## 今後の構想
96
 
97
  詳細は `docs/FUTURE_VISION.md` を参照
98
- - 【A】本体改善: ユーザー単位管理、制限時間設定
99
- - 【B】派生サービス: 問題配信、ランキング、クラス制
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
 
101
  ---
102
 
@@ -107,7 +192,30 @@ Google Sheets (データ永続化)
107
  - **改善**: ログイン状態を保持したまま教科選択画面へ移動するボタンを追加
108
  - **対象ファイル**: `static/js/components.js` (ResultScreen, App)
109
 
110
- ### 2. Geminiモデル名を環境変数化
111
- - **現状**: コードにハードコード(例: `gemini-2.5-flash`)
112
- - **改善**: HF環境変数(例: `GEMINI_MODEL`)から取得、モデル変更を容易に
113
- - **対象ファイル**: `src/services/gemini_service.py`, HF Space設定
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  - **uvicorn** - ASGI Server
12
 
13
  ### AI/LLM
14
+ - **Google Gemini API**
15
+ - v1.x: HF Space → Gemini直接呼び出し (gemini-3-flash-preview)
16
+ - v2.x: GAS → Gemini呼び出し (gemini-3-flash-preview via スクリプトプロパティ)
17
+ - デフォルト: gemini-flash-latest
18
  - **google-genai SDK** - thinking_budget対応の新SDK
19
 
20
  ### Frontend
 
86
 
87
  ## デプロイ情報
88
 
89
+ ### v1.x 練習モード
90
+ - **バージョン**: v1.8.1 STABLE
91
  - **HF Space**: leave-everything/ChoTensai_V3
92
+ - **GAS デプロイ**: @45 (v1.8.1)
93
+ - **バックアップ**: `V1.8.1/`
94
+
95
+ ### v2.x 配信モード(開発中)
96
+ - **バージョン**: v2.0.0 Phase 3 完了
97
+ - **HF Static Space**: leave-everything/ChoTensai_Deli
98
+ - **ローカル**: `ChoTensai_Deli/`
99
+ - **GAS デプロイ**: 未設定(v2用デプロイ予定)
100
+ - **Gemini評価**: GAS経由で動作確認済み (gemini-3-flash-preview)
101
+
102
+ ## v1.8.0 新機能
103
+
104
+ - **ユーザー単位USAGE_COUNT**: 各ユーザーが全問題を公平に体験
105
+ - **UserQuestionUsageシート**: ユーザー別問題使用履歴管理
106
 
107
  ## バックアップ
108
 
109
+ - **V1.8.1/**: 完全バックアップ(75ファイル)
110
+ - **V1.7.1/**: 制限時間機能追加版
111
  - **V1.6.15/**: 完全復旧可能なバックアップ(RECOVERY.md含む)
112
 
113
+ ## v2.0.0 配信モード開発【進行中】
114
+
115
+ ### アーキテクチャ
116
+ ```
117
+ 【共有レイヤー】
118
+ ├─ QuestionDatabase (1,600問)
119
+ ├─ Users / Answers (mode列追加)
120
+ ├─ GAS Core API
121
+ └─ Gemini API (GAS経由)
122
+
123
+ 【v1.x 練習モード】 【v2.x 配信モード】
124
+ ├─ HF Space (Flask) ├─ Static Space (ChoTensai_Deli)
125
+ ├─ デプロイ @45 └─ デプロイ @XX(新規予定)
126
+ ```
127
+
128
+ ### v2.0.0 Phase進捗(配信コア)
129
+ | Phase | 内容 | 状態 |
130
+ |-------|------|------|
131
+ | 設計 | アーキテクチャ設計 | ✅ 完了 |
132
+ | Phase 1 | データ基盤 | ✅ 完了 |
133
+ | Phase 2 | 認証・配信基盤 | ✅ 完了 |
134
+ | Phase 3 | 回答・採点 | ✅ 完了(Gemini評価テスト済み) |
135
+ | Phase 4 | リリース準備・デプロイ | 🔄 **進行中**(E2Eテスト完了、@50) |
136
+
137
+ ### v3.0.0 予定(拡張機能)
138
+ | Phase | 内容 | 詳細 |
139
+ |-------|------|------|
140
+ | Phase 5 | ランキング | 教科別・総合ランキング |
141
+ | Phase 6 | クラス制 | 6段階、加重平均判定 |
142
+ | Phase 7 | ゲーミフィケーション | 週間アイテム(金/銀/銅) |
143
+
144
+ ### v2専用シート
145
+ - DailyQuizzes, DailyResults, Rankings, Classes, UserProfiles
146
+
147
+ ### 次のステップ(Phase 4: リリース準備・デプロイ)
148
+ 1. ~~GAS v2用デプロイメント作成~~ ✅ @50
149
+ 2. ~~api.js BASE_URL設定~~ ✅
150
+ 3. ~~E2Eテスト~~ ✅ 全テスト合格
151
+ 4. GASトリガー設定(朝6:00/夕15:00)← **次**
152
+ 5. ドキュメント整備
153
+ 6. v2.0.0リリース
154
+
155
  ## 今後の構想
156
 
157
  詳細は `docs/FUTURE_VISION.md` を参照
158
+ - 【A-1】ユーザー単位管理: ✅ v1.8.0で達成
159
+ - 【A-2】制限時間設定: ✅ v1.7.0で達成
160
+ - 【A-3】苦手分野分析: 今後
161
+ - 【B】派生サービス: 🔄 v2.0.0(配信コア)開発中、v3.0.0でランキング・クラス制予定
162
+
163
+ ## v1.8.1 高品質化【進行中】
164
+
165
+ ### Phase 1: 分割ファイル作成 ✅
166
+ - 出力先: `knowledge/v1.8.1/{jp,math,sci,soc}/*.json`
167
+ - 36ファイル, 1600問
168
+
169
+ ### Phase 2: JP01高品質化【作業中】
170
+ - 既存103問 → 29問に統合(重複削除)
171
+ - japanese.mdから71問新規作成
172
+ - 合計100問(次回保存予定)
173
+
174
+ **一時ファイル**:
175
+ ```
176
+ /tmp/jp01_work/
177
+ ├── existing_unified.json (29問)
178
+ └── new_questions.json (71問)
179
+ ```
180
+
181
+ **新規問題内訳**:
182
+ - 同訓異字: 40問(会う/合う/遭う、写す/映す/移す 等)
183
+ - 同音異義語: 20問(意義/異議、解答/回答 等)
184
+ - 感情語彙: 11問(葛藤、困惑、躊躇 等)
185
 
186
  ---
187
 
 
192
  - **改善**: ログイン状態を保持したまま教科選択画面へ移動するボタンを追加
193
  - **対象ファイル**: `static/js/components.js` (ResultScreen, App)
194
 
195
+ ### 2. Geminiモデル名を環境変数化 ✅ 完了(v1.7.2)
196
+ - 環境変数 `GEMINI_MODEL` で上書き可能に
197
+ - デフォルト: `gemini-2.5-flash`
198
+
199
+ ---
200
+
201
+ ## 技術的��意事項
202
+
203
+ ### Gemini API設定(2025-12-28更新)
204
+
205
+ | 項目 | v1.x (HF Space) | v2.x (GAS) |
206
+ |------|-----------------|------------|
207
+ | 呼び出し元 | Python (gemini_service.py) | GAS (gemini_functions.js) |
208
+ | モデル | gemini-3-flash-preview | gemini-3-flash-preview |
209
+ | デフォルト | gemini-flash-latest | gemini-flash-latest |
210
+ | MAX_TOKENS | 65536 | 65536 |
211
+ | TEMPERATURE | 1.0 | 1.0 |
212
+
213
+ **モデル名の注意**:
214
+ - `gemini-2.5-flash` は廃止済み → `gemini-flash-latest` を使用
215
+ - `gemini-3-flash-preview` は構造化出力(JSON mode)対応
216
+ - スクリプトプロパティ `GEMINI_MODEL` で上書き可能
217
+
218
+ **Thinking API**:
219
+ - v1.x: `thinking_budget` パラメータ使用中(動作確認済み)
220
+ - Gemini 3.xでは `thinking_level` に変更の可能性あり
221
+ - 現状エラーなし、デフォルト動作と推測
ChoTensai_Deli ADDED
@@ -0,0 +1 @@
 
 
1
+ Subproject commit edc211d0e228b4000d7dcdc40b8fa4058843d253
PLAN.md CHANGED
@@ -1,8 +1,44 @@
1
- # PLAN: 超天才クイズ v2.0.0 - 問題配信サービス
2
 
3
  > **作成日**: 2025-12-28
 
4
  > **ベースライン**: v1.8.1 STABLE(完全バックアップ済み)
5
- > **目標**: 問題配信・回答回収・採点・集計システムの構築
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  ---
8
 
@@ -10,11 +46,13 @@
10
 
11
  ### 1.1 目的
12
 
13
- v1.x(練習モード)をベースに、問題配信サービス(v2.x)を構築する。
14
  - **問題配信**: 毎日決まった時間に問題を配信
15
  - **回答回収**: ユーザーの回答を収集
16
  - **採点**: ポイント制で採点(正答 + 時間ボーナス)
17
- - **集計**: ランキング・クラス制で継続的なモチベーション維持
 
 
18
 
19
  ### 1.2 設計原則
20
 
@@ -489,64 +527,158 @@ function generateDailyQuiz(timeSlot, subject) {
489
 
490
  ---
491
 
492
- ### Phase 4: ランキング(Week 4
493
 
494
- | タスク | 詳細 | 成果物 |
495
- |--------|------|--------|
496
- | 4.1 | ランキング計算ロジック | ranking_functions.js |
497
- | 4.2 | ランキング取得API | get_ranking |
498
- | 4.3 | ランキングUI | ranking.html |
499
- | 4.4 | リアルタイム更新 | 回答送信時に更新 |
500
 
501
- **受入基準**:
502
- - 教科別・総合ランキングが表示される
503
- - 回答送信後にランキングが更新される
 
 
504
 
505
  ---
506
 
507
- ### Phase 5: クラス制(Week 5)
508
 
509
- | タスク | 詳細 | 成果物 |
510
- |--------|------|--------|
511
- | 5.1 | 加重平均計算ロジック | class_functions.js |
512
- | 5.2 | クラス判定トリガー(毎日0:00) | GASトリガー |
513
- | 5.3 | プロフィールUI | profile.html |
514
- | 5.4 | クラス昇降格通知 | UI表示 |
 
515
 
516
- **受入基準**:
517
- - 毎日クラスが再判定される
518
- - プロフィール画面でクラスと加重平均が確認できる
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
 
520
  ---
521
 
522
- ### Phase 6: ゲーミフィケーション(Week 6)
523
 
524
- | タスク | 詳細 | 成果物 |
525
- |--------|------|--------|
526
- | 6.1 | 週間ポイント集計 | UserProfiles |
527
- | 6.2 | アイテム付与ロジック | class_functions.js |
528
- | 6.3 | アイテム表示UI | profile.html |
529
- | 6.4 | 表彰機能 | UI表示 |
 
 
530
 
531
- **受入基準**:
532
- - 週間ポイントに応じてアイテムが付与される
533
- - アイテムによる日次ボーナスが適用される
 
 
 
 
 
 
 
 
534
 
535
  ---
536
 
537
- ### Phase 7: 統合テスト・リリース(Week 7)
538
 
539
- | タスク | 詳細 | 成果物 |
540
- |--------|------|--------|
541
- | 7.1 | E2Eテスト | テスト結果 |
542
- | 7.2 | パフォーマンスチューニング | 最適化 |
543
- | 7.3 | ドキュメント整備 | docs/ |
544
- | 7.4 | v2.0.0リリース | デプロイ |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
 
546
  **受入基準**:
547
- - 全機能が正常動作
548
- - GAS実行時間が30秒以内
549
- - ドキュメント完備
 
 
550
 
551
  ---
552
 
@@ -564,15 +696,36 @@ function generateDailyQuiz(timeSlot, subject) {
564
 
565
  ## 12. マイルストーン
566
 
 
 
567
  | 週 | Phase | 主要成果物 | 状態 |
568
  |----|-------|-----------|------|
569
- | Week 1 | Phase 1 | データ基盤 | 🔲 |
570
- | Week 2 | Phase 2 | 認証・配信基盤 | 🔲 |
571
- | Week 3 | Phase 3 | 回答・採点 | 🔲 |
572
- | Week 4 | Phase 4 | ランキング | 🔲 |
573
- | Week 5 | Phase 5 | クラス制 | 🔲 |
574
- | Week 6 | Phase 6 | ゲーミフィケーション | 🔲 |
575
- | Week 7 | Phase 7 | リリース | 🔲 |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
576
 
577
  ---
578
 
@@ -587,5 +740,63 @@ function generateDailyQuiz(timeSlot, subject) {
587
 
588
  ---
589
 
590
- **最終更新**: 2025-12-28
591
- **ステータス**: 設計完了、Phase 1 準備中
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PLAN: 超天才クイズ v2.0.0 - 問題配信サービス(配信コア)
2
 
3
  > **作成日**: 2025-12-28
4
+ > **更新日**: 2025-12-29
5
  > **ベースライン**: v1.8.1 STABLE(完全バックアップ済み)
6
+ > **リリース**: ✅ **v2.0.0 STABLE リリース完了**(2025-12-29)
7
+ > **バックアップ**: `V2.0.0/` に完全バックアップ済み
8
+
9
+ ---
10
+
11
+ ## v2.0.0 リリース完了
12
+
13
+ | 項目 | 値 |
14
+ |------|-----|
15
+ | リリース日 | 2025-12-29 |
16
+ | GAS バージョン | @54 |
17
+ | HuggingFace コミット | `edc211d` |
18
+ | バックアップ | `V2.0.0/` |
19
+ | E2Eテスト | ✅ 完了(ファクトチェック済み) |
20
+
21
+ ### 実装完了機能
22
+
23
+ - ✅ 2教科×10問の一括LLM生成(`generateBatchQuestions`)
24
+ - ✅ LLM検証パート(`validateBatchQuestions`)
25
+ - ✅ 4択クイズUI(選択後自動進行、最終問題後自動採点)
26
+ - ✅ CORS対応(`Content-Type: text/plain` でプリフライト回避)
27
+ - ✅ sessionStorageによるデータ受け渡し
28
+ - ✅ トークン認証
29
+ - ✅ ポイント計算・結果表示
30
+
31
+ ---
32
+
33
+ ## v2.x マイナーアップデート予定
34
+
35
+ | 項目 | 内容 | 優先度 | 状態 |
36
+ |------|------|--------|------|
37
+ | GASトリガー設定 | 朝6:00/夕15:00 自動配信 | 高 | 🔲 |
38
+ | 回答権管理 | 1ユーザー1回限りの回答権 | 高 | 🔲 |
39
+ | ステータス表示 | 回答済み/未回答/未配信/期限切れ | 高 | 🔲 |
40
+ | ログイン改善 | UX向上、エラーハンドリング | 中 | 🔲 |
41
+ | 配信技術スタック | 最適化・選別 | 低 | 🔲 |
42
 
43
  ---
44
 
 
46
 
47
  ### 1.1 目的
48
 
49
+ v1.x(練習モード)をベースに、問題配信サービス(v2.x)の**コア機能**を構築する。
50
  - **問題配信**: 毎日決まった時間に問題を配信
51
  - **回答回収**: ユーザーの回答を収集
52
  - **採点**: ポイント制で採点(正答 + 時間ボーナス)
53
+ - **AI評価**: Geminiによる解説・フィードバック
54
+
55
+ > **v3.0.0への展望**: ランキング・クラス制・ゲーミフィケーションはv3.0.0で実装予定
56
 
57
  ### 1.2 設計原則
58
 
 
527
 
528
  ---
529
 
530
+ ### Phase 4: リリース準備・デプロイ(Week 4)【進行中】
531
 
532
+ #### Phase 4 詳細タスク一覧
 
 
 
 
 
533
 
534
+ | # | タスク | 詳細 | 成果物 | 状態 |
535
+ |---|--------|------|--------|------|
536
+ | 4.1 | GAS v2用デプロイメント作成 | デプロイ@50作成 | GAS | ✅ 完了 |
537
+ | 4.2 | api.js BASE_URL設定 | デプロイURLを設定 | api.js | ✅ 完了 |
538
+ | 4.3 | curlテスト | 全APIエンドポイント確認 | テスト結果 | ✅ 完了 |
539
 
540
  ---
541
 
542
+ #### Phase 4-A: ブロッカー解決(問題生成ステップ追加)【現在地】
543
 
544
+ | # | タスク | 詳細 | 状態 |
545
+ |---|--------|------|------|
546
+ | 4.A.1 | `generateQuestionsFromAnswers()` | 答え→問題文生成関数を新規作成(gemini_functions.js | 🔲 |
547
+ | 4.A.2 | `generateDailyQuiz()` 修正 | 問題生成→GeneratedQuestions保存ステップ追加 | 🔲 |
548
+ | 4.A.3 | `getDeliveryQuiz()` 修正 | GeneratedQuestionsから問題を取得するよう変更 | 🔲 |
549
+ | 4.A.4 | GAS clasp push & deploy | 新デプロイメント作成 | 🔲 |
550
+ | 4.A.5 | 問題表示確認テスト | ブラウザで問題文・回答欄が表示されることを確認 | 🔲 |
551
 
552
+ **根本原因(2025-12-29 特定)**:
553
+ トリガー実行時のLLM問題生成ステップが欠落している
554
+
555
+ 本システムの問題作成フロー:
556
+ 1. QuestionDatabaseには「答え」と「ヒント」のみ格納
557
+ 2. LLM(Dify/Gemini)で問題文を動的生成
558
+ 3. 生成した問題をフロントエンドに返す
559
+
560
+ v2配信モードでは複数受験者に同じ問題を配信するため、
561
+ **トリガー実行時��問題を事前生成してシートに保存する必要がある**
562
+
563
+ ```
564
+ 【v2の正しいフロー】
565
+ QuestionDatabase(答え・ヒント)
566
+ ↓ triggerMorningDelivery
567
+ Gemini APIで問題文・選択肢を事前生成 ← ★追加★
568
+
569
+ GeneratedQuestionsシートに保存 ← ★追加★
570
+
571
+ DailyQuizzesに保存済み問題IDを記録
572
+
573
+ getDeliveryQuiz → 事前生成された問題を返す
574
+ ```
575
+
576
+ **既存で使えるもの**:
577
+ - `callGeminiAPI()` - 汎用Gemini呼び出し関数(gemini_functions.js)
578
+ - `GEMINI_CONFIG.THINKING_BUDGET.GENERATION` - 問題生成用16384トークン
579
+ - `GeneratedQuestions`シート - v1で既に使用中
580
 
581
  ---
582
 
583
+ #### Phase 4-B: E2Eテスト完了(回答・採点フロー)
584
 
585
+ | # | タスク | 詳細 | 状態 |
586
+ |---|--------|------|------|
587
+ | 4.B.1 | 問題表示テスト | 問題文、難易度、カウンターが正しく表示 | 🔲 |
588
+ | 4.B.2 | 回答入力テスト | テキスト入力、Enterキー、ボタン操作 | 🔲 |
589
+ | 4.B.3 | 回答送信テスト | タイマー終了時の自動送信、手動採点 | 🔲 |
590
+ | 4.B.4 | ポイント計算テスト | 正答ポイント、時間ボーナスの計算確認 | 🔲 |
591
+ | 4.B.5 | AI評価テスト | Gemini評価の実行確認(失敗時フォールバック含む) | 🔲 |
592
+ | 4.B.6 | 結果画面テスト | 正解数、ポイント、回答詳細の表示 | 🔲 |
593
 
594
+ ---
595
+
596
+ #### Phase 4-C: エッジケース・エラーハンドリング
597
+
598
+ | # | タスク | 詳細 | 状態 |
599
+ |---|--------|------|------|
600
+ | 4.C.1 | 期限切れテスト | expires_atを過ぎたクイズへのアクセス → エラー表示 | 🔲 |
601
+ | 4.C.2 | 重複回答テスト | 同じクイズに複数回回答した場合の挙動 | 🔲 |
602
+ | 4.C.3 | 未ログインテスト | トークンなしでquiz.htmlにアクセス → リダイレクト | 🔲 |
603
+ | 4.C.4 | ネットワークエラーテスト | API失敗時のエラー表示 | 🔲 |
604
+ | 4.C.5 | 回答なし送信テスト | 未回答のまま採点した場合 | 🔲 |
605
 
606
  ---
607
 
608
+ #### Phase 4-D: GASトリガー設定
609
 
610
+ | # | タスク | 詳細 | 状態 |
611
+ |---|--------|------|------|
612
+ | 4.D.1 | 朝トリガー作成 | triggerMorningDelivery(6:00 AM JST) | 🔲 |
613
+ | 4.D.2 | 夕トリガー作成 | triggerAfternoonDelivery(15:00 PM JST) | 🔲 |
614
+ | 4.D.3 | トリガー動作確認 | 手動実行でログ確認 | 🔲 |
615
+ | 4.D.4 | 配信問題確認 | DailyQuizzesシートにデータ生成を確認 | 🔲 |
616
+
617
+ **トリガー設定手順**:
618
+ ```
619
+ 1. GASエディタ → トリガー → トリガー追加
620
+ 2. 実行する関数: triggerMorningDelivery
621
+ 3. イベントのソース: 時間主導型
622
+ 4. 時間ベースのトリガータイプ: 日付ベース
623
+ 5. 時刻: 午前6時〜7時
624
+ 6. 同様にtriggerAfternoonDeliveryを15:00〜16:00で設定
625
+ ```
626
+
627
+ ---
628
+
629
+ #### Phase 4-E: HF Static Space最終デプロイ
630
+
631
+ | # | タスク | 詳細 | 状態 |
632
+ |---|--------|------|------|
633
+ | 4.E.1 | ファイル同期 | ChoTensai_Deli/の全ファイルをGit push | 🔲 |
634
+ | 4.E.2 | Space動作確認 | HF Space URLで実動作確認 | 🔲 |
635
+ | 4.E.3 | レスポンシブ確認 | スマホ・タブレットでの表示確認 | 🔲 |
636
+
637
+ **HF Static Space情報**:
638
+ - URL: https://huggingface.co/spaces/leave-everything/ChoTensai_Deli
639
+ - ローカル: `ChoTensai_Deli/`
640
+
641
+ ---
642
+
643
+ #### Phase 4-F: ドキュメント整備
644
+
645
+ | # | タスク | 詳細 | 状態 |
646
+ |---|--------|------|------|
647
+ | 4.F.1 | リリースノート作成 | v2.0.0の変更点まとめ | 🔲 |
648
+ | 4.F.2 | 運用ガイド | トリガー設定、トラブルシューティング | 🔲 |
649
+
650
+ ---
651
+
652
+ #### Phase 4-G: 最終リリース
653
+
654
+ | # | タスク | 詳細 | 状態 |
655
+ |---|--------|------|------|
656
+ | 4.G.1 | STATUS.md更新 | v2.0.0完了ステータスに更新 | 🔲 |
657
+ | 4.G.2 | LOG.md更新 | 最終リリースログ追記 | 🔲 |
658
+ | 4.G.3 | v2.0.0タグ作成 | Git tag v2.0.0(オプション) | 🔲 |
659
+ | 4.G.4 | v1.x互換性最終確認 | 練習モードが正常動作することを再確認 | 🔲 |
660
+
661
+ ---
662
+
663
+ #### Phase 4 進捗サマリー
664
+
665
+ | サブフェーズ | 状態 | タスク数 | 備考 |
666
+ |-------------|------|----------|------|
667
+ | 4.1-4.3 初期設定 | ✅ 完了 | 3/3 | - |
668
+ | 4-A ブロッカー解決 | 🔄 **現在地** | 0/5 | 根本原因特定済み、解決策確定 |
669
+ | 4-B E2Eテスト | 🔲 待機中 | 0/6 | 4-A完了後 |
670
+ | 4-C エッジケース | 🔲 待機中 | 0/5 | - |
671
+ | 4-D GASトリガー | 🔲 待機中 | 0/4 | - |
672
+ | 4-E 最終デプロイ | 🔲 待機中 | 0/3 | - |
673
+ | 4-F ドキュメント | 🔲 待機中 | 0/2 | - |
674
+ | 4-G 最終リリース | 🔲 待機中 | 0/4 | - |
675
 
676
  **受入基準**:
677
+ - ✅ v1.x自習モードとの互換性(単一デプロイ@50で両立)
678
+ - GAS実行時間が30秒以内(約7秒で完了)
679
+ - 🔄 配信→回答→採点→AI評価の一連フローが正常動作
680
+ - 🔲 GASトリガーで自動配信が機能
681
+ - 🔲 ドキュメント完備
682
 
683
  ---
684
 
 
696
 
697
  ## 12. マイルストーン
698
 
699
+ ### v2.0.0(配信コア)
700
+
701
  | 週 | Phase | 主要成果物 | 状態 |
702
  |----|-------|-----------|------|
703
+ | Week 1 | Phase 1 | データ基盤 | 完了 |
704
+ | Week 2 | Phase 2 | 認証・配信基盤 | 完了 |
705
+ | Week 3 | Phase 3 | 回答・採点 | 完了 |
706
+ | Week 4 | Phase 4 | リリース準備・デプロイ | 🔄 **進行中** |
707
+
708
+ ### Phase 4 詳細マイルストーン
709
+
710
+ | サブフェーズ | 内容 | 予定タスク | 状態 |
711
+ |-------------|------|-----------|------|
712
+ | 4-A | ブロッカー解決 | 問題表示不具合修正 | 🔄 **現在地** |
713
+ | 4-B | E2Eテスト | 回答・採点・結果フロー | 🔲 次 |
714
+ | 4-C | エッジケース | エラーハンドリング | 🔲 |
715
+ | 4-D | GASトリガー | 自動配信設定 | 🔲 |
716
+ | 4-E | 最終デプロイ | HF Space同期 | 🔲 |
717
+ | 4-F | ドキュメント | リリースノート・運用ガイド | 🔲 |
718
+ | 4-G | 最終リリース | v2.0.0完了宣言 | 🔲 |
719
+
720
+ ### v3.0.0(拡張機能)- 将来計画
721
+
722
+ | Phase | 内容 | 詳細 |
723
+ |-------|------|------|
724
+ | Phase 5 | ランキング | 教科別・総合ランキング、リアルタイム更新 |
725
+ | Phase 6 | クラス制 | 6段階クラス、加重平均判定、昇降格 |
726
+ | Phase 7 | ゲーミフィケーション | 週間アイテム(金/銀/銅の鉛筆)、表彰機能 |
727
+
728
+ > 注: v3.0.0の詳細設計は本ドキュメント内の「7. ポイント・ランキング設計」「8. クラス制設計」「9. 週間アイテム設計」を参照
729
 
730
  ---
731
 
 
740
 
741
  ---
742
 
743
+ **最終更新**: 2025-12-29 15:00
744
+ **ステータス**: Phase 4-A 進行中(問題生成ステップ追加)
745
+ **ブロッカー**: 🔴 LLM問題生成ステップ欠落(根本原因特定済み、解決策確定)
746
+ **残りタスク**: 32タスク(4-A:5, 4-B:6, 4-C:5, 4-D:4, 4-E:3, 4-F:2, 4-G:4)+ 完了済み3タスク
747
+ **v2.0.0スコープ**: 配信コア機能(配信・回答・採点・AI評価)に集中
748
+ **v3.0.0予定**: ランキング・クラス制・ゲーミフィケーション
749
+
750
+ ---
751
+
752
+ ## 14. クイックリファレンス(Phase 4 実行時)
753
+
754
+ ### 問題表示不具合デバッグ手順
755
+
756
+ ```bash
757
+ # 1. APIレスポンス確認(quiz_idは実際の値に置換)
758
+ curl "https://script.google.com/macros/s/AKfycbwh5s6XXu9RppyfyDX5-GiclLc1w9FQk30gryfU_sEatPSlFt7_J91y0U-F1qNo82HS/exec?action=v2_get_delivery&quiz_id=2025-12-29-AM-jp&user_id=tomohiro"
759
+
760
+ # 2. レスポンスのquestionsフィールドを確認
761
+ # - question / QUESTION のどちらのキーが使われているか
762
+ # - answer / ANSWER のどちらのキーが使われているか
763
+ ```
764
+
765
+ ### GASトリガー設定コマンド(参考)
766
+
767
+ ```javascript
768
+ // GASエディタのスクリプトエディタで実行
769
+ function setupTriggers() {
770
+ // 既存トリガー削除
771
+ ScriptApp.getProjectTriggers().forEach(t => {
772
+ if (t.getHandlerFunction().startsWith('trigger')) {
773
+ ScriptApp.deleteTrigger(t);
774
+ }
775
+ });
776
+
777
+ // 朝6時トリガー
778
+ ScriptApp.newTrigger('triggerMorningDelivery')
779
+ .timeBased()
780
+ .atHour(6)
781
+ .everyDays(1)
782
+ .inTimezone('Asia/Tokyo')
783
+ .create();
784
+
785
+ // 午後3時トリガー
786
+ ScriptApp.newTrigger('triggerAfternoonDelivery')
787
+ .timeBased()
788
+ .atHour(15)
789
+ .everyDays(1)
790
+ .inTimezone('Asia/Tokyo')
791
+ .create();
792
+ }
793
+ ```
794
+
795
+ ### HF Space デプロイコマンド
796
+
797
+ ```bash
798
+ cd ChoTensai_Deli
799
+ git add .
800
+ git commit -m "v2.0.0 release"
801
+ git push
802
+ ```
STATUS.md CHANGED
@@ -1,9 +1,120 @@
1
- # プロジェクト: 超天才クイズ v2.0.0 開発中
2
 
3
  ## ステータス概要
4
- - **現在地**: v2.0.0 Phase 1 完了 / Phase 2 準備中
5
  - **v1.8.1**: STABLE稼働中(完全バックアップ済み `V1.8.1/`)
6
- - **次のステップ**: Phase 2 認証・配信基盤
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  ---
9
 
@@ -42,16 +153,23 @@
42
 
43
  ## フェーズ別進捗
44
 
 
 
45
  | Phase | 内容 | 状態 | 詳細 |
46
  |-------|------|------|------|
47
  | **設計** | アーキテクチャ設計 | ✅ 完了 | PLAN.md参照 |
48
  | **Phase 1** | データ基盤 | ✅ 完了 | シート作成、GAS基本関数 |
49
- | **Phase 2** | 認証・配信基盤 | 🔲 未着手 | トークン、配信生成 |
50
- | **Phase 3** | 回答・採点 | 🔲 未着手 | ポイント計算、Gemini評価 |
51
- | **Phase 4** | ランキング | 🔲 未着手 | 教科別・総合ランキング |
52
- | **Phase 5** | クラス制 | 🔲 未着手 | 6段階、加重平均判定 |
53
- | **Phase 6** | ゲーミフィケーション | 🔲 未着手 | 週間アイテム |
54
- | **Phase 7** | リリース | 🔲 未着手 | E2Eテスト、デプロイ |
 
 
 
 
 
55
 
56
  ---
57
 
@@ -81,6 +199,114 @@
81
 
82
  ---
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ## 新規シート設計
85
 
86
  ### v2専用シート(5つ)
@@ -105,35 +331,31 @@
105
 
106
  ```
107
  gas/
108
- ├─ Code.js ← v1/v2ルーティング★変更
109
- ├─ questiondb_functions.js ← 難易度フィルタ追加★変更
110
- ├─ auth_functions.js ← v2認証★新規
111
- ├─ delivery_functions.js v2配信管理★新規
112
- ├─ scoring_functions.js ← v2採点★新規
113
- ├─ ranking_functions.js v2ランキング★新規
114
- ├─ class_functions.js ← v2クラス判定★新規
115
- ├─ gemini_functions.js ← Gemini API★新規
116
  └─ [既存ファイル] ← v1用(変更なし)
117
  ```
118
 
119
  ---
120
 
121
- ## Static Space構成
122
 
123
  ```
124
- static-space/
125
- ├── index.html ランディング
126
- ├── quiz.html クイズ画面
127
- ├── result.html ← 結果表示
128
- ├── ranking.html ランキング
129
- ├── profile.html ← プロフィール
130
- ├── css/style.css
131
  └── js/
132
- ├── api.js ← GAS API呼び出し
133
- ├── auth.js 認証
134
- ├── quiz.js クイズロジック
135
- ├── timer.js ← タイマー
136
- └── ranking.js ← ランキング表示
137
  ```
138
 
139
  ---
@@ -202,5 +424,9 @@ cd gas && clasp push && clasp deploy -d "v1.8.1 復旧"
202
 
203
  ---
204
 
205
- **最終更新**: 2025-12-28
206
- **次のアクション**: GASデプロイ(clasp push)→ Phase 2 認証・配信基盤
 
 
 
 
 
1
+ # プロジェクト: 超天才クイズ v2.0.0 STABLE
2
 
3
  ## ステータス概要
4
+ - **現在地**: ✅ **v2.0.0 STABLE リリース完了**(2025-12-29)
5
  - **v1.8.1**: STABLE稼働中(完全バックアップ済み `V1.8.1/`)
6
+ - **v2.0.0**: STABLE稼働中(完全バックアップ済み `V2.0.0/`)
7
+ - **ブロッカー**: なし
8
+ - **次期開発**: v2.x マイナーアップデート(下記参照)
9
+
10
+ ---
11
+
12
+ ## v2.0.0 リリース情報
13
+
14
+ | 項目 | 値 |
15
+ |------|-----|
16
+ | リリース日 | 2025-12-29 |
17
+ | GAS バージョン | @54 |
18
+ | HuggingFace コミット | `edc211d` |
19
+ | バックアップ | `V2.0.0/` |
20
+ | E2Eテスト | ✅ 完了(ファクトチェック済み) |
21
+
22
+ ### 主要機能
23
+ - 2教科×10問の一括LLM生成
24
+ - LLM検証パート(品質・整合性チェック)
25
+ - 4択クイズUI(選択後自動進行、最終問題後自動採点)
26
+ - CORS対応(プリフライト回避)
27
+ - sessionStorageによるデータ受け渡し
28
+
29
+ ---
30
+
31
+ ## v2.x マイナーアップデート予定(メモ)
32
+
33
+ | 項目 | 内容 | 優先度 |
34
+ |------|------|--------|
35
+ | ログイン改善 | UX向上、エラーハンドリング | 中 |
36
+ | 回答権管理 | 1ユーザー1回限りの回答権 | 高 |
37
+ | ステータス表示 | 回答済み/未回答/未配信/期限切れ | 高 |
38
+ | 配信技術スタック | 最適化・選別 | 低 |
39
+ | GASトリガー設定 | 朝6:00/夕15:00 自動配信 | 高 |
40
+
41
+ ---
42
+
43
+ ## 開発履歴(v2.0.0)
44
+
45
+ ### 問題の現象
46
+ quiz.htmlで問題文・回答欄が空白(タイマー・問題番号は表示される)
47
+
48
+ ### 根本原因
49
+ **トリガー実行時のLLM問題生成ステップが欠落している**
50
+
51
+ 本システムの問題作成フロー:
52
+ 1. QuestionDatabaseには「答え」と「ヒント」のみ格納
53
+ 2. LLM(Dify/Gemini)で問題文を動的生成
54
+ 3. 生成した問題をフロントエンドに返す
55
+
56
+ v2配信モードでは、複数受験者に同じ問題を配信するため、
57
+ **トリガー実行時に問題を事前生成してシートに保存する必要がある**
58
+
59
+ ```
60
+ 【v2の正しいフロー】
61
+ QuestionDatabase(答え・ヒント)
62
+ ↓ triggerMorningDelivery
63
+ Gemini APIで問題文・選択肢を事前生成 ← ★欠落★
64
+
65
+ GeneratedQuestionsシートに保存 ← ★欠落★
66
+
67
+ DailyQuizzesに保存済み問題IDを記録
68
+
69
+ getDeliveryQuiz → 事前生成された問題を返す
70
+ ```
71
+
72
+ ### 解決策(評価済み: 微調整〜中規模)
73
+
74
+ | 項目 | 状態 | 備考 |
75
+ |------|------|------|
76
+ | `callGeminiAPI` | ✅ 既存 | 汎用Gemini呼び出し関数 |
77
+ | `GEMINI_CONFIG.THINKING_BUDGET.GENERATION` | ✅ 既存 | 問題生成用16384トークン定義済み |
78
+ | `GeneratedQuestions`シート | ✅ 既存 | v1で使用中 |
79
+ | `generateQuestionsFromAnswers()` | 🔲 **新規追加** | 答え→問題文生成(Gemini) |
80
+ | `generateDailyQuiz` | 🔧 **微修正** | 問題生成→保存ステップ追加 |
81
+ | `getDeliveryQuiz` | 🔧 **微修正** | GeneratedQuestionsから取得 |
82
+
83
+ **結論**: 既存設計を活かしつつ、問題生成関数追加と既存関数の微調整で対応可能
84
+
85
+ ---
86
+
87
+ ### ブラウザE2Eテスト結果 ✅
88
+
89
+ | テスト項目 | 結果 | 備考 |
90
+ |-----------|------|------|
91
+ | ログイン | ✅ 成功 | api.js/auth.js修正済み |
92
+ | ホーム画面 | ✅ 表示OK | クラス、ポイント、配信リスト |
93
+ | クイズ画面遷移 | ✅ 成功 | タイマー3分動作 |
94
+ | **問題文表示** | ✅ **成功** | 4択選択肢正常表示 |
95
+ | **回答送信** | ✅ **成功** | CORS問題解決済み |
96
+ | **採点・結果表示** | ✅ **成功** | 8/10正解、939pt獲得 |
97
+
98
+ ### 修正した問題(2025-12-29)
99
+
100
+ 1. **Static SpaceのURL**: `.hf.space` → `.static.hf.space`
101
+ 2. **JST日付計算**: UTC+9時間方式に修正
102
+ 3. **nextQuestion未定義**: `showQuestion()` に修正
103
+ 4. **CORSエラー**: `Content-Type: text/plain` でプリフライト回避
104
+ 5. **URL長制限(494エラー)**: `sessionStorage` でデータ受け渡し
105
+ 6. **問題品質**: LLM検証パート追加(整合性チェック)
106
+
107
+ ### curlテスト結果(参考)✅
108
+
109
+ | テスト項目 | 結果 |
110
+ |-----------|------|
111
+ | v2_check_status | ✅ v2シート・deliveryユーザー確認OK |
112
+ | v2_generate_token | ✅ トークン生成成功 |
113
+ | v2_verify_token | ✅ トークン検証成功 |
114
+ | v2_get_user_profile | ✅ プロフィール取得成功 |
115
+ | register_user | ✅ ユーザー登録/ログインOK |
116
+ | triggerMorningDelivery | ⚠️ 動作するが**問題文未生成** |
117
+ | **v1.x互換性テスト** | ✅ 自習モード正常動作(問題生成・回答・AI評価) |
118
 
119
  ---
120
 
 
153
 
154
  ## フェーズ別進捗
155
 
156
+ ### v2.0.0(配信コア)
157
+
158
  | Phase | 内容 | 状態 | 詳細 |
159
  |-------|------|------|------|
160
  | **設計** | アーキテクチャ設計 | ✅ 完了 | PLAN.md参照 |
161
  | **Phase 1** | データ基盤 | ✅ 完了 | シート作成、GAS基本関数 |
162
+ | **Phase 2** | 認証・配信基盤 | 完了 | Static Spaceデプロイ済み |
163
+ | **Phase 3** | 回答・採点 | 完了 | ポイント計算、Gemini評価 |
164
+ | **Phase 4** | リリース準備・デプロイ | 🔄 **進行中** | E2Eテスト完了、トリガー設定待ち |
165
+
166
+ ### v3.0.0(拡張機能)- 将来予定
167
+
168
+ | Phase | 内容 | 詳細 |
169
+ |-------|------|------|
170
+ | Phase 5 | ランキング | 教科別・総合ランキング |
171
+ | Phase 6 | クラス制 | 6段階、加重平均判定 |
172
+ | Phase 7 | ゲーミフィケーション | 週間アイテム |
173
 
174
  ---
175
 
 
199
 
200
  ---
201
 
202
+ ## Phase 2 タスク詳細【完了】
203
+
204
+ | タスク | 内容 | 状態 |
205
+ |--------|------|------|
206
+ | 2.1 | トークン生成・検証関数 | ✅ delivery_functions.jsに実装済み |
207
+ | 2.2 | 配信生成ロジック | ✅ delivery_functions.jsに実装済み |
208
+ | 2.3 | GASトリガー設定(朝/夕) | 🔲 Phase 4で設定 |
209
+ | 2.4 | 配信問題取得API | ✅ delivery_functions.jsに実装済み |
210
+ | 2.5 | Static Space基本構成 | ✅ ChoTensai_Deli/にデプロイ済み |
211
+
212
+ ### Phase 2 成果物
213
+
214
+ | ファイル | 内容 |
215
+ |---------|------|
216
+ | `ChoTensai_Deli/index.html` | ランディング/ログイン画面 |
217
+ | `ChoTensai_Deli/quiz.html` | クイズ画面(5分タイマー) |
218
+ | `ChoTensai_Deli/result.html` | 結果表示 |
219
+ | `ChoTensai_Deli/ranking.html` | ランキング表示 |
220
+ | `ChoTensai_Deli/css/style.css` | スタイル |
221
+ | `ChoTensai_Deli/js/api.js` | GAS API呼び出し |
222
+ | `ChoTensai_Deli/js/auth.js` | 認証・トークン管理 |
223
+ | `ChoTensai_Deli/js/quiz.js` | クイズユーティリティ |
224
+
225
+ ### HF Static Space
226
+
227
+ | 項目 | 値 |
228
+ |------|-----|
229
+ | Space URL | https://huggingface.co/spaces/leave-everything/ChoTensai_Deli |
230
+ | ローカル | `ChoTensai_Deli/` |
231
+
232
+ ---
233
+
234
+ ## Phase 3 タスク詳細【完了】
235
+
236
+ | タスク | 内容 | 状態 |
237
+ |--------|------|------|
238
+ | 3.1 | 回答送信API(submit_delivery) | ✅ Phase 1で実装済み |
239
+ | 3.2 | ポイント計算ロジック | ✅ Phase 1で実装済み |
240
+ | 3.3 | Gemini評価呼び出し(GAS経由) | ✅ 実装・テスト完了 |
241
+
242
+ ### Phase 3 成果物
243
+
244
+ | ファイル | 内容 |
245
+ |---------|------|
246
+ | `gas/gemini_functions.js` | Gemini API呼び出し(評価・解説生成) |
247
+ | `gas/delivery_functions.js` | Gemini評価統合済み |
248
+
249
+ ### Gemini設定
250
+
251
+ | 項目 | 値 |
252
+ |------|-----|
253
+ | デフォルトモデル | `gemini-flash-latest` |
254
+ | 使用モデル(スクリプトプロパティ) | `gemini-3-flash-preview` |
255
+ | MAX_TOKENS | 65536 |
256
+ | TEMPERATURE | 1.0 |
257
+
258
+ ---
259
+
260
+ ## Phase 4 タスク詳細【進行中】
261
+
262
+ ### Phase 4-A: ブロッカー解決(問題生成ステップ追加)✅ **完了**
263
+
264
+ | タスク | 内容 | 状態 |
265
+ |--------|------|------|
266
+ | 4.A.1 | `generateQuestionsFromAnswers()` 新規作成 | ✅ gemini_functions.js |
267
+ | 4.A.2 | `generateDailyQuiz()` 修正(問題生成→保存追加) | ✅ delivery_functions.js |
268
+ | 4.A.3 | `getDeliveryQuiz()` 修正(GeneratedQuestionsから取得) | ✅ delivery_functions.js |
269
+ | 4.A.4 | GAS clasp push & deploy | ✅ @53 |
270
+ | 4.A.5 | 問題表示確認テスト | ✅ 4択UI・APIテスト完了 |
271
+
272
+ ### Phase 4-B: 回答送信・採点テスト ✅ **完了**
273
+
274
+ | タスク | 内容 | 状態 |
275
+ |--------|------|------|
276
+ | 4.B.1 | nextQuestion未定義エラー修正 | ✅ quiz.html |
277
+ | 4.B.2 | CORSエラー修正(text/plain) | ✅ api.js |
278
+ | 4.B.3 | URL長制限エラー修正(sessionStorage) | ✅ quiz.html, result.html |
279
+ | 4.B.4 | 採点・結果表示テスト | ✅ 8/10正解、939pt |
280
+
281
+ ### Phase 4-C: 一括生成・検証パート ✅ **完了**
282
+
283
+ | タスク | 内容 | 状態 |
284
+ |--------|------|------|
285
+ | 4.C.1 | `generateBatchQuestions()` 新規作成 | ✅ gemini_functions.js |
286
+ | 4.C.2 | `validateBatchQuestions()` 新規作成 | ✅ gemini_functions.js |
287
+ | 4.C.3 | `generateDailyQuiz()` を一括処理に変更 | ✅ delivery_functions.js |
288
+ | 4.C.4 | 「前へ」「次へ」ボタン削除 | ✅ quiz.html |
289
+ | 4.C.5 | GAS clasp push & deploy | ✅ @54 |
290
+
291
+ ### Phase 4-D〜G(残りタスク)
292
+
293
+ | タスク | 内容 | 状態 |
294
+ |--------|------|------|
295
+ | 4.D | GASトリガー設定(朝6:00/夕15:00) | 🔲 |
296
+ | 4.E | 一括生成・検証テスト | 🔲 問題再生成待ち |
297
+ | 4.F | ドキュメン��整備 | 🔲 |
298
+ | 4.G | v2.0.0リリース | 🔲 |
299
+
300
+ ### GAS v2デプロイメント情報
301
+
302
+ | 項目 | 値 |
303
+ |------|-----|
304
+ | デプロイメントID | AKfycbyo8CX6bDA4uP2sx-Jb1USt6l_615ACFYGpn4Bf_whpOZEhEKO6J8neHVjDunVGDnj8 |
305
+ | バージョン | @54 |
306
+ | 説明 | v2.0.0 Phase 4-C: 一括生成・検証パート追加 |
307
+
308
+ ---
309
+
310
  ## 新規シート設計
311
 
312
  ### v2専用シート(5つ)
 
331
 
332
  ```
333
  gas/
334
+ ├─ Code.js ← v1/v2ルーティング ✅
335
+ ├─ questiondb_functions.js ← 難易度フィルタ追加 ✅
336
+ ├─ delivery_functions.js ← v2配信管理 ✅
337
+ ├─ gemini_functions.js Gemini API ✅
338
+ ├─ ranking_functions.js ← v3.0.0で実装予定
339
+ ├─ class_functions.js v3.0.0で実装予定
 
 
340
  └─ [既存ファイル] ← v1用(変更なし)
341
  ```
342
 
343
  ---
344
 
345
+ ## Static Space構成(ChoTensai_Deli/)
346
 
347
  ```
348
+ ChoTensai_Deli/ ← HF Space連携済み
349
+ ├── index.html ランディング/ログイン
350
+ ├── quiz.html クイズ画面(5分タイマー内蔵)
351
+ ├── result.html ← 結果表示
352
+ ├── ranking.html ランキング表示
353
+ ├── css/
354
+ │ └── style.css ← スタイル
355
  └── js/
356
+ ├── api.js ← GAS API呼び出し
357
+ ├── auth.js 認証・トークン管理
358
+ └── quiz.js クイズユーティリティ
 
 
359
  ```
360
 
361
  ---
 
424
 
425
  ---
426
 
427
+ **最終更新**: 2025-12-29 22:00
428
+ **現在のステータス**: **v2.0.0 STABLE リリース完了**
429
+ **バックアップ**: `V2.0.0/` に完全バックアップ済み
430
+ **正式URL**: `https://leave-everything-chotensai-deli.static.hf.space/`
431
+ **次期開発**: v2.x マイナーアップデート(回答権管理、ステータス表示、トリガー設定等)
432
+ **v3.0.0予定**: ランキング・クラス制・ゲーミフィケーション
V1.8.1/RECOVERY.md ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # V1.8.1 完全復旧手順書
2
+
3
+ ## バージョン情報
4
+
5
+ | 項目 | 値 |
6
+ |------|-----|
7
+ | バージョン | v1.8.1 |
8
+ | 作成日 | 2025-12-28 |
9
+ | GAS Version | @45 |
10
+ | GAS Deploy ID | AKfycbwuJjozC9Kbru-ZrvfA5mtX9cfLnXVgHqJ-poOB7Az61tJv3UcHDkkVupB5IBoxG_sC |
11
+ | 総ファイル数 | 88ファイル |
12
+
13
+ ## 主な変更点
14
+
15
+ ### QuestionDatabase更新
16
+ - **総問題数**: 1,600問
17
+ - **国語**: 400問(JP01-JP08)← JP07, JP08追加
18
+ - **数学**: 400問(MA01-MA10)
19
+ - **理科**: 400問(SC01-SC12)← SC11, SC12追加
20
+ - **社会**: 400問(SO01-SO10)
21
+
22
+ ### GENRE_CONFIG更新
23
+ - 国語: JP07, JP08 追加(JP01:2, JP02:2, JP03-08:各1 = 10問)
24
+ - 理科: SC11, SC12 追加(12カテゴリからランダム10カテゴリ選択)
25
+
26
+ ### 新機能
27
+ - 理科のランダム10カテゴリ選択ロジック追加
28
+
29
+ ---
30
+
31
+ ## バックアップ内容(完全版)
32
+
33
+ ```
34
+ V1.8.1/
35
+ ├── RECOVERY.md(この文書)
36
+ ├── .env(環境変数)
37
+ ├── app.py(メインアプリケーション)
38
+ ├── requirements.txt(Python依存関係)
39
+
40
+ ├── gas/(GAS全ファイル)
41
+ │ ├── .clasp.json
42
+ │ ├── appsscript.json
43
+ │ ├── Code.js
44
+ │ ├── DifyService.js
45
+ │ ├── GenreMaster.js
46
+ │ ├── questiondb_functions.js
47
+ │ ├── setup_dify_properties.js
48
+ │ ├── setup_sheets_v2.js
49
+ │ └── setup_sheets_v3.js
50
+
51
+ ├── src/(Pythonソースコード)
52
+ │ ├── __init__.py
53
+ │ ├── models/
54
+ │ │ └── gemini_schemas.py
55
+ │ ├── prompts/
56
+ │ │ ├── evaluation_prompts.py
57
+ │ │ ├── question_prompts.py
58
+ │ │ └── validation_prompts.py
59
+ │ └── services/
60
+ │ ├── auth_service.py
61
+ │ ├── gas_client.py
62
+ │ ├── gemini_service.py
63
+ │ ├── knowledge_service.py
64
+ │ └── questiondb_service.py
65
+
66
+ ├── static/(フロントエンド)
67
+ │ ├── index.html
68
+ │ ├── css/style.css
69
+ │ └── js/
70
+ │ ├── apiClient.js
71
+ │ ├── components.js
72
+ │ ├── config.js
73
+ │ ├── icons.js
74
+ │ ├── mockData.js
75
+ │ └── sessionManager.js
76
+
77
+ └── knowledge/v1.8.1/(問題データベース)
78
+ ├── QuestionDatabase.csv(1,600問)
79
+ ├── jp/(JP01-JP08.json)
80
+ ├── math/(MA01-MA10.json)
81
+ ├── sci/(SC01-SC12.json)
82
+ └── soc/(SO01-SO10.json)
83
+ ```
84
+
85
+ ---
86
+
87
+ ## 完全復旧手順
88
+
89
+ ### 1. Pythonアプリケーション復旧
90
+
91
+ ```bash
92
+ # プロジェクトルートで実行
93
+ cp V1.8.1/app.py ./
94
+ cp V1.8.1/requirements.txt ./
95
+ cp -r V1.8.1/src ./
96
+ cp -r V1.8.1/static ./
97
+ cp V1.8.1/.env ./
98
+ ```
99
+
100
+ ### 2. GASコード復旧
101
+
102
+ ```bash
103
+ # GASファイルをすべてコピー
104
+ cp V1.8.1/gas/* gas/
105
+
106
+ # GASにプッシュ
107
+ cd gas
108
+ clasp push
109
+ clasp deploy -d "v1.8.1 復旧"
110
+ ```
111
+
112
+ ### 3. QuestionDatabase復旧
113
+
114
+ 1. Googleシートを開く: https://docs.google.com/spreadsheets/d/10JLP5ds2CNDOEYTxEzDyY82dErbD-InkTeuyzS_w_3U
115
+ 2. QuestionDatabaseシートのA2以下を全削除
116
+ 3. `V1.8.1/knowledge/v1.8.1/QuestionDatabase.csv` を開く
117
+ 4. A2:H1601(1,600行)をコピー&ペースト
118
+
119
+ ### 4. HF Spaces復旧
120
+
121
+ 1. HF Space: https://huggingface.co/spaces/leave-everything/ChoTensai_V3
122
+ 2. Settings → Repository secrets
123
+ 3. `GAS_API_URL` を以下に設定:
124
+ ```
125
+ https://script.google.com/macros/s/AKfycbwuJjozC9Kbru-ZrvfA5mtX9cfLnXVgHqJ-poOB7Az61tJv3UcHDkkVupB5IBoxG_sC/exec
126
+ ```
127
+
128
+ ### 5. 動作確認
129
+
130
+ ```bash
131
+ # ローカルテスト
132
+ python app.py
133
+
134
+ # ブラウザで確認
135
+ # http://localhost:7860
136
+ ```
137
+
138
+ ---
139
+
140
+ ## ロールバック(v1.8.0に戻す場合)
141
+
142
+ ```bash
143
+ # GAS v1.8.0に戻す
144
+ cd gas
145
+ clasp deploy -V 44
146
+
147
+ # 環境変数を旧URLに戻す
148
+ GAS_API_URL=https://script.google.com/macros/s/AKfycbyItcslhORkvg_nAi2lJ40xwYEH6V8NtBvOFK-Ld8hA336s8RqCZnpoAsScfrDveTIL/exec
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 関連リンク
154
+
155
+ - **HF Space**: https://huggingface.co/spaces/leave-everything/ChoTensai_V3
156
+ - **Spreadsheet**: https://docs.google.com/spreadsheets/d/10JLP5ds2CNDOEYTxEzDyY82dErbD-InkTeuyzS_w_3U
157
+ - **GAS Editor**: `clasp open` で開く
158
+
159
+ ---
160
+
161
+ **最終更新**: 2025-12-28(完全バックアップ版)
V1.8.1/app.py ADDED
@@ -0,0 +1,691 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 超天才クイズ v3 - FastAPI Backend
3
+ HuggingFace Spaces Docker SDK
4
+
5
+ Difyを排除し、Gemini APIを直接呼び出すアーキテクチャ
6
+ """
7
+
8
+ import os
9
+ import json
10
+ import logging
11
+ import asyncio
12
+ from pathlib import Path
13
+ from fastapi import FastAPI, HTTPException
14
+ from fastapi.staticfiles import StaticFiles
15
+ from fastapi.responses import FileResponse
16
+ from pydantic import BaseModel
17
+ from typing import List, Optional, Dict
18
+ from dotenv import load_dotenv
19
+
20
+ # .envファイルを読み込み
21
+ load_dotenv()
22
+
23
+ # サービス
24
+ from src.services.gemini_service import GeminiService
25
+ from src.services.gas_client import GASClient, extract_exclude_keywords
26
+ # KnowledgeService削除 - QuestionDB駆動に移行(v1.6.0)
27
+ from src.services.auth_service import AuthService
28
+ from src.services.questiondb_service import QuestionDBService
29
+
30
+ # ロギング設定
31
+ logging.basicConfig(level=logging.INFO)
32
+ logger = logging.getLogger(__name__)
33
+
34
+ # FastAPIアプリ
35
+ app = FastAPI(
36
+ title="超天才クイズ v3 API",
37
+ description="中学受験対策4択クイズ - Gemini直接統合版",
38
+ version="3.0.0"
39
+ )
40
+
41
+ # サービス初期化
42
+ gemini_service = GeminiService()
43
+ gas_client = GASClient()
44
+ # KnowledgeService削除 - QuestionDB駆動に移行(v1.6.0)
45
+ questiondb_service = QuestionDBService(gas_client=gas_client, gemini_service=gemini_service)
46
+
47
+
48
+ # =============================================================================
49
+ # リクエスト/レスポンスモデル
50
+ # =============================================================================
51
+
52
+ class RegisterUserRequest(BaseModel):
53
+ username: str
54
+ password: str
55
+ invite_code: str
56
+
57
+ class StartSessionRequest(BaseModel):
58
+ user_id: str
59
+ subjects: List[str]
60
+
61
+ class GenerateQuestionsRequest(BaseModel):
62
+ session_id: str
63
+ subjects: List[str]
64
+ user_id: Optional[str] = None # v1.4.0: 要約・ジャンルカウント取得用
65
+
66
+ class Answer(BaseModel):
67
+ question_id: str
68
+ selected_answer: int
69
+ user_answer: Optional[int] = None # GAS APIに渡す用(数値型で統一)
70
+ correct_answer: Optional[int] = None # GAS APIに渡す用
71
+ subject: Optional[str] = None
72
+ category: Optional[str] = None
73
+ time_taken_seconds: Optional[int] = 0
74
+
75
+ class SubmitAnswersRequest(BaseModel):
76
+ session_id: str
77
+ answers: List[Answer]
78
+
79
+ class GetStatisticsRequest(BaseModel):
80
+ user_id: str
81
+ subjects: Optional[List[str]] = None
82
+
83
+ class GetEvaluationRequest(BaseModel):
84
+ session_id: str
85
+ subjects: Optional[List[str]] = None
86
+
87
+ class LoginRequest(BaseModel):
88
+ username: str
89
+ password: str
90
+
91
+
92
+ # =============================================================================
93
+ # バックグラウンドタスク
94
+ # =============================================================================
95
+
96
+ async def background_summary_generation(
97
+ session_id: str,
98
+ validated_by_subject: Dict[str, List[Dict]]
99
+ ):
100
+ """
101
+ バックグラウンドでサマリー生成→GAS保存
102
+
103
+ Args:
104
+ session_id: セッションID
105
+ validated_by_subject: 教科別問題辞書
106
+ """
107
+ try:
108
+ logger.info(f"background_summary_generation: Starting for session_id={session_id}")
109
+
110
+ # 各教科のサマリーを生成
111
+ for subject, questions in validated_by_subject.items():
112
+ if not questions:
113
+ continue
114
+
115
+ try:
116
+ # Geminiでサマリー生成
117
+ logger.info(f"background_summary_generation: Generating summary for {subject} ({len(questions)} questions)")
118
+ summary_data = await gemini_service.generate_summary(subject, questions)
119
+
120
+ # GASに保存
121
+ logger.info(f"background_summary_generation: Saving summary for {subject} to GAS")
122
+ save_result = await gas_client.save_summary(
123
+ session_id=session_id,
124
+ subject=subject,
125
+ summary_data=summary_data
126
+ )
127
+
128
+ if save_result.get("success"):
129
+ logger.info(f"background_summary_generation: Summary saved successfully for {subject}")
130
+ else:
131
+ logger.warning(f"background_summary_generation: Failed to save summary for {subject}: {save_result}")
132
+
133
+ except Exception as subject_error:
134
+ logger.error(f"background_summary_generation: Error processing {subject}: {subject_error}")
135
+ # 1教科の失敗は他に影響させない
136
+ continue
137
+
138
+ logger.info(f"background_summary_generation: Completed for session_id={session_id}")
139
+
140
+ except Exception as e:
141
+ logger.error(f"background_summary_generation: Fatal error for session_id={session_id}: {e}")
142
+ # バックグラウンドタスクなので例外は握りつぶす
143
+
144
+
145
+ # =============================================================================
146
+ # APIエンドポイント
147
+ # =============================================================================
148
+
149
+ @app.get("/api/health")
150
+ async def health_check():
151
+ """ヘルスチェック"""
152
+ return {
153
+ "status": "healthy",
154
+ "version": "3.0.0",
155
+ "services": {
156
+ "gemini": gemini_service.is_available(),
157
+ "gas": gas_client.is_available(),
158
+ "questiondb": True # QuestionDB駆動に移行(v1.6.0)
159
+ }
160
+ }
161
+
162
+
163
+ @app.post("/api/register_user")
164
+ async def register_user(request: RegisterUserRequest):
165
+ """ユーザー登録"""
166
+ try:
167
+ # 招待コード検証
168
+ valid_invite_code = os.environ.get("INVITE_CODE", "")
169
+
170
+ if not valid_invite_code:
171
+ logger.error("register_user: INVITE_CODE environment variable is not set")
172
+ raise HTTPException(status_code=403, detail="招待コードが設定されていません")
173
+
174
+ if request.invite_code != valid_invite_code:
175
+ logger.warning(f"register_user: Invalid invite code attempt for user '{request.username}'")
176
+ raise HTTPException(status_code=403, detail="招待コードが無効です")
177
+
178
+ logger.info(f"register_user: Invite code verified for user '{request.username}'")
179
+
180
+ # パスワードをハッシュ化
181
+ hashed_password = AuthService.hash_password(request.password)
182
+ logger.info(f"register_user: Password hashed for user '{request.username}'")
183
+
184
+ # GAS連携処理(ハッシュ化されたパスワードを渡す)
185
+ result = await gas_client.register_user(request.username, hashed_password)
186
+
187
+ # 既存ユーザーの場合はエラー
188
+ if result.get("data", {}).get("is_new") == False:
189
+ raise HTTPException(status_code=409, detail="このユーザー名は既に登録されています")
190
+
191
+ return result
192
+ except HTTPException:
193
+ # HTTPExceptionはそのまま再送出
194
+ raise
195
+ except Exception as e:
196
+ logger.error(f"register_user error: {e}")
197
+ raise HTTPException(status_code=500, detail=str(e))
198
+
199
+
200
+ @app.post("/api/login")
201
+ async def login(request: LoginRequest):
202
+ """ログイン"""
203
+ try:
204
+ # GASからユーザー情報取得
205
+ result = await gas_client.login(request.username)
206
+
207
+ # ユーザーが見つからない場合
208
+ if not result.get("found"):
209
+ logger.warning(f"login: User not found: '{request.username}'")
210
+ raise HTTPException(status_code=401, detail="ユーザー名またはパスワードが正しくありません")
211
+
212
+ data = result.get("data", {})
213
+ stored_hash = data.get("password_hash")
214
+
215
+ # パスワード未設定の既存ユーザー(v1.0からの移行ユーザー)
216
+ if not stored_hash:
217
+ logger.info(f"login: User '{request.username}' needs password migration")
218
+ raise HTTPException(
219
+ status_code=403,
220
+ detail="パスワードが未設定です。新規登録画面からパスワードを設定してください。"
221
+ )
222
+
223
+ # パスワード検証
224
+ if not AuthService.verify_password(request.password, stored_hash):
225
+ logger.warning(f"login: Invalid password for user '{request.username}'")
226
+ raise HTTPException(status_code=401, detail="ユーザー名またはパスワードが正しくありません")
227
+
228
+ logger.info(f"login: User '{request.username}' logged in successfully")
229
+
230
+ return {
231
+ "success": True,
232
+ "data": {
233
+ "user_id": data.get("user_id"),
234
+ "username": data.get("username")
235
+ }
236
+ }
237
+ except HTTPException:
238
+ raise
239
+ except Exception as e:
240
+ logger.error(f"login error: {e}")
241
+ raise HTTPException(status_code=500, detail=str(e))
242
+
243
+
244
+ @app.post("/api/start_session")
245
+ async def start_session(request: StartSessionRequest):
246
+ """セッション開始"""
247
+ try:
248
+ result = await gas_client.start_session(request.user_id, request.subjects)
249
+ return result
250
+ except Exception as e:
251
+ logger.error(f"start_session error: {e}")
252
+ raise HTTPException(status_code=500, detail=str(e))
253
+
254
+
255
+ @app.post("/api/generate_questions")
256
+ async def generate_questions(request: GenerateQuestionsRequest):
257
+ """問題生成 - QuestionDB駆動(高速版)
258
+
259
+ v1.6.0: QuestionDB駆動に移行
260
+ - Before: Gemini API 2回呼び出し(問題生成+検証)→ 20-60秒
261
+ - After: QuestionDB取得 + Gemini 1回(選択肢のみ)→ 2-5秒
262
+ """
263
+ try:
264
+ logger.info(f"generate_questions: Starting QuestionDB-driven generation for {len(request.subjects)} subjects: {request.subjects}")
265
+
266
+ # Phase 0: 統計・要約取得(優先ジャンル・除外ID用)
267
+ priority_genres = None
268
+ exclude_ids = None
269
+
270
+ if request.user_id:
271
+ try:
272
+ # 統計取得(ジャンルカウント含む)
273
+ stats_result = await gas_client.get_statistics(request.user_id, request.subjects)
274
+ priority_genres = stats_result.get("data", {}).get("priority_genres", {})
275
+ logger.info(f"generate_questions: Got priority_genres for {len(priority_genres)} subjects")
276
+
277
+ # 要約取得(重複問題除外用)
278
+ summaries_result = await gas_client.get_question_summaries(request.user_id, limit=5)
279
+ exclude_keywords = extract_exclude_keywords(summaries_result.get("data", summaries_result))
280
+ # TODO: exclude_keywords から exclude_ids に変換する処理(将来実装)
281
+ logger.info(f"generate_questions: Got {len(exclude_keywords)} exclude keywords")
282
+ except Exception as e:
283
+ logger.warning(f"generate_questions: Failed to get stats/summaries (non-fatal): {e}")
284
+
285
+ # Phase 1: QuestionDBから問題取得 + 選択肢生成
286
+ # v1.8: user_idがある場合はユーザー単位USAGE_COUNTを使用
287
+ logger.info(f"generate_questions: Fetching questions from QuestionDB (user_id={request.user_id})")
288
+ questions_by_subject = await questiondb_service.get_questions_from_db(
289
+ subjects=request.subjects,
290
+ count_per_subject=10,
291
+ priority_genres=priority_genres,
292
+ exclude_ids=exclude_ids,
293
+ user_id=request.user_id # v1.8: ユーザー単位USAGE_COUNT
294
+ )
295
+
296
+ # 取得結果の確認
297
+ total_generated = sum(len(qs) for qs in questions_by_subject.values())
298
+ logger.info(f"generate_questions: Retrieved {total_generated} questions from DB")
299
+
300
+ # 取得失敗の確認
301
+ failed_subjects = [s for s in request.subjects if len(questions_by_subject.get(s, [])) == 0]
302
+ if len(failed_subjects) == len(request.subjects):
303
+ raise HTTPException(
304
+ status_code=500,
305
+ detail="QuestionDatabaseから問題を取得できませんでした。もう一度お試しください。"
306
+ )
307
+
308
+ # Phase 2: 並列保存
309
+ async def save_for_subject(subject: str, questions: list):
310
+ """教科ごとのGAS保存処理"""
311
+ saved = await gas_client.save_questions(
312
+ session_id=request.session_id,
313
+ subject=subject,
314
+ questions=questions
315
+ )
316
+ logger.info(f"generate_questions: Saved {len(saved)} questions for '{subject}'")
317
+ return {"subject": subject, "saved": saved}
318
+
319
+ save_tasks = [
320
+ save_for_subject(subject, questions)
321
+ for subject, questions in questions_by_subject.items()
322
+ if questions # 空でない場合のみ保存
323
+ ]
324
+ save_results = await asyncio.gather(*save_tasks, return_exceptions=True)
325
+
326
+ # 教科名マッピング
327
+ subject_names = {
328
+ "jp": "国語",
329
+ "math": "算数",
330
+ "sci": "理科",
331
+ "soc": "社会"
332
+ }
333
+
334
+ # 保存結果を集約(元データ + question_id マージ)
335
+ all_questions = []
336
+ logger.info(f"generate_questions: Question save summary - total_subjects={len(save_results)}")
337
+ for idx, result in enumerate(save_results):
338
+ if isinstance(result, Exception):
339
+ logger.error(f"generate_questions: Save failed for task {idx}: {result}")
340
+ else:
341
+ subject = result.get("subject", "unknown")
342
+ saved = result.get("saved", [])
343
+ original = questions_by_subject.get(subject, []) # 元のGemini生成データ
344
+
345
+ # question_id をマージして完全なデータを構築
346
+ for i, orig_q in enumerate(original):
347
+ if i < len(saved):
348
+ orig_q["question_id"] = saved[i].get("question_id")
349
+ orig_q["subject"] = subject
350
+ orig_q["subject_name"] = subject_names.get(subject, subject)
351
+
352
+ all_questions.extend(original)
353
+ logger.info(f"generate_questions: Saved summary - subject={subject}, saved_count={len(original)}")
354
+
355
+ logger.info(f"generate_questions: All questions saved - total_count={len(all_questions)}")
356
+
357
+ # Phase 3: usage_count更新
358
+ # v1.6.15: GAS側で抽出時に更新するため、ここでの呼び出しは不要
359
+ # (抽出時更新により、Gemini生成失敗時もカウントされるがシンプルさを優先)
360
+
361
+ # Phase 4: バックグラウンドでサマリー生成(UIレスポンスを待たせない)
362
+ asyncio.create_task(
363
+ background_summary_generation(
364
+ session_id=request.session_id,
365
+ validated_by_subject=questions_by_subject
366
+ )
367
+ )
368
+ logger.info(f"generate_questions: Background summary generation task created")
369
+
370
+ # レスポンス構築
371
+ response_data = {
372
+ "session_id": request.session_id,
373
+ "questions": all_questions,
374
+ "total_count": len(all_questions)
375
+ }
376
+
377
+ if failed_subjects:
378
+ response_data["warnings"] = {
379
+ "failed_subjects": failed_subjects,
380
+ "message": f"以下の教科で問題取得に失敗しました: {', '.join(failed_subjects)}"
381
+ }
382
+ logger.warning(f"generate_questions: Partial success - failed subjects: {failed_subjects}")
383
+
384
+ logger.info(f"generate_questions: Completed with {len(all_questions)} total questions")
385
+
386
+ return {
387
+ "success": True,
388
+ "data": response_data
389
+ }
390
+ except HTTPException:
391
+ raise
392
+ except Exception as e:
393
+ logger.error(f"generate_questions error: {e}")
394
+ raise HTTPException(status_code=500, detail=str(e))
395
+
396
+
397
+ @app.post("/api/submit_answers")
398
+ async def submit_answers(request: SubmitAnswersRequest):
399
+ """解答送信"""
400
+ try:
401
+ result = await gas_client.submit_answers(
402
+ session_id=request.session_id,
403
+ answers=[a.model_dump() for a in request.answers]
404
+ )
405
+ logger.info(f"[submit_answers] GAS response: {result}")
406
+ return result
407
+ except Exception as e:
408
+ logger.error(f"submit_answers error: {e}")
409
+ raise HTTPException(status_code=500, detail=str(e))
410
+
411
+
412
+ @app.post("/api/get_statistics")
413
+ async def get_statistics(request: GetStatisticsRequest):
414
+ """統計取得
415
+
416
+ v1.6.13: GASからのcumulative/subjectsをそのまま使用するように修正
417
+ """
418
+ try:
419
+ result = await gas_client.get_statistics(
420
+ user_id=request.user_id,
421
+ subjects=request.subjects
422
+ )
423
+
424
+ # GASレスポンスをフロントエンド期待形式に変換
425
+ if result.get("success"):
426
+ gas_data = result.get("data", {})
427
+ logger.debug(f"get_statistics: GAS response keys: {gas_data.keys()}")
428
+
429
+ # v1.6.13: GASからの cumulative と subjects をそのまま使用
430
+ # GASは以下の形式で返す:
431
+ # {
432
+ # "user_id": "...",
433
+ # "subjects": [...],
434
+ # "radar_chart": {...},
435
+ # "cumulative": { "total_sessions", "total_questions", "total_correct", "overall_accuracy" }
436
+ # }
437
+
438
+ gas_cumulative = gas_data.get("cumulative", {})
439
+ gas_subjects = gas_data.get("subjects", [])
440
+
441
+ logger.debug(f"get_statistics: cumulative from GAS: {gas_cumulative}")
442
+ logger.debug(f"get_statistics: subjects count from GAS: {len(gas_subjects)}")
443
+
444
+ # 教科名マッピング(GASにない場合のフォールバック用)
445
+ subject_names = {
446
+ "jp": "国語",
447
+ "math": "算数",
448
+ "sci": "理科",
449
+ "soc": "社会"
450
+ }
451
+
452
+ # ジャンル名マッピング(CLAUDE.md準拠)
453
+ genre_names = {
454
+ # 国語
455
+ "JP01": "漢字・語彙(読み書き、四字熟語、慣用句、ことわざ)",
456
+ "JP02": "文法・言葉のきまり(品詞、敬語、文の成分、修飾関係)",
457
+ "JP03": "物語文読解(心情理解、場面把握、人物関係)",
458
+ "JP04": "説明文・論説文読解(要旨、段落構成、筆者の主張)",
459
+ "JP05": "随筆文読解(筆者の体験・感想の読み取り)",
460
+ "JP06": "詩・韻文(詩、短歌、俳句、表現技法)",
461
+ "JP07": "記述問題(理由説明、要約、意見記述)",
462
+ "JP08": "知識・文学史(作家、作品名、文学的常識)",
463
+ # 算数
464
+ "MA01": "計算",
465
+ "MA02": "数の性質",
466
+ "MA03": "割合・比",
467
+ "MA04": "速さ",
468
+ "MA05": "文章題(その他)",
469
+ "MA06": "平面図形",
470
+ "MA07": "立体図形",
471
+ "MA08": "場合の数・確率",
472
+ "MA09": "グラフ・表",
473
+ "MA10": "特殊算",
474
+ # 理科
475
+ "SC01": "力・運動",
476
+ "SC02": "電気",
477
+ "SC03": "光・音・熱",
478
+ "SC04": "物質の性質",
479
+ "SC05": "水溶液",
480
+ "SC06": "燃焼・化学変化",
481
+ "SC07": "植物",
482
+ "SC08": "動物",
483
+ "SC09": "人体",
484
+ "SC10": "天体",
485
+ "SC11": "気象",
486
+ "SC12": "地学",
487
+ # 社会
488
+ "SO01": "日本地理(国土・自然)",
489
+ "SO02": "日本地理(産業)",
490
+ "SO03": "世界地理",
491
+ "SO04": "歴史(古代〜平安)",
492
+ "SO05": "歴史(鎌倉〜室町)",
493
+ "SO06": "歴史(安土桃山〜江戸)",
494
+ "SO07": "歴史(明治〜���代)",
495
+ "SO08": "公民(政治・憲法)",
496
+ "SO09": "公民(経済・国際)",
497
+ "SO10": "時事問題"
498
+ }
499
+
500
+ # subjects配列を処理(ジャンル名を補完)
501
+ subjects_list = []
502
+ for subj in gas_subjects:
503
+ # subject_nameがない場合はマッピングから取得
504
+ if not subj.get("subject_name"):
505
+ subj["subject_name"] = subject_names.get(subj.get("subject", ""), subj.get("subject", ""))
506
+
507
+ # genresのジャンル名を補完
508
+ genres = subj.get("genres", [])
509
+ for genre in genres:
510
+ if not genre.get("genre_name") or genre.get("genre_name") == "不明":
511
+ genre["genre_name"] = genre_names.get(genre.get("genre_id", ""), genre.get("genre_id", ""))
512
+
513
+ # total_attemptedフィールドを追加(フロントエンド互換)
514
+ if "total_attempted" not in subj:
515
+ subj["total_attempted"] = subj.get("total_questions", 0)
516
+
517
+ subjects_list.append(subj)
518
+
519
+ # 累積統計を構築(GASからのデータを使用)
520
+ cumulative = {
521
+ "total_sessions": gas_cumulative.get("total_sessions", 0),
522
+ "total_questions": gas_cumulative.get("total_questions", 0),
523
+ "overall_accuracy": gas_cumulative.get("overall_accuracy", 0.0)
524
+ }
525
+
526
+ transformed_result = {
527
+ "success": True,
528
+ "data": {
529
+ "cumulative": cumulative,
530
+ "subjects": subjects_list
531
+ }
532
+ }
533
+
534
+ logger.info(f"get_statistics: Returning cumulative={cumulative}")
535
+ return transformed_result
536
+ else:
537
+ # GASがエラーを返した場合はそのまま返す
538
+ return result
539
+
540
+ except Exception as e:
541
+ logger.error(f"get_statistics error: {e}")
542
+ raise HTTPException(status_code=500, detail=str(e))
543
+
544
+
545
+ @app.post("/api/get_evaluation")
546
+ async def get_evaluation(request: GetEvaluationRequest):
547
+ """評価生成 - Gemini API直接呼び出し(一括評価対応)
548
+
549
+ v1.4.0: 要約ステータス・クイズ内容表示対応
550
+ """
551
+ try:
552
+ # セッションの統計・結果を取得
553
+ logger.info(f"get_evaluation: Fetching session results for {request.session_id}")
554
+ session_data = await gas_client.get_session_results(request.session_id)
555
+ logger.info(f"get_evaluation: Session data received: {session_data.get('success', 'no success key')}")
556
+
557
+ # v1.4.0: 要約ステータスチェック
558
+ summary_status = None
559
+ quiz_summary = None
560
+ try:
561
+ summary_result = await gas_client.check_summary_status(request.session_id)
562
+ if summary_result.get("success") or summary_result.get("completed"):
563
+ summary_status = summary_result
564
+ # 要約テキストを構築(今回のクイズ内容)
565
+ summaries = summary_result.get("summaries", [])
566
+ if summaries:
567
+ quiz_summary = "、".join([s.get("summary", "") for s in summaries if s.get("summary")])
568
+ logger.info(f"get_evaluation: Summary status - completed: {summary_result.get('completed')}, count: {summary_result.get('count')}")
569
+ except Exception as e:
570
+ logger.warning(f"get_evaluation: Failed to get summary status (non-fatal): {e}")
571
+
572
+ # セッションデータの検証
573
+ if not session_data.get('success') and not session_data.get('data'):
574
+ logger.warning(f"get_evaluation: No valid session data for {request.session_id}")
575
+ return {
576
+ "success": False,
577
+ "error": "セッションデータが見つかりません"
578
+ }
579
+
580
+ # GASからのデータを取得
581
+ raw_data = session_data.get('data', session_data)
582
+
583
+ # resultsをresults_by_subject形式に変換
584
+ results = raw_data.get('results', [])
585
+ results_by_subject = {}
586
+ for r in results:
587
+ subject = r.get('subject', '')
588
+ if subject:
589
+ if subject not in results_by_subject:
590
+ results_by_subject[subject] = []
591
+ results_by_subject[subject].append(r)
592
+
593
+ # 変換したデータ構造を作成
594
+ transformed_data = {
595
+ 'session_id': raw_data.get('session_id'),
596
+ 'results': results,
597
+ 'results_by_subject': results_by_subject,
598
+ 'summary': raw_data.get('summary', {}),
599
+ 'statistics': {} # 必要に応じて統計データも追加
600
+ }
601
+
602
+ logger.info(f"get_evaluation: Transformed data - subjects: {list(results_by_subject.keys())}, total_results: {len(results)}")
603
+
604
+ # Gemini APIで評価生成(一括評価)
605
+ logger.info(f"get_evaluation: Generating batch evaluation via Gemini")
606
+ batch_result = await gemini_service.generate_evaluation_batch(
607
+ session_data=transformed_data
608
+ )
609
+
610
+ # 結果をフロントエンド期待形式に変換
611
+ subject_evaluations = batch_result.get("subject_evaluations", {})
612
+ overall_evaluation = batch_result.get("overall_evaluation")
613
+
614
+ # evaluations配列を構築(フロントエンド互換)
615
+ evaluations = []
616
+ for subject, eval_data in subject_evaluations.items():
617
+ evaluations.append({
618
+ "subject": subject,
619
+ **eval_data
620
+ })
621
+
622
+ # 全体評価があれば追加
623
+ if overall_evaluation:
624
+ evaluations.append({
625
+ "subject": "overall",
626
+ **overall_evaluation
627
+ })
628
+
629
+ logger.info(f"get_evaluation: Generated {len(evaluations)} evaluations (including overall)")
630
+
631
+ # GASに評価を保存(エラーがあってもフロントエンドには成功を返す)
632
+ try:
633
+ save_result = await gas_client.save_evaluations(
634
+ session_id=request.session_id,
635
+ evaluations=evaluations
636
+ )
637
+ logger.info(f"get_evaluation: Save result: {save_result.get('success', 'unknown')}")
638
+ except Exception as save_error:
639
+ logger.error(f"get_evaluation: Failed to save evaluations: {save_error}")
640
+ # 保存に失敗しても、生成した評価は返す
641
+
642
+ # v1.4.0: 要約情報を含めたレスポンス構築
643
+ response_data = {
644
+ "session_id": request.session_id,
645
+ "evaluations": evaluations
646
+ }
647
+
648
+ if summary_status:
649
+ response_data["summary_status"] = {
650
+ "completed": summary_status.get("completed", False),
651
+ "count": summary_status.get("count", 0)
652
+ }
653
+ if quiz_summary:
654
+ response_data["quiz_summary"] = quiz_summary
655
+
656
+ return {
657
+ "success": True,
658
+ "data": response_data
659
+ }
660
+ except Exception as e:
661
+ logger.error(f"get_evaluation error: {e}")
662
+ raise HTTPException(status_code=500, detail=str(e))
663
+
664
+
665
+ # =============================================================================
666
+ # 静的ファイル配信
667
+ # =============================================================================
668
+
669
+ # 静的ファイル(CSS, JS)
670
+ app.mount("/css", StaticFiles(directory="static/css"), name="css")
671
+ app.mount("/js", StaticFiles(directory="static/js"), name="js")
672
+
673
+ @app.get("/")
674
+ async def root():
675
+ """メインページ"""
676
+ return FileResponse("static/index.html")
677
+
678
+
679
+ # =============================================================================
680
+ # エントリーポイント
681
+ # =============================================================================
682
+
683
+ if __name__ == "__main__":
684
+ import uvicorn
685
+ port = int(os.environ.get("PORT", 7860))
686
+ uvicorn.run(
687
+ app,
688
+ host="0.0.0.0",
689
+ port=port,
690
+ timeout_keep_alive=300 # タイムアウト300秒に延長
691
+ )
V1.8.1/gas/.clasp.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "scriptId": "1rBj6xUhat3KZ1Iy9WXLdMiRh4CTKqCJHK3G149plkLJsPeuGFa5DuyGX",
3
+ "rootDir": "."
4
+ }
V1.8.1/gas/Code.js ADDED
@@ -0,0 +1,2251 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * 超天才クイズAPI - Google Apps Script メインファイル
3
+ *
4
+ * @version 1.8.0
5
+ * @date 2025-12-22
6
+ *
7
+ * 変更履歴:
8
+ * - v1.8.0: ユーザー単位USAGE_COUNT機能追加 (get_questions_for_user, get_user_usage_stats, reset_user_usage)
9
+ * - v1.6.12: デバッグロギング追加
10
+ * - v1.6.11: handleSubmitAnswers レスポンスキー修正 (correct_count→correct, total_questions→total, score→accuracy)
11
+ * - v1.6.10: getSessionResults カラムインデックス修正 (row[5],row[7],row[8])
12
+ * - v1.6.9: correct_answer 0-indexed統一, temperature=1.0
13
+ * - v1.6.8: shuffle_choices→convert_correct_answer_index, MAX_OUTPUT_TOKENS=65536
14
+ * - v1.6.6: Answersシートに subject,category,correct_answer カラム追加
15
+ */
16
+
17
+ // ============================================================================
18
+ // 定数定義
19
+ // ============================================================================
20
+
21
+ // 超天才クイズv3 本番スプレッドシート
22
+ // URL: https://docs.google.com/spreadsheets/d/10JLP5ds2CNDOEYTxEzDyY82dErbD-InkTeuyzS_w_3U/
23
+ const SPREADSHEET_ID = '10JLP5ds2CNDOEYTxEzDyY82dErbD-InkTeuyzS_w_3U';
24
+ const SHEET_NAMES = {
25
+ USERS: 'Users',
26
+ SESSIONS: 'Sessions',
27
+ QUESTIONS: 'Questions',
28
+ ANSWERS: 'Answers',
29
+ STATISTICS: 'Statistics',
30
+ EVALUATIONS: 'Evaluations',
31
+ KNOWLEDGE_BASE: 'Knowledge_Base',
32
+ GENERATED_QUESTIONS: 'GeneratedQuestions',
33
+ SUMMARIES: 'Summaries'
34
+ };
35
+
36
+ // 教科マッピング(DifyService.jsと共有)
37
+ const SUBJECT_MAP = {
38
+ jp: { id: 'jp', name: '国語' },
39
+ math: { id: 'math', name: '算数' },
40
+ sci: { id: 'sci', name: '理科' },
41
+ soc: { id: 'soc', name: '社会' }
42
+ };
43
+
44
+ // ============================================================================
45
+ // エントリーポイント(HTTPリクエストハンドラ)
46
+ // ============================================================================
47
+
48
+ /**
49
+ * GETリクエストハンドラ(ヘルスチェック用)
50
+ *
51
+ * @param {Object} e - イベントオブジェクト
52
+ * @returns {TextOutput} - JSON形式のレスポンス
53
+ */
54
+ function doGet(e) {
55
+ try {
56
+ return createJsonResponse({
57
+ success: true,
58
+ message: "超天才クイズAPI is running",
59
+ version: "1.0.0",
60
+ timestamp: new Date().toISOString()
61
+ });
62
+ } catch (error) {
63
+ return createErrorResponse('Internal Server Error', error.toString());
64
+ }
65
+ }
66
+
67
+ /**
68
+ * POSTリクエストハンドラ(APIエンドポイントルーター)
69
+ *
70
+ * @param {Object} e - イベントオブジェクト
71
+ * @returns {TextOutput} - JSON形式のレスポンス
72
+ */
73
+ function doPost(e) {
74
+ try {
75
+ // リクエストボディのパース
76
+ const requestBody = JSON.parse(e.postData.contents);
77
+
78
+ // 新形式(action)と旧形式(endpoint)の両方をサポート
79
+ const action = requestBody.action || requestBody.endpoint || '';
80
+
81
+ // 新形式: パラメータはフラット、旧形式: params内にネスト
82
+ const params = requestBody.params || requestBody;
83
+
84
+ Logger.log('Received request - Action: ' + action);
85
+ Logger.log('Request params: ' + JSON.stringify(params));
86
+
87
+ // ==================== QuestionDatabase関連のアクション (v1.6.3, v1.8.0) ====================
88
+ const questionDbActions = [
89
+ 'get_random_answers',
90
+ 'get_random_questions', // Python互換: get_questions_by_configにマッピング
91
+ 'get_questions_by_config', // v1.6.3: ジャンル構成固定化
92
+ 'update_usage_count',
93
+ 'bulk_insert_answers',
94
+ 'get_stats',
95
+ 'reset_usage',
96
+ 'delete_by_subject',
97
+ 'add_header',
98
+ // v1.8.0: ユーザー単位USAGE_COUNT
99
+ 'get_questions_for_user',
100
+ 'get_user_usage_stats',
101
+ 'reset_user_usage'
102
+ ];
103
+
104
+ if (questionDbActions.includes(action)) {
105
+ const result = handleQuestionDatabaseAction(action, params);
106
+ return ContentService.createTextOutput(JSON.stringify(result))
107
+ .setMimeType(ContentService.MimeType.JSON);
108
+ }
109
+
110
+ // アクションによる振り分け(snake_case と camelCase の両方をサポート)
111
+ switch (action) {
112
+ case 'login':
113
+ return handleLogin(params);
114
+
115
+ case 'register_user':
116
+ case 'registerUser':
117
+ return handleRegisterUser(params);
118
+
119
+ case 'start_session':
120
+ case 'startSession':
121
+ return handleStartSession(params);
122
+
123
+ case 'generate_question':
124
+ case 'generateQuestion':
125
+ return handleGenerateQuestion(params);
126
+
127
+ case 'generate_questions':
128
+ case 'generateQuestions':
129
+ return handleGenerateQuestions(params);
130
+
131
+ case 'submit_answers':
132
+ case 'submitAnswers':
133
+ return handleSubmitAnswers(params);
134
+
135
+ case 'get_statistics':
136
+ case 'getStatistics':
137
+ return handleGetStatistics(params);
138
+
139
+ case 'get_evaluation':
140
+ case 'getEvaluation':
141
+ return handleGetEvaluation(params);
142
+
143
+ case 'save_questions':
144
+ return handleSaveQuestions(params);
145
+
146
+ case 'save_summary':
147
+ return handleSaveSummary(params);
148
+
149
+ case 'get_session_results':
150
+ return handleGetSessionResults(params);
151
+
152
+ case 'check_summary_status':
153
+ return handleCheckSummaryStatus(params);
154
+
155
+ case 'save_evaluations':
156
+ return handleSaveEvaluations(params);
157
+
158
+ default:
159
+ return createErrorResponse('Invalid Action', 'Unknown action: ' + action);
160
+ }
161
+ } catch (error) {
162
+ Logger.log('Error in doPost: ' + error.toString());
163
+ return createErrorResponse('Bad Request', error.toString());
164
+ }
165
+ }
166
+
167
+ /**
168
+ * OPTIONSリクエストハンドラ(CORS preflight対応)
169
+ *
170
+ * @returns {TextOutput} - 空のレスポンス
171
+ */
172
+ function doOptions() {
173
+ return ContentService
174
+ .createTextOutput('')
175
+ .setMimeType(ContentService.MimeType.TEXT)
176
+ .setHeader('Access-Control-Allow-Origin', '*')
177
+ .setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
178
+ .setHeader('Access-Control-Allow-Headers', 'Content-Type');
179
+ }
180
+
181
+ // ============================================================================
182
+ // エンドポイント実装(Phase 1: ダミーレスポンス)
183
+ // ============================================================================
184
+
185
+ /**
186
+ * ユーザー登録エンドポイント(本実装)
187
+ * Usersシートに新規ユーザーを追加
188
+ *
189
+ * @param {Object} params - リクエストパラメータ { username: string }
190
+ * @returns {TextOutput} - JSON形式のレスポンス
191
+ */
192
+ function handleRegisterUser(params) {
193
+ try {
194
+ // 1. バリデーション
195
+ const username = params.username;
196
+
197
+ if (!username) {
198
+ return createJsonResponse({
199
+ status: "error",
200
+ message: "Username is required"
201
+ });
202
+ }
203
+
204
+ if (username.length > 20) {
205
+ return createJsonResponse({
206
+ status: "error",
207
+ message: "Username must be 20 characters or less"
208
+ });
209
+ }
210
+
211
+ // 2. Usersシート取得
212
+ const sheet = getSheet(SHEET_NAMES.USERS);
213
+
214
+ // 3. 既存ユーザーチェック(存在すればログインとして扱う)
215
+ const data = sheet.getDataRange().getValues();
216
+ // ヘッダー行をスキップ(data[0])
217
+ for (let i = 1; i < data.length; i++) {
218
+ if (data[i][1] === username) { // 列1 = username
219
+ // 既存ユーザーが見つかった場合、ログインとして成功を返す
220
+ const existingUserId = data[i][0]; // 列0 = user_id
221
+ const existingCreatedAt = data[i][3]; // 列3 = created_at(列2はpassword_hash)
222
+
223
+ // last_loginを更新(列4)
224
+ const loginTime = getTimestamp();
225
+ sheet.getRange(i + 1, 5).setValue(loginTime); // 行番号は1始まり、列5 = last_login
226
+
227
+ Logger.log('Existing user logged in: ' + username + ' (user_id: ' + existingUserId + ')');
228
+
229
+ return createJsonResponse({
230
+ status: "success",
231
+ message: "User logged in successfully",
232
+ data: {
233
+ user_id: existingUserId,
234
+ username: username,
235
+ created_at: existingCreatedAt,
236
+ last_login: loginTime,
237
+ is_new_user: false
238
+ }
239
+ });
240
+ }
241
+ }
242
+
243
+ // 4. 新規ユーザーデータ作成
244
+ const userId = generateUUID();
245
+ const createdAt = getTimestamp();
246
+ const passwordHash = params.password_hash || ""; // パスワードハッシュ(オプション)
247
+ const newRow = [
248
+ userId, // user_id (列0)
249
+ username, // username (列1)
250
+ passwordHash, // password_hash (列2) ← 追加
251
+ createdAt, // created_at (列3)
252
+ "", // last_login (列4, 初回は空)
253
+ 0, // total_sessions (列5)
254
+ 0, // total_questions (列6)
255
+ "{}" // settings (列7)
256
+ ];
257
+
258
+ // 5. Sheetsに書き込み
259
+ sheet.appendRow(newRow);
260
+
261
+ // 6. 成功レスポンス
262
+ Logger.log('New user registered: ' + username + ' (user_id: ' + userId + ')');
263
+
264
+ return createJsonResponse({
265
+ status: "success",
266
+ message: "User registered successfully",
267
+ data: {
268
+ user_id: userId,
269
+ username: username,
270
+ created_at: createdAt,
271
+ is_new_user: true
272
+ }
273
+ });
274
+
275
+ } catch (error) {
276
+ Logger.log('Error in handleRegisterUser: ' + error.toString());
277
+ return createErrorResponse('Registration Failed', error.toString());
278
+ }
279
+ }
280
+
281
+ /**
282
+ * ログインエンドポイント(パスワードハッシュ取得)
283
+ * ユーザー名でUsersシートを検索し、password_hashを返す
284
+ *
285
+ * @param {Object} params - リクエストパラメータ { username: string }
286
+ * @returns {TextOutput} - JSON形式のレスポンス
287
+ */
288
+ function handleLogin(params) {
289
+ try {
290
+ const username = params.username;
291
+
292
+ if (!username) {
293
+ return createJsonResponse({
294
+ success: false,
295
+ error: "Username is required"
296
+ });
297
+ }
298
+
299
+ // Usersシート取得
300
+ const sheet = getSheet(SHEET_NAMES.USERS);
301
+ const data = sheet.getDataRange().getValues();
302
+
303
+ // ヘッダー行をスキップして検索
304
+ // 列構造: 0=user_id, 1=username, 2=password_hash, 3=created_at, 4=last_login, ...
305
+ for (let i = 1; i < data.length; i++) {
306
+ if (data[i][1] === username) { // 列1 = username
307
+ const userId = data[i][0]; // 列0 = user_id
308
+ const passwordHash = data[i][2]; // 列2 = password_hash
309
+
310
+ // last_loginを更新(列4)
311
+ const loginTime = getTimestamp();
312
+ sheet.getRange(i + 1, 5).setValue(loginTime); // 行番号は1始まり、列5(index 4) = last_login
313
+
314
+ Logger.log('User found for login: ' + username + ', password_hash exists: ' + (!!passwordHash));
315
+
316
+ return createJsonResponse({
317
+ success: true,
318
+ found: true,
319
+ data: {
320
+ user_id: userId,
321
+ username: username,
322
+ password_hash: passwordHash
323
+ }
324
+ });
325
+ }
326
+ }
327
+
328
+ // ユーザーが見つからない場合
329
+ Logger.log('User not found for login: ' + username);
330
+ return createJsonResponse({
331
+ success: true,
332
+ found: false,
333
+ message: "User not found"
334
+ });
335
+
336
+ } catch (error) {
337
+ Logger.log('Error in handleLogin: ' + error.toString());
338
+ return createErrorResponse('Login Failed', error.toString());
339
+ }
340
+ }
341
+
342
+ /**
343
+ * セッション開始エンドポイント(本実装)
344
+ *
345
+ * @param {Object} params - リクエストパラメータ { user_id: string, subjects: string[] }
346
+ * @returns {TextOutput} - JSON形式のレスポンス
347
+ */
348
+ function handleStartSession(params) {
349
+ try {
350
+ Logger.log('handleStartSession called with params: ' + JSON.stringify(params));
351
+
352
+ const userId = params.user_id;
353
+ const subjects = params.subjects || [];
354
+
355
+ if (!userId) {
356
+ return createJsonResponse({
357
+ success: false,
358
+ error: 'user_id is required'
359
+ });
360
+ }
361
+
362
+ // セッションデータ作成
363
+ const sessionId = generateUUID();
364
+ const startTime = getTimestamp();
365
+
366
+ const sessionsSheet = getSheet(SHEET_NAMES.SESSIONS);
367
+ const row = [
368
+ sessionId, // session_id
369
+ userId, // user_id
370
+ startTime, // start_time
371
+ '', // end_time (セッション終了時に更新)
372
+ JSON.stringify(subjects), // subjects
373
+ 0, // total_score (セッション終了時に計算)
374
+ false // completed
375
+ ];
376
+ sessionsSheet.appendRow(row);
377
+
378
+ return createJsonResponse({
379
+ success: true,
380
+ data: {
381
+ session_id: sessionId,
382
+ user_id: userId,
383
+ subjects: subjects,
384
+ start_time: startTime
385
+ }
386
+ });
387
+
388
+ } catch (error) {
389
+ Logger.log('Error in handleStartSession: ' + error.toString());
390
+ return createErrorResponse('Session Start Failed', error.toString());
391
+ }
392
+ }
393
+
394
+ /**
395
+ * 問題生成エンドポイント(旧版、互換性のため残す)
396
+ * Phase 1: ダミー問題返却(Gemini API統合はPhase 2)
397
+ *
398
+ * @param {Object} params - リクエストパラメータ { session_id: string, subjects: string[] }
399
+ * @returns {TextOutput} - JSON形式のレスポンス
400
+ */
401
+ function handleGenerateQuestion(params) {
402
+ try {
403
+ Logger.log('handleGenerateQuestion called with params: ' + JSON.stringify(params));
404
+
405
+ // Phase 1: ダミー問題データ
406
+ const dummyQuestion = {
407
+ question_id: 'dummy-question-001',
408
+ session_id: params.session_id || 'dummy-session-001',
409
+ subject: '国語',
410
+ topic: '漢字の読み',
411
+ difficulty: 3,
412
+ question_text: '次の漢字の読みを選びなさい:「薔薇」',
413
+ choices: ['ばら', 'しょうび', 'そうび', 'ばいか'],
414
+ correct_answer: 0,
415
+ created_at: new Date().toISOString()
416
+ };
417
+
418
+ const dummyResponse = {
419
+ success: true,
420
+ message: 'Question generated (dummy)',
421
+ data: {
422
+ question: dummyQuestion
423
+ }
424
+ };
425
+
426
+ return createJsonResponse(dummyResponse);
427
+ } catch (error) {
428
+ Logger.log('Error in handleGenerateQuestion: ' + error.toString());
429
+ return createErrorResponse('Question Generation Failed', error.toString());
430
+ }
431
+ }
432
+
433
+ /**
434
+ * 問題生成エンドポイント(Dify統合版・並列処理対応)
435
+ *
436
+ * @param {Object} params - { session_id: string, subjects: string[] }
437
+ * @returns {TextOutput} - JSON形式のレスポンス
438
+ */
439
+ function handleGenerateQuestions(params) {
440
+ try {
441
+ Logger.log('handleGenerateQuestions called with params: ' + JSON.stringify(params));
442
+
443
+ const sessionId = params.session_id;
444
+ const subjects = params.subjects || [];
445
+
446
+ if (!sessionId) {
447
+ return createJsonResponse({
448
+ success: false,
449
+ error: 'session_id is required'
450
+ });
451
+ }
452
+
453
+ if (subjects.length === 0) {
454
+ return createJsonResponse({
455
+ success: false,
456
+ error: 'subjects array is required'
457
+ });
458
+ }
459
+
460
+ const allQuestions = [];
461
+ const questionsSheet = getSheet(SHEET_NAMES.QUESTIONS);
462
+
463
+ // === 並列処理: 全教科のDify APIリクエストを同時実行 ===
464
+ Logger.log('Generating questions for ' + subjects.length + ' subjects in PARALLEL');
465
+ const startTime = new Date().getTime();
466
+
467
+ // 全教科のリクエスト設定を準備
468
+ const requestConfigs = subjects.map(function(subject) {
469
+ return {
470
+ action: 'generate_questions',
471
+ subject: subject,
472
+ additionalInputs: {
473
+ statistics: JSON.stringify({}),
474
+ recent_questions: JSON.stringify([])
475
+ }
476
+ };
477
+ });
478
+
479
+ // 並列でDify APIを呼び出し
480
+ const difyResponses = callDifyWorkflowBatch(requestConfigs);
481
+
482
+ const endTime = new Date().getTime();
483
+ Logger.log('Parallel API calls completed in ' + ((endTime - startTime) / 1000) + ' seconds');
484
+
485
+ // === レスポンス処理: 各教科の問題を保存 ===
486
+ for (var i = 0; i < subjects.length; i++) {
487
+ var subject = subjects[i];
488
+ var response = difyResponses[i];
489
+
490
+ try {
491
+ // エラーチェック
492
+ if (response.error) {
493
+ Logger.log('Error in response for ' + subject + ': ' + response.message);
494
+ continue;
495
+ }
496
+
497
+ // Difyレスポンスから問題データを抽出
498
+ var questions = parseQuestionsFromDifyResponse(subject, response);
499
+
500
+ // 各問題をシートに保存し、レスポンス用配列に追加
501
+ for (var j = 0; j < questions.length; j++) {
502
+ var q = questions[j];
503
+ var questionId = generateUUID();
504
+ var createdAt = getTimestamp();
505
+
506
+ // Questionsシートに保存(10列: data-model.md v2.0準拠)
507
+ // Difyは correct_answer を返すが、互換性のため correct もチェック
508
+ var correctAnswer = q.correct_answer !== undefined ? q.correct_answer : q.correct;
509
+
510
+ var row = [
511
+ questionId, // question_id
512
+ sessionId, // session_id
513
+ subject, // subject
514
+ q.category || '', // category
515
+ q.difficulty || '標準', // difficulty (基本/標準/応用)
516
+ q.question, // question_text
517
+ JSON.stringify(q.choices), // choices (JSON)
518
+ correctAnswer, // correct_answer
519
+ q.explanation || '', // explanation
520
+ createdAt // created_at
521
+ ];
522
+ questionsSheet.appendRow(row);
523
+
524
+ // レスポンス用に問題データを追加
525
+ allQuestions.push({
526
+ question_id: questionId,
527
+ subject: subject,
528
+ subject_name: SUBJECT_MAP[subject] ? SUBJECT_MAP[subject].name : subject,
529
+ category: q.category || '',
530
+ question: q.question,
531
+ choices: q.choices,
532
+ correct: correctAnswer,
533
+ difficulty: q.difficulty || 3
534
+ });
535
+ }
536
+
537
+ Logger.log('Generated ' + questions.length + ' questions for ' + subject);
538
+
539
+ } catch (subjectError) {
540
+ Logger.log('Error processing questions for ' + subject + ': ' + subjectError.toString());
541
+ // 個別教科のエラーは続行(他の教科は処理する)
542
+ }
543
+ }
544
+
545
+ if (allQuestions.length === 0) {
546
+ return createJsonResponse({
547
+ success: false,
548
+ error: 'Failed to generate questions for any subject'
549
+ });
550
+ }
551
+
552
+ var totalTime = (new Date().getTime() - startTime) / 1000;
553
+ Logger.log('Total question generation time: ' + totalTime + ' seconds for ' + allQuestions.length + ' questions');
554
+
555
+ return createJsonResponse({
556
+ success: true,
557
+ data: {
558
+ session_id: sessionId,
559
+ questions: allQuestions,
560
+ total_count: allQuestions.length
561
+ }
562
+ });
563
+
564
+ } catch (error) {
565
+ Logger.log('Error in handleGenerateQuestions: ' + error.toString());
566
+ return createErrorResponse('Question Generation Failed', error.toString());
567
+ }
568
+ }
569
+
570
+ /**
571
+ * Difyレスポンスから問題データをパース(並列処理用ヘルパー)
572
+ *
573
+ * @param {string} subject - 教科ID
574
+ * @param {Object} response - Dify APIレスポンス
575
+ * @returns {Array} - 問題配列
576
+ */
577
+ function parseQuestionsFromDifyResponse(subject, response) {
578
+ if (response.data && response.data.outputs) {
579
+ var outputs = response.data.outputs;
580
+
581
+ // エラーチェック
582
+ if (outputs.action_error) {
583
+ throw new Error('Dify action error: ' + outputs.action_error);
584
+ }
585
+ if (outputs.subject_error_questions) {
586
+ throw new Error('Dify subject error: ' + outputs.subject_error_questions);
587
+ }
588
+
589
+ // 教科別の出力変数名を取得(DifyService.jsで定義)
590
+ var outputKeyMap = {
591
+ 'jp': 'kokugo_questions',
592
+ 'math': 'sansu_questions',
593
+ 'sci': 'rika_questions',
594
+ 'soc': 'shakai_questions'
595
+ };
596
+
597
+ var outputKey = outputKeyMap[subject];
598
+ if (!outputKey || !outputs[outputKey]) {
599
+ throw new Error('Output key not found: ' + outputKey + ', available: ' + Object.keys(outputs).join(', '));
600
+ }
601
+
602
+ var questionsData = outputs[outputKey];
603
+
604
+ // JSON文字列の場合はパース
605
+ if (typeof questionsData === 'string') {
606
+ var parsed = JSON.parse(questionsData);
607
+ return parsed.questions || parsed;
608
+ }
609
+
610
+ // 既にオブジェクト/配列の場合
611
+ return questionsData.questions || questionsData;
612
+ }
613
+
614
+ throw new Error('Invalid response format from Dify');
615
+ }
616
+
617
+ /**
618
+ * 解答送信エンドポイント(本実装)
619
+ *
620
+ * v1.6.5以降: フロントエンドから送られるcorrect_answerを使用してスコアリング
621
+ *
622
+ * @param {Object} params - {
623
+ * session_id: string,
624
+ * answers: [{
625
+ * question_id,
626
+ * selected_answer,
627
+ * user_answer,
628
+ * correct_answer,
629
+ * subject,
630
+ * category,
631
+ * time_taken_seconds
632
+ * }]
633
+ * }
634
+ * @returns {TextOutput} - JSON形式のレスポンス
635
+ */
636
+ function handleSubmitAnswers(params) {
637
+ try {
638
+ Logger.log('handleSubmitAnswers called with params: ' + JSON.stringify(params));
639
+
640
+ const sessionId = params.session_id;
641
+ const answers = params.answers || [];
642
+
643
+ if (!sessionId) {
644
+ return createJsonResponse({
645
+ success: false,
646
+ error: 'session_id is required'
647
+ });
648
+ }
649
+
650
+ if (!Array.isArray(answers) || answers.length === 0) {
651
+ return createJsonResponse({
652
+ success: false,
653
+ error: 'answers array is required and must not be empty'
654
+ });
655
+ }
656
+
657
+ const answersSheet = getSheet(SHEET_NAMES.ANSWERS);
658
+
659
+ // 統計用のデータ構造(教科・分野別に集計)
660
+ const statsBySubjectCategory = {};
661
+ let correctCount = 0;
662
+ let totalCount = answers.length;
663
+
664
+ // 各回答を処理
665
+ for (let i = 0; i < answers.length; i++) {
666
+ const answer = answers[i];
667
+ const questionId = answer.question_id;
668
+ const userAnswer = answer.user_answer || answer.selected_answer; // user_answerを優先、なければselected_answer
669
+ const correctAnswer = answer.correct_answer; // フロントエンドから送られる正答
670
+ const subject = answer.subject;
671
+ const category = answer.category;
672
+ const timeTaken = answer.time_taken_seconds || 0;
673
+
674
+ // フロントエンドからcorrect_answerが送られていない場合はエラー
675
+ if (correctAnswer === undefined || correctAnswer === null) {
676
+ Logger.log('Warning: correct_answer missing for question_id: ' + questionId);
677
+ continue;
678
+ }
679
+
680
+ // 正誤判定(フロントエンドから送られるcorrect_answerを使用)
681
+ const isCorrect = (userAnswer === correctAnswer);
682
+ if (isCorrect) {
683
+ correctCount++;
684
+ }
685
+
686
+ // Answersシートに書き込み
687
+ const answerId = generateUUID();
688
+ const answeredAt = getTimestamp();
689
+ const answerRow = [
690
+ answerId, // answer_id
691
+ sessionId, // session_id
692
+ questionId, // question_id
693
+ subject || '', // subject
694
+ category || '', // category
695
+ userAnswer, // user_answer
696
+ correctAnswer, // correct_answer
697
+ isCorrect, // is_correct
698
+ timeTaken, // time_spent
699
+ answeredAt // submitted_at
700
+ ];
701
+ answersSheet.appendRow(answerRow);
702
+
703
+ // 統計用データ集計(subject/categoryがある場合のみ)
704
+ if (subject && category) {
705
+ const key = subject + '|' + category;
706
+ if (!statsBySubjectCategory[key]) {
707
+ statsBySubjectCategory[key] = {
708
+ subject: subject,
709
+ category: category,
710
+ attempted: 0,
711
+ correct: 0
712
+ };
713
+ }
714
+ statsBySubjectCategory[key].attempted++;
715
+ if (isCorrect) {
716
+ statsBySubjectCategory[key].correct++;
717
+ }
718
+ }
719
+ }
720
+
721
+ // スコア計算(0-100)
722
+ const score = Math.round((correctCount / totalCount) * 100);
723
+
724
+ // Sessionsシート更新(total_score, end_time, completed)
725
+ const sessionsSheet = getSheet(SHEET_NAMES.SESSIONS);
726
+ const sessionsData = sessionsSheet.getDataRange().getValues();
727
+ for (let i = 1; i < sessionsData.length; i++) {
728
+ if (sessionsData[i][0] === sessionId) {
729
+ const endTime = getTimestamp();
730
+ sessionsSheet.getRange(i + 1, 4).setValue(endTime); // end_time
731
+ sessionsSheet.getRange(i + 1, 6).setValue(score); // total_score
732
+ sessionsSheet.getRange(i + 1, 7).setValue(true); // completed
733
+ break;
734
+ }
735
+ }
736
+
737
+ // Statisticsシート更新
738
+ const userId = getUserIdFromSession(sessionId);
739
+ if (userId) {
740
+ updateStatistics(userId, statsBySubjectCategory);
741
+
742
+ // Usersシートのtotal_sessionsとtotal_questionsを更新
743
+ updateUserStats(userId, 1, totalCount);
744
+ }
745
+
746
+ // デバッグログ (v1.6.12)
747
+ console.log('[handleSubmitAnswers] Response data:', JSON.stringify({
748
+ session_id: sessionId,
749
+ total: totalCount,
750
+ correct: correctCount,
751
+ accuracy: score,
752
+ answers_saved: answers.length
753
+ }));
754
+
755
+ return createJsonResponse({
756
+ success: true,
757
+ data: {
758
+ session_id: sessionId,
759
+ total: totalCount,
760
+ correct: correctCount,
761
+ accuracy: score,
762
+ answers_saved: answers.length
763
+ }
764
+ });
765
+
766
+ } catch (error) {
767
+ Logger.log('Error in handleSubmitAnswers: ' + error.toString());
768
+ return createErrorResponse('Submit Answers Failed', error.toString());
769
+ }
770
+ }
771
+
772
+ /**
773
+ * 統計取得エンドポイント(ジャンル別累積集計対応版)
774
+ *
775
+ * @param {Object} params - { user_id: string, subjects?: string[] }
776
+ * @returns {TextOutput} - JSON形式のレスポンス
777
+ *
778
+ * レスポンス形式:
779
+ * {
780
+ * success: true,
781
+ * data: {
782
+ * user_id: string,
783
+ * subjects: [
784
+ * {
785
+ * subject: string,
786
+ * subject_name: string,
787
+ * total_attempted: number,
788
+ * total_correct: number,
789
+ * overall_accuracy: number,
790
+ * genres: [
791
+ * { genre_id: string, genre_name: string, attempted: number, correct: number, accuracy: number },
792
+ * ...
793
+ * ]
794
+ * },
795
+ * ...
796
+ * ],
797
+ * cumulative: {
798
+ * total_sessions: number,
799
+ * total_questions: number,
800
+ * total_correct: number,
801
+ * overall_accuracy: number
802
+ * }
803
+ * }
804
+ * }
805
+ */
806
+ function handleGetStatistics(params) {
807
+ try {
808
+ Logger.log('handleGetStatistics called with params: ' + JSON.stringify(params));
809
+
810
+ const userId = params.user_id;
811
+ const subjects = params.subjects || null;
812
+
813
+ if (!userId) {
814
+ return createJsonResponse({
815
+ success: false,
816
+ error: 'user_id is required'
817
+ });
818
+ }
819
+
820
+ const statisticsSheet = getSheet(SHEET_NAMES.STATISTICS);
821
+ const data = statisticsSheet.getDataRange().getValues();
822
+
823
+ // ヘッダー行をスキップして該当ユーザーの統計を取得
824
+ const userStats = [];
825
+ for (let i = 1; i < data.length; i++) {
826
+ const row = data[i];
827
+ const rowUserId = row[1]; // user_id
828
+ const rowSubject = row[2]; // subject
829
+
830
+ // user_idが一致し、subjects指定がある場合はそれも確認
831
+ if (rowUserId === userId) {
832
+ if (!subjects || subjects.includes(rowSubject)) {
833
+ userStats.push({
834
+ stat_id: row[0], // stat_id
835
+ user_id: row[1], // user_id
836
+ subject: row[2], // subject
837
+ category: row[3], // category(ジャンルID)
838
+ total_attempted: row[4], // total_attempted
839
+ correct_count: row[5], // correct_count
840
+ accuracy_rate: row[6], // accuracy_rate
841
+ last_updated: row[7] // last_updated
842
+ });
843
+ }
844
+ }
845
+ }
846
+
847
+ // 教科別・ジャンル別にグループ化
848
+ const bySubject = {};
849
+ let cumulativeTotalAttempted = 0;
850
+ let cumulativeTotalCorrect = 0;
851
+
852
+ for (let i = 0; i < userStats.length; i++) {
853
+ const stat = userStats[i];
854
+ const subject = stat.subject;
855
+ const genreId = stat.category; // categoryフィールドをジャンルIDとして扱う
856
+
857
+ if (!bySubject[subject]) {
858
+ bySubject[subject] = {
859
+ subject: subject,
860
+ subject_name: SUBJECT_MAP[subject] ? SUBJECT_MAP[subject].name : subject,
861
+ genres: [],
862
+ total_attempted: 0,
863
+ total_correct: 0,
864
+ overall_accuracy: 0
865
+ };
866
+ }
867
+
868
+ // GenreMaster.jsからジャンル情報を取得
869
+ const genreInfo = getGenreById(genreId);
870
+ const genreName = genreInfo ? genreInfo.name : '不明';
871
+
872
+ bySubject[subject].genres.push({
873
+ genre_id: genreId,
874
+ genre_name: genreName,
875
+ attempted: stat.total_attempted,
876
+ correct: stat.correct_count,
877
+ accuracy: stat.accuracy_rate
878
+ });
879
+
880
+ bySubject[subject].total_attempted += stat.total_attempted;
881
+ bySubject[subject].total_correct += stat.correct_count;
882
+
883
+ // 累積統計用
884
+ cumulativeTotalAttempted += stat.total_attempted;
885
+ cumulativeTotalCorrect += stat.correct_count;
886
+ }
887
+
888
+ // 教科別の正答率を計算
889
+ const subjectsArray = [];
890
+ for (const subjectId in bySubject) {
891
+ const subjectData = bySubject[subjectId];
892
+ if (subjectData.total_attempted > 0) {
893
+ subjectData.overall_accuracy = subjectData.total_correct / subjectData.total_attempted;
894
+ }
895
+
896
+ // ジャンルを正答率の低い順にソート(苦手なジャンル順)
897
+ subjectData.genres = sortByWeakness(subjectData.genres);
898
+
899
+ subjectsArray.push(subjectData);
900
+ }
901
+
902
+ // レーダーチャート用データ(教科別正答率)
903
+ const radarChartData = {
904
+ labels: [],
905
+ values: []
906
+ };
907
+ for (let i = 0; i < subjectsArray.length; i++) {
908
+ radarChartData.labels.push(subjectsArray[i].subject_name);
909
+ radarChartData.values.push(Math.round(subjectsArray[i].overall_accuracy * 100));
910
+ }
911
+
912
+ // セッション数を取得
913
+ const totalSessions = getUserSessionCount(userId);
914
+
915
+ // 累積統計
916
+ const cumulativeStats = {
917
+ total_sessions: totalSessions,
918
+ total_questions: cumulativeTotalAttempted,
919
+ total_correct: cumulativeTotalCorrect,
920
+ overall_accuracy: cumulativeTotalAttempted > 0 ? cumulativeTotalCorrect / cumulativeTotalAttempted : 0
921
+ };
922
+
923
+ return createJsonResponse({
924
+ success: true,
925
+ data: {
926
+ user_id: userId,
927
+ subjects: subjectsArray,
928
+ radar_chart: radarChartData,
929
+ cumulative: cumulativeStats
930
+ }
931
+ });
932
+
933
+ } catch (error) {
934
+ Logger.log('Error in handleGetStatistics: ' + error.toString());
935
+ return createErrorResponse('Get Statistics Failed', error.toString());
936
+ }
937
+ }
938
+
939
+ /**
940
+ * 評価取得エンドポイント(本実装)
941
+ *
942
+ * @param {Object} params - { session_id: string, subjects?: string[] }
943
+ * @returns {TextOutput} - JSON形式のレスポンス
944
+ *
945
+ * 処理フロー:
946
+ * 1. Statisticsシートから統計データを取得
947
+ * 2. Answers/Questionsシートから解答結果を取得
948
+ * 3. 各教科に対してDify評価生成を呼び出し
949
+ * 4. 全体評価も生成(すべての教科の結果を統合)
950
+ * 5. Evaluationsシートへ書き込み
951
+ */
952
+ function handleGetEvaluation(params) {
953
+ try {
954
+ Logger.log('handleGetEvaluation called with params: ' + JSON.stringify(params));
955
+
956
+ const sessionId = params.session_id;
957
+ const requestedSubjects = params.subjects || null;
958
+
959
+ if (!sessionId) {
960
+ return createJsonResponse({
961
+ success: false,
962
+ error: 'session_id is required'
963
+ });
964
+ }
965
+
966
+ // セッション情報取得
967
+ const userId = getUserIdFromSession(sessionId);
968
+ if (!userId) {
969
+ return createJsonResponse({
970
+ success: false,
971
+ error: 'Session not found'
972
+ });
973
+ }
974
+
975
+ // 統計データ取得
976
+ const statisticsSheet = getSheet(SHEET_NAMES.STATISTICS);
977
+ const statsData = statisticsSheet.getDataRange().getValues();
978
+ const userStatistics = {};
979
+
980
+ for (let i = 1; i < statsData.length; i++) {
981
+ const row = statsData[i];
982
+ const statUserId = row[1];
983
+ const statSubject = row[2];
984
+
985
+ if (statUserId === userId) {
986
+ if (!userStatistics[statSubject]) {
987
+ userStatistics[statSubject] = {
988
+ subject: statSubject,
989
+ categories: []
990
+ };
991
+ }
992
+ userStatistics[statSubject].categories.push({
993
+ category: row[3],
994
+ total_attempted: row[4],
995
+ correct_count: row[5],
996
+ accuracy_rate: row[6]
997
+ });
998
+ }
999
+ }
1000
+
1001
+ // セッションの解答結果を取得
1002
+ const sessionResults = getSessionResults(sessionId);
1003
+
1004
+ if (sessionResults.length === 0) {
1005
+ return createJsonResponse({
1006
+ success: false,
1007
+ error: 'No answers found for this session'
1008
+ });
1009
+ }
1010
+
1011
+ // 教科別にグループ化
1012
+ const resultsBySubject = {};
1013
+ for (let i = 0; i < sessionResults.length; i++) {
1014
+ const result = sessionResults[i];
1015
+ const subject = result.subject;
1016
+
1017
+ if (!resultsBySubject[subject]) {
1018
+ resultsBySubject[subject] = [];
1019
+ }
1020
+ resultsBySubject[subject].push(result);
1021
+ }
1022
+
1023
+ const evaluations = [];
1024
+ const evaluationsSheet = getSheet(SHEET_NAMES.EVALUATIONS);
1025
+
1026
+ // 教科別評価を収集するオブジェクト(全体評価用)
1027
+ const subjectEvaluations = {};
1028
+
1029
+ // 各教科の評価を生成
1030
+ const subjects = requestedSubjects || Object.keys(resultsBySubject);
1031
+ for (let i = 0; i < subjects.length; i++) {
1032
+ const subject = subjects[i];
1033
+ const results = resultsBySubject[subject] || [];
1034
+
1035
+ if (results.length === 0) {
1036
+ Logger.log('No results found for subject: ' + subject);
1037
+ continue;
1038
+ }
1039
+
1040
+ try {
1041
+ // Dify APIで評価生成
1042
+ const statistics = userStatistics[subject] || { subject: subject, categories: [] };
1043
+ const evaluation = generateEvaluationFromDify(subject, statistics, results);
1044
+
1045
+ // 教科別評価を収集(全体評価生成時に使用)
1046
+ subjectEvaluations[subject] = {
1047
+ subject: subject,
1048
+ subject_name: SUBJECT_MAP[subject] ? SUBJECT_MAP[subject].name : subject,
1049
+ advice: evaluation.advice || '',
1050
+ strengths: evaluation.strengths || [],
1051
+ weaknesses: evaluation.weaknesses || [],
1052
+ recommended_topics: evaluation.recommended_topics || []
1053
+ };
1054
+
1055
+ // Evaluationsシートに書き込み
1056
+ const evaluationId = generateUUID();
1057
+ const createdAt = getTimestamp();
1058
+
1059
+ // 教科別評価: evaluation_id, session_id, subject, advice, strengths, weaknesses, recommended_topics, created_at
1060
+ const strengthsJson = JSON.stringify(evaluation.strengths || []);
1061
+ const weaknessesJson = JSON.stringify(evaluation.weaknesses || []);
1062
+ const recommendedTopicsJson = JSON.stringify(evaluation.recommended_topics || []);
1063
+
1064
+ const row = [
1065
+ evaluationId,
1066
+ sessionId,
1067
+ subject,
1068
+ evaluation.advice || '',
1069
+ strengthsJson,
1070
+ weaknessesJson,
1071
+ recommendedTopicsJson,
1072
+ createdAt
1073
+ ];
1074
+ evaluationsSheet.appendRow(row);
1075
+
1076
+ evaluations.push({
1077
+ evaluation_id: evaluationId,
1078
+ subject: subject,
1079
+ subject_name: SUBJECT_MAP[subject] ? SUBJECT_MAP[subject].name : subject,
1080
+ advice: evaluation.advice || '',
1081
+ strengths: evaluation.strengths || [],
1082
+ weaknesses: evaluation.weaknesses || [],
1083
+ recommended_topics: evaluation.recommended_topics || [],
1084
+ created_at: createdAt
1085
+ });
1086
+
1087
+ Logger.log('Evaluation generated for ' + subject);
1088
+
1089
+ } catch (subjectError) {
1090
+ Logger.log('Error generating evaluation for ' + subject + ': ' + subjectError.toString());
1091
+ // 個別教科のエラーは続行
1092
+ }
1093
+ }
1094
+
1095
+ // 全体評価を生成(複数教科の場合)
1096
+ if (subjects.length > 1) {
1097
+ try {
1098
+ // 全統計・全結果を統合
1099
+ const overallStatistics = {
1100
+ subjects: userStatistics
1101
+ };
1102
+ const overallResults = sessionResults;
1103
+
1104
+ // 教科別評価も渡す(第4引数)
1105
+ const overallEvaluation = generateEvaluationFromDify('overall', overallStatistics, overallResults, subjectEvaluations);
1106
+
1107
+ // Evaluationsシートに書き込み(subject = 'overall')
1108
+ const evaluationId = generateUUID();
1109
+ const createdAt = getTimestamp();
1110
+
1111
+ const strengthsJson = JSON.stringify(overallEvaluation.strengths || []);
1112
+ const weaknessesJson = JSON.stringify(overallEvaluation.weaknesses || []);
1113
+ const nextStepsJson = JSON.stringify(overallEvaluation.next_steps || []);
1114
+
1115
+ const row = [
1116
+ evaluationId,
1117
+ sessionId,
1118
+ 'overall',
1119
+ overallEvaluation.overall_advice || '',
1120
+ strengthsJson,
1121
+ weaknessesJson,
1122
+ nextStepsJson,
1123
+ createdAt
1124
+ ];
1125
+ evaluationsSheet.appendRow(row);
1126
+
1127
+ evaluations.push({
1128
+ evaluation_id: evaluationId,
1129
+ subject: 'overall',
1130
+ subject_name: '全体評価',
1131
+ advice: overallEvaluation.overall_advice || '',
1132
+ strengths: overallEvaluation.strengths || [],
1133
+ weaknesses: overallEvaluation.weaknesses || [],
1134
+ next_steps: overallEvaluation.next_steps || [],
1135
+ created_at: createdAt
1136
+ });
1137
+
1138
+ Logger.log('Overall evaluation generated');
1139
+
1140
+ } catch (overallError) {
1141
+ Logger.log('Error generating overall evaluation: ' + overallError.toString());
1142
+ // 全体評価のエラーは無視(教科別評価は返す)
1143
+ }
1144
+ }
1145
+
1146
+ return createJsonResponse({
1147
+ success: true,
1148
+ data: {
1149
+ session_id: sessionId,
1150
+ evaluations: evaluations,
1151
+ total_count: evaluations.length
1152
+ }
1153
+ });
1154
+
1155
+ } catch (error) {
1156
+ Logger.log('Error in handleGetEvaluation: ' + error.toString());
1157
+ return createErrorResponse('Get Evaluation Failed', error.toString());
1158
+ }
1159
+ }
1160
+
1161
+ /**
1162
+ * 問題保存エンドポイント(v1.6.5新規)
1163
+ * 生成された問題をGeneratedQuestionsシートに保存
1164
+ *
1165
+ * @param {Object} params - { session_id: string, subject: string, questions: Array }
1166
+ * @returns {TextOutput} - JSON形式のレスポンス
1167
+ */
1168
+ function handleSaveQuestions(params) {
1169
+ try {
1170
+ Logger.log('handleSaveQuestions called with params: ' + JSON.stringify(params));
1171
+
1172
+ const sessionId = params.session_id;
1173
+ const subject = params.subject;
1174
+ const questions = params.questions || [];
1175
+
1176
+ if (!sessionId) {
1177
+ return createJsonResponse({
1178
+ success: false,
1179
+ error: 'session_id is required'
1180
+ });
1181
+ }
1182
+
1183
+ if (!subject) {
1184
+ return createJsonResponse({
1185
+ success: false,
1186
+ error: 'subject is required'
1187
+ });
1188
+ }
1189
+
1190
+ if (!Array.isArray(questions) || questions.length === 0) {
1191
+ return createJsonResponse({
1192
+ success: false,
1193
+ error: 'questions array is required and must not be empty'
1194
+ });
1195
+ }
1196
+
1197
+ // GeneratedQuestionsシート取得(なければ作成)
1198
+ const sheet = getOrCreateSheet(SHEET_NAMES.GENERATED_QUESTIONS, [
1199
+ 'question_id',
1200
+ 'session_id',
1201
+ 'subject',
1202
+ 'genre_id',
1203
+ 'answer',
1204
+ 'question_text',
1205
+ 'choices',
1206
+ 'correct_answer',
1207
+ 'difficulty',
1208
+ 'created_at'
1209
+ ]);
1210
+
1211
+ const timestamp = getTimestamp();
1212
+ const savedQuestions = [];
1213
+
1214
+ // 各問題を保存
1215
+ for (let i = 0; i < questions.length; i++) {
1216
+ const q = questions[i];
1217
+ const questionId = q.question_id || generateUUID();
1218
+
1219
+ // 行データ作成
1220
+ const row = [
1221
+ questionId, // question_id
1222
+ sessionId, // session_id
1223
+ subject, // subject
1224
+ q.genre_id || q.category || '', // genre_id
1225
+ q.answer || '', // answer
1226
+ q.question || q.question_text || '', // question_text
1227
+ JSON.stringify(q.choices || []), // choices (JSON)
1228
+ q.correct_answer !== undefined ? q.correct_answer : q.correct, // correct_answer
1229
+ q.difficulty || '標準', // difficulty
1230
+ timestamp // created_at
1231
+ ];
1232
+
1233
+ sheet.appendRow(row);
1234
+
1235
+ // レスポンス用データ
1236
+ savedQuestions.push({
1237
+ question_id: questionId,
1238
+ subject: subject,
1239
+ genre_id: q.genre_id || q.category || '',
1240
+ question: q.question || q.question_text || ''
1241
+ });
1242
+
1243
+ Logger.log('Saved question: ' + questionId + ' for subject: ' + subject);
1244
+ }
1245
+
1246
+ return createJsonResponse({
1247
+ success: true,
1248
+ data: {
1249
+ questions: savedQuestions,
1250
+ saved_count: savedQuestions.length
1251
+ }
1252
+ });
1253
+
1254
+ } catch (error) {
1255
+ Logger.log('Error in handleSaveQuestions: ' + error.toString());
1256
+ return createErrorResponse('Save Questions Failed', error.toString());
1257
+ }
1258
+ }
1259
+
1260
+ /**
1261
+ * サマリー保存エンドポイント(v1.6.5新規)
1262
+ * 問題要約をSummariesシートに保存
1263
+ *
1264
+ * @param {Object} params - { session_id: string, subject: string, summary_data: Object }
1265
+ * @returns {TextOutput} - JSON形式のレスポンス
1266
+ */
1267
+ function handleSaveSummary(params) {
1268
+ try {
1269
+ Logger.log('handleSaveSummary called with params: ' + JSON.stringify(params));
1270
+
1271
+ const sessionId = params.session_id;
1272
+ const subject = params.subject;
1273
+ const summaryData = params.summary_data || {};
1274
+
1275
+ if (!sessionId) {
1276
+ return createJsonResponse({
1277
+ success: false,
1278
+ error: 'session_id is required'
1279
+ });
1280
+ }
1281
+
1282
+ if (!subject) {
1283
+ return createJsonResponse({
1284
+ success: false,
1285
+ error: 'subject is required'
1286
+ });
1287
+ }
1288
+
1289
+ // Summariesシート取得(なければ作成)
1290
+ const sheet = getOrCreateSheet(SHEET_NAMES.SUMMARIES, [
1291
+ 'summary_id',
1292
+ 'session_id',
1293
+ 'subject',
1294
+ 'keywords',
1295
+ 'topics',
1296
+ 'summary',
1297
+ 'created_at'
1298
+ ]);
1299
+
1300
+ const summaryId = generateUUID();
1301
+ const timestamp = getTimestamp();
1302
+
1303
+ // 行データ作成
1304
+ const row = [
1305
+ summaryId, // summary_id
1306
+ sessionId, // session_id
1307
+ subject, // subject
1308
+ JSON.stringify(summaryData.keywords || []), // keywords (JSON)
1309
+ JSON.stringify(summaryData.topics || []), // topics (JSON)
1310
+ summaryData.summary || '', // summary
1311
+ timestamp // created_at
1312
+ ];
1313
+
1314
+ sheet.appendRow(row);
1315
+
1316
+ Logger.log('Saved summary: ' + summaryId + ' for session: ' + sessionId + ', subject: ' + subject);
1317
+
1318
+ return createJsonResponse({
1319
+ success: true,
1320
+ data: {
1321
+ summary_id: summaryId,
1322
+ session_id: sessionId,
1323
+ subject: subject
1324
+ }
1325
+ });
1326
+
1327
+ } catch (error) {
1328
+ Logger.log('Error in handleSaveSummary: ' + error.toString());
1329
+ return createErrorResponse('Save Summary Failed', error.toString());
1330
+ }
1331
+ }
1332
+
1333
+ // ============================================================================
1334
+ // ユーティリティ関数
1335
+ // ============================================================================
1336
+
1337
+ /**
1338
+ * UsersシートのユーザーStatistics(total_sessions, total_questions)を更新
1339
+ *
1340
+ * @param {string} userId - ユーザーID
1341
+ * @param {number} sessionsIncrement - セッション数の増分(通常1)
1342
+ * @param {number} questionsIncrement - 問題数の増分
1343
+ */
1344
+ function updateUserStats(userId, sessionsIncrement, questionsIncrement) {
1345
+ try {
1346
+ const usersSheet = getSheet(SHEET_NAMES.USERS);
1347
+ const data = usersSheet.getDataRange().getValues();
1348
+
1349
+ // ユーザーを検索して更新
1350
+ for (let i = 1; i < data.length; i++) {
1351
+ if (data[i][0] === userId) { // user_id (列0)
1352
+ const currentSessions = data[i][4] || 0; // total_sessions (列4 = E列)
1353
+ const currentQuestions = data[i][5] || 0; // total_questions (列5 = F列)
1354
+
1355
+ const newSessions = currentSessions + sessionsIncrement;
1356
+ const newQuestions = currentQuestions + questionsIncrement;
1357
+
1358
+ // E列(total_sessions)とF列(total_questions)を更新
1359
+ usersSheet.getRange(i + 1, 5).setValue(newSessions); // 列5 = E列
1360
+ usersSheet.getRange(i + 1, 6).setValue(newQuestions); // 列6 = F列
1361
+
1362
+ Logger.log('Updated user stats for ' + userId + ': sessions=' + newSessions + ', questions=' + newQuestions);
1363
+ return;
1364
+ }
1365
+ }
1366
+
1367
+ Logger.log('User not found for stats update: ' + userId);
1368
+
1369
+ } catch (error) {
1370
+ Logger.log('Error in updateUserStats: ' + error.toString());
1371
+ }
1372
+ }
1373
+
1374
+ /**
1375
+ * セッションIDからユーザーIDを取得
1376
+ *
1377
+ * @param {string} sessionId - セッションID
1378
+ * @returns {string|null} - ユーザーID(見つからない場合null)
1379
+ */
1380
+ function getUserIdFromSession(sessionId) {
1381
+ try {
1382
+ const sessionsSheet = getSheet(SHEET_NAMES.SESSIONS);
1383
+ const data = sessionsSheet.getDataRange().getValues();
1384
+
1385
+ for (let i = 1; i < data.length; i++) {
1386
+ if (data[i][0] === sessionId) { // session_id
1387
+ return data[i][1]; // user_id
1388
+ }
1389
+ }
1390
+ return null;
1391
+ } catch (error) {
1392
+ Logger.log('Error in getUserIdFromSession: ' + error.toString());
1393
+ return null;
1394
+ }
1395
+ }
1396
+
1397
+ /**
1398
+ * ユーザーのセッション総数を取得
1399
+ *
1400
+ * @param {string} userId - ユーザーID
1401
+ * @returns {number} - セッション総数
1402
+ */
1403
+ function getUserSessionCount(userId) {
1404
+ try {
1405
+ const sessionsSheet = getSheet(SHEET_NAMES.SESSIONS);
1406
+ const data = sessionsSheet.getDataRange().getValues();
1407
+
1408
+ let count = 0;
1409
+ for (let i = 1; i < data.length; i++) {
1410
+ if (data[i][1] === userId) { // user_id
1411
+ count++;
1412
+ }
1413
+ }
1414
+ return count;
1415
+ } catch (error) {
1416
+ Logger.log('Error in getUserSessionCount: ' + error.toString());
1417
+ return 0;
1418
+ }
1419
+ }
1420
+
1421
+ /**
1422
+ * ジャンル統計を苦手順(正答率昇順)にソート
1423
+ *
1424
+ * @param {Array} genreStats - ジャンル統計配列 [{ genre_id, genre_name, attempted, correct, accuracy }]
1425
+ * @returns {Array} - 正答率昇順でソートされた配列
1426
+ */
1427
+ function sortByWeakness(genreStats) {
1428
+ if (!Array.isArray(genreStats)) {
1429
+ return [];
1430
+ }
1431
+
1432
+ return genreStats.sort(function(a, b) {
1433
+ return a.accuracy - b.accuracy; // 正答率昇順(苦手なジャンルが上位)
1434
+ });
1435
+ }
1436
+
1437
+ /**
1438
+ * セッションの解答結果を取得
1439
+ *
1440
+ * @param {string} sessionId - セッションID
1441
+ * @returns {Array} - 解答結果配列
1442
+ *
1443
+ * 結果配列の各要素:
1444
+ * {
1445
+ * question_id: string,
1446
+ * subject: string,
1447
+ * category: string,
1448
+ * question_text: string,
1449
+ * user_answer: number,
1450
+ * correct_answer: number,
1451
+ * is_correct: boolean,
1452
+ * time_taken: number
1453
+ * }
1454
+ */
1455
+ function getSessionResults(sessionId) {
1456
+ try {
1457
+ const answersSheet = getSheet(SHEET_NAMES.ANSWERS);
1458
+ const questionsSheet = getSheet(SHEET_NAMES.GENERATED_QUESTIONS);
1459
+ const answersData = answersSheet.getDataRange().getValues();
1460
+ const questionsData = questionsSheet.getDataRange().getValues();
1461
+
1462
+ // Questionsデータをマップ化(高速検索用)
1463
+ const questionsMap = {};
1464
+ for (let i = 1; i < questionsData.length; i++) {
1465
+ const questionId = questionsData[i][0];
1466
+ questionsMap[questionId] = {
1467
+ session_id: questionsData[i][1],
1468
+ subject: questionsData[i][2],
1469
+ category: questionsData[i][3],
1470
+ difficulty: questionsData[i][8],
1471
+ question_text: questionsData[i][5],
1472
+ choices: questionsData[i][6],
1473
+ correct_answer: questionsData[i][7],
1474
+ explanation: '',
1475
+ created_at: questionsData[i][9]
1476
+ };
1477
+ }
1478
+
1479
+ const results = [];
1480
+
1481
+ // Answersシートから該当セッションの解答を取得
1482
+ for (let i = 1; i < answersData.length; i++) {
1483
+ const row = answersData[i];
1484
+ const answerSessionId = row[1]; // session_id
1485
+
1486
+ if (answerSessionId === sessionId) {
1487
+ const questionId = row[2]; // question_id
1488
+ const userAnswer = row[5]; // user_answer (F列)
1489
+ const isCorrect = row[7]; // is_correct (H列)
1490
+ const timeTaken = row[8]; // time_spent (I列)
1491
+
1492
+ // 対応する問題データを取得
1493
+ const question = questionsMap[questionId];
1494
+ if (question) {
1495
+ results.push({
1496
+ question_id: questionId,
1497
+ subject: question.subject,
1498
+ category: question.category,
1499
+ difficulty: question.difficulty,
1500
+ question_text: question.question_text,
1501
+ user_answer: userAnswer,
1502
+ correct_answer: question.correct_answer,
1503
+ is_correct: isCorrect,
1504
+ time_taken: timeTaken
1505
+ });
1506
+ }
1507
+ }
1508
+ }
1509
+
1510
+ Logger.log('getSessionResults: Found ' + results.length + ' results for session ' + sessionId);
1511
+ return results;
1512
+
1513
+ } catch (error) {
1514
+ Logger.log('Error in getSessionResults: ' + error.toString());
1515
+ return [];
1516
+ }
1517
+ }
1518
+
1519
+ /**
1520
+ * セッション結果取得エンドポイント(評価生成用)
1521
+ *
1522
+ * @param {Object} params - { session_id: string }
1523
+ * @returns {TextOutput} - JSON形式のレスポンス
1524
+ *
1525
+ * レスポンス形式:
1526
+ * {
1527
+ * success: true,
1528
+ * data: {
1529
+ * session_id: string,
1530
+ * results: [
1531
+ * {
1532
+ * question_id: string,
1533
+ * subject: string,
1534
+ * category: string,
1535
+ * difficulty: string,
1536
+ * question_text: string,
1537
+ * user_answer: number,
1538
+ * correct_answer: number,
1539
+ * is_correct: boolean,
1540
+ * time_taken: number
1541
+ * },
1542
+ * ...
1543
+ * ],
1544
+ * summary: {
1545
+ * total_score: number,
1546
+ * completed: boolean,
1547
+ * start_time: string,
1548
+ * end_time: string
1549
+ * }
1550
+ * }
1551
+ * }
1552
+ */
1553
+ function handleGetSessionResults(params) {
1554
+ try {
1555
+ Logger.log('handleGetSessionResults called with params: ' + JSON.stringify(params));
1556
+
1557
+ const sessionId = params.session_id;
1558
+
1559
+ if (!sessionId) {
1560
+ return createJsonResponse({
1561
+ success: false,
1562
+ error: 'session_id is required'
1563
+ });
1564
+ }
1565
+
1566
+ // Sessionsシートからセッション情報を取得
1567
+ const sessionsSheet = getSheet(SHEET_NAMES.SESSIONS);
1568
+ const sessionsData = sessionsSheet.getDataRange().getValues();
1569
+
1570
+ let sessionInfo = null;
1571
+ for (let i = 1; i < sessionsData.length; i++) {
1572
+ if (sessionsData[i][0] === sessionId) {
1573
+ sessionInfo = {
1574
+ session_id: sessionsData[i][0],
1575
+ user_id: sessionsData[i][1],
1576
+ start_time: sessionsData[i][2],
1577
+ end_time: sessionsData[i][3],
1578
+ subjects: sessionsData[i][4],
1579
+ total_score: sessionsData[i][5],
1580
+ completed: sessionsData[i][6]
1581
+ };
1582
+ break;
1583
+ }
1584
+ }
1585
+
1586
+ if (!sessionInfo) {
1587
+ return createJsonResponse({
1588
+ success: false,
1589
+ error: 'Session not found'
1590
+ });
1591
+ }
1592
+
1593
+ // 解答結果を取得(既存のgetSessionResults関数を使用)
1594
+ const results = getSessionResults(sessionId);
1595
+
1596
+ Logger.log('handleGetSessionResults: Found ' + results.length + ' results');
1597
+
1598
+ return createJsonResponse({
1599
+ success: true,
1600
+ data: {
1601
+ session_id: sessionId,
1602
+ results: results,
1603
+ summary: {
1604
+ total_score: sessionInfo.total_score,
1605
+ completed: sessionInfo.completed,
1606
+ start_time: sessionInfo.start_time,
1607
+ end_time: sessionInfo.end_time
1608
+ }
1609
+ }
1610
+ });
1611
+
1612
+ } catch (error) {
1613
+ Logger.log('Error in handleGetSessionResults: ' + error.toString());
1614
+ return createErrorResponse('Get Session Results Failed', error.toString());
1615
+ }
1616
+ }
1617
+
1618
+ /**
1619
+ * check_summary_statusエンドポイント
1620
+ * session_idに紐づくサマリー完了状態を確認
1621
+ *
1622
+ * @param {Object} params - { session_id: string }
1623
+ * @returns {TextOutput} - JSON形式のレスポンス
1624
+ */
1625
+ function handleCheckSummaryStatus(params) {
1626
+ try {
1627
+ Logger.log('handleCheckSummaryStatus called with params: ' + JSON.stringify(params));
1628
+
1629
+ const sessionId = params.session_id;
1630
+
1631
+ if (!sessionId) {
1632
+ return createJsonResponse({
1633
+ success: false,
1634
+ error: 'session_id is required'
1635
+ });
1636
+ }
1637
+
1638
+ // Summariesシートからsession_idに一致するレコードを取得
1639
+ const sheet = getSheet(SHEET_NAMES.SUMMARIES);
1640
+ const data = sheet.getDataRange().getValues();
1641
+
1642
+ // ヘッダー行を確認(デバッグ用)
1643
+ const headers = data[0];
1644
+ Logger.log('Summaries sheet headers: ' + JSON.stringify(headers));
1645
+
1646
+ const summaries = [];
1647
+
1648
+ // ヘッダー行をスキップして検索
1649
+ for (let i = 1; i < data.length; i++) {
1650
+ const row = data[i];
1651
+ const rowSessionId = row[1]; // session_id列(0-indexed)
1652
+
1653
+ if (rowSessionId === sessionId) {
1654
+ const subject = row[2]; // subject
1655
+ const keywordsJson = row[3]; // keywords (JSON文字列)
1656
+ const summary = row[5]; // summary
1657
+
1658
+ // JSONをパース(空の場合は空配列)
1659
+ let keywords = [];
1660
+ try {
1661
+ keywords = keywordsJson ? JSON.parse(keywordsJson) : [];
1662
+ } catch (parseError) {
1663
+ Logger.log('Failed to parse keywords: ' + parseError.toString());
1664
+ keywords = [];
1665
+ }
1666
+
1667
+ summaries.push({
1668
+ subject: subject,
1669
+ summary: summary || '',
1670
+ keywords: keywords
1671
+ });
1672
+ }
1673
+ }
1674
+
1675
+ const completed = summaries.length > 0;
1676
+ const count = summaries.length;
1677
+
1678
+ Logger.log('handleCheckSummaryStatus: Found ' + count + ' summaries for session: ' + sessionId);
1679
+
1680
+ return createJsonResponse({
1681
+ success: true,
1682
+ data: {
1683
+ session_id: sessionId,
1684
+ completed: completed,
1685
+ count: count,
1686
+ summaries: summaries
1687
+ }
1688
+ });
1689
+
1690
+ } catch (error) {
1691
+ Logger.log('Error in handleCheckSummaryStatus: ' + error.toString());
1692
+ return createErrorResponse('Check Summary Status Failed', error.toString());
1693
+ }
1694
+ }
1695
+
1696
+ /**
1697
+ * 評価保存エンドポイント
1698
+ * Python側のget_evaluationから呼び出される
1699
+ *
1700
+ * @param {Object} params - { session_id: string, evaluations: Array }
1701
+ * @returns {TextOutput} - JSON形式のレスポンス
1702
+ */
1703
+ function handleSaveEvaluations(params) {
1704
+ try {
1705
+ Logger.log('handleSaveEvaluations called with params: ' + JSON.stringify(params));
1706
+
1707
+ const sessionId = params.session_id;
1708
+ const evaluations = params.evaluations || [];
1709
+
1710
+ if (!sessionId) {
1711
+ return createJsonResponse({
1712
+ success: false,
1713
+ error: 'session_id is required'
1714
+ });
1715
+ }
1716
+
1717
+ if (!Array.isArray(evaluations) || evaluations.length === 0) {
1718
+ return createJsonResponse({
1719
+ success: false,
1720
+ error: 'evaluations array is required and must not be empty'
1721
+ });
1722
+ }
1723
+
1724
+ // Evaluationsシート取得(なければ作成)
1725
+ const sheet = getOrCreateSheet(SHEET_NAMES.EVALUATIONS, [
1726
+ 'evaluation_id',
1727
+ 'session_id',
1728
+ 'subject',
1729
+ 'advice',
1730
+ 'strengths',
1731
+ 'weaknesses',
1732
+ 'recommended_topics',
1733
+ 'created_at'
1734
+ ]);
1735
+
1736
+ const timestamp = getTimestamp();
1737
+ const savedEvaluations = [];
1738
+
1739
+ // 各評価を保存
1740
+ for (let i = 0; i < evaluations.length; i++) {
1741
+ const evaluation = evaluations[i];
1742
+ const evaluationId = generateUUID();
1743
+
1744
+ const row = [
1745
+ evaluationId,
1746
+ sessionId,
1747
+ evaluation.subject || 'overall',
1748
+ evaluation.advice || '',
1749
+ JSON.stringify(evaluation.strengths || []),
1750
+ JSON.stringify(evaluation.weaknesses || []),
1751
+ JSON.stringify(evaluation.recommended_topics || evaluation.next_steps || []),
1752
+ timestamp
1753
+ ];
1754
+
1755
+ sheet.appendRow(row);
1756
+
1757
+ savedEvaluations.push({
1758
+ evaluation_id: evaluationId,
1759
+ subject: evaluation.subject || 'overall'
1760
+ });
1761
+
1762
+ Logger.log('Saved evaluation: ' + evaluationId + ' for subject: ' + (evaluation.subject || 'overall'));
1763
+ }
1764
+
1765
+ return createJsonResponse({
1766
+ success: true,
1767
+ data: {
1768
+ session_id: sessionId,
1769
+ saved_count: savedEvaluations.length,
1770
+ evaluations: savedEvaluations
1771
+ }
1772
+ });
1773
+
1774
+ } catch (error) {
1775
+ Logger.log('Error in handleSaveEvaluations: ' + error.toString());
1776
+ return createErrorResponse('Save Evaluations Failed', error.toString());
1777
+ }
1778
+ }
1779
+
1780
+ /**
1781
+ * Statisticsシートを更新
1782
+ *
1783
+ * @param {string} userId - ユーザーID
1784
+ * @param {Object} statsBySubjectCategory - 教科・分野別の統計データ
1785
+ */
1786
+ function updateStatistics(userId, statsBySubjectCategory) {
1787
+ try {
1788
+ const statisticsSheet = getSheet(SHEET_NAMES.STATISTICS);
1789
+ const data = statisticsSheet.getDataRange().getValues();
1790
+ const timestamp = getTimestamp();
1791
+
1792
+ // 各教科・分野について統計を更新
1793
+ for (const key in statsBySubjectCategory) {
1794
+ const stat = statsBySubjectCategory[key];
1795
+ const subject = stat.subject;
1796
+ const category = stat.category;
1797
+ const attempted = stat.attempted;
1798
+ const correct = stat.correct;
1799
+
1800
+ // 既存の統計レコードを検索
1801
+ let existingRowIndex = -1;
1802
+ for (let i = 1; i < data.length; i++) {
1803
+ if (data[i][1] === userId && data[i][2] === subject && data[i][3] === category) {
1804
+ existingRowIndex = i;
1805
+ break;
1806
+ }
1807
+ }
1808
+
1809
+ if (existingRowIndex !== -1) {
1810
+ // 既存レコードを更新
1811
+ const oldAttempted = data[existingRowIndex][4] || 0;
1812
+ const oldCorrect = data[existingRowIndex][5] || 0;
1813
+ const newAttempted = oldAttempted + attempted;
1814
+ const newCorrect = oldCorrect + correct;
1815
+ const newAccuracyRate = newAttempted > 0 ? newCorrect / newAttempted : 0;
1816
+
1817
+ statisticsSheet.getRange(existingRowIndex + 1, 5).setValue(newAttempted); // total_attempted
1818
+ statisticsSheet.getRange(existingRowIndex + 1, 6).setValue(newCorrect); // correct_count
1819
+ statisticsSheet.getRange(existingRowIndex + 1, 7).setValue(newAccuracyRate); // accuracy_rate
1820
+ statisticsSheet.getRange(existingRowIndex + 1, 8).setValue(timestamp); // last_updated
1821
+
1822
+ Logger.log('Updated statistics: ' + subject + '/' + category + ' - ' + newCorrect + '/' + newAttempted);
1823
+ } else {
1824
+ // 新規レコードを作成
1825
+ const statId = generateUUID();
1826
+ const accuracyRate = attempted > 0 ? correct / attempted : 0;
1827
+ const newRow = [
1828
+ statId, // stat_id
1829
+ userId, // user_id
1830
+ subject, // subject
1831
+ category, // category
1832
+ attempted, // total_attempted
1833
+ correct, // correct_count
1834
+ accuracyRate, // accuracy_rate
1835
+ timestamp // last_updated
1836
+ ];
1837
+ statisticsSheet.appendRow(newRow);
1838
+
1839
+ Logger.log('Created new statistics: ' + subject + '/' + category + ' - ' + correct + '/' + attempted);
1840
+ }
1841
+ }
1842
+
1843
+ } catch (error) {
1844
+ Logger.log('Error in updateStatistics: ' + error.toString());
1845
+ }
1846
+ }
1847
+
1848
+ /**
1849
+ * JSON形式のレスポンスを作成
1850
+ *
1851
+ * @param {Object} data - レスポンスデータ
1852
+ * @returns {TextOutput} - JSON形式のレスポンス
1853
+ */
1854
+ function createJsonResponse(data) {
1855
+ return ContentService
1856
+ .createTextOutput(JSON.stringify(data))
1857
+ .setMimeType(ContentService.MimeType.JSON);
1858
+ }
1859
+
1860
+ /**
1861
+ * エラーレスポンスを作成
1862
+ *
1863
+ * @param {string} message - エラーメッセージ
1864
+ * @param {string} details - エラー詳細
1865
+ * @returns {TextOutput} - JSON形式のエラーレスポンス
1866
+ */
1867
+ function createErrorResponse(message, details) {
1868
+ const errorData = {
1869
+ success: false,
1870
+ error: message,
1871
+ details: details,
1872
+ timestamp: new Date().toISOString()
1873
+ };
1874
+
1875
+ return ContentService
1876
+ .createTextOutput(JSON.stringify(errorData))
1877
+ .setMimeType(ContentService.MimeType.JSON);
1878
+ }
1879
+
1880
+ /**
1881
+ * スプレッドシートオブジェクトを取得
1882
+ *
1883
+ * @returns {Spreadsheet} - スプレッドシートオブジェクト
1884
+ */
1885
+ function getSpreadsheet() {
1886
+ return SpreadsheetApp.openById(SPREADSHEET_ID);
1887
+ }
1888
+
1889
+ /**
1890
+ * シートオブジェクトを取得
1891
+ *
1892
+ * @param {string} sheetName - シート名
1893
+ * @returns {Sheet} - シートオブジェクト
1894
+ */
1895
+ function getSheet(sheetName) {
1896
+ const spreadsheet = getSpreadsheet();
1897
+ const sheet = spreadsheet.getSheetByName(sheetName);
1898
+
1899
+ if (!sheet) {
1900
+ throw new Error('Sheet not found: ' + sheetName);
1901
+ }
1902
+
1903
+ return sheet;
1904
+ }
1905
+
1906
+ /**
1907
+ * シートオブジェクトを取得(存在しない場合は作成)
1908
+ *
1909
+ * @param {string} sheetName - シート名
1910
+ * @param {Array} headers - ヘッダー行の配列(新規作成時のみ使用)
1911
+ * @returns {Sheet} - シートオブジェクト
1912
+ */
1913
+ function getOrCreateSheet(sheetName, headers) {
1914
+ const spreadsheet = getSpreadsheet();
1915
+ let sheet = spreadsheet.getSheetByName(sheetName);
1916
+
1917
+ if (!sheet) {
1918
+ Logger.log('Creating new sheet: ' + sheetName);
1919
+ sheet = spreadsheet.insertSheet(sheetName);
1920
+
1921
+ // ヘッダー行を設定
1922
+ if (headers && headers.length > 0) {
1923
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
1924
+ Logger.log('Set headers for ' + sheetName + ': ' + headers.join(', '));
1925
+ }
1926
+ }
1927
+
1928
+ return sheet;
1929
+ }
1930
+
1931
+ /**
1932
+ * UUIDを生成(簡易版)
1933
+ *
1934
+ * @returns {string} - UUID文字列
1935
+ */
1936
+ function generateUUID() {
1937
+ return Utilities.getUuid();
1938
+ }
1939
+
1940
+ /**
1941
+ * 現在のタイムスタンプ(ISO 8601形式)を取得
1942
+ *
1943
+ * @returns {string} - ISO 8601形式の日時文字列
1944
+ */
1945
+ function getTimestamp() {
1946
+ return new Date().toISOString();
1947
+ }
1948
+
1949
+ // ============================================================================
1950
+ // デバッグ用関数(開発時のみ使用)
1951
+ // ============================================================================
1952
+
1953
+ /**
1954
+ * デバッグ用:ユーザー登録APIテスト
1955
+ * Apps Scriptエディタから実行可能
1956
+ * ランダムなusernameを生成して重複を回避
1957
+ */
1958
+ function testRegisterUser() {
1959
+ // ランダムなusernameを生成(重複回避)
1960
+ const randomSuffix = Math.floor(Math.random() * 10000);
1961
+ const e = {
1962
+ postData: {
1963
+ contents: JSON.stringify({
1964
+ endpoint: 'registerUser',
1965
+ params: {
1966
+ username: 'テストユーザー' + randomSuffix
1967
+ }
1968
+ })
1969
+ }
1970
+ };
1971
+
1972
+ const response = doPost(e);
1973
+ Logger.log('Test Response: ' + response.getContent());
1974
+ }
1975
+
1976
+ function testStartSession() {
1977
+ const e = {
1978
+ postData: {
1979
+ contents: JSON.stringify({
1980
+ endpoint: 'startSession',
1981
+ params: {
1982
+ user_id: 'dummy-user-001',
1983
+ subjects: ['国語', '算数', '理科']
1984
+ }
1985
+ })
1986
+ }
1987
+ };
1988
+
1989
+ const response = doPost(e);
1990
+ Logger.log('Test Response: ' + response.getContent());
1991
+ }
1992
+
1993
+ function testGenerateQuestion() {
1994
+ const e = {
1995
+ postData: {
1996
+ contents: JSON.stringify({
1997
+ endpoint: 'generateQuestion',
1998
+ params: {
1999
+ session_id: 'dummy-session-001',
2000
+ subjects: ['国語']
2001
+ }
2002
+ })
2003
+ }
2004
+ };
2005
+
2006
+ const response = doPost(e);
2007
+ Logger.log('Test Response: ' + response.getContent());
2008
+ }
2009
+
2010
+ /**
2011
+ * デバッグ用:重複usernameでのユーザー登録テスト
2012
+ * 既存のusernameを使用してエラーレスポンスを確認
2013
+ */
2014
+ function testDuplicateUsername() {
2015
+ const e = {
2016
+ postData: {
2017
+ contents: JSON.stringify({
2018
+ endpoint: 'registerUser',
2019
+ params: {
2020
+ username: 'テストユーザー9526' // 既存のusername
2021
+ }
2022
+ })
2023
+ }
2024
+ };
2025
+
2026
+ const response = doPost(e);
2027
+ Logger.log('Test Response: ' + response.getContent());
2028
+ }
2029
+
2030
+ /**
2031
+ * 問題生成APIテスト(Dify統合)
2032
+ */
2033
+ function testGenerateQuestions() {
2034
+ const e = {
2035
+ postData: {
2036
+ contents: JSON.stringify({
2037
+ endpoint: 'generateQuestions',
2038
+ params: {
2039
+ session_id: 'test-session-' + Date.now(),
2040
+ subjects: ['jp'] // まず国語だけでテスト
2041
+ }
2042
+ })
2043
+ }
2044
+ };
2045
+
2046
+ const response = doPost(e);
2047
+ Logger.log('Test Response: ' + response.getContent());
2048
+ }
2049
+
2050
+ /**
2051
+ * 解答送信APIテスト
2052
+ * 注: 事前にtestStartSession、testGenerateQuestionsを実行し、
2053
+ * 実際のsession_idとquestion_idを取得してから実行すること
2054
+ */
2055
+ function testSubmitAnswers() {
2056
+ // テスト用: 実際のsession_idとquestion_idに置き換える必要あり
2057
+ const e = {
2058
+ postData: {
2059
+ contents: JSON.stringify({
2060
+ endpoint: 'submitAnswers',
2061
+ params: {
2062
+ session_id: 'test-session-001', // 実際のsession_idに置き換え
2063
+ answers: [
2064
+ {
2065
+ question_id: 'test-question-001', // 実際のquestion_idに置き換え
2066
+ selected_answer: 0,
2067
+ time_taken_seconds: 12
2068
+ },
2069
+ {
2070
+ question_id: 'test-question-002', // 実際のquestion_idに置き換え
2071
+ selected_answer: 2,
2072
+ time_taken_seconds: 18
2073
+ }
2074
+ ]
2075
+ }
2076
+ })
2077
+ }
2078
+ };
2079
+
2080
+ const response = doPost(e);
2081
+ Logger.log('Test Response: ' + response.getContent());
2082
+ }
2083
+
2084
+ /**
2085
+ * 統計取得APIテスト(ジャンル別累積集計対応版)
2086
+ * 注: 事前にtestRegisterUserを実行し、実際のuser_idを取得してから実行すること
2087
+ *
2088
+ * テスト項目:
2089
+ * 1. ジャンル別統計が取得できること
2090
+ * 2. GenreMaster.jsからジャンル名が正しく取得できること
2091
+ * 3. 苦手順(正答率昇順)にソートされていること
2092
+ * 4. 累積統計(total_sessions, total_questions, total_correct, overall_accuracy)が返却されること
2093
+ */
2094
+ function testGetStatistics() {
2095
+ const e = {
2096
+ postData: {
2097
+ contents: JSON.stringify({
2098
+ endpoint: 'getStatistics',
2099
+ params: {
2100
+ user_id: 'test-user-001', // 実際のuser_idに置き換え
2101
+ subjects: ['jp', 'math'] // オプション: 指定教科のみ取得
2102
+ }
2103
+ })
2104
+ }
2105
+ };
2106
+
2107
+ const response = doPost(e);
2108
+ const responseText = response.getContent();
2109
+ Logger.log('=== testGetStatistics 結果 ===');
2110
+ Logger.log(responseText);
2111
+
2112
+ // レスポンスをパースして検証
2113
+ try {
2114
+ const data = JSON.parse(responseText);
2115
+ if (data.success && data.data) {
2116
+ Logger.log('✅ success: true');
2117
+ Logger.log('user_id: ' + data.data.user_id);
2118
+
2119
+ if (data.data.subjects && data.data.subjects.length > 0) {
2120
+ Logger.log('✅ subjects配列が存在(' + data.data.subjects.length + '教科)');
2121
+
2122
+ // 最初の教科の詳細を確認
2123
+ const firstSubject = data.data.subjects[0];
2124
+ Logger.log('教科例: ' + firstSubject.subject_name);
2125
+ Logger.log(' - 総問題数: ' + firstSubject.total_attempted);
2126
+ Logger.log(' - 正解数: ' + firstSubject.total_correct);
2127
+ Logger.log(' - 正答率: ' + (firstSubject.overall_accuracy * 100).toFixed(1) + '%');
2128
+
2129
+ if (firstSubject.genres && firstSubject.genres.length > 0) {
2130
+ Logger.log('✅ ジャンル配列が存在(' + firstSubject.genres.length + 'ジャンル)');
2131
+ Logger.log('ジャンル例(苦手順):');
2132
+ for (let i = 0; i < Math.min(3, firstSubject.genres.length); i++) {
2133
+ const genre = firstSubject.genres[i];
2134
+ Logger.log(' ' + (i + 1) + '. ' + genre.genre_name + '(' + genre.genre_id + '): ' +
2135
+ genre.correct + '/' + genre.attempted + ' = ' +
2136
+ (genre.accuracy * 100).toFixed(1) + '%');
2137
+ }
2138
+ } else {
2139
+ Logger.log('⚠️ ジャンル配列が空です');
2140
+ }
2141
+ }
2142
+
2143
+ if (data.data.cumulative) {
2144
+ Logger.log('✅ 累積統計が存在');
2145
+ Logger.log(' - 総セッション数: ' + data.data.cumulative.total_sessions);
2146
+ Logger.log(' - 総問題数: ' + data.data.cumulative.total_questions);
2147
+ Logger.log(' - 総正解数: ' + data.data.cumulative.total_correct);
2148
+ Logger.log(' - 全体正答率: ' + (data.data.cumulative.overall_accuracy * 100).toFixed(1) + '%');
2149
+ } else {
2150
+ Logger.log('⚠️ 累積統計が存在しません');
2151
+ }
2152
+ } else {
2153
+ Logger.log('❌ エラー: ' + (data.error || 'unknown'));
2154
+ }
2155
+ } catch (parseError) {
2156
+ Logger.log('❌ JSON解析エラー: ' + parseError.toString());
2157
+ }
2158
+
2159
+ Logger.log('=== テスト完了 ===');
2160
+ }
2161
+
2162
+ /**
2163
+ * 評価取得APIテスト
2164
+ * 注: 事前にtestStartSession、testGenerateQuestions、testSubmitAnswersを実行し、
2165
+ * 実際のsession_idを取得してから実行すること
2166
+ *
2167
+ * 使用方法:
2168
+ * 1. testStartSession() → session_idを取得
2169
+ * 2. testGenerateQuestions() → question_idを取得
2170
+ * 3. testSubmitAnswers() → 解答を送信
2171
+ * 4. testGetEvaluation() → 評価を取得
2172
+ */
2173
+ function testGetEvaluation() {
2174
+ const e = {
2175
+ postData: {
2176
+ contents: JSON.stringify({
2177
+ endpoint: 'getEvaluation',
2178
+ params: {
2179
+ session_id: 'test-session-001', // 実際のsession_idに置き換え
2180
+ subjects: ['jp', 'math'] // オプション: 指定教科のみ評価
2181
+ }
2182
+ })
2183
+ }
2184
+ };
2185
+
2186
+ const response = doPost(e);
2187
+ Logger.log('Test Response: ' + response.getContent());
2188
+ }
2189
+
2190
+ /**
2191
+ * save_questions APIテスト
2192
+ * GeneratedQuestionsシートへの保存をテスト
2193
+ */
2194
+ function testSaveQuestions() {
2195
+ const e = {
2196
+ postData: {
2197
+ contents: JSON.stringify({
2198
+ action: 'save_questions',
2199
+ session_id: 'test-session-' + Date.now(),
2200
+ subject: 'jp',
2201
+ questions: [
2202
+ {
2203
+ question_id: 'test-q-001',
2204
+ genre_id: 'JP01',
2205
+ answer: '憂鬱',
2206
+ question: '次の漢字の読みを選びなさい:「憂鬱」',
2207
+ choices: ['ゆううつ', 'ゆうげき', 'ゆうめい', 'ゆうべつ'],
2208
+ correct_answer: 0,
2209
+ difficulty: '標準'
2210
+ },
2211
+ {
2212
+ question_id: 'test-q-002',
2213
+ genre_id: 'JP01',
2214
+ answer: '慈悲',
2215
+ question: '次の熟語の読みを選びなさい:「慈悲」',
2216
+ choices: ['じひ', 'じしん', 'じゅひ', 'しひ'],
2217
+ correct_answer: 0,
2218
+ difficulty: '基本'
2219
+ }
2220
+ ]
2221
+ })
2222
+ }
2223
+ };
2224
+
2225
+ const response = doPost(e);
2226
+ Logger.log('Test Response: ' + response.getContent());
2227
+ }
2228
+
2229
+ /**
2230
+ * save_summary APIテスト
2231
+ * Summariesシートへの保存をテスト
2232
+ */
2233
+ function testSaveSummary() {
2234
+ const e = {
2235
+ postData: {
2236
+ contents: JSON.stringify({
2237
+ action: 'save_summary',
2238
+ session_id: 'test-session-' + Date.now(),
2239
+ subject: 'jp',
2240
+ summary_data: {
2241
+ keywords: ['漢字', '語彙', '読み'],
2242
+ topics: ['漢字の読み', '熟語'],
2243
+ summary: '今回は漢字と熟語の読みに関する問題でした。難読漢字が2問出題されました。'
2244
+ }
2245
+ })
2246
+ }
2247
+ };
2248
+
2249
+ const response = doPost(e);
2250
+ Logger.log('Test Response: ' + response.getContent());
2251
+ }
V1.8.1/gas/DifyService.js ADDED
@@ -0,0 +1,458 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Dify APIサービス
3
+ *
4
+ * Dify Cloudのワークフロー実行APIを呼び出すラッパー
5
+ *
6
+ * @version 1.0.0
7
+ * @date 2025-12-04
8
+ */
9
+
10
+ // ============================================================================
11
+ // 定数定義
12
+ // ============================================================================
13
+
14
+ const DIFY_CONFIG = {
15
+ TIMEOUT: 150000, // 150秒(RAG Knowledge Base利用による処理時間増加対応)
16
+ RESPONSE_MODE: 'blocking',
17
+ USER: 'gas-orchestrator'
18
+ };
19
+
20
+ // 教科マッピング: GAS内部コード → Dify期待値(日本語)
21
+ const SUBJECT_TO_JAPANESE = {
22
+ 'jp': '国語',
23
+ 'math': '算数',
24
+ 'sci': '理科',
25
+ 'soc': '社会'
26
+ };
27
+
28
+ // 教科コード → Dify出力変数名のマッピング
29
+ const SUBJECT_TO_OUTPUT_KEY = {
30
+ 'jp': 'kokugo_questions',
31
+ 'math': 'sansu_questions',
32
+ 'sci': 'rika_questions',
33
+ 'soc': 'shakai_questions'
34
+ };
35
+
36
+ // 教科コード → Dify評価出力変数名のマッピング
37
+ const SUBJECT_TO_EVALUATION_KEY = {
38
+ 'jp': 'kokugo_evaluation',
39
+ 'math': 'sansu_evaluation',
40
+ 'sci': 'rika_evaluation',
41
+ 'soc': 'shakai_evaluation'
42
+ };
43
+
44
+ /**
45
+ * Difyの評価出力形式をGAS期待形式に正規化
46
+ *
47
+ * Dify出力形式: {"評価": ["コメント1", "コメント2", ...]}
48
+ * GAS期待形式: {advice, strengths[], weaknesses[], recommended_topics[]}
49
+ *
50
+ * @param {Object} difyEvaluation - Difyから返された評価データ
51
+ * @param {string} subject - 教科ID
52
+ * @returns {Object} - 正規化された評価データ
53
+ */
54
+ function normalizeEvaluationFormat(difyEvaluation, subject) {
55
+ // 既にGAS期待形式の場合はそのまま返す
56
+ if (difyEvaluation.advice !== undefined) {
57
+ Logger.log('[DifyService] Evaluation already in expected format');
58
+ return difyEvaluation;
59
+ }
60
+
61
+ // Dify形式 {"評価": [...]} の場合
62
+ if (difyEvaluation['評価'] && Array.isArray(difyEvaluation['評価'])) {
63
+ const comments = difyEvaluation['評価'];
64
+ Logger.log('[DifyService] Converting Dify format to GAS format: ' + comments.length + ' comments');
65
+
66
+ // コメントを構造化
67
+ // 最初のコメントを総合アドバイス、残りを分類
68
+ const advice = comments[0] || '';
69
+ const strengths = [];
70
+ const weaknesses = [];
71
+ const recommended_topics = [];
72
+
73
+ // 2番目以降のコメントを内容で分類
74
+ for (var i = 1; i < comments.length; i++) {
75
+ var comment = comments[i];
76
+ // 改善・弱点を示すキーワードがあればweaknesses
77
+ if (comment.includes('課題') || comment.includes('弱') || comment.includes('不足') ||
78
+ comment.includes('低い') || comment.includes('0%') || comment.includes('改善')) {
79
+ weaknesses.push(comment);
80
+ }
81
+ // 強み・良い点を示すキーワードがあればstrengths
82
+ else if (comment.includes('強') || comment.includes('得意') || comment.includes('高い') ||
83
+ comment.includes('安定') || comment.includes('良')) {
84
+ strengths.push(comment);
85
+ }
86
+ // それ以外はrecommended_topics
87
+ else {
88
+ recommended_topics.push(comment);
89
+ }
90
+ }
91
+
92
+ return {
93
+ advice: advice,
94
+ strengths: strengths,
95
+ weaknesses: weaknesses,
96
+ recommended_topics: recommended_topics
97
+ };
98
+ }
99
+
100
+ // 不明な形式の場合はそのまま返す(ログ出力)
101
+ Logger.log('[DifyService] Unknown evaluation format: ' + JSON.stringify(Object.keys(difyEvaluation)));
102
+ return {
103
+ advice: JSON.stringify(difyEvaluation),
104
+ strengths: [],
105
+ weaknesses: [],
106
+ recommended_topics: []
107
+ };
108
+ }
109
+
110
+ // ============================================================================
111
+ // Dify API呼び出し関数
112
+ // ============================================================================
113
+
114
+ /**
115
+ * Dify APIの環境変数を取得
116
+ */
117
+ function getDifyCredentials() {
118
+ const properties = PropertiesService.getScriptProperties();
119
+ const apiUrl = properties.getProperty('DIFY_API_URL');
120
+ const apiKey = properties.getProperty('DIFY_API_KEY');
121
+
122
+ if (!apiUrl || !apiKey) {
123
+ throw new Error('Dify API credentials not configured. Run setDifyProperties() first.');
124
+ }
125
+
126
+ return { apiUrl, apiKey };
127
+ }
128
+
129
+ /**
130
+ * 複数のDify APIリクエストを並列実行
131
+ *
132
+ * @param {Array} requestConfigs - リクエスト設定の配列
133
+ * 各要素: { action: string, subject: string, additionalInputs: Object }
134
+ * @returns {Array} - Dify APIレスポンスの配列(リクエスト順序を保持)
135
+ */
136
+ function callDifyWorkflowBatch(requestConfigs) {
137
+ try {
138
+ const { apiUrl, apiKey } = getDifyCredentials();
139
+
140
+ Logger.log('[DifyService] callDifyWorkflowBatch: Preparing ' + requestConfigs.length + ' parallel requests');
141
+
142
+ // 各リクエストの設定を作成
143
+ const requests = requestConfigs.map((config, index) => {
144
+ const japaneseSubject = SUBJECT_TO_JAPANESE[config.subject] || config.subject;
145
+
146
+ Logger.log('[DifyService] Request ' + index + ': action=' + config.action + ', subject=' + config.subject + ' (' + japaneseSubject + ')');
147
+
148
+ return {
149
+ url: apiUrl,
150
+ method: 'post',
151
+ contentType: 'application/json',
152
+ headers: {
153
+ 'Authorization': 'Bearer ' + apiKey
154
+ },
155
+ payload: JSON.stringify({
156
+ inputs: {
157
+ action: config.action,
158
+ subject: japaneseSubject,
159
+ ...config.additionalInputs
160
+ },
161
+ response_mode: DIFY_CONFIG.RESPONSE_MODE,
162
+ user: DIFY_CONFIG.USER
163
+ }),
164
+ muteHttpExceptions: true
165
+ };
166
+ });
167
+
168
+ Logger.log('[DifyService] Sending ' + requests.length + ' parallel requests to Dify API...');
169
+ const startTime = new Date().getTime();
170
+
171
+ // 並列実行
172
+ const responses = UrlFetchApp.fetchAll(requests);
173
+
174
+ const endTime = new Date().getTime();
175
+ Logger.log('[DifyService] All requests completed in ' + ((endTime - startTime) / 1000) + ' seconds');
176
+
177
+ // 結果をパースして返却
178
+ return responses.map((response, index) => {
179
+ const responseCode = response.getResponseCode();
180
+ const responseText = response.getContentText();
181
+
182
+ Logger.log('[DifyService] Response ' + index + ': code=' + responseCode);
183
+
184
+ if (responseCode !== 200) {
185
+ Logger.log('[DifyService] Batch request ' + index + ' failed: ' + responseText.substring(0, 200));
186
+ return {
187
+ error: true,
188
+ code: responseCode,
189
+ message: responseText,
190
+ subject: requestConfigs[index].subject
191
+ };
192
+ }
193
+
194
+ try {
195
+ const parsed = JSON.parse(responseText);
196
+ parsed._subject = requestConfigs[index].subject; // 後で識別するため
197
+ return parsed;
198
+ } catch (parseError) {
199
+ Logger.log('[DifyService] JSON parse error for request ' + index + ': ' + parseError.toString());
200
+ return {
201
+ error: true,
202
+ code: responseCode,
203
+ message: 'JSON parse error: ' + parseError.toString(),
204
+ subject: requestConfigs[index].subject
205
+ };
206
+ }
207
+ });
208
+
209
+ } catch (error) {
210
+ Logger.log('[DifyService] callDifyWorkflowBatch error: ' + error.toString());
211
+ throw error;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Dify Workflowを実行
217
+ *
218
+ * @param {string} action - アクション(generate_questions, generate_evaluation)
219
+ * @param {string} subject - 教科ID(jp, math, sci, soc)
220
+ * @param {Object} additionalInputs - 追加の入力パラメータ(統計情報など)
221
+ * @returns {Object} - Dify APIレスポンス
222
+ */
223
+ function callDifyWorkflow(action, subject, additionalInputs = {}) {
224
+ try {
225
+ const { apiUrl, apiKey } = getDifyCredentials();
226
+
227
+ // GASの教科コード(jp, math, sci, soc)を日本語に変換
228
+ const japaneseSubject = SUBJECT_TO_JAPANESE[subject] || subject;
229
+
230
+ Logger.log('[DifyService] callDifyWorkflow: action=' + action + ', subject=' + subject + ' (' + japaneseSubject + ')');
231
+
232
+ // リクエストペイロード(subjectは日本語に変換して送信)
233
+ const payload = {
234
+ inputs: {
235
+ action: action,
236
+ subject: japaneseSubject,
237
+ ...additionalInputs
238
+ },
239
+ response_mode: DIFY_CONFIG.RESPONSE_MODE,
240
+ user: DIFY_CONFIG.USER
241
+ };
242
+
243
+ // HTTPリクエストオプション
244
+ const options = {
245
+ method: 'post',
246
+ contentType: 'application/json',
247
+ headers: {
248
+ 'Authorization': 'Bearer ' + apiKey
249
+ },
250
+ payload: JSON.stringify(payload),
251
+ muteHttpExceptions: true
252
+ };
253
+
254
+ Logger.log('[DifyService] Sending request to Dify API...');
255
+ const response = UrlFetchApp.fetch(apiUrl, options);
256
+ const responseCode = response.getResponseCode();
257
+ const responseText = response.getContentText();
258
+
259
+ Logger.log('[DifyService] Response code: ' + responseCode);
260
+
261
+ if (responseCode !== 200) {
262
+ Logger.log('[DifyService] Error response: ' + responseText);
263
+ throw new Error('Dify API error: ' + responseCode + ' - ' + responseText);
264
+ }
265
+
266
+ const responseData = JSON.parse(responseText);
267
+ Logger.log('[DifyService] Success: workflow_run_id=' + (responseData.workflow_run_id || 'N/A'));
268
+
269
+ return responseData;
270
+
271
+ } catch (error) {
272
+ Logger.log('[DifyService] Error: ' + error.toString());
273
+ throw error;
274
+ }
275
+ }
276
+
277
+ /**
278
+ * 問題生成APIを呼び出し
279
+ *
280
+ * @param {string} subject - 教科ID
281
+ * @param {Object} statistics - ユーザー統計(オプション)
282
+ * @param {Array} recentQuestions - 直近の問題リスト(オプション)
283
+ * @returns {Array} - 生成された問題配列
284
+ */
285
+ function generateQuestionsFromDify(subject, statistics = {}, recentQuestions = []) {
286
+ try {
287
+ Logger.log('[DifyService] generateQuestionsFromDify: subject=' + subject);
288
+
289
+ const response = callDifyWorkflow('generate_questions', subject, {
290
+ statistics: JSON.stringify(statistics),
291
+ recent_questions: JSON.stringify(recentQuestions)
292
+ });
293
+
294
+ // Difyレスポンスから問題データを抽出
295
+ // response.data.outputs から教科別の出力変数を取得
296
+ if (response.data && response.data.outputs) {
297
+ const outputs = response.data.outputs;
298
+
299
+ // エラーレスポンスチェック
300
+ if (outputs.action_error) {
301
+ throw new Error('Dify action error: ' + outputs.action_error);
302
+ }
303
+ if (outputs.subject_error_questions) {
304
+ throw new Error('Dify subject error: ' + outputs.subject_error_questions);
305
+ }
306
+
307
+ // 教科別の出力変数名を取得(例: kokugo_questions, sansu_questions)
308
+ const outputKey = SUBJECT_TO_OUTPUT_KEY[subject];
309
+ if (!outputKey) {
310
+ throw new Error('Invalid subject code: ' + subject);
311
+ }
312
+
313
+ Logger.log('[DifyService] Looking for output key: ' + outputKey);
314
+
315
+ // 教科別の出力変数から問題データを取得
316
+ if (outputs[outputKey]) {
317
+ const questionsData = outputs[outputKey];
318
+
319
+ // JSON文字列の場合はパース
320
+ if (typeof questionsData === 'string') {
321
+ Logger.log('[DifyService] Parsing JSON string from ' + outputKey);
322
+ const parsed = JSON.parse(questionsData);
323
+
324
+ // { questions: [...] } 形式の場合
325
+ if (parsed.questions && Array.isArray(parsed.questions)) {
326
+ Logger.log('[DifyService] Successfully parsed ' + parsed.questions.length + ' questions');
327
+ return parsed.questions;
328
+ }
329
+
330
+ // 直接配列の場合
331
+ if (Array.isArray(parsed)) {
332
+ Logger.log('[DifyService] Successfully parsed ' + parsed.length + ' questions (array format)');
333
+ return parsed;
334
+ }
335
+ }
336
+
337
+ // 既にオブジェクト/配列の場合
338
+ if (Array.isArray(questionsData)) {
339
+ Logger.log('[DifyService] Got ' + questionsData.length + ' questions (array format)');
340
+ return questionsData;
341
+ }
342
+
343
+ if (questionsData.questions && Array.isArray(questionsData.questions)) {
344
+ Logger.log('[DifyService] Got ' + questionsData.questions.length + ' questions (object format)');
345
+ return questionsData.questions;
346
+ }
347
+ }
348
+
349
+ Logger.log('[DifyService] Output key "' + outputKey + '" not found in outputs: ' + JSON.stringify(Object.keys(outputs)));
350
+ }
351
+
352
+ throw new Error('Invalid response format from Dify: questions data not found');
353
+
354
+ } catch (error) {
355
+ Logger.log('[DifyService] generateQuestionsFromDify error: ' + error.toString());
356
+ throw error;
357
+ }
358
+ }
359
+
360
+ /**
361
+ * 評価生成APIを呼び出し
362
+ *
363
+ * @param {string} subject - 教科ID(jp, math, sci, soc, または 'overall')
364
+ * @param {Object} statistics - ユーザー統計(教科別正答率など)
365
+ * @param {Array} results - 解答結果配列(各問題の正誤結果)
366
+ * @param {Object} subjectEvaluations - 教科別評価(overallの場合のみ使用、オプション)
367
+ * @returns {Object} - 生成された評価
368
+ *
369
+ * レスポンスフォーマット:
370
+ * 教科別評価: { subject, advice, strengths[], weaknesses[], recommended_topics[] }
371
+ * 全体評価: { overall_advice, strengths[], weaknesses[], next_steps[] }
372
+ */
373
+ function generateEvaluationFromDify(subject, statistics, results, subjectEvaluations = null) {
374
+ try {
375
+ Logger.log('[DifyService] generateEvaluationFromDify: subject=' + subject);
376
+
377
+ // 追加の入力パラメータ
378
+ const additionalInputs = {
379
+ statistics: JSON.stringify(statistics),
380
+ results: JSON.stringify(results)
381
+ };
382
+
383
+ // 全体評価の場合、教科別評価も渡す
384
+ if (subject === 'overall' && subjectEvaluations) {
385
+ Logger.log('[DifyService] Adding subject_evaluations to overall evaluation');
386
+ additionalInputs.subject_evaluations = JSON.stringify(subjectEvaluations);
387
+ }
388
+
389
+ const response = callDifyWorkflow('generate_evaluation', subject, additionalInputs);
390
+
391
+ // Difyレスポンスから評価データを抽出
392
+ if (response.data && response.data.outputs) {
393
+ const outputs = response.data.outputs;
394
+
395
+ // エラーレスポンスチェック
396
+ if (outputs.action_error) {
397
+ throw new Error('Dify action error: ' + outputs.action_error);
398
+ }
399
+ if (outputs.subject_error_evaluation) {
400
+ throw new Error('Dify subject error: ' + outputs.subject_error_evaluation);
401
+ }
402
+
403
+ // 全体評価の場合
404
+ if (subject === 'overall') {
405
+ if (outputs.overall_evaluation) {
406
+ const evaluationData = outputs.overall_evaluation;
407
+
408
+ // JSON文字列の場合はパース
409
+ if (typeof evaluationData === 'string') {
410
+ Logger.log('[DifyService] Parsing overall_evaluation JSON string');
411
+ const parsed = JSON.parse(evaluationData);
412
+ Logger.log('[DifyService] Overall evaluation generated successfully');
413
+ return parsed;
414
+ }
415
+
416
+ // 既にオブジェクトの場合
417
+ Logger.log('[DifyService] Overall evaluation generated successfully (object format)');
418
+ return evaluationData;
419
+ }
420
+ } else {
421
+ // 教科別評価の場合
422
+ const evaluationKey = SUBJECT_TO_EVALUATION_KEY[subject];
423
+ if (!evaluationKey) {
424
+ throw new Error('Invalid subject code for evaluation: ' + subject);
425
+ }
426
+
427
+ Logger.log('[DifyService] Looking for evaluation key: ' + evaluationKey);
428
+
429
+ if (outputs[evaluationKey]) {
430
+ const evaluationData = outputs[evaluationKey];
431
+ let parsed;
432
+
433
+ // JSON文字列の場合はパース
434
+ if (typeof evaluationData === 'string') {
435
+ Logger.log('[DifyService] Parsing JSON string from ' + evaluationKey);
436
+ parsed = JSON.parse(evaluationData);
437
+ } else {
438
+ // 既にオブジェクトの場合
439
+ parsed = evaluationData;
440
+ }
441
+
442
+ // Difyの出力形式 {"評価": [...]} をGAS期待形式に変換
443
+ const normalized = normalizeEvaluationFormat(parsed, subject);
444
+ Logger.log('[DifyService] Evaluation generated successfully for ' + subject);
445
+ return normalized;
446
+ }
447
+
448
+ Logger.log('[DifyService] Evaluation key "' + evaluationKey + '" not found in outputs: ' + JSON.stringify(Object.keys(outputs)));
449
+ }
450
+ }
451
+
452
+ throw new Error('Invalid response format from Dify: evaluation data not found');
453
+
454
+ } catch (error) {
455
+ Logger.log('[DifyService] generateEvaluationFromDify error: ' + error.toString());
456
+ throw error;
457
+ }
458
+ }
V1.8.1/gas/GenreMaster.js ADDED
@@ -0,0 +1,431 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * ジャンルマスターデータ
3
+ *
4
+ * 中学受験4教科のジャンル分類を定義
5
+ *
6
+ * @version 1.0.0
7
+ * @date 2025-12-07
8
+ */
9
+
10
+ // ============================================================================
11
+ // ジャンルマスターデータ
12
+ // ============================================================================
13
+
14
+ /**
15
+ * 中学受験4教科のジャンル分類マスターデータ
16
+ * @constant {Object}
17
+ */
18
+ var GENRE_MASTER = {
19
+ // 国語(8ジャンル)
20
+ jp: {
21
+ subject_id: 'jp',
22
+ subject_name: '国語',
23
+ genres: [
24
+ {
25
+ id: 'JP01',
26
+ name: '漢字・語彙',
27
+ description: '読み書き、四字熟語、慣用句、ことわざ'
28
+ },
29
+ {
30
+ id: 'JP02',
31
+ name: '文法・言葉のきまり',
32
+ description: '品詞、敬語、文の成分、修飾関係'
33
+ },
34
+ {
35
+ id: 'JP03',
36
+ name: '物語文読解',
37
+ description: '心情理解、場面把握、人物関係'
38
+ },
39
+ {
40
+ id: 'JP04',
41
+ name: '説明文・論説文読解',
42
+ description: '要旨、段落構成、筆者の主張'
43
+ },
44
+ {
45
+ id: 'JP05',
46
+ name: '随筆文読解',
47
+ description: '筆者の体験・感想の読み取り'
48
+ },
49
+ {
50
+ id: 'JP06',
51
+ name: '詩・韻文',
52
+ description: '詩、短歌、俳句、表現技法'
53
+ },
54
+ {
55
+ id: 'JP07',
56
+ name: '記述問題',
57
+ description: '理由説明、要約、意見記述'
58
+ },
59
+ {
60
+ id: 'JP08',
61
+ name: '知識・文学史',
62
+ description: '作家、作品名、文学的常識'
63
+ }
64
+ ]
65
+ },
66
+
67
+ // 算数(10ジャンル)
68
+ math: {
69
+ subject_id: 'math',
70
+ subject_name: '算数',
71
+ genres: [
72
+ {
73
+ id: 'MA01',
74
+ name: '計算',
75
+ description: '四則演算、分数・小数、逆算'
76
+ },
77
+ {
78
+ id: 'MA02',
79
+ name: '数の性質',
80
+ description: '約数・倍数、素因数分解、規則性'
81
+ },
82
+ {
83
+ id: 'MA03',
84
+ name: '割合・比',
85
+ description: '割合、比、百分率、歩合'
86
+ },
87
+ {
88
+ id: 'MA04',
89
+ name: '速さ',
90
+ description: '旅人算、通過算、流水算、時計算'
91
+ },
92
+ {
93
+ id: 'MA05',
94
+ name: '文章題(その他)',
95
+ description: '濃度、仕事算、ニュートン算、差集め算'
96
+ },
97
+ {
98
+ id: 'MA06',
99
+ name: '平面図形',
100
+ description: '面積、角度、相似、合同'
101
+ },
102
+ {
103
+ id: 'MA07',
104
+ name: '立体図形',
105
+ description: '体積、表面積、展開図、切断'
106
+ },
107
+ {
108
+ id: 'MA08',
109
+ name: '場合の数・確率',
110
+ description: '順列、組み合わせ、確率'
111
+ },
112
+ {
113
+ id: 'MA09',
114
+ name: 'グラフ・表',
115
+ description: '統計、変化のグラフ、ダイヤグラム'
116
+ },
117
+ {
118
+ id: 'MA10',
119
+ name: '特殊算',
120
+ description: 'つるかめ算、消去算、過不足算'
121
+ }
122
+ ]
123
+ },
124
+
125
+ // 理科(12ジャンル)
126
+ sci: {
127
+ subject_id: 'sci',
128
+ subject_name: '理科',
129
+ genres: [
130
+ {
131
+ id: 'SC01',
132
+ name: '力・運動',
133
+ description: 'てこ、滑車、ばね、浮力、振り子'
134
+ },
135
+ {
136
+ id: 'SC02',
137
+ name: '電気',
138
+ description: '回路、抵抗、電磁石、発熱'
139
+ },
140
+ {
141
+ id: 'SC03',
142
+ name: '光・音・熱',
143
+ description: '反射、屈折、レンズ、音の性質'
144
+ },
145
+ {
146
+ id: 'SC04',
147
+ name: '物質の性質',
148
+ description: '金属、気体、密度、状態変化'
149
+ },
150
+ {
151
+ id: 'SC05',
152
+ name: '水溶液',
153
+ description: '酸・アルカリ、中和、溶解度'
154
+ },
155
+ {
156
+ id: 'SC06',
157
+ name: '燃焼・化学変化',
158
+ description: '燃焼、酸化還元、化合'
159
+ },
160
+ {
161
+ id: 'SC07',
162
+ name: '植物',
163
+ description: 'つくり、光合成、蒸散、分類'
164
+ },
165
+ {
166
+ id: 'SC08',
167
+ name: '動物',
168
+ description: 'からだのつくり、行動、分類'
169
+ },
170
+ {
171
+ id: 'SC09',
172
+ name: '人体',
173
+ description: '消化、呼吸、血液循環、感覚器官'
174
+ },
175
+ {
176
+ id: 'SC10',
177
+ name: '天体',
178
+ description: '太陽、月、星座、地球の運動'
179
+ },
180
+ {
181
+ id: 'SC11',
182
+ name: '気象',
183
+ description: '天気、気温、湿度、雲、季節風'
184
+ },
185
+ {
186
+ id: 'SC12',
187
+ name: '地学',
188
+ description: '地層、岩石、火山、地震'
189
+ }
190
+ ]
191
+ },
192
+
193
+ // 社会(10ジャンル)
194
+ soc: {
195
+ subject_id: 'soc',
196
+ subject_name: '社会',
197
+ genres: [
198
+ {
199
+ id: 'SO01',
200
+ name: '日本地理(国土・自然)',
201
+ description: '地形、気候、都道府県'
202
+ },
203
+ {
204
+ id: 'SO02',
205
+ name: '日本地理(産業)',
206
+ description: '農業、工業、水産業、商業'
207
+ },
208
+ {
209
+ id: 'SO03',
210
+ name: '世界地理',
211
+ description: '大陸、国、貿易、環境問題'
212
+ },
213
+ {
214
+ id: 'SO04',
215
+ name: '歴史(古代〜平安)',
216
+ description: '旧石器〜平安時代'
217
+ },
218
+ {
219
+ id: 'SO05',
220
+ name: '歴史(鎌倉〜室町)',
221
+ description: '武士の台頭、文化'
222
+ },
223
+ {
224
+ id: 'SO06',
225
+ name: '歴史(安土桃山〜江戸)',
226
+ description: '統一、鎖国、元禄・化政文化'
227
+ },
228
+ {
229
+ id: 'SO07',
230
+ name: '歴史(明治〜現代)',
231
+ description: '近代化、戦争、戦後'
232
+ },
233
+ {
234
+ id: 'SO08',
235
+ name: '公民(政治・憲法)',
236
+ description: '三権分立、選挙、人権'
237
+ },
238
+ {
239
+ id: 'SO09',
240
+ name: '公民(経済・国際)',
241
+ description: '経済の仕組み、国際機関、SDGs'
242
+ },
243
+ {
244
+ id: 'SO10',
245
+ name: '時事問題',
246
+ description: '直近1〜2年のニュース'
247
+ }
248
+ ]
249
+ }
250
+ };
251
+
252
+ // ============================================================================
253
+ // ヘルパー関数
254
+ // ============================================================================
255
+
256
+ /**
257
+ * ジャンルIDからジャンル情報を取得
258
+ *
259
+ * @param {string} genreId - ジャンルID(例: 'JP01', 'MA05')
260
+ * @returns {Object|null} - ジャンル情報 { id, name, description, subject_id, subject_name } または null
261
+ *
262
+ * @example
263
+ * var genre = getGenreById('JP01');
264
+ * // => { id: 'JP01', name: '漢字・語彙', description: '...', subject_id: 'jp', subject_name: '国語' }
265
+ */
266
+ function getGenreById(genreId) {
267
+ if (!genreId || typeof genreId !== 'string') {
268
+ return null;
269
+ }
270
+
271
+ var upperGenreId = genreId.toUpperCase();
272
+
273
+ // 全教科を検索
274
+ var subjects = ['jp', 'math', 'sci', 'soc'];
275
+ for (var i = 0; i < subjects.length; i++) {
276
+ var subjectId = subjects[i];
277
+ var subjectData = GENRE_MASTER[subjectId];
278
+ var genres = subjectData.genres;
279
+
280
+ for (var j = 0; j < genres.length; j++) {
281
+ var genre = genres[j];
282
+ if (genre.id === upperGenreId) {
283
+ // ジャンル情報に教科情報を追加して返却
284
+ return {
285
+ id: genre.id,
286
+ name: genre.name,
287
+ description: genre.description,
288
+ subject_id: subjectData.subject_id,
289
+ subject_name: subjectData.subject_name
290
+ };
291
+ }
292
+ }
293
+ }
294
+
295
+ return null;
296
+ }
297
+
298
+ /**
299
+ * 教科のジャンル一覧を取得
300
+ *
301
+ * @param {string} subjectId - 教科ID(jp, math, sci, soc)
302
+ * @returns {Array} - ジャンル配列(見つからない場合は空配列)
303
+ *
304
+ * @example
305
+ * var genres = getGenresBySubject('jp');
306
+ * // => [{ id: 'JP01', name: '漢字・語彙', ... }, ...]
307
+ */
308
+ function getGenresBySubject(subjectId) {
309
+ if (!subjectId || typeof subjectId !== 'string') {
310
+ return [];
311
+ }
312
+
313
+ var subjectData = GENRE_MASTER[subjectId.toLowerCase()];
314
+ if (!subjectData) {
315
+ return [];
316
+ }
317
+
318
+ return subjectData.genres;
319
+ }
320
+
321
+ /**
322
+ * 全ジャンル数を取得
323
+ *
324
+ * @returns {number} - 総ジャンル数(40)
325
+ *
326
+ * @example
327
+ * var total = getTotalGenreCount();
328
+ * // => 40
329
+ */
330
+ function getTotalGenreCount() {
331
+ var count = 0;
332
+ var subjects = ['jp', 'math', 'sci', 'soc'];
333
+
334
+ for (var i = 0; i < subjects.length; i++) {
335
+ var subjectId = subjects[i];
336
+ count += GENRE_MASTER[subjectId].genres.length;
337
+ }
338
+
339
+ return count;
340
+ }
341
+
342
+ /**
343
+ * ジャンルIDの検証
344
+ *
345
+ * @param {string} genreId - ジャンルID
346
+ * @returns {boolean} - 有効なジャンルIDかどうか
347
+ *
348
+ * @example
349
+ * isValidGenreId('JP01'); // => true
350
+ * isValidGenreId('XX99'); // => false
351
+ */
352
+ function isValidGenreId(genreId) {
353
+ return getGenreById(genreId) !== null;
354
+ }
355
+
356
+ /**
357
+ * Dify用のジャンルリストを生成(問題生成プロンプト用)
358
+ *
359
+ * @param {string} subjectId - 教科ID(jp, math, sci, soc)
360
+ * @returns {string} - ジャンルリストの文字列(改行区切り)
361
+ *
362
+ * @example
363
+ * var list = getGenreListForDify('jp');
364
+ * // => "JP01: 漢字・語彙(読み書き、四字熟語、慣用句、ことわざ)\n..."
365
+ */
366
+ function getGenreListForDify(subjectId) {
367
+ var genres = getGenresBySubject(subjectId);
368
+
369
+ if (genres.length === 0) {
370
+ return '';
371
+ }
372
+
373
+ var lines = [];
374
+ for (var i = 0; i < genres.length; i++) {
375
+ var genre = genres[i];
376
+ var line = genre.id + ': ' + genre.name + '(' + genre.description + ')';
377
+ lines.push(line);
378
+ }
379
+
380
+ return lines.join('\n');
381
+ }
382
+
383
+ // ============================================================================
384
+ // テスト関数(GASエディタで実行可能)
385
+ // ============================================================================
386
+
387
+ /**
388
+ * GenreMaster.jsのテスト関数
389
+ * GASエディタで実行して動作確認
390
+ */
391
+ function testGenreMaster() {
392
+ Logger.log('=== GenreMaster.js テスト開始 ===');
393
+
394
+ // テスト1: ジャンル総数
395
+ var totalCount = getTotalGenreCount();
396
+ Logger.log('テスト1: 総ジャンル数 = ' + totalCount + ' (期待値: 40)');
397
+
398
+ // テスト2: ジャンルID検索
399
+ var genre1 = getGenreById('JP01');
400
+ Logger.log('テスト2: getGenreById("JP01") = ' + JSON.stringify(genre1));
401
+
402
+ var genre2 = getGenreById('MA05');
403
+ Logger.log('テスト2: getGenreById("MA05") = ' + JSON.stringify(genre2));
404
+
405
+ // テスト3: 教科別ジャンル取得
406
+ var jpGenres = getGenresBySubject('jp');
407
+ Logger.log('テスト3: 国語ジャンル数 = ' + jpGenres.length + ' (期待値: 8)');
408
+
409
+ var mathGenres = getGenresBySubject('math');
410
+ Logger.log('テスト3: 算数ジャンル数 = ' + mathGenres.length + ' (期待値: 10)');
411
+
412
+ var sciGenres = getGenresBySubject('sci');
413
+ Logger.log('テスト3: 理科ジャンル数 = ' + sciGenres.length + ' (期待値: 12)');
414
+
415
+ var socGenres = getGenresBySubject('soc');
416
+ Logger.log('テスト3: 社会ジャンル数 = ' + socGenres.length + ' (期待値: 10)');
417
+
418
+ // テスト4: ジャンルID検証
419
+ var valid1 = isValidGenreId('JP01');
420
+ Logger.log('テスト4: isValidGenreId("JP01") = ' + valid1 + ' (期待値: true)');
421
+
422
+ var valid2 = isValidGenreId('XX99');
423
+ Logger.log('テスト4: isValidGenreId("XX99") = ' + valid2 + ' (期待値: false)');
424
+
425
+ // テスト5: Dify用ジャンルリスト生成
426
+ var jpList = getGenreListForDify('jp');
427
+ Logger.log('テスト5: 国語ジャンルリスト(最初の100文字):');
428
+ Logger.log(jpList.substring(0, 100) + '...');
429
+
430
+ Logger.log('=== GenreMaster.js テスト完了 ===');
431
+ }
V1.8.1/gas/appsscript.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "timeZone": "Asia/Tokyo",
3
+ "dependencies": {
4
+ },
5
+ "exceptionLogging": "STACKDRIVER",
6
+ "runtimeVersion": "V8",
7
+ "oauthScopes": [
8
+ "https://www.googleapis.com/auth/script.external_request",
9
+ "https://www.googleapis.com/auth/spreadsheets"
10
+ ],
11
+ "webapp": {
12
+ "executeAs": "USER_DEPLOYING",
13
+ "access": "ANYONE_ANONYMOUS"
14
+ }
15
+ }
V1.8.1/gas/questiondb_functions.js ADDED
@@ -0,0 +1,1166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * QuestionDatabase機能
3
+ *
4
+ * 機能:
5
+ * - 事前生成された「回答させたい答え」をGoogle Sheetsで管理
6
+ * - 問題生成時に使用回数が少ないものからランダムに選択
7
+ *
8
+ * シート名: QuestionDatabase
9
+ *
10
+ * スキーマ(8カラム):
11
+ * A: answer_id (string) - 一意ID (例: jp_001, math_042)
12
+ * B: subject (string) - 教科コード (jp, math, sci, soc)
13
+ * C: category (string) - ジャンルID (例: JP01, MA03, SC07)
14
+ * D: answer (string) - 回答させたい答え
15
+ * E: question_hint (string) - 設問方針
16
+ * F: difficulty (string) - 基本/標準/応用
17
+ * G: source_context (string) - 教材での使用例
18
+ * H: usage_count (number) - 使用回数(初期値0)
19
+ */
20
+
21
+ // ==================== 定数定義 ====================
22
+
23
+ const QUESTIONDB_SHEET_NAME = 'QuestionDatabase';
24
+
25
+ const QUESTIONDB_COLUMNS = {
26
+ ANSWER_ID: 1, // A列
27
+ SUBJECT: 2, // B列
28
+ CATEGORY: 3, // C列
29
+ ANSWER: 4, // D列
30
+ QUESTION_HINT: 5, // E列
31
+ DIFFICULTY: 6, // F列
32
+ SOURCE_CONTEXT: 7, // G列
33
+ USAGE_COUNT: 8 // H列
34
+ };
35
+
36
+ const QUESTIONDB_HEADER = [
37
+ 'answer_id',
38
+ 'subject',
39
+ 'category',
40
+ 'answer',
41
+ 'question_hint',
42
+ 'difficulty',
43
+ 'source_context',
44
+ 'usage_count'
45
+ ];
46
+
47
+ /**
48
+ * ジャンル構成定義(各教科10問)
49
+ *
50
+ * 国語: JP01(2), JP02(2), JP03-08各1 = 10問
51
+ * 算数: MA01-MA10 各1問 = 10問
52
+ * 理科: SC01-SC12 各1問(12カテゴリから10問をランダム選択 ※要ロジック修正)
53
+ * 社会: SO01-SO10 各1問 = 10問
54
+ *
55
+ * v1.8.1: JP07-08, SC11-12 追加
56
+ */
57
+ const GENRE_CONFIG = {
58
+ "jp": {"JP01": 2, "JP02": 2, "JP03": 1, "JP04": 1, "JP05": 1, "JP06": 1, "JP07": 1, "JP08": 1},
59
+ "math": {"MA01": 1, "MA02": 1, "MA03": 1, "MA04": 1, "MA05": 1, "MA06": 1, "MA07": 1, "MA08": 1, "MA09": 1, "MA10": 1},
60
+ "sci": {"SC01": 1, "SC02": 1, "SC03": 1, "SC04": 1, "SC05": 1, "SC06": 1, "SC07": 1, "SC08": 1, "SC09": 1, "SC10": 1, "SC11": 1, "SC12": 1},
61
+ "soc": {"SO01": 1, "SO02": 1, "SO03": 1, "SO04": 1, "SO05": 1, "SO06": 1, "SO07": 1, "SO08": 1, "SO09": 1, "SO10": 1}
62
+ };
63
+
64
+ // ==================== ユーティリティ関数 ====================
65
+
66
+ /**
67
+ * QuestionDatabaseシートを取得(なければ作成)
68
+ * @returns {GoogleAppsScript.Spreadsheet.Sheet}
69
+ */
70
+ function getQuestionDatabaseSheet_() {
71
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
72
+ let sheet = ss.getSheetByName(QUESTIONDB_SHEET_NAME);
73
+
74
+ if (!sheet) {
75
+ sheet = ss.insertSheet(QUESTIONDB_SHEET_NAME);
76
+ // ヘッダー行を設定
77
+ sheet.getRange(1, 1, 1, QUESTIONDB_HEADER.length).setValues([QUESTIONDB_HEADER]);
78
+ sheet.getRange(1, 1, 1, QUESTIONDB_HEADER.length).setFontWeight('bold');
79
+ sheet.setFrozenRows(1);
80
+
81
+ Logger.log('QuestionDatabaseシートを新規作成しました');
82
+ }
83
+
84
+ return sheet;
85
+ }
86
+
87
+ /**
88
+ * 行データをオブジェクトに変換
89
+ * @param {Array} row - スプレッドシートの行データ
90
+ * @returns {Object}
91
+ */
92
+ function rowToQuestionObject_(row) {
93
+ return {
94
+ answer_id: row[0] || '',
95
+ subject: row[1] || '',
96
+ category: row[2] || '',
97
+ answer: row[3] || '',
98
+ question_hint: row[4] || '',
99
+ difficulty: row[5] || '',
100
+ source_context: row[6] || '',
101
+ usage_count: row[7] || 0
102
+ };
103
+ }
104
+
105
+ /**
106
+ * オブジェクトを行データに変換
107
+ * @param {Object} obj - 問題データオブジェクト
108
+ * @returns {Array}
109
+ */
110
+ function questionObjectToRow_(obj) {
111
+ return [
112
+ obj.answer_id || '',
113
+ obj.subject || '',
114
+ obj.category || '',
115
+ obj.answer || '',
116
+ obj.question_hint || '',
117
+ obj.difficulty || '',
118
+ obj.source_context || '',
119
+ obj.usage_count || 0
120
+ ];
121
+ }
122
+
123
+ // ==================== メインAPI ====================
124
+
125
+ /**
126
+ * 教科を指定してランダムに答えを取得
127
+ *
128
+ * アルゴリズム:
129
+ * 1. subject で絞り込み
130
+ * 2. usage_count の最小値を取得
131
+ * 3. 最小値のレコードに絞り込み
132
+ * 4. その中からランダムに count 件抽出
133
+ *
134
+ * @param {string} subject - 教科コード (jp, math, sci, soc)
135
+ * @param {number} count - 取得件数
136
+ * @returns {Array<Object>} 取得した答えデータの配列
137
+ *
138
+ * @example
139
+ * // 国語から3件取得
140
+ * const answers = get_random_answers('jp', 3);
141
+ * console.log(answers);
142
+ * // [
143
+ * // { answer_id: 'jp_001', subject: 'jp', category: 'JP01', answer: '漢字', ... },
144
+ * // { answer_id: 'jp_042', subject: 'jp', category: 'JP02', answer: '文法', ... },
145
+ * // ...
146
+ * // ]
147
+ */
148
+ function get_random_answers(subject, count) {
149
+ try {
150
+ const sheet = getQuestionDatabaseSheet_();
151
+ const lastRow = sheet.getLastRow();
152
+
153
+ if (lastRow <= 1) {
154
+ Logger.log('QuestionDatabaseにデータがありません');
155
+ return [];
156
+ }
157
+
158
+ // 全データを取得(ヘッダー行を除く)
159
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
160
+ const allData = dataRange.getValues();
161
+
162
+ // subjectで��り込み
163
+ const filteredData = allData
164
+ .map((row, index) => ({ row, originalIndex: index + 2 })) // 行番号を保持(2行目から)
165
+ .filter(item => item.row[QUESTIONDB_COLUMNS.SUBJECT - 1] === subject);
166
+
167
+ if (filteredData.length === 0) {
168
+ Logger.log(`教科コード '${subject}' のデータが見つかりませんでした`);
169
+ return [];
170
+ }
171
+
172
+ // usage_countの最小値を取得
173
+ const usageCounts = filteredData.map(item => item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0);
174
+ const minUsageCount = Math.min(...usageCounts);
175
+
176
+ Logger.log(`教科 '${subject}' の最小使用回数: ${minUsageCount}`);
177
+
178
+ // 最小値のレコードに絞り込み
179
+ const minUsageData = filteredData.filter(
180
+ item => (item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0) === minUsageCount
181
+ );
182
+
183
+ Logger.log(`最小使用回数のレコード数: ${minUsageData.length}`);
184
+
185
+ // ランダムに count 件抽出
186
+ const selectedCount = Math.min(count, minUsageData.length);
187
+ const shuffled = minUsageData.sort(() => Math.random() - 0.5);
188
+ const selected = shuffled.slice(0, selectedCount);
189
+
190
+ // オブジェクト形式に変換
191
+ const results = selected.map(item => rowToQuestionObject_(item.row));
192
+
193
+ Logger.log(`${selectedCount}件の答えを取得しました`);
194
+ return results;
195
+
196
+ } catch (error) {
197
+ Logger.log(`get_random_answers エラー: ${error.message}`);
198
+ throw error;
199
+ }
200
+ }
201
+
202
+ /**
203
+ * ジャンル構成に基づいて問題を取得(v1.6.3新規)
204
+ *
205
+ * 各ジャンル内でusage_countが最小のレコードからランダムに指定数を抽出
206
+ * これにより全ジャンルから均等に出題され、同じ問題の繰り返しを防ぐ
207
+ *
208
+ * @param {Array<string>} subjects - 教科コードの配列 (例: ["jp", "math", "sci", "soc"])
209
+ * @returns {Array<Object>} 取得した問題データの配列(全教科分を結合)
210
+ *
211
+ * @example
212
+ * const questions = get_questions_by_genre_config(["jp", "math"]);
213
+ * // 国語10問 + 算数10問 = 20問が返る
214
+ */
215
+ function get_questions_by_genre_config(subjects) {
216
+ try {
217
+ const sheet = getQuestionDatabaseSheet_();
218
+ const lastRow = sheet.getLastRow();
219
+
220
+ if (lastRow <= 1) {
221
+ Logger.log('QuestionDatabaseにデータがありません');
222
+ return [];
223
+ }
224
+
225
+ // 全データを取得(ヘッダー行を除く)
226
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
227
+ const allData = dataRange.getValues();
228
+
229
+ const results = [];
230
+
231
+ // 各教科を処理
232
+ for (const subject of subjects) {
233
+ let genreConfig = GENRE_CONFIG[subject];
234
+
235
+ if (!genreConfig) {
236
+ Logger.log(`未知の教科コード: ${subject} - スキップ`);
237
+ continue;
238
+ }
239
+
240
+ // v1.8.1: 理科は12カテゴリからランダムに10カテゴリを選択
241
+ if (subject === 'sci') {
242
+ const allGenres = Object.entries(genreConfig);
243
+ if (allGenres.length > 10) {
244
+ const shuffled = allGenres.sort(() => Math.random() - 0.5);
245
+ const selected = shuffled.slice(0, 10);
246
+ genreConfig = Object.fromEntries(selected);
247
+ Logger.log(`理科: ランダム10カテゴリ選択 - ${selected.map(([g]) => g).join(', ')}`);
248
+ }
249
+ }
250
+
251
+ Logger.log(`教科 '${subject}' を処理中...`);
252
+
253
+ // 各ジャンルを処理
254
+ for (const [genre, count] of Object.entries(genreConfig)) {
255
+ // このジャンルのレコードを抽出
256
+ const genreData = allData
257
+ .map((row, index) => ({ row, originalIndex: index + 2 }))
258
+ .filter(item =>
259
+ item.row[QUESTIONDB_COLUMNS.SUBJECT - 1] === subject &&
260
+ item.row[QUESTIONDB_COLUMNS.CATEGORY - 1] === genre
261
+ );
262
+
263
+ if (genreData.length === 0) {
264
+ Logger.log(`ジャンル '${genre}' のデータがありません`);
265
+ continue;
266
+ }
267
+
268
+ // v1.6.14: usage_count最小優先で抽出、不足分は次のusage_countから補充
269
+ // ユニークなusage_count値をソート
270
+ const usageCounts = genreData.map(item => item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0);
271
+ const uniqueUsageCounts = [...new Set(usageCounts)].sort((a, b) => a - b);
272
+
273
+ const selected = [];
274
+ let remaining = count;
275
+
276
+ // usage_countが小さい順に必要数を満たすまで抽出
277
+ for (const usageCount of uniqueUsageCounts) {
278
+ if (remaining <= 0) break;
279
+
280
+ // この usage_count のレコードを取得
281
+ const usageData = genreData.filter(
282
+ item => (item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0) === usageCount
283
+ );
284
+
285
+ // ランダムにシャッフルして不足分だけ抽出
286
+ const shuffled = usageData.sort(() => Math.random() - 0.5);
287
+ const toTake = Math.min(remaining, shuffled.length);
288
+
289
+ for (let i = 0; i < toTake; i++) {
290
+ selected.push(shuffled[i]);
291
+ }
292
+
293
+ remaining -= toTake;
294
+
295
+ if (toTake > 0) {
296
+ Logger.log(` usage_count=${usageCount}: ${toTake}問取得`);
297
+ }
298
+ }
299
+
300
+ // v1.6.15: 抽出時にUSAGE_COUNTを+1(抽出と同時に更新)
301
+ for (const item of selected) {
302
+ const currentUsage = item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0;
303
+ const newUsage = currentUsage + 1;
304
+ sheet.getRange(item.originalIndex, QUESTIONDB_COLUMNS.USAGE_COUNT).setValue(newUsage);
305
+ // メモリ上のデータも更新(後続のジャンルで正しいusage_countを参照するため)
306
+ item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] = newUsage;
307
+ }
308
+
309
+ // オブジェクト形式に変換して結果に追加
310
+ for (const item of selected) {
311
+ results.push(rowToQuestionObject_(item.row));
312
+ }
313
+
314
+ Logger.log(`ジャンル '${genre}': ${selected.length}/${count}問取得(USAGE_COUNT更新済)`);
315
+ }
316
+ }
317
+
318
+ Logger.log(`合計 ${results.length} 問を取得しました`);
319
+ return results;
320
+
321
+ } catch (error) {
322
+ Logger.log(`get_questions_by_genre_config エラー: ${error.message}`);
323
+ throw error;
324
+ }
325
+ }
326
+
327
+ /**
328
+ * 指定した答えIDの使用回数を+1する
329
+ *
330
+ * @param {Array<string>} answerIds - 答えIDの配列
331
+ * @returns {Object} 更新結果 { success: true, updated_count: number }
332
+ *
333
+ * @example
334
+ * // 2件の使用回数を更新
335
+ * const result = update_usage_count(['jp_001', 'jp_042']);
336
+ * console.log(result); // { success: true, updated_count: 2 }
337
+ */
338
+ function update_usage_count(answerIds) {
339
+ try {
340
+ if (!Array.isArray(answerIds) || answerIds.length === 0) {
341
+ Logger.log('answer_ids が空または無効です');
342
+ return { success: false, updated_count: 0, error: 'Invalid answer_ids' };
343
+ }
344
+
345
+ const sheet = getQuestionDatabaseSheet_();
346
+ const lastRow = sheet.getLastRow();
347
+
348
+ if (lastRow <= 1) {
349
+ Logger.log('QuestionDatabaseにデータがありません');
350
+ return { success: false, updated_count: 0, error: 'No data' };
351
+ }
352
+
353
+ // 全データを取得
354
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
355
+ const allData = dataRange.getValues();
356
+
357
+ let updatedCount = 0;
358
+
359
+ // answer_id でマッチする行を探して usage_count を +1
360
+ allData.forEach((row, index) => {
361
+ const answerId = row[QUESTIONDB_COLUMNS.ANSWER_ID - 1];
362
+
363
+ if (answerIds.includes(answerId)) {
364
+ const currentUsage = row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0;
365
+ const newUsage = currentUsage + 1;
366
+
367
+ // usage_count セルを更新
368
+ const rowNumber = index + 2; // ヘッダー行を考慮
369
+ sheet.getRange(rowNumber, QUESTIONDB_COLUMNS.USAGE_COUNT).setValue(newUsage);
370
+
371
+ Logger.log(`${answerId} の使用回数を ${currentUsage} → ${newUsage} に更新`);
372
+ updatedCount++;
373
+ }
374
+ });
375
+
376
+ Logger.log(`合計 ${updatedCount} 件の使用回数を更新しました`);
377
+
378
+ return {
379
+ success: true,
380
+ updated_count: updatedCount
381
+ };
382
+
383
+ } catch (error) {
384
+ Logger.log(`update_usage_count エラー: ${error.message}`);
385
+ return {
386
+ success: false,
387
+ updated_count: 0,
388
+ error: error.message
389
+ };
390
+ }
391
+ }
392
+
393
+ /**
394
+ * 答えデータを一括挿入(初期データ投入用)
395
+ *
396
+ * @param {Array<Object>} answers - 答えデータの配列
397
+ * @returns {Object} 挿入結果 { success: true, inserted_count: number }
398
+ *
399
+ * @example
400
+ * const answers = [
401
+ * {
402
+ * answer_id: 'jp_001',
403
+ * subject: 'jp',
404
+ * category: 'JP01',
405
+ * answer: '漢字',
406
+ * question_hint: '部首を手がかりに意味を推測させる',
407
+ * difficulty: '基本',
408
+ * source_context: '小学3年生の漢字学習',
409
+ * usage_count: 0
410
+ * },
411
+ * ...
412
+ * ];
413
+ * const result = bulk_insert_answers(answers);
414
+ */
415
+ function bulk_insert_answers(answers) {
416
+ try {
417
+ if (!Array.isArray(answers) || answers.length === 0) {
418
+ Logger.log('answers が空または無効です');
419
+ return { success: false, inserted_count: 0, error: 'Invalid answers' };
420
+ }
421
+
422
+ const sheet = getQuestionDatabaseSheet_();
423
+ const lastRow = sheet.getLastRow();
424
+
425
+ // オブジェクト配列を行データに変換
426
+ const rows = answers.map(obj => questionObjectToRow_(obj));
427
+
428
+ // データを一括挿入
429
+ const startRow = lastRow + 1;
430
+ const range = sheet.getRange(startRow, 1, rows.length, QUESTIONDB_HEADER.length);
431
+ range.setValues(rows);
432
+
433
+ Logger.log(`${rows.length} 件のデータを挿入しました(行 ${startRow} ~ ${startRow + rows.length - 1})`);
434
+
435
+ return {
436
+ success: true,
437
+ inserted_count: rows.length
438
+ };
439
+
440
+ } catch (error) {
441
+ Logger.log(`bulk_insert_answers エラー: ${error.message}`);
442
+ return {
443
+ success: false,
444
+ inserted_count: 0,
445
+ error: error.message
446
+ };
447
+ }
448
+ }
449
+
450
+ // ==================== 管理用ユーティリティ ====================
451
+
452
+ /**
453
+ * QuestionDatabaseの統計情報を取得
454
+ *
455
+ * @returns {Object} 統計情報
456
+ */
457
+ function getQuestionDatabaseStats() {
458
+ const sheet = getQuestionDatabaseSheet_();
459
+ const lastRow = sheet.getLastRow();
460
+
461
+ if (lastRow <= 1) {
462
+ return {
463
+ total_count: 0,
464
+ subjects: {}
465
+ };
466
+ }
467
+
468
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
469
+ const allData = dataRange.getValues();
470
+
471
+ const stats = {
472
+ total_count: allData.length,
473
+ subjects: {}
474
+ };
475
+
476
+ allData.forEach(row => {
477
+ const subject = row[QUESTIONDB_COLUMNS.SUBJECT - 1];
478
+ const category = row[QUESTIONDB_COLUMNS.CATEGORY - 1];
479
+ const usageCount = row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0;
480
+
481
+ if (!stats.subjects[subject]) {
482
+ stats.subjects[subject] = {
483
+ count: 0,
484
+ categories: {},
485
+ total_usage: 0,
486
+ min_usage: Infinity,
487
+ max_usage: 0
488
+ };
489
+ }
490
+
491
+ stats.subjects[subject].count++;
492
+ stats.subjects[subject].total_usage += usageCount;
493
+ stats.subjects[subject].min_usage = Math.min(stats.subjects[subject].min_usage, usageCount);
494
+ stats.subjects[subject].max_usage = Math.max(stats.subjects[subject].max_usage, usageCount);
495
+
496
+ if (!stats.subjects[subject].categories[category]) {
497
+ stats.subjects[subject].categories[category] = 0;
498
+ }
499
+ stats.subjects[subject].categories[category]++;
500
+ });
501
+
502
+ Logger.log('QuestionDatabase統計情報:');
503
+ Logger.log(JSON.stringify(stats, null, 2));
504
+
505
+ return stats;
506
+ }
507
+
508
+ /**
509
+ * 指定した教科のデータを全削除
510
+ *
511
+ * @param {string} subject - 教科コード (jp, math, sci, soc)
512
+ * @returns {Object} 削除結果 { success: true, deleted_count: number }
513
+ */
514
+ function deleteBySubject(subject) {
515
+ try {
516
+ if (!subject) {
517
+ Logger.log('subject が指定されていません');
518
+ return { success: false, deleted_count: 0, error: 'subject required' };
519
+ }
520
+
521
+ const sheet = getQuestionDatabaseSheet_();
522
+ const lastRow = sheet.getLastRow();
523
+
524
+ if (lastRow <= 1) {
525
+ Logger.log('QuestionDatabaseにデータがありません');
526
+ return { success: true, deleted_count: 0 };
527
+ }
528
+
529
+ // 全データを取得
530
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
531
+ const allData = dataRange.getValues();
532
+
533
+ // 削除対象の行番号を特定(後ろから削除するため逆順)
534
+ const rowsToDelete = [];
535
+ allData.forEach((row, index) => {
536
+ if (row[QUESTIONDB_COLUMNS.SUBJECT - 1] === subject) {
537
+ rowsToDelete.push(index + 2); // ヘッダー行を考慮
538
+ }
539
+ });
540
+
541
+ // 後ろから削除(行番号がずれないように)
542
+ rowsToDelete.reverse().forEach(rowNum => {
543
+ sheet.deleteRow(rowNum);
544
+ });
545
+
546
+ Logger.log(`教科 '${subject}' の ${rowsToDelete.length} 件を削除しました`);
547
+
548
+ return {
549
+ success: true,
550
+ deleted_count: rowsToDelete.length
551
+ };
552
+
553
+ } catch (error) {
554
+ Logger.log(`deleteBySubject エラー: ${error.message}`);
555
+ return {
556
+ success: false,
557
+ deleted_count: 0,
558
+ error: error.message
559
+ };
560
+ }
561
+ }
562
+
563
+ /**
564
+ * QuestionDatabaseシートにヘッダ行を追加
565
+ *
566
+ * @returns {Object} 結果 { success: true, message: string }
567
+ */
568
+ function addQuestionDatabaseHeader() {
569
+ try {
570
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
571
+ let sheet = ss.getSheetByName(QUESTIONDB_SHEET_NAME);
572
+
573
+ if (!sheet) {
574
+ // シートがない場合は作成
575
+ sheet = ss.insertSheet(QUESTIONDB_SHEET_NAME);
576
+ Logger.log('QuestionDatabaseシートを新規作成しました');
577
+ }
578
+
579
+ // ヘッダー行を設定(既存データがある場合は行1に挿入)
580
+ const firstRow = sheet.getRange(1, 1, 1, QUESTIONDB_HEADER.length);
581
+ const currentFirstRow = firstRow.getValues()[0];
582
+
583
+ // 既にヘッダーがあるかチェック
584
+ if (currentFirstRow[0] === 'answer_id') {
585
+ return {
586
+ success: true,
587
+ message: 'Header already exists'
588
+ };
589
+ }
590
+
591
+ // ヘッダーがない場合、行1に挿入
592
+ if (currentFirstRow[0] !== '' && currentFirstRow[0] !== 'answer_id') {
593
+ // データがある場合は行を挿入
594
+ sheet.insertRowBefore(1);
595
+ }
596
+
597
+ // ヘッダーを設定
598
+ sheet.getRange(1, 1, 1, QUESTIONDB_HEADER.length).setValues([QUESTIONDB_HEADER]);
599
+ sheet.getRange(1, 1, 1, QUESTIONDB_HEADER.length).setFontWeight('bold');
600
+ sheet.setFrozenRows(1);
601
+
602
+ Logger.log('QuestionDatabaseヘッダ行を追加しました');
603
+
604
+ return {
605
+ success: true,
606
+ message: 'Header added successfully'
607
+ };
608
+
609
+ } catch (error) {
610
+ Logger.log(`addQuestionDatabaseHeader エラー: ${error.message}`);
611
+ return {
612
+ success: false,
613
+ error: error.message
614
+ };
615
+ }
616
+ }
617
+
618
+ /**
619
+ * 全データのusage_countをリセット(開発/テスト用)
620
+ *
621
+ * @returns {Object} リセット結果
622
+ */
623
+ function resetAllUsageCount() {
624
+ const sheet = getQuestionDatabaseSheet_();
625
+ const lastRow = sheet.getLastRow();
626
+
627
+ if (lastRow <= 1) {
628
+ Logger.log('QuestionDatabaseにデータがありません');
629
+ return { success: false, message: 'No data' };
630
+ }
631
+
632
+ const usageCountRange = sheet.getRange(2, QUESTIONDB_COLUMNS.USAGE_COUNT, lastRow - 1, 1);
633
+ const zeros = Array(lastRow - 1).fill([0]);
634
+ usageCountRange.setValues(zeros);
635
+
636
+ Logger.log(`${lastRow - 1} 件の usage_count を 0 にリセットしました`);
637
+
638
+ return {
639
+ success: true,
640
+ reset_count: lastRow - 1
641
+ };
642
+ }
643
+
644
+ // ==================== Web API エンドポイント ====================
645
+
646
+ /**
647
+ * doPost エンドポイント(既存のコードに統合用)
648
+ *
649
+ * アクション一覧:
650
+ * - get_random_answers: ランダムに答えを取得
651
+ * - update_usage_count: 使用回数を更新
652
+ * - bulk_insert_answers: 一括挿入
653
+ *
654
+ * 使用例:
655
+ *
656
+ * // get_random_answers
657
+ * POST https://script.google.com/macros/s/.../exec
658
+ * {
659
+ * "action": "get_random_answers",
660
+ * "subject": "jp",
661
+ * "count": 3
662
+ * }
663
+ *
664
+ * // update_usage_count
665
+ * POST https://script.google.com/macros/s/.../exec
666
+ * {
667
+ * "action": "update_usage_count",
668
+ * "answer_ids": ["jp_001", "jp_042"]
669
+ * }
670
+ *
671
+ * // bulk_insert_answers
672
+ * POST https://script.google.com/macros/s/.../exec
673
+ * {
674
+ * "action": "bulk_insert_answers",
675
+ * "answers": [
676
+ * {
677
+ * "answer_id": "jp_001",
678
+ * "subject": "jp",
679
+ * "category": "JP01",
680
+ * "answer": "漢字",
681
+ * "question_hint": "部首を手がかりに",
682
+ * "difficulty": "基本",
683
+ * "source_context": "小学3年生",
684
+ * "usage_count": 0
685
+ * }
686
+ * ]
687
+ * }
688
+ */
689
+ function handleQuestionDatabaseAction(action, params) {
690
+ switch (action) {
691
+ case 'get_random_answers':
692
+ return get_random_answers(params.subject, params.count || 1);
693
+
694
+ case 'get_random_questions':
695
+ // Python互換: get_questions_by_configと同じだが、レスポンス形式を調整
696
+ try {
697
+ const questions = get_questions_by_genre_config(params.subjects || []);
698
+ return {
699
+ success: true,
700
+ data: {
701
+ questions: questions
702
+ }
703
+ };
704
+ } catch (error) {
705
+ return {
706
+ success: false,
707
+ error: error.message
708
+ };
709
+ }
710
+
711
+ case 'get_questions_for_user':
712
+ // v1.8: ユーザー単位USAGE_COUNTを使用した問題取得
713
+ try {
714
+ if (!params.user_id) {
715
+ return {
716
+ success: false,
717
+ error: 'user_id is required'
718
+ };
719
+ }
720
+ const questions = get_questions_by_genre_config_for_user(params.user_id, params.subjects || []);
721
+ return {
722
+ success: true,
723
+ data: {
724
+ questions: questions
725
+ }
726
+ };
727
+ } catch (error) {
728
+ return {
729
+ success: false,
730
+ error: error.message
731
+ };
732
+ }
733
+
734
+ case 'get_questions_by_config':
735
+ // v1.6.3: ジャンル構成に基づく問題取得
736
+ return get_questions_by_genre_config(params.subjects || []);
737
+
738
+ case 'update_usage_count':
739
+ return update_usage_count(params.answer_ids || []);
740
+
741
+ case 'bulk_insert_answers':
742
+ return bulk_insert_answers(params.answers || []);
743
+
744
+ case 'get_stats':
745
+ return getQuestionDatabaseStats();
746
+
747
+ case 'get_user_usage_stats':
748
+ // v1.8: ユーザーの問題使用統計
749
+ if (!params.user_id) {
750
+ return { success: false, error: 'user_id is required' };
751
+ }
752
+ return getUserQuestionUsageStats(params.user_id);
753
+
754
+ case 'reset_usage':
755
+ return resetAllUsageCount();
756
+
757
+ case 'reset_user_usage':
758
+ // v1.8: ユーザー単位の使用履歴リセット
759
+ if (!params.user_id) {
760
+ return { success: false, error: 'user_id is required' };
761
+ }
762
+ return resetUserQuestionUsage(params.user_id);
763
+
764
+ case 'delete_by_subject':
765
+ return deleteBySubject(params.subject);
766
+
767
+ case 'add_header':
768
+ return addQuestionDatabaseHeader();
769
+
770
+ default:
771
+ return {
772
+ success: false,
773
+ error: `Unknown action: ${action}`
774
+ };
775
+ }
776
+ }
777
+
778
+ // ==================== テスト用関数 ====================
779
+
780
+ /**
781
+ * テスト用: サンプルデータを挿入
782
+ */
783
+ function testInsertSampleData() {
784
+ const sampleData = [
785
+ {
786
+ answer_id: 'jp_001',
787
+ subject: 'jp',
788
+ category: 'JP01',
789
+ answer: '憂鬱',
790
+ question_hint: '気分が晴れない様子を表す漢字',
791
+ difficulty: '標準',
792
+ source_context: '中学国語教科書',
793
+ usage_count: 0
794
+ },
795
+ {
796
+ answer_id: 'jp_002',
797
+ subject: 'jp',
798
+ category: 'JP01',
799
+ answer: '慈悲',
800
+ question_hint: '思いやりの心を表す熟語',
801
+ difficulty: '基本',
802
+ source_context: '小学6年生',
803
+ usage_count: 0
804
+ },
805
+ {
806
+ answer_id: 'jp_003',
807
+ subject: 'jp',
808
+ category: 'JP02',
809
+ answer: 'である',
810
+ question_hint: '断定の助動詞',
811
+ difficulty: '基本',
812
+ source_context: '中学文法',
813
+ usage_count: 0
814
+ },
815
+ {
816
+ answer_id: 'math_001',
817
+ subject: 'math',
818
+ category: 'MA01',
819
+ answer: '平方根',
820
+ question_hint: '2乗してその数になる数',
821
+ difficulty: '標準',
822
+ source_context: '中学3年数学',
823
+ usage_count: 0
824
+ }
825
+ ];
826
+
827
+ const result = bulk_insert_answers(sampleData);
828
+ Logger.log('サンプルデータ挿入結果:');
829
+ Logger.log(JSON.stringify(result, null, 2));
830
+ }
831
+
832
+ /**
833
+ * テスト用: get_random_answers のテスト
834
+ */
835
+ function testGetRandomAnswers() {
836
+ const answers = get_random_answers('jp', 2);
837
+ Logger.log('取得した答え:');
838
+ Logger.log(JSON.stringify(answers, null, 2));
839
+ }
840
+
841
+ /**
842
+ * テスト用: update_usage_count のテスト
843
+ */
844
+ function testUpdateUsageCount() {
845
+ const result = update_usage_count(['jp_001', 'jp_002']);
846
+ Logger.log('更新結果:');
847
+ Logger.log(JSON.stringify(result, null, 2));
848
+ }
849
+
850
+ /**
851
+ * テスト用: get_questions_by_genre_config のテスト(v1.6.3)
852
+ */
853
+ function testGetQuestionsByGenreConfig() {
854
+ const questions = get_questions_by_genre_config(['jp', 'math']);
855
+ Logger.log(`取得した問題数: ${questions.length}`);
856
+
857
+ // ジャンル別の内訳を表示
858
+ const genreCounts = {};
859
+ for (const q of questions) {
860
+ const key = `${q.subject}/${q.category}`;
861
+ genreCounts[key] = (genreCounts[key] || 0) + 1;
862
+ }
863
+
864
+ Logger.log('ジャンル別内訳:');
865
+ Logger.log(JSON.stringify(genreCounts, null, 2));
866
+ }
867
+
868
+ // ==================== v1.8 ユーザー単位USAGE_COUNT機能 ====================
869
+
870
+ const USER_QUESTION_USAGE_SHEET_NAME = 'UserQuestionUsage';
871
+
872
+ const USER_QUESTION_USAGE_COLUMNS = {
873
+ USAGE_ID: 1, // A列
874
+ USER_ID: 2, // B列
875
+ ANSWER_ID: 3, // C列
876
+ USAGE_COUNT: 4, // D列
877
+ LAST_USED_AT: 5 // E列
878
+ };
879
+
880
+ const USER_QUESTION_USAGE_HEADER = [
881
+ 'usage_id',
882
+ 'user_id',
883
+ 'answer_id',
884
+ 'usage_count',
885
+ 'last_used_at'
886
+ ];
887
+
888
+ /**
889
+ * UserQuestionUsageシートを取得(なければ作成)
890
+ * @returns {GoogleAppsScript.Spreadsheet.Sheet}
891
+ */
892
+ function getUserQuestionUsageSheet_() {
893
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
894
+ let sheet = ss.getSheetByName(USER_QUESTION_USAGE_SHEET_NAME);
895
+
896
+ if (!sheet) {
897
+ sheet = ss.insertSheet(USER_QUESTION_USAGE_SHEET_NAME);
898
+ sheet.getRange(1, 1, 1, USER_QUESTION_USAGE_HEADER.length).setValues([USER_QUESTION_USAGE_HEADER]);
899
+ sheet.getRange(1, 1, 1, USER_QUESTION_USAGE_HEADER.length).setFontWeight('bold');
900
+ sheet.setFrozenRows(1);
901
+
902
+ Logger.log('UserQuestionUsageシートを新規作成しました');
903
+ }
904
+
905
+ return sheet;
906
+ }
907
+
908
+ /**
909
+ * 指定ユーザーの使用履歴マップを取得
910
+ * @param {string} userId - ユーザーID
911
+ * @returns {Object} { answerId: { usage_count, last_used_at, rowIndex } }
912
+ */
913
+ function getUserUsageMap_(userId) {
914
+ const sheet = getUserQuestionUsageSheet_();
915
+ const lastRow = sheet.getLastRow();
916
+
917
+ if (lastRow <= 1) {
918
+ return {};
919
+ }
920
+
921
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, USER_QUESTION_USAGE_HEADER.length);
922
+ const allData = dataRange.getValues();
923
+
924
+ const usageMap = {};
925
+
926
+ allData.forEach((row, index) => {
927
+ if (row[USER_QUESTION_USAGE_COLUMNS.USER_ID - 1] === userId) {
928
+ const answerId = row[USER_QUESTION_USAGE_COLUMNS.ANSWER_ID - 1];
929
+ usageMap[answerId] = {
930
+ usage_count: row[USER_QUESTION_USAGE_COLUMNS.USAGE_COUNT - 1] || 0,
931
+ last_used_at: row[USER_QUESTION_USAGE_COLUMNS.LAST_USED_AT - 1] || '',
932
+ rowIndex: index + 2 // シートの行番号(1-indexed, ヘッダー考慮)
933
+ };
934
+ }
935
+ });
936
+
937
+ return usageMap;
938
+ }
939
+
940
+ /**
941
+ * ユーザーの問題使用履歴を更新
942
+ * @param {string} userId - ユーザーID
943
+ * @param {Array<Object>} questions - 使用した問題の配列(answer_id を含む)
944
+ */
945
+ function updateUserQuestionUsage_(userId, questions) {
946
+ const sheet = getUserQuestionUsageSheet_();
947
+ const timestamp = getTimestamp();
948
+
949
+ // 現在のユーザー使用履歴を取得
950
+ const usageMap = getUserUsageMap_(userId);
951
+
952
+ for (const q of questions) {
953
+ const answerId = q.answer_id;
954
+
955
+ if (usageMap[answerId]) {
956
+ // 既存レコード: usage_count +1
957
+ const rowIndex = usageMap[answerId].rowIndex;
958
+ const currentCount = usageMap[answerId].usage_count;
959
+ sheet.getRange(rowIndex, USER_QUESTION_USAGE_COLUMNS.USAGE_COUNT).setValue(currentCount + 1);
960
+ sheet.getRange(rowIndex, USER_QUESTION_USAGE_COLUMNS.LAST_USED_AT).setValue(timestamp);
961
+ } else {
962
+ // 新規レコード
963
+ const usageId = generateUUID();
964
+ sheet.appendRow([usageId, userId, answerId, 1, timestamp]);
965
+ }
966
+ }
967
+
968
+ Logger.log(`ユーザー ${userId} の使用履歴を ${questions.length} 件更新しました`);
969
+ }
970
+
971
+ /**
972
+ * ユーザー単位でジャンル構成に基づいて問題を取得(v1.8新規)
973
+ *
974
+ * グローバルusage_countではなく、ユーザー単位のusage_countを参照
975
+ * ユーザーがまだ解いていない問題を優先的に出題
976
+ *
977
+ * @param {string} userId - ユーザーID
978
+ * @param {Array<string>} subjects - 教科コードの配列
979
+ * @returns {Array<Object>} 取得した問題データの配列
980
+ */
981
+ function get_questions_by_genre_config_for_user(userId, subjects) {
982
+ try {
983
+ const questionSheet = getQuestionDatabaseSheet_();
984
+ const lastRow = questionSheet.getLastRow();
985
+
986
+ if (lastRow <= 1) {
987
+ Logger.log('QuestionDatabaseにデータがありません');
988
+ return [];
989
+ }
990
+
991
+ // QuestionDatabaseの全データを取得
992
+ const dataRange = questionSheet.getRange(2, 1, lastRow - 1, QUESTIONDB_HEADER.length);
993
+ const allData = dataRange.getValues();
994
+
995
+ // ユーザーの使用履歴マップを取得
996
+ const userUsageMap = getUserUsageMap_(userId);
997
+
998
+ Logger.log(`ユーザー ${userId} の使用履歴: ${Object.keys(userUsageMap).length} 件`);
999
+
1000
+ const results = [];
1001
+
1002
+ // 各教科を処理
1003
+ for (const subject of subjects) {
1004
+ let genreConfig = GENRE_CONFIG[subject];
1005
+
1006
+ if (!genreConfig) {
1007
+ Logger.log(`未知の教科コード: ${subject} - スキップ`);
1008
+ continue;
1009
+ }
1010
+
1011
+ // v1.8.1: 理科は12カテゴリからランダムに10カテゴリを選択
1012
+ if (subject === 'sci') {
1013
+ const allGenres = Object.entries(genreConfig);
1014
+ if (allGenres.length > 10) {
1015
+ const shuffled = allGenres.sort(() => Math.random() - 0.5);
1016
+ const selected = shuffled.slice(0, 10);
1017
+ genreConfig = Object.fromEntries(selected);
1018
+ Logger.log(`理科: ランダム10カテゴリ選択 - ${selected.map(([g]) => g).join(', ')}`);
1019
+ }
1020
+ }
1021
+
1022
+ Logger.log(`教科 '${subject}' を処理中...`);
1023
+
1024
+ // 各ジャンルを処理
1025
+ for (const [genre, count] of Object.entries(genreConfig)) {
1026
+ // このジャンルのレコードを抽出
1027
+ const genreData = allData
1028
+ .map((row, index) => ({
1029
+ row,
1030
+ originalIndex: index + 2,
1031
+ answerId: row[QUESTIONDB_COLUMNS.ANSWER_ID - 1]
1032
+ }))
1033
+ .filter(item =>
1034
+ item.row[QUESTIONDB_COLUMNS.SUBJECT - 1] === subject &&
1035
+ item.row[QUESTIONDB_COLUMNS.CATEGORY - 1] === genre
1036
+ );
1037
+
1038
+ if (genreData.length === 0) {
1039
+ Logger.log(`ジャンル '${genre}' のデータがありません`);
1040
+ continue;
1041
+ }
1042
+
1043
+ // ユーザー単位のusage_countを付与
1044
+ const genreDataWithUserUsage = genreData.map(item => {
1045
+ const userUsage = userUsageMap[item.answerId];
1046
+ return {
1047
+ ...item,
1048
+ userUsageCount: userUsage ? userUsage.usage_count : 0
1049
+ };
1050
+ });
1051
+
1052
+ // ユーザー単位usage_countでソート(昇順)
1053
+ const userUsageCounts = genreDataWithUserUsage.map(item => item.userUsageCount);
1054
+ const uniqueUserUsageCounts = [...new Set(userUsageCounts)].sort((a, b) => a - b);
1055
+
1056
+ const selected = [];
1057
+ let remaining = count;
1058
+
1059
+ // usage_countが小さい順に必要数を満たすまで抽出
1060
+ for (const usageCount of uniqueUserUsageCounts) {
1061
+ if (remaining <= 0) break;
1062
+
1063
+ const usageData = genreDataWithUserUsage.filter(item => item.userUsageCount === usageCount);
1064
+ const shuffled = usageData.sort(() => Math.random() - 0.5);
1065
+ const toTake = Math.min(remaining, shuffled.length);
1066
+
1067
+ for (let i = 0; i < toTake; i++) {
1068
+ selected.push(shuffled[i]);
1069
+ }
1070
+
1071
+ remaining -= toTake;
1072
+
1073
+ if (toTake > 0) {
1074
+ Logger.log(` user_usage_count=${usageCount}: ${toTake}問取得`);
1075
+ }
1076
+ }
1077
+
1078
+ // グローバルUSAGE_COUNTも更新(管理統計用)
1079
+ for (const item of selected) {
1080
+ const currentUsage = item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] || 0;
1081
+ const newUsage = currentUsage + 1;
1082
+ questionSheet.getRange(item.originalIndex, QUESTIONDB_COLUMNS.USAGE_COUNT).setValue(newUsage);
1083
+ item.row[QUESTIONDB_COLUMNS.USAGE_COUNT - 1] = newUsage;
1084
+ }
1085
+
1086
+ // オブジェクト形式に変換して結果に追加
1087
+ for (const item of selected) {
1088
+ results.push(rowToQuestionObject_(item.row));
1089
+ }
1090
+
1091
+ Logger.log(`ジャンル '${genre}': ${selected.length}/${count}問取得`);
1092
+ }
1093
+ }
1094
+
1095
+ // ユーザー単位の使用履歴を更新
1096
+ if (results.length > 0) {
1097
+ updateUserQuestionUsage_(userId, results);
1098
+ }
1099
+
1100
+ Logger.log(`合計 ${results.length} 問を取得しました(ユーザー単位USAGE_COUNT使用)`);
1101
+ return results;
1102
+
1103
+ } catch (error) {
1104
+ Logger.log(`get_questions_by_genre_config_for_user エラー: ${error.message}`);
1105
+ throw error;
1106
+ }
1107
+ }
1108
+
1109
+ /**
1110
+ * ユーザーの問題使用統計を取得
1111
+ * @param {string} userId - ユーザーID
1112
+ * @returns {Object} 使用統計
1113
+ */
1114
+ function getUserQuestionUsageStats(userId) {
1115
+ const usageMap = getUserUsageMap_(userId);
1116
+
1117
+ const stats = {
1118
+ user_id: userId,
1119
+ total_questions_used: Object.keys(usageMap).length,
1120
+ usage_distribution: {}
1121
+ };
1122
+
1123
+ // usage_countの分布を計算
1124
+ for (const [answerId, data] of Object.entries(usageMap)) {
1125
+ const count = data.usage_count;
1126
+ stats.usage_distribution[count] = (stats.usage_distribution[count] || 0) + 1;
1127
+ }
1128
+
1129
+ return stats;
1130
+ }
1131
+
1132
+ /**
1133
+ * ユーザーの使用履歴をリセット(テスト用)
1134
+ * @param {string} userId - ユーザーID
1135
+ * @returns {Object} リセット結果
1136
+ */
1137
+ function resetUserQuestionUsage(userId) {
1138
+ const sheet = getUserQuestionUsageSheet_();
1139
+ const lastRow = sheet.getLastRow();
1140
+
1141
+ if (lastRow <= 1) {
1142
+ return { success: true, deleted_count: 0 };
1143
+ }
1144
+
1145
+ const dataRange = sheet.getRange(2, 1, lastRow - 1, USER_QUESTION_USAGE_HEADER.length);
1146
+ const allData = dataRange.getValues();
1147
+
1148
+ // 削除対象の行を特定(後ろから削除)
1149
+ const rowsToDelete = [];
1150
+ allData.forEach((row, index) => {
1151
+ if (row[USER_QUESTION_USAGE_COLUMNS.USER_ID - 1] === userId) {
1152
+ rowsToDelete.push(index + 2);
1153
+ }
1154
+ });
1155
+
1156
+ rowsToDelete.reverse().forEach(rowNum => {
1157
+ sheet.deleteRow(rowNum);
1158
+ });
1159
+
1160
+ Logger.log(`ユーザー ${userId} の使用履歴 ${rowsToDelete.length} 件を削除しました`);
1161
+
1162
+ return {
1163
+ success: true,
1164
+ deleted_count: rowsToDelete.length
1165
+ };
1166
+ }
V1.8.1/gas/setup_dify_properties.js ADDED
@@ -0,0 +1,468 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Dify環境変数設定スクリプト
3
+ *
4
+ * Google Apps ScriptのScriptPropertiesに、Dify API統合に必要な環境変数を設定・管理します。
5
+ *
6
+ * 主要機能:
7
+ * - Dify API URL・API Keyの設定
8
+ * - 設定値の取得・確認
9
+ * - Dify APIへの接続テスト
10
+ * - 環境変数のクリア(デバッグ用)
11
+ *
12
+ * @version 1.0.0
13
+ * @date 2025-11-10
14
+ */
15
+
16
+ // ============================================================================
17
+ // 定数定義
18
+ // ============================================================================
19
+
20
+ /**
21
+ * 環境変数のキー名
22
+ */
23
+ const PROPERTY_KEYS = {
24
+ DIFY_API_URL: 'DIFY_API_URL',
25
+ DIFY_API_KEY: 'DIFY_API_KEY',
26
+ SPREADSHEET_ID: 'SPREADSHEET_ID'
27
+ };
28
+
29
+ // ============================================================================
30
+ // 環境変数設定関数
31
+ // ============================================================================
32
+
33
+ /**
34
+ * Dify関連の環境変数をScriptPropertiesに設定します
35
+ *
36
+ * 設定される環境変数:
37
+ * - DIFY_API_URL: Difyワークフロー実行エンドポイント
38
+ * - DIFY_API_KEY: Dify APIキー
39
+ * - SPREADSHEET_ID: Google SheetsのスプレッドシートID(確認用)
40
+ *
41
+ * 実行方法:
42
+ * 1. Apps Scriptエディタでこのファイルを開く
43
+ * 2. 関数 setDifyProperties を選択して実行
44
+ * 3. 実行ログで結果を確認
45
+ *
46
+ * 注意:
47
+ * - 実際の値を設定する際は、以下のダミー値を実際の値に置き換えてください
48
+ * - API Keyは機密情報のため、取り扱いに注意してください
49
+ *
50
+ * @returns {void}
51
+ *
52
+ * @example
53
+ * // 実行例(Apps Scriptエディタで実行)
54
+ * setDifyProperties();
55
+ * // ログ出力: 「✅ Dify環境変数の設定が完了しました」
56
+ */
57
+ function setDifyProperties() {
58
+ try {
59
+ const properties = PropertiesService.getScriptProperties();
60
+
61
+ // ========================================================================
62
+ // 【重要】実際の値に置き換えてください
63
+ // ========================================================================
64
+
65
+ // Dify Cloud のワークフロー実行エンドポイント
66
+ // 例: 'https://api.dify.ai/v1/workflows/run'
67
+ const DIFY_API_URL = 'https://api.dify.ai/v1/workflows/run';
68
+
69
+ // Dify Cloud のAPI Key(ワークフロー作成後に取得)
70
+ // 例: 'app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
71
+ const DIFY_API_KEY = 'app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
72
+
73
+ // Google SheetsのスプレッドシートID(既存、確認用)
74
+ // 既にCode.jsで定義されている値
75
+ const SPREADSHEET_ID = '1xlyaDpCrg4M-epbQ-KqemjpDeabxBjZ7aVCvRgRLazE';
76
+
77
+ // ========================================================================
78
+ // 環境変数の設定
79
+ // ========================================================================
80
+
81
+ properties.setProperty(PROPERTY_KEYS.DIFY_API_URL, DIFY_API_URL);
82
+ properties.setProperty(PROPERTY_KEYS.DIFY_API_KEY, DIFY_API_KEY);
83
+ properties.setProperty(PROPERTY_KEYS.SPREADSHEET_ID, SPREADSHEET_ID);
84
+
85
+ Logger.log('✅ Dify環境変数の設定が完了しました');
86
+ Logger.log('');
87
+ Logger.log('設定内容:');
88
+ Logger.log(' DIFY_API_URL: ' + DIFY_API_URL);
89
+ Logger.log(' DIFY_API_KEY: ' + maskApiKey(DIFY_API_KEY));
90
+ Logger.log(' SPREADSHEET_ID: ' + SPREADSHEET_ID);
91
+ Logger.log('');
92
+ Logger.log('次のステップ: getDifyProperties() を実行して設定を確認してください');
93
+
94
+ } catch (error) {
95
+ Logger.log('❌ エラー: Dify環境変数の設定に失敗しました');
96
+ Logger.log('詳細: ' + error.toString());
97
+ throw new Error('環境変数の設定に失敗しました: ' + error.toString());
98
+ }
99
+ }
100
+
101
+ // ============================================================================
102
+ // 環境変数取得関数
103
+ // ============================================================================
104
+
105
+ /**
106
+ * 設定されたDify環境変数を取得・確認します
107
+ *
108
+ * 取得する環境変数:
109
+ * - DIFY_API_URL: Difyワークフロー実行エンドポイント
110
+ * - DIFY_API_KEY: Dify APIキー(マスク表示)
111
+ * - SPREADSHEET_ID: Google SheetsのスプレッドシートID
112
+ *
113
+ * 実行方法:
114
+ * 1. Apps Scriptエディタでこのファイルを開く
115
+ * 2. 関数 getDifyProperties を選択して実行
116
+ * 3. 実行ログで設定内容を確認
117
+ *
118
+ * @returns {Object} 環境変数のオブジェクト
119
+ * @returns {string} returns.DIFY_API_URL - Dify API URL
120
+ * @returns {string} returns.DIFY_API_KEY - Dify API Key
121
+ * @returns {string} returns.SPREADSHEET_ID - スプレッドシートID
122
+ *
123
+ * @example
124
+ * // 実行例(Apps Scriptエディタで実行)
125
+ * const props = getDifyProperties();
126
+ * // ログ出力: 各環境変数の値
127
+ *
128
+ * @example
129
+ * // コード内での使用例
130
+ * const props = getDifyProperties();
131
+ * const apiUrl = props.DIFY_API_URL;
132
+ * const apiKey = props.DIFY_API_KEY;
133
+ */
134
+ function getDifyProperties() {
135
+ try {
136
+ const properties = PropertiesService.getScriptProperties();
137
+
138
+ const difyApiUrl = properties.getProperty(PROPERTY_KEYS.DIFY_API_URL);
139
+ const difyApiKey = properties.getProperty(PROPERTY_KEYS.DIFY_API_KEY);
140
+ const spreadsheetId = properties.getProperty(PROPERTY_KEYS.SPREADSHEET_ID);
141
+
142
+ Logger.log('📋 Dify環境変数の取得結果:');
143
+ Logger.log('');
144
+ Logger.log(' DIFY_API_URL: ' + (difyApiUrl || '(未設定)'));
145
+ Logger.log(' DIFY_API_KEY: ' + (difyApiKey ? maskApiKey(difyApiKey) : '(未設定)'));
146
+ Logger.log(' SPREADSHEET_ID: ' + (spreadsheetId || '(未設定)'));
147
+ Logger.log('');
148
+
149
+ // 未設定の項目をチェック
150
+ const missingKeys = [];
151
+ if (!difyApiUrl) missingKeys.push('DIFY_API_URL');
152
+ if (!difyApiKey) missingKeys.push('DIFY_API_KEY');
153
+ if (!spreadsheetId) missingKeys.push('SPREADSHEET_ID');
154
+
155
+ if (missingKeys.length > 0) {
156
+ Logger.log('⚠️ 未設定の環境変数があります: ' + missingKeys.join(', '));
157
+ Logger.log('setDifyProperties() を実行して設定してください');
158
+ } else {
159
+ Logger.log('✅ すべての環境変数が設定されています');
160
+ }
161
+
162
+ return {
163
+ DIFY_API_URL: difyApiUrl,
164
+ DIFY_API_KEY: difyApiKey,
165
+ SPREADSHEET_ID: spreadsheetId
166
+ };
167
+
168
+ } catch (error) {
169
+ Logger.log('❌ エラー: Dify環境変数の取得に失敗しました');
170
+ Logger.log('詳細: ' + error.toString());
171
+ throw new Error('環境変数の取得に失敗しました: ' + error.toString());
172
+ }
173
+ }
174
+
175
+ // ============================================================================
176
+ // Dify接続テスト関数
177
+ // ============================================================================
178
+
179
+ /**
180
+ * Dify APIへの接続テストを実行します
181
+ *
182
+ * テスト内容:
183
+ * - 環境変数の存在確認
184
+ * - Dify API URLへのHTTPリクエスト送信
185
+ * - レスポンスステータスの確認
186
+ *
187
+ * 実行方法:
188
+ * 1. setDifyProperties() を実行して環境変数を設定
189
+ * 2. Apps Scriptエディタでこのファイルを開く
190
+ * 3. 関数 testDifyConnection を選択して実行
191
+ * 4. 実行ログで接続テスト結果を確認
192
+ *
193
+ * 注意:
194
+ * - 実際のDify Cloudアカウントとワークフロー作成が必要です
195
+ * - API Keyが正しく設定されていることを確認してください
196
+ *
197
+ * @returns {Object} テスト結果のオブジェクト
198
+ * @returns {boolean} returns.success - テスト成功フラグ
199
+ * @returns {string} returns.message - テスト結果メッセージ
200
+ * @returns {Object} returns.response - APIレスポンス(成功時)
201
+ *
202
+ * @example
203
+ * // 実行例(Apps Scriptエディタで実行)
204
+ * testDifyConnection();
205
+ * // ログ出力: 「✅ Dify API接続テスト成功」または「❌ 接続テスト失敗」
206
+ */
207
+ function testDifyConnection() {
208
+ try {
209
+ Logger.log('🔄 Dify API接続テストを開始します...');
210
+ Logger.log('');
211
+
212
+ // 環境変数の取得
213
+ const properties = PropertiesService.getScriptProperties();
214
+ const difyApiUrl = properties.getProperty(PROPERTY_KEYS.DIFY_API_URL);
215
+ const difyApiKey = properties.getProperty(PROPERTY_KEYS.DIFY_API_KEY);
216
+
217
+ // 環境変数の存在確認
218
+ if (!difyApiUrl || !difyApiKey) {
219
+ Logger.log('❌ エラー: 環境変数が未設定です');
220
+ Logger.log('setDifyProperties() を実行して環境変数を設定してください');
221
+ return {
222
+ success: false,
223
+ message: '環境変数が未設定です'
224
+ };
225
+ }
226
+
227
+ Logger.log('環境変数の確認: ✅');
228
+ Logger.log(' DIFY_API_URL: ' + difyApiUrl);
229
+ Logger.log(' DIFY_API_KEY: ' + maskApiKey(difyApiKey));
230
+ Logger.log('');
231
+
232
+ // テスト用のリクエストペイロード
233
+ const testPayload = {
234
+ inputs: {
235
+ subject: '算数',
236
+ category: '四則計算',
237
+ test: true
238
+ },
239
+ response_mode: 'blocking',
240
+ user: 'gas-test-user'
241
+ };
242
+
243
+ // HTTPリクエストオプション
244
+ const options = {
245
+ method: 'post',
246
+ contentType: 'application/json',
247
+ headers: {
248
+ 'Authorization': 'Bearer ' + difyApiKey
249
+ },
250
+ payload: JSON.stringify(testPayload),
251
+ muteHttpExceptions: true // エラーレスポンスも取得するため
252
+ };
253
+
254
+ Logger.log('🌐 Dify APIへリクエストを送信中...');
255
+ Logger.log('URL: ' + difyApiUrl);
256
+ Logger.log('');
257
+
258
+ // Dify APIへのリクエスト送信
259
+ const response = UrlFetchApp.fetch(difyApiUrl, options);
260
+ const responseCode = response.getResponseCode();
261
+ const responseText = response.getContentText();
262
+
263
+ Logger.log('📥 レスポンスを受信しました');
264
+ Logger.log('ステータスコード: ' + responseCode);
265
+ Logger.log('');
266
+
267
+ // レスポンスの解析
268
+ if (responseCode === 200) {
269
+ const responseData = JSON.parse(responseText);
270
+ Logger.log('✅ Dify API接続テスト成功');
271
+ Logger.log('');
272
+ Logger.log('レスポンス内容:');
273
+ Logger.log(JSON.stringify(responseData, null, 2));
274
+
275
+ return {
276
+ success: true,
277
+ message: '接続テスト成功',
278
+ response: responseData
279
+ };
280
+
281
+ } else {
282
+ Logger.log('❌ Dify API接続テスト失敗');
283
+ Logger.log('ステータスコード: ' + responseCode);
284
+ Logger.log('エラー内容: ' + responseText);
285
+ Logger.log('');
286
+ Logger.log('考えられる原因:');
287
+ Logger.log(' 1. DIFY_API_URL が正しくない');
288
+ Logger.log(' 2. DIFY_API_KEY が正しくない');
289
+ Logger.log(' 3. Difyワークフローがまだ作成されていない');
290
+ Logger.log(' 4. Difyワークフローが公開されていない');
291
+
292
+ return {
293
+ success: false,
294
+ message: '接続テスト失敗(ステータスコード: ' + responseCode + ')',
295
+ error: responseText
296
+ };
297
+ }
298
+
299
+ } catch (error) {
300
+ Logger.log('❌ エラー: Dify API接続テストでエラーが発生しました');
301
+ Logger.log('詳細: ' + error.toString());
302
+ Logger.log('');
303
+ Logger.log('考えられる原因:');
304
+ Logger.log(' 1. ネットワーク接続エラー');
305
+ Logger.log(' 2. URLが不正(例: プロトコル未指定)');
306
+ Logger.log(' 3. Apps Scriptの外部API接続権限が不足');
307
+
308
+ return {
309
+ success: false,
310
+ message: '接続テスト中にエラーが発生しました: ' + error.toString()
311
+ };
312
+ }
313
+ }
314
+
315
+ // ============================================================================
316
+ // 環境変数クリア関数(デバッグ用)
317
+ // ============================================================================
318
+
319
+ /**
320
+ * 設定されたDify環境変数をクリアします(デバッグ用)
321
+ *
322
+ * 削除される環境変数:
323
+ * - DIFY_API_URL
324
+ * - DIFY_API_KEY
325
+ * - SPREADSHEET_ID
326
+ *
327
+ * 実行方法:
328
+ * 1. Apps Scriptエディタでこのファイルを開く
329
+ * 2. 関数 clearDifyProperties を選択して実行
330
+ * 3. 実行ログで削除結果を確認
331
+ *
332
+ * 注意:
333
+ * - この操作は元に戻せません
334
+ * - 誤って実行しないように注意してください
335
+ * - 本番環境では使用しないでください
336
+ *
337
+ * @returns {void}
338
+ *
339
+ * @example
340
+ * // 実行例(Apps Scriptエディタで実行)
341
+ * clearDifyProperties();
342
+ * // ログ出力: 「✅ Dify環境変数のクリアが完了しました」
343
+ */
344
+ function clearDifyProperties() {
345
+ try {
346
+ const properties = PropertiesService.getScriptProperties();
347
+
348
+ Logger.log('🔄 Dify環境変数のクリアを開始します...');
349
+ Logger.log('');
350
+
351
+ // 削除前の確認
352
+ const before = getDifyPropertiesInternal(properties);
353
+ Logger.log('削除前の設定:');
354
+ Logger.log(' DIFY_API_URL: ' + (before.DIFY_API_URL ? '設定あり' : '設定なし'));
355
+ Logger.log(' DIFY_API_KEY: ' + (before.DIFY_API_KEY ? '設定あり' : '設定なし'));
356
+ Logger.log(' SPREADSHEET_ID: ' + (before.SPREADSHEET_ID ? '設定あり' : '設定なし'));
357
+ Logger.log('');
358
+
359
+ // 環境変数の削除
360
+ properties.deleteProperty(PROPERTY_KEYS.DIFY_API_URL);
361
+ properties.deleteProperty(PROPERTY_KEYS.DIFY_API_KEY);
362
+ properties.deleteProperty(PROPERTY_KEYS.SPREADSHEET_ID);
363
+
364
+ Logger.log('✅ Dify環境変数のクリアが完了しました');
365
+ Logger.log('');
366
+ Logger.log('削除された環境変数:');
367
+ Logger.log(' - DIFY_API_URL');
368
+ Logger.log(' - DIFY_API_KEY');
369
+ Logger.log(' - SPREADSHEET_ID');
370
+ Logger.log('');
371
+ Logger.log('再設定する場合: setDifyProperties() を実行してください');
372
+
373
+ } catch (error) {
374
+ Logger.log('❌ エラー: Dify環境変数のクリアに失敗しました');
375
+ Logger.log('詳細: ' + error.toString());
376
+ throw new Error('環境変数のクリアに失敗しました: ' + error.toString());
377
+ }
378
+ }
379
+
380
+ // ============================================================================
381
+ // ユーティリティ関数
382
+ // ============================================================================
383
+
384
+ /**
385
+ * API Keyをマスク表示します(セキュリティ対策)
386
+ *
387
+ * 例: 'app-abc123xyz789' → 'app-abc***xyz789'
388
+ *
389
+ * @param {string} apiKey - API Key
390
+ * @returns {string} マスク表示されたAPI Key
391
+ * @private
392
+ */
393
+ function maskApiKey(apiKey) {
394
+ if (!apiKey || apiKey.length < 10) {
395
+ return '***';
396
+ }
397
+ const prefix = apiKey.substring(0, 7);
398
+ const suffix = apiKey.substring(apiKey.length - 6);
399
+ return prefix + '***' + suffix;
400
+ }
401
+
402
+ /**
403
+ * 環境変数を取得します(内部用、ログ出力なし)
404
+ *
405
+ * @param {PropertiesService.Properties} properties - Propertiesオブジェクト
406
+ * @returns {Object} 環境変数のオブジェクト
407
+ * @private
408
+ */
409
+ function getDifyPropertiesInternal(properties) {
410
+ return {
411
+ DIFY_API_URL: properties.getProperty(PROPERTY_KEYS.DIFY_API_URL),
412
+ DIFY_API_KEY: properties.getProperty(PROPERTY_KEYS.DIFY_API_KEY),
413
+ SPREADSHEET_ID: properties.getProperty(PROPERTY_KEYS.SPREADSHEET_ID)
414
+ };
415
+ }
416
+
417
+ // ============================================================================
418
+ // 使用例・実行手順
419
+ // ============================================================================
420
+
421
+ /**
422
+ * 【実行手順】
423
+ *
424
+ * 1. 環境変数の設定
425
+ * - setDifyProperties() を実行
426
+ * - 事前に関数内のダミー値を実際の値に置き換えてください
427
+ *
428
+ * 2. 設定の確認
429
+ * - getDifyProperties() を実行
430
+ * - 実行ログで設定内容を確認してください
431
+ *
432
+ * 3. 接続テスト
433
+ * - testDifyConnection() を実行
434
+ * - Dify APIへの接続が成功するか確認してください
435
+ *
436
+ * 4. 環境変数のクリア(必要な場合のみ)
437
+ * - clearDifyProperties() を実行
438
+ * - 誤って実行しないように注意してください
439
+ *
440
+ * 【Code.jsでの使用例】
441
+ *
442
+ * ```javascript
443
+ * // 環境変数の取得
444
+ * const properties = PropertiesService.getScriptProperties();
445
+ * const DIFY_API_URL = properties.getProperty('DIFY_API_URL');
446
+ * const DIFY_API_KEY = properties.getProperty('DIFY_API_KEY');
447
+ *
448
+ * // Dify APIへのリクエスト送信
449
+ * function callDifyAPI(inputs) {
450
+ * const options = {
451
+ * method: 'post',
452
+ * contentType: 'application/json',
453
+ * headers: {
454
+ * 'Authorization': 'Bearer ' + DIFY_API_KEY
455
+ * },
456
+ * payload: JSON.stringify({
457
+ * inputs: inputs,
458
+ * response_mode: 'blocking',
459
+ * user: 'gas-orchestrator'
460
+ * }),
461
+ * muteHttpExceptions: true
462
+ * };
463
+ *
464
+ * const response = UrlFetchApp.fetch(DIFY_API_URL, options);
465
+ * return JSON.parse(response.getContentText());
466
+ * }
467
+ * ```
468
+ */
V1.8.1/gas/setup_sheets_v2.js ADDED
@@ -0,0 +1,524 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * サイクル1.2.5: Google Sheets拡張(7シート構成への移行)
3
+ *
4
+ * このスクリプトは「超天才クイズDB」を4シート構成から7シート構成に自動拡張します。
5
+ *
6
+ * 実行方法:
7
+ * 1. Apps Scriptエディタで本ファイルを開く
8
+ * 2. setupSheetsV2関数を選択
9
+ * 3. 実行ボタンをクリック
10
+ * 4. ログで結果を確認
11
+ *
12
+ * 仕様:
13
+ * - 新規シート作成: Answers, Statistics, Evaluations(各ヘッダー + サンプルデータ)
14
+ * - 既存シート更新: Questions, Knowledge_Baseに`category`列追加
15
+ * - 安全機能: 既存シートチェック、重複チェック、エラーハンドリング
16
+ *
17
+ * 参照:
18
+ * - docs/data-model.md v2.0
19
+ * - docs/sheets-setup-manual-v2.md
20
+ *
21
+ * バージョン: 1.0
22
+ * 作成日: 2025-11-10
23
+ */
24
+
25
+ // Note: SPREADSHEET_IDはCode.jsで定義済みのためここでは宣言しない
26
+
27
+ /**
28
+ * メイン関数: Google Sheetsを7シート構成に拡張
29
+ */
30
+ function setupSheetsV2() {
31
+ try {
32
+ Logger.log('=== Google Sheets拡張開始(v2.0: 7シート構成) ===');
33
+
34
+ // スプレッドシート取得(Code.jsで定義されたSPREADSHEET_IDを使用)
35
+ var spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
36
+ Logger.log('スプレッドシート取得成功: ' + spreadsheet.getName());
37
+
38
+ // 既存シート確認
39
+ Logger.log('\n--- 既存シート確認 ---');
40
+ checkExistingSheets(spreadsheet);
41
+
42
+ // 新規シート作成(3シート)
43
+ Logger.log('\n--- 新規シート作成 ---');
44
+ createAnswersSheet(spreadsheet);
45
+ createStatisticsSheet(spreadsheet);
46
+ createEvaluationsSheet(spreadsheet);
47
+
48
+ // 既存シート更新(2シート)
49
+ Logger.log('\n--- 既存シート更新 ---');
50
+ updateQuestionsSheet(spreadsheet);
51
+ updateKnowledgeBaseSheet(spreadsheet);
52
+
53
+ Logger.log('\n=== Google Sheets拡張完了! ===');
54
+ Logger.log('結果: 7シート構成に拡張成功');
55
+ Logger.log('次のステップ: Google Sheetsを開いて7シート全て存在することを確認してください');
56
+
57
+ } catch (error) {
58
+ Logger.log('\n❌ エラー発生: ' + error.message);
59
+ Logger.log('スタックトレース: ' + error.stack);
60
+ throw error;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * 既存シート確認
66
+ */
67
+ function checkExistingSheets(spreadsheet) {
68
+ var sheets = spreadsheet.getSheets();
69
+ Logger.log('現在のシート数: ' + sheets.length);
70
+
71
+ for (var i = 0; i < sheets.length; i++) {
72
+ Logger.log(' - ' + sheets[i].getName());
73
+ }
74
+
75
+ // 必須シート確認(Users, Sessions, Questions, Knowledge_Base)
76
+ var requiredSheets = ['Users', 'Sessions', 'Questions', 'Knowledge_Base'];
77
+ for (var j = 0; j < requiredSheets.length; j++) {
78
+ var sheet = spreadsheet.getSheetByName(requiredSheets[j]);
79
+ if (!sheet) {
80
+ throw new Error('必須シート「' + requiredSheets[j] + '」が存在しません。サイクル1.2を先に実行してください。');
81
+ }
82
+ }
83
+ Logger.log('必須シート(4シート)確認完了');
84
+ }
85
+
86
+ /**
87
+ * Answersシート作成
88
+ */
89
+ function createAnswersSheet(spreadsheet) {
90
+ var sheetName = 'Answers';
91
+
92
+ // 既存チェック
93
+ if (spreadsheet.getSheetByName(sheetName)) {
94
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
95
+ return;
96
+ }
97
+
98
+ Logger.log(sheetName + 'シートを作成中...');
99
+
100
+ // シート作成
101
+ var sheet = spreadsheet.insertSheet(sheetName);
102
+
103
+ // ヘッダー行(1行目)
104
+ var headers = [
105
+ 'answer_id',
106
+ 'session_id',
107
+ 'question_id',
108
+ 'user_answer',
109
+ 'is_correct',
110
+ 'time_taken',
111
+ 'answered_at'
112
+ ];
113
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
114
+
115
+ // サンプルデータ(2行)
116
+ var sampleData = [
117
+ ['ans-sample-001', 'session-sample-001', 'q-sample-001', 0, true, 12, '2025-11-04T10:31:15Z'],
118
+ ['ans-sample-002', 'session-sample-001', 'q-sample-002', 2, false, 18, '2025-11-04T10:31:33Z']
119
+ ];
120
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
121
+
122
+ Logger.log('✅ ' + sheetName + 'シート作成完了(ヘッダー + サンプルデータ2行)');
123
+ }
124
+
125
+ /**
126
+ * Statisticsシート作成
127
+ */
128
+ function createStatisticsSheet(spreadsheet) {
129
+ var sheetName = 'Statistics';
130
+
131
+ // 既存チェック
132
+ if (spreadsheet.getSheetByName(sheetName)) {
133
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
134
+ return;
135
+ }
136
+
137
+ Logger.log(sheetName + 'シートを作成中...');
138
+
139
+ // シート作成
140
+ var sheet = spreadsheet.insertSheet(sheetName);
141
+
142
+ // ヘッダー行(1行目)
143
+ var headers = [
144
+ 'stat_id',
145
+ 'user_id',
146
+ 'subject',
147
+ 'category',
148
+ 'total_attempted',
149
+ 'correct_count',
150
+ 'accuracy_rate',
151
+ 'last_updated'
152
+ ];
153
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
154
+
155
+ // サンプルデータ(3行)
156
+ var sampleData = [
157
+ ['stat-001', 'sample-user-001', '国語', '漢字・語彙', 20, 16, 0.80, '2025-11-04T10:45:00Z'],
158
+ ['stat-002', 'sample-user-001', '国語', '物語文読解', 15, 9, 0.60, '2025-11-04T10:45:00Z'],
159
+ ['stat-003', 'sample-user-001', '算数', '平面図形', 10, 4, 0.40, '2025-11-04T10:45:00Z']
160
+ ];
161
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
162
+
163
+ Logger.log('✅ ' + sheetName + 'シート作成完了(ヘッダー + サンプルデータ3行)');
164
+ }
165
+
166
+ /**
167
+ * Evaluationsシート作成
168
+ */
169
+ function createEvaluationsSheet(spreadsheet) {
170
+ var sheetName = 'Evaluations';
171
+
172
+ // 既存チェック
173
+ if (spreadsheet.getSheetByName(sheetName)) {
174
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
175
+ return;
176
+ }
177
+
178
+ Logger.log(sheetName + 'シートを作成中...');
179
+
180
+ // シート作成
181
+ var sheet = spreadsheet.insertSheet(sheetName);
182
+
183
+ // ヘッダー行(1行目)
184
+ var headers = [
185
+ 'eval_id',
186
+ 'session_id',
187
+ 'subject_evaluations',
188
+ 'overall_evaluation',
189
+ 'created_at'
190
+ ];
191
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
192
+
193
+ // サンプルデータ(1行)
194
+ // JSON形式のデータは文字列として扱う(Google Sheetsは型なし)
195
+ var sampleData = [
196
+ [
197
+ 'eval-001',
198
+ 'session-sample-001',
199
+ '{"国語":["漢字・語彙は80%の正答率で安定"],"算数":["計算力が優れています"]}',
200
+ '["今回は合計29/40(72.5%)"]',
201
+ '2025-11-04T10:46:00Z'
202
+ ]
203
+ ];
204
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
205
+
206
+ Logger.log('✅ ' + sheetName + 'シート作成完了(ヘッダー + サンプルデータ1行)');
207
+ }
208
+
209
+ /**
210
+ * Questionsシート更新(category列追加)
211
+ */
212
+ function updateQuestionsSheet(spreadsheet) {
213
+ var sheetName = 'Questions';
214
+
215
+ Logger.log(sheetName + 'シートを更新中...');
216
+
217
+ // シート取得
218
+ var sheet = spreadsheet.getSheetByName(sheetName);
219
+ if (!sheet) {
220
+ throw new Error(sheetName + 'シートが存在しません');
221
+ }
222
+
223
+ // 現在のヘッダー行確認
224
+ var lastColumn = sheet.getLastColumn();
225
+ if (lastColumn === 0) {
226
+ Logger.log('⚠️ ' + sheetName + 'シートが空です。列追加をスキップします。');
227
+ return;
228
+ }
229
+
230
+ var headers = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
231
+ Logger.log('現在のヘッダー: ' + headers.join(', '));
232
+
233
+ // category列が既に存在するかチェック
234
+ var categoryIndex = headers.indexOf('category');
235
+ if (categoryIndex !== -1) {
236
+ Logger.log('⚠️ category列は既に存在します(列' + (categoryIndex + 1) + ')。スキップします。');
237
+ return;
238
+ }
239
+
240
+ // D列(subjectの次)に新規列を挿入
241
+ // 想定: A=question_id, B=session_id, C=subject, D=(新規category), E=difficulty(元のD)...
242
+ var insertPosition = 4; // D列(1-indexed)
243
+ sheet.insertColumnBefore(insertPosition);
244
+
245
+ // D1にヘッダー「category」を追加
246
+ sheet.getRange(1, insertPosition).setValue('category');
247
+
248
+ // D2にサンプルデータを追加(既存のサンプルデータがある場合)
249
+ var lastRow = sheet.getLastRow();
250
+ if (lastRow >= 2) {
251
+ sheet.getRange(2, insertPosition).setValue('漢字・語彙');
252
+ }
253
+
254
+ Logger.log('✅ ' + sheetName + 'シート更新完了(D列にcategory追加)');
255
+ }
256
+
257
+ /**
258
+ * Knowledge_Baseシート更新(category列追加)
259
+ */
260
+ function updateKnowledgeBaseSheet(spreadsheet) {
261
+ var sheetName = 'Knowledge_Base';
262
+
263
+ Logger.log(sheetName + 'シートを更新中...');
264
+
265
+ // シート取得
266
+ var sheet = spreadsheet.getSheetByName(sheetName);
267
+ if (!sheet) {
268
+ throw new Error(sheetName + 'シートが存在しません');
269
+ }
270
+
271
+ // 現在のヘッダー行確認
272
+ var lastColumn = sheet.getLastColumn();
273
+ if (lastColumn === 0) {
274
+ Logger.log('⚠️ ' + sheetName + 'シートが空です。列追加をスキップします。');
275
+ return;
276
+ }
277
+
278
+ var headers = sheet.getRange(1, 1, 1, lastColumn).getValues()[0];
279
+ Logger.log('現在のヘッダー: ' + headers.join(', '));
280
+
281
+ // category列が既に存在するかチェック
282
+ var categoryIndex = headers.indexOf('category');
283
+ if (categoryIndex !== -1) {
284
+ Logger.log('⚠️ category列は既に存在します(列' + (categoryIndex + 1) + ')。スキップします。');
285
+ return;
286
+ }
287
+
288
+ // C列(subjectの次)に新規列を挿入
289
+ // 想定: A=kb_id, B=subject, C=(新規category), D=grade(元のC)...
290
+ var insertPosition = 3; // C列(1-indexed)
291
+ sheet.insertColumnBefore(insertPosition);
292
+
293
+ // C1にヘッダー「category」を追加
294
+ sheet.getRange(1, insertPosition).setValue('category');
295
+
296
+ // C2にサンプルデータを追加(既存のサンプルデータがある場合)
297
+ var lastRow = sheet.getLastRow();
298
+ if (lastRow >= 2) {
299
+ sheet.getRange(2, insertPosition).setValue('植物の成長');
300
+ }
301
+
302
+ Logger.log('✅ ' + sheetName + 'シート更新完了(C列にcategory追加)');
303
+ }
304
+
305
+ /**
306
+ * 空シート初期化関数: Sessions, Questions, Knowledge_Baseシートが空の場合に初期データを投入
307
+ *
308
+ * 実行方法:
309
+ * 1. Apps Scriptエディタで本ファイルを開く
310
+ * 2. initializeEmptySheets関数を選択
311
+ * 3. 実行ボタンをクリック
312
+ * 4. ログで結果を確認
313
+ *
314
+ * 処理内容:
315
+ * - Sessionsシート: ヘッダー + サンプルデータ1行
316
+ * - Questionsシート: ヘッダー(category列含む) + サンプルデータ1行
317
+ * - Knowledge_Baseシート: ヘッダー(category列含む) + サンプルデータ1行
318
+ *
319
+ * 安全機能:
320
+ * - シートが既にデータを持つ場合はスキップ
321
+ * - エラーハンドリング
322
+ * - 詳細ログ出力
323
+ */
324
+ function initializeEmptySheets() {
325
+ try {
326
+ Logger.log('=== 空シート初期化開始 ===');
327
+
328
+ // スプレッドシート取得(Code.jsで定義されたSPREADSHEET_IDを使用)
329
+ var spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
330
+ Logger.log('スプレッドシート取得成功: ' + spreadsheet.getName());
331
+
332
+ // 各シートの初期化
333
+ Logger.log('\n--- シート初期化処理 ---');
334
+ initializeSessionsSheet(spreadsheet);
335
+ initializeQuestionsSheet(spreadsheet);
336
+ initializeKnowledgeBaseSheet(spreadsheet);
337
+
338
+ Logger.log('\n=== 空シート初期化完了! ===');
339
+ Logger.log('結果: 3シート(Sessions, Questions, Knowledge_Base)の初期化が完了しました');
340
+ Logger.log('次のステップ: Google Sheetsを開いて各シートにヘッダーとサンプルデータが存在することを確認してください');
341
+
342
+ } catch (error) {
343
+ Logger.log('\n❌ エラー発生: ' + error.message);
344
+ Logger.log('スタックトレース: ' + error.stack);
345
+ throw error;
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Sessionsシート初期化
351
+ */
352
+ function initializeSessionsSheet(spreadsheet) {
353
+ var sheetName = 'Sessions';
354
+
355
+ Logger.log(sheetName + 'シートを確認中...');
356
+
357
+ // シート取得
358
+ var sheet = spreadsheet.getSheetByName(sheetName);
359
+ if (!sheet) {
360
+ Logger.log('⚠️ ' + sheetName + 'シートが存在しません。スキップします。');
361
+ return;
362
+ }
363
+
364
+ // 既存データ確認(空シートかどうか)
365
+ var lastRow = sheet.getLastRow();
366
+ if (lastRow > 0) {
367
+ Logger.log('⚠️ ' + sheetName + 'シートは既にデータを持っています(' + lastRow + '行)。スキップします。');
368
+ return;
369
+ }
370
+
371
+ Logger.log(sheetName + 'シートを初期化中...');
372
+
373
+ // ヘッダー行(1行目)
374
+ var headers = [
375
+ 'session_id',
376
+ 'user_id',
377
+ 'subjects',
378
+ 'start_time',
379
+ 'end_time',
380
+ 'total_score',
381
+ 'completed'
382
+ ];
383
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
384
+
385
+ // サンプルデータ(1行)
386
+ var sampleData = [
387
+ ['session-sample-001', 'sample-user-001', '["国語","算数"]', '2025-11-04T10:30:00Z', '2025-11-04T10:45:00Z', 29, true]
388
+ ];
389
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
390
+
391
+ Logger.log('✅ ' + sheetName + 'シート初期化完了(ヘッダー + サンプルデータ1行)');
392
+ }
393
+
394
+ /**
395
+ * Questionsシート初期化(category列含む)
396
+ */
397
+ function initializeQuestionsSheet(spreadsheet) {
398
+ var sheetName = 'Questions';
399
+
400
+ Logger.log(sheetName + 'シートを確認中...');
401
+
402
+ // シート取得
403
+ var sheet = spreadsheet.getSheetByName(sheetName);
404
+ if (!sheet) {
405
+ Logger.log('⚠️ ' + sheetName + 'シートが存在しません。スキップします。');
406
+ return;
407
+ }
408
+
409
+ // 既存データ確認(空シートかどうか)
410
+ var lastRow = sheet.getLastRow();
411
+ if (lastRow > 0) {
412
+ Logger.log('⚠️ ' + sheetName + 'シートは既にデータを持っています(' + lastRow + '行)。スキップします。');
413
+ return;
414
+ }
415
+
416
+ Logger.log(sheetName + 'シートを初期化中...');
417
+
418
+ // ヘッダー行(1行目)- category列を含む
419
+ var headers = [
420
+ 'question_id',
421
+ 'session_id',
422
+ 'subject',
423
+ 'category',
424
+ 'difficulty',
425
+ 'question_text',
426
+ 'choices',
427
+ 'correct_answer',
428
+ 'explanation',
429
+ 'created_at'
430
+ ];
431
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
432
+
433
+ // サンプルデータ(1行)
434
+ var sampleData = [
435
+ [
436
+ 'q-sample-001',
437
+ 'session-sample-001',
438
+ '国語',
439
+ '漢字・語彙',
440
+ '標準',
441
+ '次の漢字の読みを選びなさい:「成就」',
442
+ '["じょうじゅ","せいしゅう","せいじゅ","じょうしゅう"]',
443
+ 0,
444
+ '「成就」は「じょうじゅ」と読みます。',
445
+ '2025-11-04T10:31:00Z'
446
+ ]
447
+ ];
448
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
449
+
450
+ Logger.log('✅ ' + sheetName + 'シート初期化完了(ヘッダー(category列含む) + サンプルデータ1行)');
451
+ }
452
+
453
+ /**
454
+ * Knowledge_Baseシート初期化(category列含む)
455
+ */
456
+ function initializeKnowledgeBaseSheet(spreadsheet) {
457
+ var sheetName = 'Knowledge_Base';
458
+
459
+ Logger.log(sheetName + 'シートを確認中...');
460
+
461
+ // シート取得
462
+ var sheet = spreadsheet.getSheetByName(sheetName);
463
+ if (!sheet) {
464
+ Logger.log('⚠️ ' + sheetName + 'シートが存在しません。スキップします。');
465
+ return;
466
+ }
467
+
468
+ // 既存データ確認(空シートかどうか)
469
+ var lastRow = sheet.getLastRow();
470
+ if (lastRow > 0) {
471
+ Logger.log('⚠️ ' + sheetName + 'シートは既にデータを持っています(' + lastRow + '行)。スキップします。');
472
+ return;
473
+ }
474
+
475
+ Logger.log(sheetName + 'シートを初期化中...');
476
+
477
+ // ヘッダー行(1行目)- category列を含む
478
+ var headers = [
479
+ 'kb_id',
480
+ 'subject',
481
+ 'category',
482
+ 'grade',
483
+ 'content',
484
+ 'difficulty',
485
+ 'usage_count',
486
+ 'last_used'
487
+ ];
488
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
489
+
490
+ // サンプルデータ(1行)
491
+ var sampleData = [
492
+ [
493
+ 'kb-sample-001',
494
+ '理科',
495
+ '植物の成長',
496
+ 5,
497
+ '種子が発芽するためには、水・空気・適切な温度が必要である。',
498
+ 2,
499
+ 5,
500
+ '2025-11-04T09:00:00Z'
501
+ ]
502
+ ];
503
+ sheet.getRange(2, 1, sampleData.length, headers.length).setValues(sampleData);
504
+
505
+ Logger.log('✅ ' + sheetName + 'シート初期化完了(ヘッダー(category列含む) + サンプルデータ1行)');
506
+ }
507
+
508
+ /**
509
+ * テスト関数: setupSheetsV2の動作確認
510
+ */
511
+ function testSetupSheetsV2() {
512
+ Logger.log('=== テスト実行: setupSheetsV2 ===');
513
+ setupSheetsV2();
514
+ Logger.log('=== テスト完了 ===');
515
+ }
516
+
517
+ /**
518
+ * テスト関数: initializeEmptySheetsの動作確認
519
+ */
520
+ function testInitializeEmptySheets() {
521
+ Logger.log('=== テスト実行: initializeEmptySheets ===');
522
+ initializeEmptySheets();
523
+ Logger.log('=== テスト完了 ===');
524
+ }
V1.8.1/gas/setup_sheets_v3.js ADDED
@@ -0,0 +1,401 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * 超天才クイズv3 シートリセット・初期化スクリプト v3
3
+ *
4
+ * v1.6.8用: 現行Code.jsのスキーマに合わせたシート初期化
5
+ *
6
+ * 実行方法:
7
+ * 1. Apps Scriptエディタで本ファイルを開く
8
+ * 2. 実行したい関数を選択
9
+ * 3. 実行ボタンをクリック
10
+ *
11
+ * 提供関数:
12
+ * - deleteAllSheetsExceptQuestionDB(): QuestionDatabase以外のシートを削除
13
+ * - initializeAllSheets(): 現行スキーマで全シートを初期化
14
+ * - resetAndInitialize(): 削除 + 初期化を一括実行
15
+ *
16
+ * @version 3.0
17
+ * @date 2025-12-20
18
+ */
19
+
20
+ // Note: SPREADSHEET_IDはCode.jsで定義済み
21
+
22
+ /**
23
+ * QuestionDatabase以外の全シートを削除
24
+ *
25
+ * 注意: この操作は取り消せません!
26
+ * QuestionDatabaseシートは保護されます。
27
+ */
28
+ function deleteAllSheetsExceptQuestionDB() {
29
+ try {
30
+ Logger.log('=== シート削除開始(QuestionDatabase以外) ===');
31
+
32
+ const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
33
+ const sheets = spreadsheet.getSheets();
34
+
35
+ Logger.log('現在のシート数: ' + sheets.length);
36
+
37
+ // 保護するシート
38
+ const protectedSheets = ['QuestionDatabase'];
39
+
40
+ // 削除対象シートを収集
41
+ const sheetsToDelete = [];
42
+ for (let i = 0; i < sheets.length; i++) {
43
+ const sheetName = sheets[i].getName();
44
+ if (!protectedSheets.includes(sheetName)) {
45
+ sheetsToDelete.push(sheetName);
46
+ } else {
47
+ Logger.log('✅ 保護: ' + sheetName);
48
+ }
49
+ }
50
+
51
+ // シート削除(最低1シートは残す必要があるため、仮シートを作成)
52
+ if (sheetsToDelete.length === sheets.length) {
53
+ // 全シート削除しようとしている場合、一時シートを作成
54
+ spreadsheet.insertSheet('_temp_');
55
+ Logger.log('一時シート作成(全削除防止)');
56
+ }
57
+
58
+ // 削除実行
59
+ for (let i = 0; i < sheetsToDelete.length; i++) {
60
+ const sheetName = sheetsToDelete[i];
61
+ const sheet = spreadsheet.getSheetByName(sheetName);
62
+ if (sheet) {
63
+ spreadsheet.deleteSheet(sheet);
64
+ Logger.log('❌ 削除: ' + sheetName);
65
+ }
66
+ }
67
+
68
+ Logger.log('\n=== シート削除完了 ===');
69
+ Logger.log('削除したシート: ' + sheetsToDelete.join(', '));
70
+ Logger.log('残りのシート数: ' + spreadsheet.getSheets().length);
71
+
72
+ return { success: true, deleted: sheetsToDelete };
73
+
74
+ } catch (error) {
75
+ Logger.log('\n❌ エラー発生: ' + error.message);
76
+ throw error;
77
+ }
78
+ }
79
+
80
+ /**
81
+ * 現行スキーマで全シートを初期化
82
+ *
83
+ * Code.jsのSHEET_NAMESとgetOrCreateSheet()の定義に基づく
84
+ */
85
+ function initializeAllSheets() {
86
+ try {
87
+ Logger.log('=== シート初期化開始(v3スキーマ) ===');
88
+
89
+ const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
90
+
91
+ // 一時シートがあれば後で削除
92
+ const tempSheet = spreadsheet.getSheetByName('_temp_');
93
+
94
+ // 各シートを初期化
95
+ initializeUsersSheet(spreadsheet);
96
+ initializeSessionsSheet(spreadsheet);
97
+ initializeAnswersSheet(spreadsheet);
98
+ initializeStatisticsSheet(spreadsheet);
99
+ initializeEvaluationsSheet(spreadsheet);
100
+ initializeGeneratedQuestionsSheet(spreadsheet);
101
+ initializeSummariesSheet(spreadsheet);
102
+
103
+ // 一時シートを削除
104
+ if (tempSheet) {
105
+ spreadsheet.deleteSheet(tempSheet);
106
+ Logger.log('一時シート削除');
107
+ }
108
+
109
+ Logger.log('\n=== シート初期化完了 ===');
110
+ Logger.log('次のステップ: Google Sheetsを開いて各シートのヘッダーを確認してください');
111
+
112
+ return { success: true };
113
+
114
+ } catch (error) {
115
+ Logger.log('\n❌ エラー発生: ' + error.message);
116
+ throw error;
117
+ }
118
+ }
119
+
120
+ /**
121
+ * シート削除 + 初期化を一括実行
122
+ */
123
+ function resetAndInitialize() {
124
+ Logger.log('========================================');
125
+ Logger.log('シートリセット&初期化 開始');
126
+ Logger.log('========================================\n');
127
+
128
+ deleteAllSheetsExceptQuestionDB();
129
+
130
+ Logger.log('\n');
131
+
132
+ initializeAllSheets();
133
+
134
+ Logger.log('\n========================================');
135
+ Logger.log('シートリセット&初期化 完了!');
136
+ Logger.log('========================================');
137
+ }
138
+
139
+ // ============================================================================
140
+ // 個別シート初期化関数
141
+ // ============================================================================
142
+
143
+ /**
144
+ * Usersシート初期化
145
+ * スキーマ: user_id, username, created_at, total_sessions, total_questions
146
+ */
147
+ function initializeUsersSheet(spreadsheet) {
148
+ const sheetName = 'Users';
149
+ Logger.log(sheetName + 'シートを初期化中...');
150
+
151
+ let sheet = spreadsheet.getSheetByName(sheetName);
152
+ if (sheet) {
153
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
154
+ return;
155
+ }
156
+
157
+ sheet = spreadsheet.insertSheet(sheetName);
158
+
159
+ const headers = [
160
+ 'user_id',
161
+ 'username',
162
+ 'created_at',
163
+ 'total_sessions',
164
+ 'total_questions'
165
+ ];
166
+
167
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
168
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
169
+
170
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
171
+ }
172
+
173
+ /**
174
+ * Sessionsシート初期化
175
+ * スキーマ: session_id, user_id, subjects, start_time, end_time, total_score, completed
176
+ */
177
+ function initializeSessionsSheet(spreadsheet) {
178
+ const sheetName = 'Sessions';
179
+ Logger.log(sheetName + 'シートを初期化中...');
180
+
181
+ let sheet = spreadsheet.getSheetByName(sheetName);
182
+ if (sheet) {
183
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
184
+ return;
185
+ }
186
+
187
+ sheet = spreadsheet.insertSheet(sheetName);
188
+
189
+ const headers = [
190
+ 'session_id',
191
+ 'user_id',
192
+ 'subjects',
193
+ 'start_time',
194
+ 'end_time',
195
+ 'total_score',
196
+ 'completed'
197
+ ];
198
+
199
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
200
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
201
+
202
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
203
+ }
204
+
205
+ /**
206
+ * Answersシート初期化
207
+ * スキーマ: answer_id, session_id, question_id, subject, category, user_answer, correct_answer, is_correct, time_spent, submitted_at
208
+ *
209
+ * ★重要: v1.6.6で修正されたスキーマ(10列)
210
+ */
211
+ function initializeAnswersSheet(spreadsheet) {
212
+ const sheetName = 'Answers';
213
+ Logger.log(sheetName + 'シートを初期化中...');
214
+
215
+ let sheet = spreadsheet.getSheetByName(sheetName);
216
+ if (sheet) {
217
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
218
+ return;
219
+ }
220
+
221
+ sheet = spreadsheet.insertSheet(sheetName);
222
+
223
+ // v1.6.6で修正されたスキーマ(10列)
224
+ const headers = [
225
+ 'answer_id', // A
226
+ 'session_id', // B
227
+ 'question_id', // C
228
+ 'subject', // D
229
+ 'category', // E
230
+ 'user_answer', // F
231
+ 'correct_answer', // G ★追加
232
+ 'is_correct', // H
233
+ 'time_spent', // I
234
+ 'submitted_at' // J
235
+ ];
236
+
237
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
238
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
239
+
240
+ Logger.log('✅ ' + sheetName + 'シート初期化完了(10列スキーマ)');
241
+ }
242
+
243
+ /**
244
+ * Statisticsシート初期化
245
+ * スキーマ: stat_id, user_id, subject, category, total_attempted, correct_count, accuracy_rate, last_updated
246
+ */
247
+ function initializeStatisticsSheet(spreadsheet) {
248
+ const sheetName = 'Statistics';
249
+ Logger.log(sheetName + 'シートを初期化中...');
250
+
251
+ let sheet = spreadsheet.getSheetByName(sheetName);
252
+ if (sheet) {
253
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
254
+ return;
255
+ }
256
+
257
+ sheet = spreadsheet.insertSheet(sheetName);
258
+
259
+ const headers = [
260
+ 'stat_id',
261
+ 'user_id',
262
+ 'subject',
263
+ 'category',
264
+ 'total_attempted',
265
+ 'correct_count',
266
+ 'accuracy_rate',
267
+ 'last_updated'
268
+ ];
269
+
270
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
271
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
272
+
273
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
274
+ }
275
+
276
+ /**
277
+ * Evaluationsシート初期化
278
+ * スキーマ: evaluation_id, session_id, subject, advice, strengths, weaknesses, recommended_topics, created_at
279
+ */
280
+ function initializeEvaluationsSheet(spreadsheet) {
281
+ const sheetName = 'Evaluations';
282
+ Logger.log(sheetName + 'シートを初期化中...');
283
+
284
+ let sheet = spreadsheet.getSheetByName(sheetName);
285
+ if (sheet) {
286
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
287
+ return;
288
+ }
289
+
290
+ sheet = spreadsheet.insertSheet(sheetName);
291
+
292
+ const headers = [
293
+ 'evaluation_id',
294
+ 'session_id',
295
+ 'subject',
296
+ 'advice',
297
+ 'strengths',
298
+ 'weaknesses',
299
+ 'recommended_topics',
300
+ 'created_at'
301
+ ];
302
+
303
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
304
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
305
+
306
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
307
+ }
308
+
309
+ /**
310
+ * GeneratedQuestionsシート初期化
311
+ * スキーマ: question_id, session_id, subject, genre_id, answer, question_text, choices, correct_answer, difficulty, created_at
312
+ */
313
+ function initializeGeneratedQuestionsSheet(spreadsheet) {
314
+ const sheetName = 'GeneratedQuestions';
315
+ Logger.log(sheetName + 'シートを初期化中...');
316
+
317
+ let sheet = spreadsheet.getSheetByName(sheetName);
318
+ if (sheet) {
319
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
320
+ return;
321
+ }
322
+
323
+ sheet = spreadsheet.insertSheet(sheetName);
324
+
325
+ const headers = [
326
+ 'question_id',
327
+ 'session_id',
328
+ 'subject',
329
+ 'genre_id',
330
+ 'answer',
331
+ 'question_text',
332
+ 'choices',
333
+ 'correct_answer',
334
+ 'difficulty',
335
+ 'created_at'
336
+ ];
337
+
338
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
339
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
340
+
341
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
342
+ }
343
+
344
+ /**
345
+ * Summariesシート初期化
346
+ * スキーマ: summary_id, session_id, subject, keywords, topics, summary, created_at
347
+ */
348
+ function initializeSummariesSheet(spreadsheet) {
349
+ const sheetName = 'Summaries';
350
+ Logger.log(sheetName + 'シートを初期化中...');
351
+
352
+ let sheet = spreadsheet.getSheetByName(sheetName);
353
+ if (sheet) {
354
+ Logger.log('⚠️ ' + sheetName + 'シートは既に存在します。スキップします。');
355
+ return;
356
+ }
357
+
358
+ sheet = spreadsheet.insertSheet(sheetName);
359
+
360
+ const headers = [
361
+ 'summary_id',
362
+ 'session_id',
363
+ 'subject',
364
+ 'keywords',
365
+ 'topics',
366
+ 'summary',
367
+ 'created_at'
368
+ ];
369
+
370
+ sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
371
+ sheet.getRange(1, 1, 1, headers.length).setFontWeight('bold');
372
+
373
+ Logger.log('✅ ' + sheetName + 'シート初期化完了');
374
+ }
375
+
376
+ // ============================================================================
377
+ // テスト関数
378
+ // ============================================================================
379
+
380
+ /**
381
+ * シート一覧を表示(デバッグ用)
382
+ */
383
+ function listAllSheets() {
384
+ const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
385
+ const sheets = spreadsheet.getSheets();
386
+
387
+ Logger.log('=== シート一覧 ===');
388
+ for (let i = 0; i < sheets.length; i++) {
389
+ const sheet = sheets[i];
390
+ const lastRow = sheet.getLastRow();
391
+ const lastCol = sheet.getLastColumn();
392
+ Logger.log((i + 1) + '. ' + sheet.getName() + ' (' + lastRow + '行 x ' + lastCol + '列)');
393
+
394
+ // ヘッダー行を表示
395
+ if (lastCol > 0) {
396
+ const headers = sheet.getRange(1, 1, 1, lastCol).getValues()[0];
397
+ Logger.log(' ヘッダー: ' + headers.join(', '));
398
+ }
399
+ }
400
+ Logger.log('=== 合計: ' + sheets.length + 'シート ===');
401
+ }
V1.8.1/knowledge/v1.8.1/QuestionDatabase.csv ADDED
The diff for this file is too large to render. See raw diff
 
V1.8.1/knowledge/v1.8.1/jp/JP01.json ADDED
@@ -0,0 +1,702 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP01_001",
4
+ "answer": "補う",
5
+ "question_hint": "【漢字書き取り】「足りない分を足す」という意味の語。部首のミス(ネとネの違い)に注意させる問題。",
6
+ "difficulty": "標準",
7
+ "source_context": "読みは「おぎなう」。部首は「衣(ころもへん)」であり、「ネ(しめすへん)」ではない点に注意。衣の破れを繕う(つくろう)ことからできた字であるという由来に基づき、正しく書かせる。"
8
+ },
9
+ {
10
+ "answer_id": "JP01_002",
11
+ "answer": "貸す",
12
+ "question_hint": "【漢字書き取り】対義語「借りる」との混同や、「貨」「賃」などの似た漢字との書き分けを確認する問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "読みは「かす」。対義語は「借りる」。下の部分が「貝」であること、また「貨(貨物)」や「賃(賃金)」と混同しないよう区別させる。"
15
+ },
16
+ {
17
+ "answer_id": "JP01_003",
18
+ "answer": "規模",
19
+ "question_hint": "【漢字書き取り】熟語「全国規模」などの語彙。「規」の右側のつくりが「見」であることを徹底する問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "読みは「きぼ」。「規」の右側は「見」であり「貝」ではない。「模」は「模様」「模造」の音読み「モ」であることをセットで提示し、正確な字形を求める。"
22
+ },
23
+ {
24
+ "answer_id": "JP01_004",
25
+ "answer": "意外",
26
+ "question_hint": "【同音異義語】「予想外」という意味と「それ以外」という意味の使い分けを問う問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "「意外(いがい)」は「予想もしなかったこと」。「以外(いがい)」は「それを除くほかのもの」。文脈(「食べてみたら○○においしかった」等)から選択させる。"
29
+ },
30
+ {
31
+ "answer_id": "JP01_005",
32
+ "answer": "検討",
33
+ "question_hint": "【漢字書き取り】「よく調べて考える」という意味。同音の「険」との混同を避ける問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "読みは「けんとう」。「検」を「険(険しい)」と書かないように注意させる。「検査」「点検」と同じ「検」であることを根拠とする。"
36
+ },
37
+ {
38
+ "answer_id": "JP01_006",
39
+ "answer": "対象",
40
+ "question_hint": "【同音異義語】「目的となるもの」「照らし合わせる」「つり合い」の3つの「たいしょう」の書き分け。",
41
+ "difficulty": "応用",
42
+ "source_context": "「対象」:目的(例:小学生が対象)。「対照」:比べる(例:二つを対照させる)。「対称」:つり合い(例:左右対称)。この3つの定義の違いを明確にして作問する。"
43
+ },
44
+ {
45
+ "answer_id": "JP01_007",
46
+ "answer": "招く",
47
+ "question_hint": "【漢字書き取り】「招待する」または「結果を引き起こす」という意味。似た字(昭・召)との判別。",
48
+ "difficulty": "標準",
49
+ "source_context": "読みは「まねく」。偏は「手(てへん)」。「昭(昭和)」や「召(召し上がる)」と混同しやすい点に注意を促す。"
50
+ },
51
+ {
52
+ "answer_id": "JP01_008",
53
+ "answer": "関心",
54
+ "question_hint": "【同音異義語】「興味をもつ(関心)」と「深く感ずる(感心)」の使い分けを問う問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "「関心」:興味(例:歴史に関心がある)。「感心」:感服(例:勇気ある行動に感心する)。文脈により「門がまえ」か「心」を含む漢字かを選択させる。"
57
+ },
58
+ {
59
+ "answer_id": "JP01_009",
60
+ "answer": "縦断",
61
+ "question_hint": "【漢字書き取り】「南北に貫く」という意味。対義語「横断」との関連で出題。",
62
+ "difficulty": "標準",
63
+ "source_context": "読みは「じゅうだん」。偏は「糸(いとへん)」。対義語「横断(おうだん)」とセットで覚え、漢字の構成(糸と米の組み合わせ)を正しく書かせる。"
64
+ },
65
+ {
66
+ "answer_id": "JP01_010",
67
+ "answer": "勤める",
68
+ "question_hint": "【同訓異字】「働く(勤める)」「力を尽くす(努める)」「役目を担う(務める)」の3種の使い分け。",
69
+ "difficulty": "標準",
70
+ "source_context": "「勤める」:勤務(例:市役所に勤める)。「努める」:努力(例:解決に努める)。「務める」:役目(例:司会を務める)。それぞれの意味的背景を文脈から判断させる。"
71
+ },
72
+ {
73
+ "answer_id": "JP01_011",
74
+ "answer": "成就",
75
+ "question_hint": "【漢字読み取り】「願いが叶う」という意味。常用外に近い特殊な音読みを確認する問題。",
76
+ "difficulty": "応用",
77
+ "source_context": "正解は「じょうじゅ」。「就」を「ジュ」と読む非常に稀な例であることを強調する(通常は「シュウ」:就職)。読み取り問題として難易度が高い。"
78
+ },
79
+ {
80
+ "answer_id": "JP01_012",
81
+ "answer": "厳か",
82
+ "question_hint": "【漢字読み取り】「厳しい」と同じ漢字を用いた異なる訓読み(送り仮名による区別)。",
83
+ "difficulty": "標準",
84
+ "source_context": "正解は「おごそか」。送り仮名が「〜か」であれば「おごそか」、「〜しい」であれば「きびしい」と読み分けるルールを提示する。"
85
+ },
86
+ {
87
+ "answer_id": "JP01_013",
88
+ "answer": "延びる",
89
+ "question_hint": "【漢字書き取り】「時間や期間が長くなる」という意味。偏の書き間違いに注意。",
90
+ "difficulty": "標準",
91
+ "source_context": "読みは「のびる」。部首は「えんにょう(いんにょう)」。正しく「延」を書かせる。「のばす」「のべる」という訓もある。"
92
+ },
93
+ {
94
+ "answer_id": "JP01_014",
95
+ "answer": "能率",
96
+ "question_hint": "【漢字書き取り】「効率よく進める」という意味。似た字「卒」との判別。",
97
+ "difficulty": "標準",
98
+ "source_context": "読みは「のうりつ」。「率」の字の形が「卒(卒業)」と似ているため、上の部分を正しく「玄」を崩した形で書くよう指導する。"
99
+ },
100
+ {
101
+ "answer_id": "JP01_015",
102
+ "answer": "暖かい",
103
+ "question_hint": "【同訓異字】「気温(暖かい)」と「水温・体温・心(温かい)」の使い分けを問う問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "「暖かい」:気温(例:暖かい春の日)。「温かい」:温度・感情(例:温かいごはん、温かい心)。文脈の対象が「空気」か「物体・心」かを判別させる。"
106
+ },
107
+ {
108
+ "answer_id": "JP01_016",
109
+ "answer": "治める",
110
+ "question_hint": "【同訓異字】「統治(治める)」「納税(納める)」「習得(修める)」「収穫(収める)」の4種の使い分け。",
111
+ "difficulty": "応用",
112
+ "source_context": "「治める」:統治・鎮める。「納める」:渡す(税・金)。「修める」:学ぶ(学問・身)。「収める」:入れる(成功・収穫)。4つの漢字の使い分けを例文で確認させる。"
113
+ },
114
+ {
115
+ "answer_id": "JP01_017",
116
+ "answer": "会心",
117
+ "question_hint": "【同音異義語】「満足すること(会心)」と「心を入れ替える(改心)」の使い分け。",
118
+ "difficulty": "標準",
119
+ "source_context": "「会心」:満足(例:会心の出来)。「改心」:悔い改める(例:改心して働く)。特に「会心の笑み(思わずニッコリ笑う)」の用法を強調する。"
120
+ },
121
+ {
122
+ "answer_id": "JP01_018",
123
+ "answer": "成績",
124
+ "question_hint": "【漢字書き取り】「結果としての点数」などの語。同音の「積」との書き分け。",
125
+ "difficulty": "標準",
126
+ "source_context": "読みは「せいせき」。「績」を「積(面積)」と書かないよう注意。「績」は業績・功績など仕事の結果、「積」は面積・体積など積み重なった量という区別を教える。"
127
+ },
128
+ {
129
+ "answer_id": "JP01_019",
130
+ "answer": "志す",
131
+ "question_hint": "【送り仮名】「心に決める」という意味の語。送り仮名の位置と名詞形との違い。",
132
+ "difficulty": "標準",
133
+ "source_context": "書きは「志す(こころざす)」。名詞は「志(こころざし)」で送り仮名はつかない。動詞の場合は「す」を出す点に注目させる。"
134
+ },
135
+ {
136
+ "answer_id": "JP01_020",
137
+ "answer": "構築",
138
+ "question_hint": "【漢字書き取り】「土台を築く」などの意味。「築」の筆順と部首の注意。",
139
+ "difficulty": "応用",
140
+ "source_context": "「築く(きずく)」、音読みは「チク」。部首は「木」ではなく「竹」であること、また筆順が複雑なため、正確な字形を再現させる。"
141
+ },
142
+ {
143
+ "answer_id": "JP01_021",
144
+ "answer": "意義",
145
+ "question_hint": "【同音異義語】「価値(意義)」、「反対意見(異議)」、「別の意味(異義)」の三種使い分け。",
146
+ "difficulty": "応用",
147
+ "source_context": "「意義」:価値(例:参加することに意義がある)。「異議」:反対意見(例:決定に異議を唱える)。「異義」:別の意味(例:同音異義語)。文脈判断を重視する。"
148
+ },
149
+ {
150
+ "answer_id": "JP01_022",
151
+ "answer": "印象",
152
+ "question_hint": "【漢字書き取り】「心に残る感じ」という意味。似た字「像」との混同を避ける問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "読みは「いんしょう」。「象」を「像(仏像)」と書かないよう注意。「象」は形そのものやゾウ、「像」は人や物に似せて作った像という使い分けがある。"
155
+ },
156
+ {
157
+ "answer_id": "JP01_023",
158
+ "answer": "異口同音",
159
+ "question_hint": "【四字熟語読み取り】「多くの人が同じことを言う」という意味の語。読みと構成の理解。",
160
+ "difficulty": "標準",
161
+ "source_context": "正解は「いくどうおん」。各漢字の意味(異なる口が同じ音を出す)と読みの正確さを問う。"
162
+ },
163
+ {
164
+ "answer_id": "JP01_024",
165
+ "answer": "衛生",
166
+ "question_hint": "【同音異義語】「清潔(衛生)」と「星の周りの星(衛星)」の使い分け。",
167
+ "difficulty": "基本",
168
+ "source_context": "「衛生」:健康(例:衛生面に注意する)。「衛星」:星(例:人工衛星)。意味の違いから漢字を選択させる。"
169
+ },
170
+ {
171
+ "answer_id": "JP01_025",
172
+ "answer": "追求",
173
+ "question_hint": "【同音異義語】「利益・理想(追求)」、「責任・犯人(追及)」、「真理・本質(追究)」の三種使い分け。",
174
+ "difficulty": "応用",
175
+ "source_context": "「追求」:追い求める(例:利益の追求)。「追及」:問いつめる(例:責任の追及)。「追究」:究める(例:真理の追究)。目的語による使い分けがポイント。"
176
+ },
177
+ {
178
+ "answer_id": "JP01_026",
179
+ "answer": "図る",
180
+ "question_hint": "【同訓異字】「計る」「測る」「量る」「図る」の4種の使い分け。",
181
+ "difficulty": "標準",
182
+ "source_context": "「計る」:時間・程度。「測る」:長さ・広さ・深さ。「量る」:重さ・かさ。「図る」:計画(例:マナーの向上を図る)。計測対象による漢字の選択。"
183
+ },
184
+ {
185
+ "answer_id": "JP01_027",
186
+ "answer": "幼い",
187
+ "question_hint": "【送り仮名】「子供である」という意味。よくある送り仮名の誤り「幼ない」を訂正させる問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "正解は「幼い(おさない)」。送り仮名を「ない」まで出さず、「い」のみ出す点を強調する。音読みは「ヨウ」(幼児)。"
190
+ },
191
+ {
192
+ "answer_id": "JP01_028",
193
+ "answer": "改める",
194
+ "question_hint": "【漢字書き取り】「新しくする」「直す」という意味。偏の書きミスに注意。",
195
+ "difficulty": "標準",
196
+ "source_context": "読みは「あらためる」。偏は「己」に似るが、筆順に注意して「改」と書かせる。「改革」「改善」の「改」。"
197
+ },
198
+ {
199
+ "answer_id": "JP01_029",
200
+ "answer": "初",
201
+ "question_hint": "【部首名】「初めて」の「初」の部首を特定させる問題。間違いやすい「衣」との区別。",
202
+ "difficulty": "応用",
203
+ "source_context": "「初」の部首は「刀(かたな)」。偏の部分が「衣(ころもへん)」に見えるが、実は刀が部首である。理由:布を切り始めることから。「刀」を部首と答える必要がある。"
204
+ },
205
+ {
206
+ "answer_id": "JP01_030",
207
+ "answer": "窓",
208
+ "question_hint": "【部首名】「まど」の漢字の部首。成り立ちをヒントに特定させる。",
209
+ "difficulty": "標準",
210
+ "source_context": "「窓」の部首は「穴(あなかんむり)」。家に穴をあけて通気や採光を確保したことに由来することを解説し、「穴」を正解とする。"
211
+ },
212
+ {
213
+ "answer_id": "JP01_031",
214
+ "answer": "快方",
215
+ "question_hint": "【同音異義語】「病気が良くなる(快方)」と「自由にする(開放・解放)」の使い分け。",
216
+ "difficulty": "標準",
217
+ "source_context": "「快方」:回復(例:病気が快方に向かう)。「開放」:開け放つ。「解放」:自由にする。病状については「快い(こころよい)」という字を使うことを根拠とする。"
218
+ },
219
+ {
220
+ "answer_id": "JP01_032",
221
+ "answer": "縦横",
222
+ "question_hint": "【漢字読み取り】「縦と横」または「自由自在」という意味の語。読みを確認。",
223
+ "difficulty": "標準",
224
+ "source_context": "正解は「じゅうおう」。四字熟語「縦横無尽」などの文脈で使用される。訓読み(たてよこ)との混同に注意。"
225
+ },
226
+ {
227
+ "answer_id": "JP01_033",
228
+ "answer": "竹刀",
229
+ "question_hint": "【特別な読み】剣道で使う道具。熟字訓の読み。",
230
+ "difficulty": "標準",
231
+ "source_context": "正解は「しない」。漢字それぞれの読みからは推測できない特別な読み(熟字訓)として記憶させる。"
232
+ },
233
+ {
234
+ "answer_id": "JP01_034",
235
+ "answer": "体裁",
236
+ "question_hint": "【漢字読み取り】「見た目・世間体」という意味。珍しい音読みを問う。",
237
+ "difficulty": "応用",
238
+ "source_context": "正解は「ていさい」。「体」を「テイ」と読む稀な例(他には風体など)を正確に答えさせる。"
239
+ },
240
+ {
241
+ "answer_id": "JP01_035",
242
+ "answer": "謝る",
243
+ "question_hint": "【同訓異字】「謝罪(謝る)」と「間違い(誤る)」の使い分け。送り仮名にも注目。",
244
+ "difficulty": "基本",
245
+ "source_context": "「謝る」:わびる(例:素直に謝る)。「誤る」:間違い(例:操作を誤る)。どちらも送り仮名は「る」のみであることをセットで教える。"
246
+ },
247
+ {
248
+ "answer_id": "JP01_036",
249
+ "answer": "断つ",
250
+ "question_hint": "【同訓異字】「切り離す・やめる(断つ)」と「関係をなくす(絶つ)」の使い分け。",
251
+ "difficulty": "応用",
252
+ "source_context": "「断つ」:ひと続きのものを切る、何かをやめる(例:酒を断つ)。「絶つ」:つながりをなくす(例:連絡を絶つ)。文脈により、継続を否定するか分離するかを判断させる。"
253
+ },
254
+ {
255
+ "answer_id": "JP01_037",
256
+ "answer": "一対",
257
+ "question_hint": "【漢字読み取り】「一組」という意味。特殊な読み。",
258
+ "difficulty": "標準",
259
+ "source_context": "正解は「いっつい」。「対」を「ツイ」と読む点、および「一」が促音化する点に注意させる。"
260
+ },
261
+ {
262
+ "answer_id": "JP01_038",
263
+ "answer": "出納",
264
+ "question_hint": "【特別な読み】「出し入れ」という意味の語。両方の字が特殊な読み。",
265
+ "difficulty": "応用",
266
+ "source_context": "正解は「すいとう」。「出(スイ)」も「納(トウ)」もこの熟語に特有の読み方であることを明示し、正確に答えさせる。"
267
+ },
268
+ {
269
+ "answer_id": "JP01_039",
270
+ "answer": "潔い",
271
+ "question_hint": "【漢字読み取り】「思い切りがよい」という意味の形容詞。読みと送り仮名。",
272
+ "difficulty": "標準",
273
+ "source_context": "正解は「いさぎよい」。送り仮名「〜よい」に注目させ、正確な訓読みを求める。"
274
+ },
275
+ {
276
+ "answer_id": "JP01_040",
277
+ "answer": "態",
278
+ "question_hint": "【漢字書き取り】「態度」「事態」の「たい」。下の部分の「心」を忘れさせない。",
279
+ "difficulty": "標準",
280
+ "source_context": "読みは「たい」。上の部分は「能」に似ているが、正確に「態」と書き、下の「心」を落とさないよう指導する。"
281
+ },
282
+ {
283
+ "answer_id": "JP01_041",
284
+ "answer": "精進",
285
+ "question_hint": "【漢字読み取り】「一生懸命励む」という意味。仏教由来の特別な音読み。",
286
+ "difficulty": "応用",
287
+ "source_context": "正解は「しょうじん」。通常「セイ(精神)」と読む「精」を「ショウ」、「シン(進歩)」と読む「進」を「ジン」と読む特殊な例。"
288
+ },
289
+ {
290
+ "answer_id": "JP01_042",
291
+ "answer": "未定",
292
+ "question_hint": "【熟語構成】打ち消しの漢字「未」の選択。対義語「既定」との対比。",
293
+ "difficulty": "基本",
294
+ "source_context": "「未(まだ〜ない)」+「定(きまる)」。まだ決まっていない状態を表す。他の打ち消し字(不・無・非)との意味の違い(未は時間的猶予を含む)を理解させる。"
295
+ },
296
+ {
297
+ "answer_id": "JP01_043",
298
+ "answer": "無愛想",
299
+ "question_hint": "【特別な読み】「そっけない」という意味の語。最初の文字の読み。",
300
+ "difficulty": "標準",
301
+ "source_context": "正解は「ぶあいそう」。「無」を「ム」ではなく「ブ」と読む点に注意。不作法、無礼(ぶれい)などと同様の読みのパターン。"
302
+ },
303
+ {
304
+ "answer_id": "JP01_044",
305
+ "answer": "支度",
306
+ "question_hint": "【漢字読み取り】「準備」という意味の語。読みの正確性。",
307
+ "difficulty": "基本",
308
+ "source_context": "正解は「したく」。特に「度」を「タク」と読む点(通常はド・ト)に注目させる。「仕度」とも書く。"
309
+ },
310
+ {
311
+ "answer_id": "JP01_045",
312
+ "answer": "重宝",
313
+ "question_hint": "ed【漢字読み取り】「便利で役立つ」という意味。読みの特殊性。",
314
+ "difficulty": "標準",
315
+ "source_context": "正解は「ちょうほう」。「重」を「ジョウ」ではなく「チョウ」、「宝」を「ホウ」と読む。貴重(きちょう)と同様の読みの系譜。"
316
+ },
317
+ {
318
+ "answer_id": "JP01_046",
319
+ "answer": "日和",
320
+ "question_hint": "【特別な読み】「好都合な天気」という意味。熟字訓���",
321
+ "difficulty": "標準",
322
+ "source_context": "正解は「ひより」。個別の字の読み(ひ・わ等)を繋げても読めない熟字訓の代表例として扱わせる。"
323
+ },
324
+ {
325
+ "answer_id": "JP01_047",
326
+ "answer": "強情",
327
+ "question_hint": "【漢字読み取り】「わがまま」という意味の語。読みの正確性。",
328
+ "difficulty": "標準",
329
+ "source_context": "正解は「ごうじょう」。「強」を「キョウ」ではなく「ゴウ」と濁って読む点に注意(強引と同様の読み)。"
330
+ },
331
+ {
332
+ "answer_id": "JP01_048",
333
+ "answer": "経る",
334
+ "question_hint": "【漢字読み取り/活用】「時間が過ぎる」という意味。送り仮名と活用形式。",
335
+ "difficulty": "応用",
336
+ "source_context": "正解は「へる」。下一段活用(経ない、経ます)であることに対し、減る(へる:五段活用)との活用の違いを意識させる(減らない・経ない)。"
337
+ },
338
+ {
339
+ "answer_id": "JP01_049",
340
+ "answer": "自ら",
341
+ "question_hint": "【送り仮名】「自分で」という意味の副詞的な用法。",
342
+ "difficulty": "標準",
343
+ "source_context": "正解は「みずから」。送り仮名は「ら」のみ。「自」を訓読みで「みずか」と読む特殊な例として覚えさせる。"
344
+ },
345
+ {
346
+ "answer_id": "JP01_050",
347
+ "answer": "空ける",
348
+ "question_hint": "【同訓異字】「開ける」「空ける」「明ける」の3種の使い分け。",
349
+ "difficulty": "標準",
350
+ "source_context": "「開ける」:扉・蓋。「空ける」:空(から)にする、不在にする(例:席を空ける)。「明ける」:時間が経過する(例:夜が明ける)。対象が「空間の隙間・不在」なら「空」を用いる。"
351
+ },
352
+ {
353
+ "answer_id": "JP01_051",
354
+ "answer": "素直",
355
+ "question_hint": "【漢字読み取り】「従順」という意味の語。読みの特定。",
356
+ "difficulty": "基本",
357
+ "source_context": "正解は「すなお」。通常「ス」と読むのは素顔・素手など特定の語に限られるため、質素(シッソ)などとの読みの違いを確認させる。"
358
+ },
359
+ {
360
+ "answer_id": "JP01_052",
361
+ "answer": "和む",
362
+ "question_hint": "【漢字読み取り】「心が安らぐ」という意味の訓読み。",
363
+ "difficulty": "標準",
364
+ "source_context": "正解は「なごむ」。「和」には多くの訓(やわらぐ、なごやか等)があるが、送り仮名「〜む」により「なごむ」を特定させる。"
365
+ },
366
+ {
367
+ "answer_id": "JP01_053",
368
+ "answer": "小豆",
369
+ "question_hint": "【特別な読み】植物の名前。熟字訓。",
370
+ "difficulty": "標準",
371
+ "source_context": "正解は「あずき」。通常の音訓(ショウ・ズ)からは読めない特別な読みとして覚えさせる。"
372
+ },
373
+ {
374
+ "answer_id": "JP01_054",
375
+ "answer": "危うい",
376
+ "question_hint": "【送り仮名】「危ない」との送り仮名による読み分け。",
377
+ "difficulty": "標準",
378
+ "source_context": "書きは「危うい(あやうい)」。もし「危ない」なら「あぶない」。同じ漢字で送り仮名によって読みが大きく変わる典型例。"
379
+ },
380
+ {
381
+ "answer_id": "JP01_055",
382
+ "answer": "行脚",
383
+ "question_hint": "【漢字読み取り】「各地を旅する」という意味。仏教由来の読み。",
384
+ "difficulty": "応用",
385
+ "source_context": "正解は「あんぎゃ」。「行」を「アン」と読む数少ない例。「脚」を「ギャ」と読む点もあわせて指導する。"
386
+ },
387
+ {
388
+ "answer_id": "JP01_056",
389
+ "answer": "田舎",
390
+ "question_hint": "【特別な読み】「地方」という意味の語。熟字訓。",
391
+ "difficulty": "基本",
392
+ "source_context": "正解は「いなか」。日常語でありながら、漢字それぞれの読みを無視した熟字訓であることを確認させる。"
393
+ },
394
+ {
395
+ "answer_id": "JP01_057",
396
+ "answer": "会得",
397
+ "question_hint": "【漢字読み取り】「理解して身につける」という意味の語。読みの正確性。",
398
+ "difficulty": "標準",
399
+ "source_context": "正解は「えとく」。「会」を「カイ」ではなく「エ」と読む。会釈(えしゃく)と同様の読みのパターン。"
400
+ },
401
+ {
402
+ "answer_id": "JP01_058",
403
+ "answer": "往生",
404
+ "question_hint": "【漢字読み取り】「死ぬこと」または「困り果てること」という意味の語。読みの特定。",
405
+ "difficulty": "標準",
406
+ "source_context": "正解は「おうじょう」。「生」を「ショウ」と読む(誕生など)のではなく、仏教用語由来で「ジョウ」と読む点に注目。"
407
+ },
408
+ {
409
+ "answer_id": "JP01_059",
410
+ "answer": "路",
411
+ "question_hint": "【漢字読み取り】「家路」「旅路」���「じ」。特殊な訓読み。",
412
+ "difficulty": "標準",
413
+ "source_context": "正解は「じ」。通常は「ロ」と音読みするが、特定の語で「じ」という訓読みを持つことを「家路(いえじ)」を例に答えさせる。"
414
+ },
415
+ {
416
+ "answer_id": "JP01_060",
417
+ "answer": "背",
418
+ "question_hint": "【同訓異字】「背中・身長(せ・せい)」と「命令にそむく(背く)」の使い分け。",
419
+ "difficulty": "標準",
420
+ "source_context": "書きは「背く(そむく)」。体の一部を表す場合は「せ・せい」、反抗する場合は「そむく」と読み分ける。"
421
+ },
422
+ {
423
+ "answer_id": "JP01_061",
424
+ "answer": "直筆",
425
+ "question_hint": "【漢字読み取り】「本人が書いた」という意味。特定の読み。",
426
+ "difficulty": "標準",
427
+ "source_context": "正解は「じきひつ」。「直」を「チョク(直接)」ではなく「ジキ(正直・直筆)」と読むパターンを確認させる。"
428
+ },
429
+ {
430
+ "answer_id": "JP01_062",
431
+ "answer": "閉口",
432
+ "question_hint": "【漢字読み取り】「困り果てる」という意味の語。読みと意味の理解。",
433
+ "difficulty": "標準",
434
+ "source_context": "正解は「へいこう」。言葉に詰まって口が閉じることに由来。音読みの正確さを問う。"
435
+ },
436
+ {
437
+ "answer_id": "JP01_063",
438
+ "answer": "預金",
439
+ "question_hint": "【漢字書き取り】「お金を預ける」という意味。偏の正確性。",
440
+ "difficulty": "基本",
441
+ "source_context": "読みは「よきん」。偏の部分は「予」であり、似た字と混同しないように書かせる。訓読みは「あずける」。"
442
+ },
443
+ {
444
+ "answer_id": "JP01_064",
445
+ "answer": "激痛",
446
+ "question_hint": "【漢字書き取り】「激しい痛み」。複雑な字形を確認。",
447
+ "difficulty": "標準",
448
+ "source_context": "読みは「げきつう」。「激」のさんずいと右側の複雑な構成、および「痛」のやまいだれの中身を正確に書かせる。"
449
+ },
450
+ {
451
+ "answer_id": "JP01_065",
452
+ "answer": "混乱",
453
+ "question_hint": "【漢字書き取り】「入り乱れる」という意味。両方の漢字を正確に書かせる。",
454
+ "difficulty": "標準",
455
+ "source_context": "読みは「こんらん」。「混」のさんずいと「乱」のつくりの形に注意を促し、熟語として完成させる。"
456
+ },
457
+ {
458
+ "answer_id": "JP01_066",
459
+ "answer": "授受",
460
+ "question_hint": "【熟語構成】「授ける」と「受ける」の反対の意味の組み合わせ。",
461
+ "difficulty": "標準",
462
+ "source_context": "読みは「じゅじゅ」。受け渡しを意味する。「授」に「手(てへん)」があることを忘れさせない(授ける=手を差し出すイメージ)。"
463
+ },
464
+ {
465
+ "answer_id": "JP01_067",
466
+ "answer": "脳",
467
+ "question_hint": "【漢字書き取り】「頭脳」の「のう」。偏の区別を問う問題。",
468
+ "difficulty": "標準",
469
+ "source_context": "読みは「のう」。部首は「月(にくづき)」。形の似ている「悩(なやむ:りっしんべん)」と混同させないよう、体の一部であることを強調する。"
470
+ },
471
+ {
472
+ "answer_id": "JP01_068",
473
+ "answer": "通貨",
474
+ "question_hint": "【漢字書き取り】「お金」という意味。似た漢字(貸・資)との区別。",
475
+ "difficulty": "標準",
476
+ "source_context": "読みは「つうか」。「貨」を「貸(かす)」や「資(しりょう)」と書き間違えないよう、貨物・金貨の「貨」であることを意識させる。"
477
+ },
478
+ {
479
+ "answer_id": "JP01_069",
480
+ "answer": "統計",
481
+ "question_hint": "【漢字書き取り】「数値をまとめる」という意味。偏とつくりの構成。",
482
+ "difficulty": "標準",
483
+ "source_context": "読みは「とうけい」。「統」の糸偏と右側の「充」に似た形を正確に書かせる。伝統・統一の「統」。"
484
+ },
485
+ {
486
+ "answer_id": "JP01_070",
487
+ "answer": "脳裏",
488
+ "question_hint": "【漢字読み取り】「頭の中」という意味の語。読みの正確性。",
489
+ "difficulty": "応用",
490
+ "source_context": "正解は「のうり」。「裏」を「リ」と音読みする数少ない熟語(表裏など)として覚えさせる。"
491
+ },
492
+ {
493
+ "answer_id": "JP01_071",
494
+ "answer": "複数",
495
+ "question_hint": "【漢字書き取り】「二つ以上」という意味。対義語「単数」を意識。",
496
+ "difficulty": "基本",
497
+ "source_context": "読みは「ふくすう」。偏は「衣(ころもへん)」であり、間違いやすい「示(しめすへん)」としないよう徹底する。"
498
+ },
499
+ {
500
+ "answer_id": "JP01_072",
501
+ "answer": "保証",
502
+ "question_hint": "【同音異義語】「請け負う(保証)」、「保護する(保障)」、「償う(補償)」の三種使い分け。",
503
+ "difficulty": "応用",
504
+ "source_context": "「保証」:確かだと請け合う(例:味が保証される)。「保障」:守る(例:社会保障)。「補償」:埋め合わせる(例:損害補償)。文脈から正確な熟語を選ばせる。"
505
+ },
506
+ {
507
+ "answer_id": "JP01_073",
508
+ "answer": "易しい",
509
+ "question_hint": "【同訓異字】「易しい(簡単)」と「優しい(親切)」の使い分け。",
510
+ "difficulty": "基本",
511
+ "source_context": "「易しい」:たやすい(例:計算問題)。「優しい」:思いやり(例:優しい性格)。平易、安易の「易」を使うことを根拠とする。"
512
+ },
513
+ {
514
+ "answer_id": "JP01_074",
515
+ "answer": "支度",
516
+ "question_hint": "【漢字書き取り】「用意」という意味の語。別表記(仕度)との区別。",
517
+ "difficulty": "標準",
518
+ "source_context": "読みは「したく」。一般的には「支度」と書くが、「仕度」も正解。送り仮名がない名詞形として書かせる。"
519
+ },
520
+ {
521
+ "answer_id": "JP01_075",
522
+ "answer": "純真",
523
+ "question_hint": "【漢字書き取り】「汚れがない」という意味の語。似た言葉(純心)との混同。",
524
+ "difficulty": "標準",
525
+ "source_context": "読みは「じゅんしん」。熟語として「純心」と書かないよう注意を促し、真心の「真」を用いることを正確に書かせる。"
526
+ },
527
+ {
528
+ "answer_id": "JP01_076",
529
+ "answer": "損なう",
530
+ "question_hint": "【漢字読み取り】「傷つける・失う」という意味の訓読み。",
531
+ "difficulty": "標準",
532
+ "source_context": "正解は「そこなう」。「そこ・ねる」という訓もあるが、送り仮名「〜なう」により「そこなう」を答えさせる。"
533
+ },
534
+ {
535
+ "answer_id": "JP01_077",
536
+ "answer": "境内",
537
+ "question_hint": "【特別な読み】「寺社の敷地内」という意味の語。特定の読み。",
538
+ "difficulty": "標準",
539
+ "source_context": "正解は「けいだい」。「境」を「ケイ」、「内」を「ダイ」と読む特殊なパターン。内裏(だいり)などと同様の読み。"
540
+ },
541
+ {
542
+ "answer_id": "JP01_078",
543
+ "answer": "是正",
544
+ "question_hint": "【漢字読み取り】「悪い点を直す」という意味の語。読みと意味。",
545
+ "difficulty": "応用",
546
+ "source_context": "正解は「ぜせい」。正しい方向へ正すという意味。音読みの「ゼ」と「セイ」を正確に答えさせる。"
547
+ },
548
+ {
549
+ "answer_id": "JP01_079",
550
+ "answer": "皮革",
551
+ "question_hint": "【漢字読み取り】「かわ」製品を表す語。両方の字の音読み。",
552
+ "difficulty": "標準",
553
+ "source_context": "正解は「ひかく」。どちらも訓は「かわ」だが、音読みで「ヒ」と「カク」になる。正確な音読みの知識を問う。"
554
+ },
555
+ {
556
+ "answer_id": "JP01_080",
557
+ "answer": "繁盛",
558
+ "question_hint": "【漢字読み取り】「にぎわう」という意味の語。読みの正確性。",
559
+ "difficulty": "標準",
560
+ "source_context": "正解は「はんじょう」。「盛」には「セイ(盛大)」と「ジョウ(繁盛)」があるが、この語では「ジョウ」と読むことを答えさせる。"
561
+ },
562
+ {
563
+ "answer_id": "JP01_081",
564
+ "answer": "巧妙",
565
+ "question_hint": "【漢字読み取り】「やり方がうまい」という意味。読みと構成。",
566
+ "difficulty": "基本",
567
+ "source_context": "正解は「こうみょう」。「巧(こう)」と「妙(みょう)」の音読み。巧みな(たくみな)という訓もあわせて提示する。"
568
+ },
569
+ {
570
+ "answer_id": "JP01_082",
571
+ "answer": "承る",
572
+ "question_hint": "【漢字読み取り】「受ける・聞く」の謙譲語。送り仮名と特殊な訓読み。",
573
+ "difficulty": "応用",
574
+ "source_context": "正解は「うけたまわる」。非常に長い訓読みを正確に再現させる。音読みは「ショウ(承諾)」。"
575
+ },
576
+ {
577
+ "answer_id": "JP01_083",
578
+ "answer": "解熱",
579
+ "question_hint": "【漢字読み取り】「熱を下げる」という意味。特定の読み。",
580
+ "difficulty": "標準",
581
+ "source_context": "正解は「げねつ」。「解」を「カイ」ではなく「ゲ(解毒・解脱と同様)」と濁って読むパターンを確認する。"
582
+ },
583
+ {
584
+ "answer_id": "JP01_084",
585
+ "answer": "和らぐ",
586
+ "question_hint": "【漢字読み取り】「寒さや緊張が緩む」という意味の訓読み。",
587
+ "difficulty": "標準",
588
+ "source_context": "正解は「やわらぐ」。送り仮名「〜らぐ」により特定させる。「和む(なごむ)」との読み分けが必要。"
589
+ },
590
+ {
591
+ "answer_id": "JP01_085",
592
+ "answer": "朗らか",
593
+ "question_hint": "【漢字読み取り】「性格が明るい」という意味の形容動詞の語幹読み。",
594
+ "difficulty": "標準",
595
+ "source_context": "正解は「ほがらか」。音読みは「ロウ(朗読)」。送り仮名「〜らか」により訓読みを答えさせる。"
596
+ },
597
+ {
598
+ "answer_id": "JP01_086",
599
+ "answer": "都合",
600
+ "question_hint": "【漢字読み取り】「状況・予定」という意味の語。特定の読み。",
601
+ "difficulty": "基本",
602
+ "source_context": "正解は「つごう」。「都」を「ト」ではなく「ツ(都度、都合と同様)」と読む点を確認する。"
603
+ },
604
+ {
605
+ "answer_id": "JP01_087",
606
+ "answer": "定規",
607
+ "question_hint": "【特別な読み】長さを測る道具。特殊な読み方。",
608
+ "difficulty": "基本",
609
+ "source_context": "正解は「じょうぎ」。「定」を「ジョウ」と読む(案の定と同様のパターン)点を特定させる。"
610
+ },
611
+ {
612
+ "answer_id": "JP01_088",
613
+ "answer": "利益",
614
+ "question_hint": "【漢字読み取り】「もうけ」という意味の語。読みと対義語。",
615
+ "difficulty": "基本",
616
+ "source_context": "正解は「りえき」。対義語は「損失」。日常語だが「リヤク(ご利益)」との混同に注意させる。"
617
+ },
618
+ {
619
+ "answer_id": "JP01_089",
620
+ "answer": "担う",
621
+ "question_hint": "【送り仮名】「責任や役割を引き受ける」という意味の訓読み。",
622
+ "difficulty": "標準",
623
+ "source_context": "書きは「担う(になう)」。送り仮名は「う」のみ。「かつぐ」という読みもあるが、送り仮名で見分けさせる。"
624
+ },
625
+ {
626
+ "answer_id": "JP01_090",
627
+ "answer": "納得",
628
+ "question_hint": "【漢字読み取り】「理解して受け入れる」という意味。特定の読み。",
629
+ "difficulty": "標準",
630
+ "source_context": "正解は「なっとく」。「納」を「ナッ」と促音化して読む珍しい例であることを強調する。"
631
+ },
632
+ {
633
+ "answer_id": "JP01_091",
634
+ "answer": "自重",
635
+ "question_hint": "【漢字読み取り】「慎重に行動する」という意味の語。読みの正確性。",
636
+ "difficulty": "応用",
637
+ "source_context": "正解は「じちょう」。「重」を「ジュウ」ではなく「チョウ」と読む(尊重、慎重と同様)ことを特定させる。"
638
+ },
639
+ {
640
+ "answer_id": "JP01_092",
641
+ "answer": "時雨",
642
+ "question_hint": "【特別な読み】「冬の初めの小雨」という意味。熟字訓。",
643
+ "difficulty": "標準",
644
+ "source_context": "正解は「しぐれ」。季節感を表す特別な読み(熟字訓)として覚えさせる。"
645
+ },
646
+ {
647
+ "answer_id": "JP01_093",
648
+ "answer": "言語道断",
649
+ "question_hint": "【四字熟語読み取り】「あきれて言葉が出ない」という意味。特定の読み。",
650
+ "difficulty": "応用",
651
+ "source_context": "正解は「ごんごどうだん」。「言語」を「げんご」ではなく「ごんご」と読む、慣習的な読みを問う。"
652
+ },
653
+ {
654
+ "answer_id": "JP01_094",
655
+ "answer": "有頂天",
656
+ "question_hint": "【漢字読み取り】「得意の絶頂にある」という意味。特定の読み。",
657
+ "difficulty": "標準",
658
+ "source_context": "正解は「うちょうてん」。「有」を「ユウ」ではなく「ウ(有無と同様)」と読む仏教用語由来の読みを確認する。"
659
+ },
660
+ {
661
+ "answer_id": "JP01_095",
662
+ "answer": "著す",
663
+ "question_hint": "【同訓異字】「著す(本を書く)」「表す(感情)」「現す(姿)」の三種使い分け。",
664
+ "difficulty": "応用",
665
+ "source_context": "「著す」:執筆(例:参考書を著す)。「表す」:表現。「現す」:出現。著作、著者の「著」を使うことを根拠とする。"
666
+ },
667
+ {
668
+ "answer_id": "JP01_096",
669
+ "answer": "挙げて",
670
+ "question_hint": "【送り仮名】「実例を出す」という意味の訓読み。",
671
+ "difficulty": "基本",
672
+ "source_context": "書きは「挙げて(あげて)」。送り仮名は「げて」。音読みは「キョ(挙手)」であることをあわせて提示する。"
673
+ },
674
+ {
675
+ "answer_id": "JP01_097",
676
+ "answer": "軽率",
677
+ "question_hint": "【漢字読み取り】「軽はずみな様子」という意味。読みと対義語。",
678
+ "difficulty": "標準",
679
+ "source_context": "正解は「けいそつ」。対義語は「慎重」。音読みの正確な再現を求める。"
680
+ },
681
+ {
682
+ "answer_id": "JP01_098",
683
+ "answer": "息吹",
684
+ "question_hint": "【特別な読み】「活気ある気配」という意味。熟字訓。",
685
+ "difficulty": "標準",
686
+ "source_context": "正解は「いぶき」。春の訪れなどを表す際に使われる特別な読��(熟字訓)として記憶させる。"
687
+ },
688
+ {
689
+ "answer_id": "JP01_099",
690
+ "answer": "句読点",
691
+ "question_hint": "【漢字読み取り】「文章の区切り」の記号。読みの正確性。",
692
+ "difficulty": "標準",
693
+ "source_context": "正解は「くとうてん」。「読」を「ドク」ではなく「トウ」と読む点を確認する。"
694
+ },
695
+ {
696
+ "answer_id": "JP01_100",
697
+ "answer": "更地",
698
+ "question_hint": "【漢字読み取り/語彙】「建物がない土地」という意味の語。読みの正確性。",
699
+ "difficulty": "応用",
700
+ "source_context": "正解は「さらち」。「更」を「コウ(更新)」ではなく訓読みの「さら」で読む特別な用法を問う。"
701
+ }
702
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP02.json ADDED
@@ -0,0 +1,702 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP02_001",
4
+ "answer": "清潔",
5
+ "question_hint": "熟語の組み立てを分類する問題。意味の似た字を重ねて構成されている二字熟語を特定させる。",
6
+ "difficulty": "基本",
7
+ "source_context": "熟語の構成パターン「ア:意味の似た字を重ねたもの」。『清』と『潔』はどちらも『よごれていない。きれいだ』という意味を持つ漢字であり、同じ意味の強調によって熟語が成立している。"
8
+ },
9
+ {
10
+ "answer_id": "JP02_002",
11
+ "answer": "細大",
12
+ "question_hint": "熟語の組み立てを分類する問題。反対の意味の字を組み合わせて構成されている二字熟語を特定させる。",
13
+ "difficulty": "基本",
14
+ "source_context": "熟語の構成パターン「イ:反対の意味の字を組み合わせたもの」。『細(こまかい)』と『大(大きい)』という対照的な意味を持つ漢字の組み合わせ。意味は『細かいことと大きいこと。すべて』を指す。"
15
+ },
16
+ {
17
+ "answer_id": "JP02_003",
18
+ "answer": "給食",
19
+ "question_hint": "熟語の組み立てを分類する問題。下の字が上の字の目的語(〜を…する)になっている熟語を特定させる。",
20
+ "difficulty": "標準",
21
+ "source_context": "熟語の構成パターン「エ:下の字が上の字の目的語になっているもの」。『食事』を『支給する』という動作と対象の関係で成立している。"
22
+ },
23
+ {
24
+ "answer_id": "JP02_004",
25
+ "answer": "頭痛",
26
+ "question_hint": "熟語の組み立てを分類する問題。上の字が主語、下の字が述語(〜が…する)の関係にある熟語を特定させる。",
27
+ "difficulty": "標準",
28
+ "source_context": "熟語の構成パターン「オ:上の字が主語、下の字が述語を表すもの」。『頭』が『痛い』という主述の関係。同様の例に『県営(県が経営する)』がある。"
29
+ },
30
+ {
31
+ "answer_id": "JP02_005",
32
+ "answer": "洋画",
33
+ "question_hint": "熟語の組み立てを分類する問題。上の字が下の字を詳しく説明(修飾)している熟語を特定させる。",
34
+ "difficulty": "標準",
35
+ "source_context": "熟語の構成パターン「ウ:上の字の意味が下の字の意味にかかるもの」。『西洋』の『絵画・映画』という限定・説明の関係。上の字が形容詞的な働きをしている。"
36
+ },
37
+ {
38
+ "answer_id": "JP02_006",
39
+ "answer": "善良",
40
+ "question_hint": "熟語の組み立て。似た意味の漢字の重ね合わせである熟語を選択させる。",
41
+ "difficulty": "基本",
42
+ "source_context": "熟語の構成「ア(似た意味)」。『善』も『良』も「よい」という意味。性質が共通する漢字を並べて、その意味を明確にしている。"
43
+ },
44
+ {
45
+ "answer_id": "JP02_007",
46
+ "answer": "今昔",
47
+ "question_hint": "熟語の組み立て。対立する意味の漢字で構成される熟語を選択させる。",
48
+ "difficulty": "基本",
49
+ "source_context": "熟語の構成「イ(反対の意味)」。『今(現在)』と『昔(過去)』を組み合わせたもの。"
50
+ },
51
+ {
52
+ "answer_id": "JP02_008",
53
+ "answer": "決心",
54
+ "question_hint": "熟語の構成。「~を…する」という目的語・動詞の関係にある熟語を特定させる。",
55
+ "difficulty": "標準",
56
+ "source_context": "熟語の構成「エ(目的語)」。『心』を『決める』。動作の対象が下に来る漢文的な語順(述目的語)となっている。"
57
+ },
58
+ {
59
+ "answer_id": "JP02_009",
60
+ "answer": "県営",
61
+ "question_hint": "熟語の構成。主語と述語の関係で成り立つ熟語を特定させる。",
62
+ "difficulty": "標準",
63
+ "source_context": "熟語の構成「オ(主述関係)」。『県』が『経営する』。主体が上、動作が下に来る日本語の語順に近い構成。"
64
+ },
65
+ {
66
+ "answer_id": "JP02_010",
67
+ "answer": "血管",
68
+ "question_hint": "熟語の構成。上の字が下の字の内容を限定・修飾している熟語を選択させる。",
69
+ "difficulty": "標準",
70
+ "source_context": "熟語の構成「ウ(修飾)」。『血液(が流れる)』『管』。どのような管かを上の字が説明している。"
71
+ },
72
+ {
73
+ "answer_id": "JP02_011",
74
+ "answer": "授受",
75
+ "question_hint": "熟語の構成。対照的な動作を組み合わせた熟語を特定させる。",
76
+ "difficulty": "標準",
77
+ "source_context": "熟語の構成「イ(反対の意味)」。『授ける(さずける)』と『受ける(うける)』のセット。やりとりを意味する。"
78
+ },
79
+ {
80
+ "answer_id": "JP02_012",
81
+ "answer": "着席",
82
+ "question_hint": "熟語の構成。目的語の関係(〜に…する)にある熟語を選択させる。",
83
+ "difficulty": "標準",
84
+ "source_context": "熟語の構成「エ(目的語)」。『席』に『着く(つく)』。場所や対象を示す漢字が下に来ている。"
85
+ },
86
+ {
87
+ "answer_id": "JP02_013",
88
+ "answer": "永住",
89
+ "question_hint": "熟語の構成。状態や程度を説明する字が上に来ている熟語を特定させる。",
90
+ "difficulty": "標準",
91
+ "source_context": "熟語の構成「ウ(修飾)」。『永く(ながく)』、下の『住む』にかかっている。副詞的な働きをする漢字が上にある例。"
92
+ },
93
+ {
94
+ "answer_id": "JP02_014",
95
+ "answer": "禁止",
96
+ "question_hint": "熟語の構成。似た意味の動詞的漢字を重ねた熟語を特定させる。",
97
+ "difficulty": "基本",
98
+ "source_context": "熟語の構成「ア(似た意味)」。『禁じる』と『止める』。どちらも「させない」という強い制止を意味する漢字。"
99
+ },
100
+ {
101
+ "answer_id": "JP02_015",
102
+ "answer": "漢字",
103
+ "question_hint": "熟語の構成。所属や種類を限定する字が上にある熟語を特定させる。",
104
+ "difficulty": "標準",
105
+ "source_context": "熟語の構成「ウ(修飾)」。『漢(中国)』の『文字』。単なる文字ではなく、特定の由来を説明している。"
106
+ },
107
+ {
108
+ "answer_id": "JP02_016",
109
+ "answer": "指名",
110
+ "question_hint": "熟語の構成。対象を指す字が下、動作が上にある熟語を選択させる。",
111
+ "difficulty": "標準",
112
+ "source_context": "熟語の構成「エ(目的語)」。『名(前)』を『指し示す(さししめす)』。下の字が目的語。"
113
+ },
114
+ {
115
+ "answer_id": "JP02_017",
116
+ "answer": "保護",
117
+ "question_hint": "熟語の構成。似た役割の漢字を組み合わせた熟語を特定させる。",
118
+ "difficulty": "基本",
119
+ "source_context": "熟語の構成「ア(似た意味)」。『保(たもつ)』も『護(まもる)』も、状態を維持し守るという意味。"
120
+ },
121
+ {
122
+ "answer_id": "JP02_018",
123
+ "answer": "古書",
124
+ "question_hint": "熟語の構成。性質を説明する字が上、対象が下の熟語を選択させる。",
125
+ "difficulty": "基本",
126
+ "source_context": "熟語の構成「ウ(修飾)」。『古い』という状態が、下の『書物』の内容を限定している。"
127
+ },
128
+ {
129
+ "answer_id": "JP02_019",
130
+ "answer": "会員",
131
+ "question_hint": "熟語の構成。範囲を示す字が上の熟語を特定させる。",
132
+ "difficulty": "標準",
133
+ "source_context": "熟語の構成「ウ(修飾)」。『会』の『人員(入っている人)』。"
134
+ },
135
+ {
136
+ "answer_id": "JP02_020",
137
+ "answer": "往復",
138
+ "question_hint": "熟語の構成。一連の動作の行き帰りを表す漢字の組み合わせを特定させる。",
139
+ "difficulty": "基本",
140
+ "source_context": "熟語の構成「イ(反対の意味)」。『往(行く)』と『復(かえる)』の組み合わせ。"
141
+ },
142
+ {
143
+ "answer_id": "JP02_021",
144
+ "answer": "再会",
145
+ "question_hint": "熟語の構成。回数や頻度を表す字が上に来る熟語を特定させる。",
146
+ "difficulty": "標準",
147
+ "source_context": "熟語の構成「ウ(修飾)」。『再び(ふたたび)』が、下の『会う』という動作を修飾している。"
148
+ },
149
+ {
150
+ "answer_id": "JP02_022",
151
+ "answer": "乗船",
152
+ "question_hint": "熟語の構成。動作と場所(対象)の漢文的語順の熟語を特定させる。",
153
+ "difficulty": "標準",
154
+ "source_context": "熟語の構成「エ(目的語)」。『船』に『乗る』。船を対象とする動作。"
155
+ },
156
+ {
157
+ "answer_id": "JP02_023",
158
+ "answer": "絵画",
159
+ "question_hint": "熟語の構成。似た名詞を重ねた熟語を特定させる。",
160
+ "difficulty": "基本",
161
+ "source_context": "熟語の構成「ア(似た意味)」。『絵』と『画(え・えがく)』を重ねて、「え」全般を指す。"
162
+ },
163
+ {
164
+ "answer_id": "JP02_024",
165
+ "answer": "縦横",
166
+ "question_hint": "熟語の構成。方向を表す対になる漢字の組み合わせを特定させる。",
167
+ "difficulty": "標準",
168
+ "source_context": "熟語の構成「イ(反対の意味)」。『縦(じゅう・たて)』と『横(おう・よこ)』。あわせて「自由自在」や「四方八方」のニュアンスを持つ。"
169
+ },
170
+ {
171
+ "answer_id": "JP02_025",
172
+ "answer": "未定",
173
+ "question_hint": "打ち消しの漢字を含む熟語。「まだ〜していない」という意味を持つ熟語を特定させる。",
174
+ "difficulty": "基本",
175
+ "source_context": "打ち消しの漢字『未』の使用例。意味は『まだ決まっていないこと』。対義語は『既定(すでに決まっていること)』。"
176
+ },
177
+ {
178
+ "answer_id": "JP02_026",
179
+ "answer": "無事",
180
+ "question_hint": "打ち消しの漢字を含む熟語。「~がない」という意味で、平穏であることを表す熟語を特定させる。",
181
+ "difficulty": "基本",
182
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『ふだんと変わりなく、何事もないこと』。読みは『ぶじ』。"
183
+ },
184
+ {
185
+ "answer_id": "JP02_027",
186
+ "answer": "不足",
187
+ "question_hint": "打ち消しの漢字を含む熟語。「〜でない、十分でない」という意味の熟語を特定させる。",
188
+ "difficulty": "基本",
189
+ "source_context": "打ち消しの漢字『不』の使用例。意味は『足りていないこと』。"
190
+ },
191
+ {
192
+ "answer_id": "JP02_028",
193
+ "answer": "非常",
194
+ "question_hint": "打ち消しの漢字を含む熟語。「いつもと違う」という意味から転じて、程度が甚だしいことを表す熟語を特定させる。",
195
+ "difficulty": "標準",
196
+ "source_context": "打ち消しの漢字『非』の使用例。意味は『ふつうでない、たいへんな事態』。転じて『非常に(とても)』という副詞的強調にも使われる。"
197
+ },
198
+ {
199
+ "answer_id": "JP02_029",
200
+ "answer": "不調",
201
+ "question_hint": "打ち消しの漢字を含む熟語。物事の具合が良くないことを表す熟語を選択させる。",
202
+ "difficulty": "標準",
203
+ "source_context": "打ち消しの漢字『不』の使用例。意味は『(健康や仕事などの)調子がよくないこと』。"
204
+ },
205
+ {
206
+ "answer_id": "JP02_030",
207
+ "answer": "未熟",
208
+ "question_hint": "打ち消しの漢字を含む熟語。成長の途上でまだ十分でないことを表す熟語を特定させる。",
209
+ "difficulty": "標準",
210
+ "source_context": "打ち消しの漢字『未』の使用例。意味は『心や体がまだ十分に成長していないこと』。対義語は『成熟』。"
211
+ },
212
+ {
213
+ "answer_id": "JP02_031",
214
+ "answer": "無数",
215
+ "question_hint": "打ち消しの漢字を含む熟語。数が極めて多いことを表す熟語を特定させる。",
216
+ "difficulty": "標準",
217
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『数えきれないほど多いこと』。読みは『むすう』。"
218
+ },
219
+ {
220
+ "answer_id": "JP02_032",
221
+ "answer": "不幸",
222
+ "question_hint": "打ち消しの漢字を含む熟語。幸福ではない状態を意味する熟語を選択させる。",
223
+ "difficulty": "基本",
224
+ "source_context": "打ち消しの漢字『不』の使用例。意味は『幸せでないこと』。対義語は『幸福』。"
225
+ },
226
+ {
227
+ "answer_id": "JP02_033",
228
+ "answer": "無害",
229
+ "question_hint": "打ち消しの漢字を含む熟語。害を及ぼさないことを表す熟語を特定させる。",
230
+ "difficulty": "基本",
231
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『害がなく悪い影響を及ぼさないこと』。対義語は『有害』。"
232
+ },
233
+ {
234
+ "answer_id": "JP02_034",
235
+ "answer": "無礼",
236
+ "question_hint": "打ち消しの漢字を含む熟語。礼儀に反する様子を表す熟語を特定させる。",
237
+ "difficulty": "標準",
238
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『礼儀にはずれていること』。読みは『ぶれい』。類義語(同音接頭辞違い)として『非礼』がある。"
239
+ },
240
+ {
241
+ "answer_id": "JP02_035",
242
+ "answer": "未完成",
243
+ "question_hint": "打ち消しの漢字を含む熟語。まだ出来上がっていない状態を表す熟語を選択させる。",
244
+ "difficulty": "基本",
245
+ "source_context": "打ち消しの漢字『未』の使用例。意味は『まだできあがっていないこと』。"
246
+ },
247
+ {
248
+ "answer_id": "JP02_036",
249
+ "answer": "非常識",
250
+ "question_hint": "打ち消しの漢字を含む熟語。一般社会の決まりや知識を欠いている様子を指す熟語を選択させる。",
251
+ "difficulty": "標準",
252
+ "source_context": "打ち消しの漢字『非』の使用例。意味は『常識を欠いていること』。"
253
+ },
254
+ {
255
+ "answer_id": "JP02_037",
256
+ "answer": "不自然",
257
+ "question_hint": "打ち消しの漢字を含む熟語。わざとらしく無理がある様子を表す熟語を選択させる。",
258
+ "difficulty": "標準",
259
+ "source_context": "打ち消しの漢字『不』の使用例。意味は『自然さがなく無理があること』。"
260
+ },
261
+ {
262
+ "answer_id": "JP02_038",
263
+ "answer": "無責任",
264
+ "question_hint": "打ち消しの漢字を含む熟語。自分の果たすべき役目を顧みない様子を表す熟語を選択させる。",
265
+ "difficulty": "標準",
266
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『責任感がないこと』。"
267
+ },
268
+ {
269
+ "answer_id": "JP02_039",
270
+ "answer": "無愛想",
271
+ "question_hint": "打ち消しの漢字を含む熟語。態度がそっけなく、愛想がない様子を指す熟語を選択させる。",
272
+ "difficulty": "応用",
273
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『愛想がなくそっけないこと』。読みは『ぶあいそう』。漢字書き取りでも頻出。"
274
+ },
275
+ {
276
+ "answer_id": "JP02_040",
277
+ "answer": "未発達",
278
+ "question_hint": "打ち消しの漢字を含む熟語。成長や進歩が十分でない状態を指す熟語を特定させる。",
279
+ "difficulty": "標準",
280
+ "source_context": "打ち消しの漢字『未』の使用例。意味は『まだ十分に発達していないこと』。"
281
+ },
282
+ {
283
+ "answer_id": "JP02_041",
284
+ "answer": "非公式",
285
+ "question_hint": "打ち消しの漢字を含む熟語。公に認められたものではない様子を指す熟語を選択させる。",
286
+ "difficulty": "標準",
287
+ "source_context": "打ち消しの漢字『非』の使用例。意味は『おおやけでないこと』。対義語は『公式』。"
288
+ },
289
+ {
290
+ "answer_id": "JP02_042",
291
+ "answer": "不可能",
292
+ "question_hint": "打ち消しの漢字を含む熟語。できないことを表す熟語を選択させる。",
293
+ "difficulty": "基本",
294
+ "source_context": "打ち消しの漢字『不』の使用例。意味は『できないこと』。対義語は『可能』。"
295
+ },
296
+ {
297
+ "answer_id": "JP02_043",
298
+ "answer": "未解決",
299
+ "question_hint": "打ち消しの漢字を含む熟語。まだ片付いていない状態を指す熟語を特定させる。",
300
+ "difficulty": "基本",
301
+ "source_context": "打ち消しの漢字『未』の使用例。意味は『まだ解決していないこと』。"
302
+ },
303
+ {
304
+ "answer_id": "JP02_044",
305
+ "answer": "無意識",
306
+ "question_hint": "打ち消しの漢字を含む熟語。自覚がないまま行動する様子を指す熟語を特定させる。",
307
+ "difficulty": "標準",
308
+ "source_context": "打ち消しの漢字『無』の使用例。意味は『自分のしていることに気がつかないこと』。"
309
+ },
310
+ {
311
+ "answer_id": "JP02_045",
312
+ "answer": "不可欠",
313
+ "question_hint": "打ち消しの漢字を含む熟語。「欠くことができない」という二重否定的な意味を持つ熟語を特定させる。",
314
+ "difficulty": "応用",
315
+ "source_context": "打ち消しの漢字『不』と『可(~できる)』『欠(かける)』の構成。意味は『どうしても欠くことができないこと』。『必要不可欠』という四字熟語的な表現でよく用いられる。"
316
+ },
317
+ {
318
+ "answer_id": "JP02_046",
319
+ "answer": "非売品",
320
+ "question_hint": "打ち消しの漢字を含む熟語。売り物ではないことを示す熟語を特定させる。",
321
+ "difficulty": "標準",
322
+ "source_context": "打ち消しの漢字『非』の使用例。意味は『売り物でない品物』。"
323
+ },
324
+ {
325
+ "answer_id": "JP02_047",
326
+ "answer": "労る",
327
+ "question_hint": "感情語の文法的な使い分け。弱い立場の人に親切に接する動作を表す熟語を特定させる。",
328
+ "difficulty": "標準",
329
+ "source_context": "感情語『いたわる(労る)』。定義:『立場が弱い人に対して、親切に接すること。』。姉が妹を心配する、親が子を気遣う文脈などで使用される。"
330
+ },
331
+ {
332
+ "answer_id": "JP02_048",
333
+ "answer": "労う",
334
+ "question_hint": "感情語の文法的な使い分け。苦労や努力に対して感謝を表す熟語を特定させる。",
335
+ "difficulty": "標準",
336
+ "source_context": "感情語『ねぎらう(労う)』。定義:『苦労や努力に対して感謝すること。』。上の立場の人が下の立場の人に対して行うことが多い。例:アレルギー注射を打った少年を大人たちが感謝する場面。"
337
+ },
338
+ {
339
+ "answer_id": "JP02_049",
340
+ "answer": "慈しむ",
341
+ "question_hint": "感情語。深い愛情を注ぎ大切にする様子を表す熟語を選択させる。",
342
+ "difficulty": "標準",
343
+ "source_context": "感情語『慈しむ(いつくしむ)』。定義:『愛情を注いだり、大切にしたりする気持ち。』。立場が下の者や弱い者(祖母が孫のために作るショール等)への愛情表現として用いられる。"
344
+ },
345
+ {
346
+ "answer_id": "JP02_050",
347
+ "answer": "健気",
348
+ "question_hint": "感情語。力の弱い者が困難に立ち向かう立派な様子を形容する熟語を特定させる。",
349
+ "difficulty": "標準",
350
+ "source_context": "感情語『健気(けなげ)』。定義:『子ども、力や立場が弱い者が、難しいことに立ち向かっていく様子。』。褒めてあげたい気持ちが含まれる。"
351
+ },
352
+ {
353
+ "answer_id": "JP02_051",
354
+ "answer": "郷愁",
355
+ "question_hint": "感情語。故郷や過去を懐かしむ情緒を表す熟語を特定させる。",
356
+ "difficulty": "応用",
357
+ "source_context": "感情語『郷愁(きょうしゅう)』。定義:『昔のことや、故郷を懐かしく思うこと。』。ノスタルジー。"
358
+ },
359
+ {
360
+ "answer_id": "JP02_052",
361
+ "answer": "高揚",
362
+ "question_hint": "感情語。気分が高ぶる状態を表す熟語を特定させる。",
363
+ "difficulty": "標準",
364
+ "source_context": "感情語『高揚(こうよう)』。定義:『気分が高まること。』。『高揚感』という形でも使われる。何らかのプラスの事象に対する感情のたかぶり。"
365
+ },
366
+ {
367
+ "answer_id": "JP02_053",
368
+ "answer": "賞賛",
369
+ "question_hint": "感情語。優れたものを褒めたたえる行為を指す熟語を選択させる。",
370
+ "difficulty": "基本",
371
+ "source_context": "感情語『賞賛(しょうさん)』。定義:『素晴らしいものだと、ほめたたえること。』。尊敬の念が含まれる。"
372
+ },
373
+ {
374
+ "answer_id": "JP02_054",
375
+ "answer": "一体感",
376
+ "question_hint": "感情語。集団が一つにまとまる感覚を表す熟語を特定させる。",
377
+ "difficulty": "標準",
378
+ "source_context": "感情語『一体感(いったいかん)』。定義:『一緒にいる人たちの気持ちや考えが、一つにまとまったと感じること。』。アンサンブルやチームプレーの文脈で頻出。"
379
+ },
380
+ {
381
+ "answer_id": "JP02_055",
382
+ "answer": "感慨",
383
+ "question_hint": "感情語。深く身に染みて感じる様子を表す熟語を特定させる。",
384
+ "difficulty": "標準",
385
+ "source_context": "感情語『感慨(かんがい)』。定義:『ある出来事について深く心に感じることや、感心する様子。』。『感慨深い』という形で、じんわりと広がる感動を表現する。"
386
+ },
387
+ {
388
+ "answer_id": "JP02_056",
389
+ "answer": "解放感",
390
+ "question_hint": "感情語。束縛から自由になった際の心地よさを表す熟語を選択させる。",
391
+ "difficulty": "標準",
392
+ "source_context": "感情語『解放感(かいほうかん)』。定義:『縛られていたものがなくなって、自由になった感覚。』。テスト終了後や緊張からの緩和時に抱くプラスの感情。"
393
+ },
394
+ {
395
+ "answer_id": "JP02_057",
396
+ "answer": "向上心",
397
+ "question_hint": "感情語。より高い目標を目指す意志の強さを表す熟語を特定させる。",
398
+ "difficulty": "基本",
399
+ "source_context": "感情語『向上心(こうじょうしん)』。定義:『今の状態に満足せず、より優れたもの、より高いところを目指して努力する心。』。"
400
+ },
401
+ {
402
+ "answer_id": "JP02_058",
403
+ "answer": "楽観的",
404
+ "question_hint": "感情語。物事を良い方向に考える性質を表す熟語を選択させる。",
405
+ "difficulty": "標準",
406
+ "source_context": "感情語『楽観的(らっかんてき)』。定義:『きっとよい方向にいくはずだと明るく考えて、心配しない様子。』。対義語は『悲観的』。"
407
+ },
408
+ {
409
+ "answer_id": "JP02_059",
410
+ "answer": "厚意",
411
+ "question_hint": "感情語。他人が自分に向けてくれた思いやりの心を指す熟語を特定させる。",
412
+ "difficulty": "標準",
413
+ "source_context": "感情語『厚意(こうい)』。定義:『誰かが自分に対してしてくれた、思いやりがこもった心。』。混同しやすい『好意(好きだという気持ち)』との違いに注意。"
414
+ },
415
+ {
416
+ "answer_id": "JP02_060",
417
+ "answer": "寛容",
418
+ "question_hint": "感情語。他人の過ちや違いを受け入れる心の広さを表す熟語を特定させる。",
419
+ "difficulty": "応用",
420
+ "source_context": "感情語『寛容(かんよう)』。定義:『心が広くて、他人の言動を受け入れること。』。多様性の尊重の文脈でも重要。"
421
+ },
422
+ {
423
+ "answer_id": "JP02_061",
424
+ "answer": "感銘",
425
+ "question_hint": "感情語。深く感動し、心に刻まれる様子を表す熟語を特定させる。",
426
+ "difficulty": "標準",
427
+ "source_context": "感情語『感銘(かんめい)』。定義:『深く感動して、忘れられないこと。』。『感銘を受ける』の形で使われる。"
428
+ },
429
+ {
430
+ "answer_id": "JP02_062",
431
+ "answer": "優越感",
432
+ "question_hint": "感情語。自分が他人より優れていると感じる満足感を表す熟語を選択させる。",
433
+ "difficulty": "標準",
434
+ "source_context": "感情語『優越感(ゆうえつかん)』。定義:『自分が他人よりも優れていると感じる時に思う気持ち。』。対義語は『劣等感』。"
435
+ },
436
+ {
437
+ "answer_id": "JP02_063",
438
+ "answer": "羨望",
439
+ "question_hint": "感情語。他人の良さを羨ましく思う気持ちを表す熟語を特定させる。",
440
+ "difficulty": "応用",
441
+ "source_context": "感情語『羨望(せんぼう)』。定義:『羨ましいと思う気持ち。』。『羨望のまなざし』などで使われ、純粋な憧れに近い。"
442
+ },
443
+ {
444
+ "answer_id": "JP02_064",
445
+ "answer": "卑屈",
446
+ "question_hint": "感情語。自分を不当に低く評価し、いじける様子を表す熟語を選択させる。",
447
+ "difficulty": "標準",
448
+ "source_context": "感情語『卑屈(ひくつ)』。定義:『いじけて、自分を大したことがないと悪く思うこと。』。他人と比較して『どうせ自分なんか』と考える状態。"
449
+ },
450
+ {
451
+ "answer_id": "JP02_065",
452
+ "answer": "羞恥心",
453
+ "question_hint": "感情語。恥ずかしいと感じる心を指す熟語を特定させる。",
454
+ "difficulty": "標準",
455
+ "source_context": "感情語『羞恥心(しゅうちしん)』。定義:『恥ずかしく思う気持ち。』。"
456
+ },
457
+ {
458
+ "answer_id": "JP02_066",
459
+ "answer": "無力感",
460
+ "question_hint": "感情語。自分の力ではどうにもできないという絶望的な感覚を表す熟語を特定させる。",
461
+ "difficulty": "標準",
462
+ "source_context": "感情語『無力感(むりょくかん)』。定義:『自分には力がないと、むなしく思う気持ち。』。生死などの巨大な問題に直面した際などに抱く。"
463
+ },
464
+ {
465
+ "answer_id": "JP02_067",
466
+ "answer": "困惑",
467
+ "question_hint": "感情語。予想外の事態にどうしていいか迷う様子を指す熟語を特定させる。",
468
+ "difficulty": "基本",
469
+ "source_context": "感情語『困惑(こんわく)』。定義:『どうしたらよいか迷ったり困ったりする気持ち。』。常識や予想と現実が異なる際に生じる。"
470
+ },
471
+ {
472
+ "answer_id": "JP02_068",
473
+ "answer": "躊躇",
474
+ "question_hint": "感情語。決断を下せず、ためらう動作を指す熟語を特定させる。",
475
+ "difficulty": "応用",
476
+ "source_context": "感情語『躊躇(ちゅうちょ)』。定義:『迷ってなかなか決断できないこと。』。動詞は『躊躇う(ためらう)』。"
477
+ },
478
+ {
479
+ "answer_id": "JP02_069",
480
+ "answer": "罪悪感",
481
+ "question_hint": "感情語。自分が悪いことをした、あるいは申し訳ないと思う心を指す熟語を選択させる。",
482
+ "difficulty": "標準",
483
+ "source_context": "感情語『罪悪感(ざいあくかん)』。定義:『悪いことをしたと思う気持ち。』。相手を傷つけた自覚がある時に抱く重い感情。"
484
+ },
485
+ {
486
+ "answer_id": "JP02_070",
487
+ "answer": "疎外感",
488
+ "question_hint": "感情語。集団から外されているような寂しい感覚を表す熟語を特定させる。",
489
+ "difficulty": "応用",
490
+ "source_context": "感情語『疎外感(そがいかん)』。定義:『自分が避けられ、排除されていると思う気持ち。』。"
491
+ },
492
+ {
493
+ "answer_id": "JP02_071",
494
+ "answer": "葛藤",
495
+ "question_hint": "感情語。心の中で対立する二つの感情に悩む状態を指す熟語を特定させる。",
496
+ "difficulty": "応用",
497
+ "source_context": "感情語『葛藤(かっとう)』。定義:『心の中に、複数の感情があり、どうするのか悩むこと。』。物語文のクライマックスや心理描写で極めて重要。"
498
+ },
499
+ {
500
+ "answer_id": "JP02_072",
501
+ "answer": "憤り",
502
+ "question_hint": "感情語。心の中で激しく怒る様子を表す熟語を選択させる。",
503
+ "difficulty": "標準",
504
+ "source_context": "感情語『憤り(いきどおり)』。定義:『激しく腹を立てること。』。大声で怒鳴る『怒り』と違い、内面で震えるような強い怒りを指すことが多い。"
505
+ },
506
+ {
507
+ "answer_id": "JP02_073",
508
+ "answer": "非難",
509
+ "question_hint": "感情語。相手の欠点を責め立てる行為を表す熟語を特定させる。",
510
+ "difficulty": "標準",
511
+ "source_context": "感情語『非難(ひなん)』。定義:『人の欠点やミスを取り上げて、責めること。』。一方的な攻撃のニュアンスが強い。"
512
+ },
513
+ {
514
+ "answer_id": "JP02_074",
515
+ "answer": "冷淡",
516
+ "question_hint": "感情語。相手に対して関心がなく、冷たい様子を表す熟語を特定させる。",
517
+ "difficulty": "標準",
518
+ "source_context": "感情語『冷淡(れいたん)』。定義:『無関心であること。そっけないこと。』。"
519
+ },
520
+ {
521
+ "answer_id": "JP02_075",
522
+ "answer": "虚勢",
523
+ "question_hint": "感情語。自分の弱さを隠して、威勢よく振る舞う様子を表す熟語を特定させる。",
524
+ "difficulty": "標準",
525
+ "source_context": "感情語『虚勢(きょせい)』。定義:『自分の弱いところを隠し、威勢がいいフリをすること。』。『虚勢を張る』として使われる。"
526
+ },
527
+ {
528
+ "answer_id": "JP02_076",
529
+ "answer": "合理主義",
530
+ "question_hint": "論理的・現代的概念。理性を中心に据え、効率を重んじる考え方を指す熟語を特定させる。",
531
+ "difficulty": "標準",
532
+ "source_context": "テーマ『合理主義(近代合理主義)』。意味:『物事を理性的に考え、生活していくこと。』。感情よりも論理や根拠を重視する。近代社会の基盤となる考え方。"
533
+ },
534
+ {
535
+ "answer_id": "JP02_077",
536
+ "answer": "効率化",
537
+ "question_hint": "現代社会のキーワード。少ない労力で大きな成果を得ようとする動きを指す熟語を特定させる。",
538
+ "difficulty": "標準",
539
+ "source_context": "テーマ『効率化』。意味:『使った労力に対して、得られる成果を高くしていくこと。』。現代社会ではプラスとされるが、ゆとりの喪失などのマイナス面も議論される。"
540
+ },
541
+ {
542
+ "answer_id": "JP02_078",
543
+ "answer": "資本主義",
544
+ "question_hint": "社会経済の基本概念。自由競争を肯定し利益を追求する経済体系を指す熟語を選択させる。",
545
+ "difficulty": "標準",
546
+ "source_context": "テーマ『資本主義』。意味:『自由競争によって利益を追求すれば、社会全体も豊かになっていくという考え。』。効率化や合理主義と密接に関連する。"
547
+ },
548
+ {
549
+ "answer_id": "JP02_079",
550
+ "answer": "個人主義",
551
+ "question_hint": "近代の人間観。個人の権利や自由を最優先する考え方を指す熟語を特定させる。",
552
+ "difficulty": "標準",
553
+ "source_context": "テーマ『個人主義』。意味:『個人の権利や自由を尊重する考え方。』。近代ヨーロッパで定着し、現代の日本でも広まっている。対義語は『集団主義』。"
554
+ },
555
+ {
556
+ "answer_id": "JP02_080",
557
+ "answer": "固定観念",
558
+ "question_hint": "思考のバイアス。変化を受け入れにくい、凝り固まった考えを指す熟語を特定させる。",
559
+ "difficulty": "標準",
560
+ "source_context": "テーマ『固定観念』。意味:『周囲の状況や変化によっても変えることが難しい考え。』。先入観とも呼ばれ、批判的に扱われることが多い。"
561
+ },
562
+ {
563
+ "answer_id": "JP02_081",
564
+ "answer": "多様性",
565
+ "question_hint": "現代の重要概念。様々な価値観や属性の違いを認め合うことを指す熟語を選択させる。",
566
+ "difficulty": "標準",
567
+ "source_context": "テーマ『多様性(ダイバーシティ)』。意味:『性別や国籍、人種などに関係なく、いろいろな価値観を大切にすること。』。SDGsや現代の論説文で最重要。"
568
+ },
569
+ {
570
+ "answer_id": "JP02_082",
571
+ "answer": "科学",
572
+ "question_hint": "学問的定義。因果関係と再現性に基づく体系的な知識を指す熟語を特定させる。",
573
+ "difficulty": "標準",
574
+ "source_context": "テーマ『科学』。意味:『知識や経験の集まりによって、因果関係があり、再現性があること。』。近代化を推進したが、自然支配という観点から批判されることもある。"
575
+ },
576
+ {
577
+ "answer_id": "JP02_083",
578
+ "answer": "画一化",
579
+ "question_hint": "社会現象。個別の違いを無視して一様にそろえる動きを指す熟語を選択させる。",
580
+ "difficulty": "標準",
581
+ "source_context": "テーマ『画一化』。意味:『個々の違いを考えずに、同じ様子や状態にそろえること。』。効率的だが、脆弱性や個性の欠如を招くと批判される。"
582
+ },
583
+ {
584
+ "answer_id": "JP02_084",
585
+ "answer": "文明",
586
+ "question_hint": "文化との対比概念。技術によって生活が便利・快適になった状態を指す熟語を特定させる。",
587
+ "difficulty": "標準",
588
+ "source_context": "テーマ『文明』。意味:『生活が豊かになった状態。技術が進歩して、生活が便利に、快適になっていく。』。文化(精神的・伝統的なもの)と対置される。"
589
+ },
590
+ {
591
+ "answer_id": "JP02_085",
592
+ "answer": "共存",
593
+ "question_hint": "異なるものが同時に存在する望ましい状態を指す熟語を選択させる。",
594
+ "difficulty": "基本",
595
+ "source_context": "テーマ『共存(共生)』。意味:『二つ以上のものが、同時に存在すること。』。自然と人間、異なる民族間の関係などでプラスの意味で使用される。"
596
+ },
597
+ {
598
+ "answer_id": "JP02_086",
599
+ "answer": "自立",
600
+ "question_hint": "人間的成長の指標。他者に頼らず自分の力で立つことを指��熟語を特定させる。",
601
+ "difficulty": "基本",
602
+ "source_context": "テーマ『自立』。意味:『他のものから支配されたり助けてもらったりすることなく、存在すること。』。精神的な自立が中学受験のテーマになりやすい。"
603
+ },
604
+ {
605
+ "answer_id": "JP02_087",
606
+ "answer": "依存",
607
+ "question_hint": "他者や物に頼り切る状態を指す熟語を選択させる。",
608
+ "difficulty": "標準",
609
+ "source_context": "テーマ『依存』。意味:『他のものに頼って生活したり、存在したりすること。』。スマホ依存などの否定的文脈や、社会の他国依存などの文脈で使われる。"
610
+ },
611
+ {
612
+ "answer_id": "JP02_088",
613
+ "answer": "秩序",
614
+ "question_hint": "社会のきまり。集団が安定するために守られるべき規則や体系を指す熟語を特定させる。",
615
+ "difficulty": "標準",
616
+ "source_context": "テーマ『秩序(ちつじょ)』。意味:『社会や集団などが、望ましい状態であるためのきまり。』。"
617
+ },
618
+ {
619
+ "answer_id": "JP02_089",
620
+ "answer": "普遍性",
621
+ "question_hint": "哲学的概念。あらゆるものに例外なく適用される性質を指す熟語を特定させる。",
622
+ "difficulty": "応用",
623
+ "source_context": "テーマ『普遍性』。意味:『例外なく、すべてのものにあてはまること。』。カントの道徳法則などの文脈で登場する。"
624
+ },
625
+ {
626
+ "answer_id": "JP02_090",
627
+ "answer": "贈与",
628
+ "question_hint": "社会人類学的概念。見返りを直接求めない、モノや財の授与を指す熟語を特定させる。",
629
+ "difficulty": "応用",
630
+ "source_context": "テーマ『贈与』。意味:『財産を渡す側の「無償であげます」という意思に対して、受け取る意思のある相手に、財産を渡すこと。』。市場の『交換』と対比される。"
631
+ },
632
+ {
633
+ "answer_id": "JP02_091",
634
+ "answer": "同調圧力",
635
+ "question_hint": "集団心理の用語。集団の中で、多数派の意見に合わせるよう求める見えない力を指す熟語を特定させる。",
636
+ "difficulty": "標準",
637
+ "source_context": "テーマ『同調圧力』。意味:『みんなと同じであるべきだという無言の圧力。』。少数意見の排除につながるため、批判的な論調で書かれることが多い。"
638
+ },
639
+ {
640
+ "answer_id": "JP02_092",
641
+ "answer": "利他",
642
+ "question_hint": "倫理的概念。自分の利益よりも他人の利益を優先する考え方を指す熟語を選択させる。",
643
+ "difficulty": "標準",
644
+ "source_context": "テーマ『利他(りた)』。意味:『自分のことよりも他人の幸せや利益を考えて、人のために尽くすこと。』。"
645
+ },
646
+ {
647
+ "answer_id": "JP02_093",
648
+ "answer": "バイアス",
649
+ "question_hint": "心理学的用語。偏った思い込みや先入観を指す外来語(漢字表記も可能だがここでは概念)を熟語として特定させる。",
650
+ "difficulty": "標準",
651
+ "source_context": "テーマ『バイアス』。意味:『思い込み。先入観。』。アンコンシャス・バイアス(無意識の思い込み)などの形で出題される。"
652
+ },
653
+ {
654
+ "answer_id": "JP02_094",
655
+ "answer": "広告",
656
+ "question_hint": "情報の目的。商品やサービスを広く知らせ、購買意欲を高める活動を指す熟語を選択させる。",
657
+ "difficulty": "基本",
658
+ "source_context": "テーマ『広告』。意味:『多くの人に商品やサービスを知ってもらうこと。』。マスメディアの収益源であるが、情報の偏りを生む要因としても議論される。"
659
+ },
660
+ {
661
+ "answer_id": "JP02_095",
662
+ "answer": "人工知能",
663
+ "question_hint": "先端技術。人間の知的活動をコンピューターに行わせる技術の名称を熟語で特定させる。",
664
+ "difficulty": "標準",
665
+ "source_context": "テーマ『人工知能(AI)』。意味:『言葉を理解したり、分析、判断したりするような人間の知的活動を、コンピューターに行わせる技術。』。"
666
+ },
667
+ {
668
+ "answer_id": "JP02_096",
669
+ "answer": "情報拡散",
670
+ "question_hint": "メディア現象。SNSなどを通じて情報が瞬時に広まる様子を指す熟語を選択させる。",
671
+ "difficulty": "標準",
672
+ "source_context": "テーマ『情報拡散』。意味:『情報が広がっていくこと。』。メリットだけでなく、誤情報の広がりなどのリスクも伴う。"
673
+ },
674
+ {
675
+ "answer_id": "JP02_097",
676
+ "answer": "集団主義",
677
+ "question_hint": "社会の性質。個よりも全体の和や利益を重んじる考え方を指す熟語を特定させる。",
678
+ "difficulty": "標準",
679
+ "source_context": "テーマ『集団主義』。意味:『個人よりも、集団の目標や利益を優先する、集団中心の考え方。』。日本の伝統的な性質として描かれることが多い。"
680
+ },
681
+ {
682
+ "answer_id": "JP02_098",
683
+ "answer": "自粛警察",
684
+ "question_hint": "社会現象。同調圧力に基づいて、他人の行動を過剰に監視・制裁する人々を指す熟語的表現を選択させる。",
685
+ "difficulty": "標準",
686
+ "source_context": "テーマ『コロナ禍における監視』。同調圧力が可視化された例。自ら取り締まりを行う一般市民を指す言葉。"
687
+ },
688
+ {
689
+ "answer_id": "JP02_099",
690
+ "answer": "哲学",
691
+ "question_hint": "学問分野。物事の根源的な意味を深く追求する知的営みを指す熟語を選択させる。",
692
+ "difficulty": "応用",
693
+ "source_context": "テーマ『哲学』。意味:『世界・人生などの根本原理を追求する学問。』。『なぜ?』『どうして?』を深く問い、自己や社会を了解するための智慧。"
694
+ },
695
+ {
696
+ "answer_id": "JP02_100",
697
+ "answer": "責任",
698
+ "question_hint": "自由と対になる概念。自分の行動が引き起こす結果を引き受ける義務を指す熟語を特定させる。",
699
+ "difficulty": "標準",
700
+ "source_context": "テーマ『責任』。意味:『物事に対して、自分の立場に応じて義務を負うこと。』。『自由とは責任を担うこと』といった文脈で論じられる。"
701
+ }
702
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP03.json ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP03_001",
4
+ "answer": "いたわる",
5
+ "question_hint": "【語彙・心情】立場が弱い人に対して親切に接する様子を表す心情語を特定させる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "定義:立場が弱い人(病気の人、年下、妹など)に対して、親切に接したり思いやったりすること。洗足学園中の例文では、坊主頭にした妹に対し、学校での立場を心配して姉がかけた声を「いたわるような声」と表現している。"
8
+ },
9
+ {
10
+ "answer_id": "JP03_002",
11
+ "answer": "ねぎらう",
12
+ "question_hint": "【語彙・心情】苦労や努力に対して感謝の気持ちを示す様子を表す言葉を選ばせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "定義:苦労や努力に対して感謝すること。早稲田中の例文では、勇気を出して人助け(アレルギー対応の注射)をした少年に対し、周囲の大人たちが「よくやったなあ」と感謝する場面で使用されている。上の立場の者が下の者に対して行うことが多い。"
15
+ },
16
+ {
17
+ "answer_id": "JP03_003",
18
+ "answer": "慈しむ",
19
+ "question_hint": "【語彙・心情】かわいがって、大切に愛情を注ぐ様子を意味する心情語を答えさせる問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "定義:愛情を注いだり、大切にしたりする気持ち。渋谷教育学園渋谷中の例文では、顔を覚えていない祖母が孫のために心を込めて作ったショールを「慈しむようにして作ってくれた」と表現。立場が下、あるいは弱い者への深い愛情を示す。"
22
+ },
23
+ {
24
+ "answer_id": "JP03_004",
25
+ "answer": "健気(けなげ)",
26
+ "question_hint": "【語彙・心情】年少者や弱い者が、困難に立ち向かって健闘する様子を表す言葉を問う問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "定義:子どもや、力・立場の弱い者が、困難なことに立ち向かっていく立派な様子。ほめてあげたい、というニュアンスを含む。渋谷教育学園渋谷中の例文では、厳しい自然の中を力強く渡っていく鳩の姿を「健気で美しい姿」と評している。大人が子供を評価する際によく使われる。"
29
+ },
30
+ {
31
+ "answer_id": "JP03_005",
32
+ "answer": "郷愁(きょうしゅう)",
33
+ "question_hint": "【語彙・心情】故郷や過去を懐かしく思う感情を指す用語を特定させる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "定義:昔のことや、故郷を懐かしく思うこと。「ノスタルジー」とも言い換えられる。東洋英和女学院中の例文では、亡き姉が弾いていた琴の曲を自分で弾いた際、懐かしさと共に「郷愁を想起させる」と表現されている。過去への憧憬を伴う。"
36
+ },
37
+ {
38
+ "answer_id": "JP03_006",
39
+ "answer": "高揚",
40
+ "question_hint": "【語彙・心情】気分が昂り、テンションが上がっている状態を表す二字熟語を答えさせる問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "定義:気分や気持ちが高まること。ラ・サール中の例文では、視力を失った兄が伴走者である弟と走り、転倒はしたものの「怖いとかではなく高揚した」と述べている。限界に挑戦したり、未知の世界に足を踏み入れたりする際の昂ぶり。"
43
+ },
44
+ {
45
+ "answer_id": "JP03_007",
46
+ "answer": "感慨(かんがい)",
47
+ "question_hint": "【語彙・心情】ある出来事に対し、心に深く感じ入る「しみじみとした」様子を問う問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "定義:ある出来事について深く心に感じること。単なる「感動」よりも「しみじみとした」ニュアンスが強い。聖光学院中の例文では、ピアノの才能を持つ少女に対し、園長先生が「神様の贈りものだ」としみじみ語る様子を「感慨深げ」と表現している。"
50
+ },
51
+ {
52
+ "answer_id": "JP03_008",
53
+ "answer": "晴れがましい",
54
+ "question_hint": "【語彙・心情】注目を浴びて誇らしく、誇張したいほどの明るい気分を指す言葉を選ばせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "定義:多くの人から注目される状況で、気持ちが晴れやかで誇らしい様子。洗足学園中の例文では、目立つグループに所属した主人公が「いつもライトが当たっているようで晴れがましい気分になった」と回想。ただし、意味としては「恥ずかしい」場合にも使われる多義語。"
57
+ },
58
+ {
59
+ "answer_id": "JP03_009",
60
+ "answer": "解放感",
61
+ "question_hint": "【心情分析】緊張や拘束から解き放たれた際の心情を、対比構造を用いて説明させる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "定義:縛られていたものがなくなり、自由になった感覚。構造として「緊張・制限(テスト中など)」→「きっかけ(終了)」→「解放」という対比が必要。法政第二中の例文では、静まり返った中学校の定期テストが終わった直後の教室の様子を指している。"
64
+ },
65
+ {
66
+ "answer_id": "JP03_010",
67
+ "answer": "羨望(せんぼう)",
68
+ "question_hint": "【語彙・心情】他人の状態を「うらやましい」と強く思う気持ちを指す言葉を特定させる問題。",
69
+ "difficulty": "応用",
70
+ "source_context": "定義:うらやましいと思う気持ち。灘中の例文では、合格した「ぼく」に対し塾の仲間たちが向けた視線を「羨望のまなざし」と表現。「自分もそうなりたい」というプラスの憧れを含むが、文脈により「嫉妬」に転じる可能性も孕む。"
71
+ },
72
+ {
73
+ "answer_id": "JP03_011",
74
+ "answer": "気後れ",
75
+ "question_hint": "【心情分析】周囲の勢いや雰囲気に圧倒され、自信をなくす様子を答えさせる問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "定義:相手の勢いや雰囲気に押されて、心がひるむこと。開成中の例文では、低学年の頃の主人公が、大人数で盛り上がるノリに対して感じていた心情として描かれている。内向的な人物が外交的な集団に接する際によく見られる感情。"
78
+ },
79
+ {
80
+ "answer_id": "JP03_012",
81
+ "answer": "卑屈(ひくつ)",
82
+ "question_hint": "【心情分析】自分自身を過小評価し、いじけた態度をとる心情を指す言葉を答えさせる問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "定義:自分を大したことがないといじけ、卑しめること。洗足学園中の例文では、友人が努力して絵を描いているのに対し、自分は真剣に向き合っていなかった自責から「私なんか――」と卑屈な言葉をこぼしそうになる場面で使われている。"
85
+ },
86
+ {
87
+ "answer_id": "JP03_013",
88
+ "answer": "羞恥心(しゅうちしん)",
89
+ "question_hint": "【心情分析】自分の言動が恥ずかしいと感じる気持ちを、特に「大人ぶった振る舞い」と関連させて問う問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "定義:恥ずかしく思う気持ち。東邦大東邦中の例文では、生意気で大人ぶった内容の読書感想文が全校放送で読まれたことを「羞恥心と共に思い出す」とある。過去の未熟な自分を客観視した際に出る感情。"
92
+ },
93
+ {
94
+ "answer_id": "JP03_014",
95
+ "answer": "無力感",
96
+ "question_hint": "【心情分析】自分の力では現状を変えられないことへの絶望や虚無感を答えさせる問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "定義:自分には状況を変える力がないと悟り、虚しく思うこと。鷗友学園女子中の例文では、母を亡くした幼馴染に対し、一緒に泣くことしかできない自分を「無力が恨めしかった」と表現。虚脱感を伴う重い心情。"
99
+ },
100
+ {
101
+ "answer_id": "JP03_015",
102
+ "answer": "疎外感",
103
+ "question_hint": "【心情分析】集団の中で自分だけが仲間外れにされている、あるいは避けられていると感じる心情を問う問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "定義:自分が避けられ、排除されていると思う気持ち。甲陽学院中の例文では、双子の兄弟と離れて一人で水泳留学をすることに対し、周囲と違う道を行くことによる「疎外感に怯える必要はない」と自分を鼓舞する文脈で使われている。"
106
+ },
107
+ {
108
+ "answer_id": "JP03_016",
109
+ "answer": "いたたまれない",
110
+ "question_hint": "【語彙・心情】恥ずかしさや気まずさから、その場に居続けることが苦しい様子を表す心情語を答えさせる問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "定義:辛さ、悲しみ、恥ずかしさなどで、その場所に居続けることができない気持ち。駒場東邦中の例文では、相手の誘いが「未成年を帰すための方便」だったと気づき、自分の幼さを自覚して赤面するような場面で「いたたまれなくなり」と表現。"
113
+ },
114
+ {
115
+ "answer_id": "JP03_017",
116
+ "answer": "うなだれる",
117
+ "question_hint": "【心情推察】動作から心情を読み取る問題。「首を力なく垂れる」動作の背景にある心情を答えさせる。",
118
+ "difficulty": "標準",
119
+ "source_context": "動作の意味:がっかりした気持ち、悲しさ、羞恥心から頭を下げること。洛星中の例文では、友人といじめに加担し、ターゲットを川に落としてしまった少年が、後悔と罪悪感から「うなだれる」様子が描かれている。"
120
+ },
121
+ {
122
+ "answer_id": "JP03_018",
123
+ "answer": "葛藤(かっとう)",
124
+ "question_hint": "【読解概念】心の中に相反する二つの感情があり、板挟みになって悩む状態を何というか答えさせる問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "定義:心の中に複数の相反する感情があり、判断に迷うこと。本郷中の例文では、親の都合で来日した子供が「日本の生活に馴染みたい自分」と「故郷を懐かしむ自分」の間で悩む様子を「葛藤に悩まされている」と表現。物語の展開を作る核心要素。"
127
+ },
128
+ {
129
+ "answer_id": "JP03_019",
130
+ "answer": "憤り(いきどおり)",
131
+ "question_hint": "【心情分析】「怒り」との違いに注目し、内面に溜め込まれた激しい怒りを指す言葉を特定させる問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "定義:激しく腹を立てること。「怒り」が表出するのに対し、「憤り」は内側でわなわなと震えるような、深みのある怒りを指す。芝中の例文では、患者を救えなかった過去の自分を許せない医者の心情を「自身に対する悔いと憤り」と表現。"
134
+ },
135
+ {
136
+ "answer_id": "JP03_020",
137
+ "answer": "横柄(おうへい)",
138
+ "question_hint": "【語彙・人物像】人を見下し、威張った態度をとる様子を形容する言葉を答えさせる問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "定義:威張っていて、人を見下した態度。青稜中の例文(芥川龍之介『魔術』)では、魔術の名人らしく振る舞おうとして「横柄に答えた」と記述。不遜な人物像や、虚勢を張っている様子を示す際に使われる。"
141
+ },
142
+ {
143
+ "answer_id": "JP03_021",
144
+ "answer": "冷淡(れいたん)",
145
+ "question_hint": "【人物像分析】相手に対して無関心で、思いやりのない「冷たい」様子を指す言葉を答えさせる問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "定義:無関心、そっけない、思いやりがないこと。洛星中の例文(芥川龍之介『トロッコ』)では、親切にお菓子をくれた男に対し、良平が「ありがとう」とそっけなく言った態度を「冷淡に」と表現。後で自責の念に駆られる原因となる。"
148
+ },
149
+ {
150
+ "answer_id": "JP03_022",
151
+ "answer": "うぬぼれる",
152
+ "question_hint": "【心情分析】自分の実力を過大評価し、得意げになっている様子を表す心情語を答えさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "定義:実際以上に自分が優れていると思い込み、得意になること。洗足学園中の例文では、兄を自転車で追い越した弟が、兄の配慮(危険回避)に気づかず「お兄ちゃんを超えた」と勘違いした様子を「勝手にうぬぼれた」と回想している。"
155
+ },
156
+ {
157
+ "answer_id": "JP03_023",
158
+ "answer": "虚勢を張る(きょせいをはる)",
159
+ "question_hint": "【人物像分析】自分の弱さを隠すために、わざと強気な態度を見せる様子を指す慣用句を問う問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "定義:弱みを見せないよう、無理に威勢をよく見せること。吉祥女子中の例文では、集団に属さず一人で堂々としている女子生徒を「虚勢を張るわけでもなく、おどおどするでもなく」と評し、彼女の自立した精神性を強調している。"
162
+ },
163
+ {
164
+ "answer_id": "JP03_024",
165
+ "answer": "鬱陶しい(うっとうしい)",
166
+ "question_hint": "【心情分析】特に思春期の子供が親の干渉に対して抱く、煩わしい感情を答えさせる問題。",
167
+ "difficulty": "基本",
168
+ "source_context": "定義:煩わしい、うるさい、気が晴れない。立命館宇治中の例文では、内面を聞き出そうとする母の干渉を「鬱陶しくて煩わしくて面倒くさい」と表現。自立しようとする時期の、言葉にならないもどかしさを伴う反発。"
169
+ },
170
+ {
171
+ "answer_id": "JP03_025",
172
+ "answer": "無念(むねん)",
173
+ "question_hint": "【心情分析】期待が裏切られ、非常に悔しく残念に思う気持ちを答えさせる問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "定義:非常に悔しく思うこと。駒場東邦中の例文では、自信を持って勧めた本が「そうでもなかった」と言われた教師の表情を「無念そうな表情」と形容。期待(プラス)と現実(マイナス)のギャップから生じる強い落胆。"
176
+ },
177
+ {
178
+ "answer_id": "JP03_026",
179
+ "answer": "不憫(ふびん)",
180
+ "question_hint": "【心情分析】立場が上の者が、苦労している下の者を「かわいそう」と思う感情を特定させる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "定義:かわいそうに思うこと、気の毒に思うこと。渋谷教育学園渋谷中の例文では、貧しい生活で身なりが整わない母を見た息子が「不憫になって」口紅をプレゼントした回想シーンで登場。「憐れみ」に近いニュアンス。"
183
+ },
184
+ {
185
+ "answer_id": "JP03_027",
186
+ "answer": "偏見(へんけん)",
187
+ "question_hint": "【読解概念】客観的な根拠なく、先入観で一方的に決めつける偏った考え方を答えさせる問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "定義:偏った見方。海城中の例文では、難聴の少女が「手話を習う=自分が障害者だと認めること」に抵抗を感じ、自分の中に「障害者はかわいそう・劣っている」という偏見があることに気づき、自己嫌悪に陥る葛藤が描かれている。"
190
+ },
191
+ {
192
+ "answer_id": "JP03_028",
193
+ "answer": "いぶかしむ",
194
+ "question_hint": "【心情分析】物事が不自然であると感じ、怪しく、不審に思う様子を表す心情語を答えさせる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "定義:あやしい、おかしいと不思議に思う。聖光学院中の例文では、様子がおかしい滝田に対し、友人の松島が「大丈夫か?」と不審に思う表情を「いぶかしむような表情」と表現。「怪訝(けげん)そう」と言い換え可能。"
197
+ },
198
+ {
199
+ "answer_id": "JP03_029",
200
+ "answer": "焦燥(しょうそう)",
201
+ "question_hint": "【心情分析】物事が思うように進まず、焦ってイライラする様子を答えさせる問題。",
202
+ "difficulty": "応用",
203
+ "source_context": "定義:焦っていらいらすること。「焦燥感に駆られる」の形で使われる。東京都市大付中の例文(菊池寛『忠直卿行状記』)では、これまでの勝利が全て八百長だったと知った大名の、自尊心が傷つき、やり場のない苛立ちを「烈しい焦燥」と表現。"
204
+ },
205
+ {
206
+ "answer_id": "JP03_030",
207
+ "answer": "トラウマ",
208
+ "question_hint": "【読解概念】過去の衝撃的な経験が、現在の行動を制限するほど深い心の傷となっている状態を答えさせる問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "定義:心的外傷。後々まで消えない心の傷。聖光学院中の例文では、大怪我をした選手が治ったはずなのに思い切ったプレーができない原因として「怪我のトラウマ」の可能性を指摘している。物語ではこれを克服することが「成長」の軸となる。"
211
+ },
212
+ {
213
+ "answer_id": "JP03_031",
214
+ "answer": "切望(せつぼう)",
215
+ "question_hint": "【心情分析】何かを「心から強く望む」ことを表す、強い意志の入った熟語を答えさせる問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "定義:心から強く望むこと。國學院久我山中の例文では、表面的な友だち付き合いをしている主人公が、過去に「心の一部を預け合える友だち」を激しく求めていた自分を思い出し、それを「切望していた」と表現している。"
218
+ },
219
+ {
220
+ "answer_id": "JP03_032",
221
+ "answer": "安堵(あんど)",
222
+ "question_hint": "【心情分析】気がかりなことが解決し、ほっと胸をなでおろす様子を言い換えさせる問題。",
223
+ "difficulty": "基本",
224
+ "source_context": "定義:気がかりがなくなって安心すること。灘中の例文では、息子が生活保護家庭の女子と付き合っているのではないかという疑念が晴れた母の様子を「安堵の顔」と記述。文脈により、差別的な優越感を含む「安心」であることもある。"
225
+ },
226
+ {
227
+ "answer_id": "JP03_033",
228
+ "answer": "自尊心(じそんしん)",
229
+ "question_hint": "【読解概念】自分自身を大切にし、誇りに思う気持ちを「カタカナ語」と言い換えさせて答えさせる問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "定義:自分を大切にする心、誇り。言い換え:プライド。國學院久我山中の例文では、地位を失い、新しい環境でも役に立てていない中高年男性が、周囲の視線に耐えられず「自尊心が傷ついている」様子が分析されている。"
232
+ },
233
+ {
234
+ "answer_id": "JP03_034",
235
+ "answer": "達成感",
236
+ "question_hint": "【心情分析】目標を成し遂げた後に得られる、格別な満足感を答えさせる問題。",
237
+ "difficulty": "基本",
238
+ "source_context": "定義:何かを成し遂げた後の満足感。大阪星光学院中の例文では、病弱で激しい運動を禁じられてきた弟が、ゴールまで走り切った際の「達成感」を知らないことを、兄が「かわいそう・申し訳ない」と痛感するシーンで登場。"
239
+ },
240
+ {
241
+ "answer_id": "JP03_035",
242
+ "answer": "信頼",
243
+ "question_hint": "【人間関係】相手を信じて頼りにする、物語の良好な人間関係を構築する基礎となる言葉を問う問題。",
244
+ "difficulty": "基本",
245
+ "source_context": "定義:信じて頼りにすること。心情語。頌栄女子学院中の例文では、「心から信頼を寄せてくる相手に対して、人はそうそう冷たくなれない」と同僚が主人公に語り、人間関係の本質を説いている。"
246
+ },
247
+ {
248
+ "answer_id": "JP03_036",
249
+ "answer": "嫉妬(しっと)",
250
+ "question_hint": "【心情分析】自分より優れた者に対し、恨めしく思ったりねたんだりする、負の感情を答えさせる問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "定義:自分より優れている人をねたむこと。普連土学園中の例文では、若くして成功したジンが、世間から「嫉妬と憧れのまなざし」を向けられていると記述。物語では、この嫉妬心が周囲の悪意を招く伏線となることが多い。"
253
+ },
254
+ {
255
+ "answer_id": "JP03_037",
256
+ "answer": "後ろめたい",
257
+ "question_hint": "【心情分析】自分に非があると感じ、心に引っかかり(しこり)を覚える状態を答えさせる問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "定義:自分に悪い点があると感じ、心がとがめる。洛星中の例文では、イチゴが「好きだから最後に残した」と勝手に思い込んでいた主人公が、相手が実は嫌いだったと知り、「思い込みで人を決めつけた後ろめたさ」を感じる場面で使われている。"
260
+ },
261
+ {
262
+ "answer_id": "JP03_038",
263
+ "answer": "後悔(こうかい)",
264
+ "question_hint": "【読解概念】してしまったことに対して、後から「しなければよかった」と悔やむ心情を答えさせる問題。",
265
+ "difficulty": "基本",
266
+ "source_context": "定義:自分のしたことを後から悔やむこと。同志社女子中の例文では、友人に対して無愛想に給食を渡してしまった後で、「どうしてあんなつっけんどんに……」と思い悩む様子を「後悔していた」と記述。変化(プラス)へのきっかけとなることが多い。"
267
+ },
268
+ {
269
+ "answer_id": "JP03_039",
270
+ "answer": "孤独(こどく)",
271
+ "question_hint": "【心情分析】仲間がいなかったり、理解者がいなかったりして寂しく思う、物語文の「マイナス状態」の典型を問う問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "定義:一人ぼっちで寂しいこと。渋谷教育学園渋谷中の例文では、いつか息子が自立して去ってしまうことを予見した父が「耐えがたい孤独」を感じる場面で登場。単なる「独り」ではなく、精神的なつながりの欠如を指す。"
274
+ },
275
+ {
276
+ "answer_id": "JP03_040",
277
+ "answer": "絶望(ぜつぼう)",
278
+ "question_hint": "【心情分析】「希望が全くなくなった」という、物語文において最も深いマイナスの状態を指す言葉を答えさせる問題。",
279
+ "difficulty": "基本",
280
+ "source_context": "定義:希望がなくなる。近畿大学附属中の例文では、事故でピアノを弾けなくなった少女の内心を、周囲が「傷つき、絶望している」と推察する場面で使われている。物語はこの極限状態から「再生」へ向かう構造を持つ。"
281
+ },
282
+ {
283
+ "answer_id": "JP03_041",
284
+ "answer": "マイナスからプラスへ変化する",
285
+ "question_hint": "【物語の構造】物語文の展開における、最も一般的で「道徳的・成長」を感じさせる変化パターンを説明させる問題。",
286
+ "difficulty": "標準",
287
+ "source_context": "物語の暗黙ルール:物語は基本的に「不幸な状況(マイナス)」から、何らかの「きっかけ」を経て「成長・変化(プラス)」へ向かう。入試問題では、この変化の「きっかけ」や「成長した後の内面」を問う問題が頻出。アンパンマンの構図(敗北→助け→勝利)はその典型例。"
288
+ },
289
+ {
290
+ "answer_id": "JP03_042",
291
+ "answer": "内面の成長",
292
+ "question_hint": "【読解概念】入試物語文のテーマとして選ばれる「道徳的な変化」を一言でどう表すか答えさせる問題。",
293
+ "difficulty": "標準",
294
+ "source_context": "定義:できなかったことができるようになる、理解できなかった他者の心情を理解できるようになる等の「心の変化」。入試問題では、単なる偶然の幸運ではなく、自己と向き合い、自発的に変わる「内面の成長」を描いた作品が選ばれる。"
295
+ },
296
+ {
297
+ "answer_id": "JP03_043",
298
+ "answer": "曖昧になっていた自分の気持ちと向き合う",
299
+ "question_hint": "【物語パターン】『雲を紡ぐ』や『教室に並んだ背表紙』に共通する、主人公の自己解決型成長パターンを答えさせる問題。",
300
+ "difficulty": "標準",
301
+ "source_context": "パターン:うまく言えなかった本心や、ぼんやりしていた感情が、他者(先生や祖父)との関わりで明確になり、最終的に自分の意思を相手(親など)に伝えることができるようになる。自己覚醒の物語。"
302
+ },
303
+ {
304
+ "answer_id": "JP03_044",
305
+ "answer": "他者の視線に左右されない自分になる",
306
+ "question_hint": "【物語パターン】親の期待や周囲の評価に合わせて自分を「演じていた」子供が、自立していくパターンを答えさせる問題。",
307
+ "difficulty": "標準",
308
+ "source_context": "パターン:アイデンティティの確立がテーマ。「親にとって望ましい自分」をやめ、自分のやりたいこと(絵やピアノなど)を、周囲の反対を恐れずに選択する。市川中出題の「みどり色の記憶」などが代表例。"
309
+ },
310
+ {
311
+ "answer_id": "JP03_045",
312
+ "answer": "転校生(留学生)",
313
+ "question_hint": "【物語パターン】物語において、停滞していた人間関係や主人公の内面に変化をもたらす典型的な「外部からの刺激」となる役割は何か問う問題。",
314
+ "difficulty": "標準",
315
+ "source_context": "役割:既存の集団のルールに縛られない「異質」な存在として登場。主人公のトラウマを気にせず接したり、本音を引き出したりする「変化のきっかけ」となる。洗足学園中、海陽中、吉祥女子中などの入試素材文で多用される設定。"
316
+ },
317
+ {
318
+ "answer_id": "JP03_046",
319
+ "answer": "自分にない考えを理解する",
320
+ "question_hint": "【物語パターン】境遇や価値観が全く異なる他者と出会い、自分の「常識」をアップデートする成長パターンを答えさせる問題。",
321
+ "difficulty": "応用",
322
+ "source_context": "パターン:自分の物差しでは測れない他者の事情(生活保護、戦争、不登校等)を知り、相手に共感したり、自分の無知を恥じたりする。駒場東邦中出題の『夏と百花とカルピスと』では、カルピスを「平和の味」と呼ぶ避難民の少女の視点を知ることで主人公が成長する。"
323
+ },
324
+ {
325
+ "answer_id": "JP03_047",
326
+ "answer": "集団心理から抜け出す",
327
+ "question_hint": "【物語パターン】特に「戦争」などの極限状況を扱った作品で見られる、周囲に流されない個の目覚めを描くパターンを答えさせる問題。",
328
+ "difficulty": "応用",
329
+ "source_context": "パターン:戦時中の「国のために死ぬのが当然」という同調圧力から離れ、一個人の命の尊さや素朴な感情を大切にするようになる変化。桜蔭中、武蔵中などの最難関校で好まれるテーマ。"
330
+ },
331
+ {
332
+ "answer_id": "JP03_048",
333
+ "answer": "トラウマを克服する",
334
+ "question_hint": "【物語パターン】過去の失敗やいじめによる深い傷によって「できない」と思い込んでいたことに再挑戦するパターンを答えさせる問題。",
335
+ "difficulty": "応用",
336
+ "source_context": "パターン:過去の衝撃(マイナス)により制限されていた行動が、新たな出会いや他者への助け(きっかけ)を通じて解消され、自尊心を回復する。早稲田中出題の『明日の僕に風が吹く』やサレジオ学院中の『金の角持つ子どもたち』が該当。"
337
+ },
338
+ {
339
+ "answer_id": "JP03_049",
340
+ "answer": "先入観を持った行動を後悔する・気づきを得る",
341
+ "question_hint": "【物語パターン】物語の結末が「ハッピーエンド」ではなく、自分の至らなさを自覚して終わるパターンの本質を答えさせる問題。",
342
+ "difficulty": "応用",
343
+ "source_context": "パターン:自分の思い込み(他人の悪意など)が間違いだったと気づき、自分を恥じる。聖光学院中出題の『リバース&リバース』のように、良かれと思った行動が実は相手を追い詰めていたと知ることで、自分自身の未熟さを反省する「成長」の一種。"
344
+ },
345
+ {
346
+ "answer_id": "JP03_050",
347
+ "answer": "世の中の常識に相反する・葛藤する",
348
+ "question_hint": "【物語パターン】灘、桜蔭、麻布などの最���関校で出題される、エリート層の孤独や才能ゆえの苦悩を扱うパターンを答えさせる問題。",
349
+ "difficulty": "応用",
350
+ "source_context": "パターン:周囲と話が合わない孤独、社会が求める「わかりやすい復興」と自分の「芸術的信念」の激突など。世間の期待(常識)に自分を合わせるか、孤高を貫くかの葛藤。麻布中、海城中出題の『氷柱の声』では、コンクールの評価基準と自分の画風の間での葛藤が描かれた。"
351
+ }
352
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP04.json ADDED
@@ -0,0 +1,352 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP04_001",
4
+ "answer": "対比(たいひ)",
5
+ "question_hint": "説明文の基本的な「型」に関する用語定義。二つの事柄を並べて違いを際立たせる手法を問う問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "説明文・論説文の「暗黙のルール」の一つ。筆者は自分の主張を際立たせるために、反対の事柄や従来一般的だった考え方を並べて比較する「対比」を多用する。例えば「これまでの強いリーダー」と「これからの弱いリーダー」を比較するような構成が挙げられる。"
8
+ },
9
+ {
10
+ "answer_id": "JP04_002",
11
+ "answer": "常識とは異なること(当たり前と思われていないこと)",
12
+ "question_hint": "説明文の筆者が読者に伝えようとする内容の性質を問う問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "筆者は、読者が既に知っている「当たり前のこと(例:三角形の面積の公式)」をわざわざ書くことはない。読者が「へぇ〜!」と思うような、世の中の常識とは異なる視点や、新しい発見を伝えるのが文章の目的である。"
15
+ },
16
+ {
17
+ "answer_id": "JP04_003",
18
+ "answer": "説得力を持たせるため",
19
+ "question_hint": "説明文において「具体例」が用いられる目的を問う問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "筆者が自分の主張を述べるだけでは独りよがりになりやすいため、具体例(事例やエピソード)を挿入することで、読者に対して自分の意見に「説得力」を持たせる役割がある。"
22
+ },
23
+ {
24
+ "answer_id": "JP04_004",
25
+ "answer": "二元論(にげんろん)",
26
+ "question_hint": "物事を二つの対立する世界や考え方に分けて単純化する思考法を問う問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "複雑な事象を「善と悪」「西洋と東洋」「スマホと本」のように二つの世界に分けて説明する考え方。物事を単純化することで読者にわかりやすく伝える効果があるが、過度な決めつけに陥る危険性も併せ持つ。"
29
+ },
30
+ {
31
+ "answer_id": "JP04_005",
32
+ "answer": "真の意味で「弱さ」を受け入れることのできるリーダー",
33
+ "question_hint": "コロナ禍をテーマにした文章における「これからのリーダー像」を特定する問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "若松英輔『弱さのちから』の例。コロナ禍以前は「強い」リーダーが求められていたが、これからは強がるのではなく、自らの弱さを受け入れ、人々と深いところでつながる「弱い」リーダーが求められるという対比が示されている。"
36
+ },
37
+ {
38
+ "answer_id": "JP04_006",
39
+ "answer": "身体や感情を伴った「対面(直接会うこと)」の場",
40
+ "question_hint": "オンライン化が進む中で、筆者が強調する「大学の学び」の本質を問う問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "増田聡の文章より。オンラインでの知識の習得(コンテンツのインストール)は便利だが、本質的な「学び」とは、身体と感情を持った人間が直接会って対話し、試行錯誤する「場」にこそあると説かれている。"
43
+ },
44
+ {
45
+ "answer_id": "JP04_007",
46
+ "answer": "リモートワークができる「恵まれた環境」かどうかの差",
47
+ "question_hint": "コロナ禍における「格差の拡大」についての具体例を問う問題。",
48
+ "difficulty": "応用",
49
+ "source_context": "コロナ禍では、リモートワークができる豊かな層と、他者と距離を取ることができず低賃金で働く層の間で格差が露呈した。また、非正規雇用の人が優先的に解雇されるなどの経済的格差も、コロナ禍というテーマで頻出する視点である。"
50
+ },
51
+ {
52
+ "answer_id": "JP04_008",
53
+ "answer": "同調圧力(どうちょうあつりょく)",
54
+ "question_hint": "集団の中で「周りと同じように振る舞え」と強制される無言の圧力を指す用語を問う問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "少数意見を持つ人に対し、暗黙のうちに周囲の大多数と同じ行動をするよう強制する空気。日本では「空気を読め」という風潮として強く現れ、コロナ禍では自粛警察やマスク警察といった形で見られた。"
57
+ },
58
+ {
59
+ "answer_id": "JP04_009",
60
+ "answer": "絶対的な神を持たず、場の「空気」に支配されやすいため",
61
+ "question_hint": "日本社会において同調圧力が強く働く背景(宗教的観点)を問う問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "渋谷教育学園幕張中の出���。キリスト教などの一神教を信じる人が多くない日本は、絶対的な基準(神)がない代わりに、その場を支配する「臨在感的」な力(空気)に身を任せてしまいやすい傾向がある。"
64
+ },
65
+ {
66
+ "answer_id": "JP04_010",
67
+ "answer": "利他(りた)",
68
+ "question_hint": "自分の利益よりも他人の幸せを優先する考え方を指す用語を問う問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "自分のことよりも他人の利益を考えて尽くすこと。利己主義(自己中)の対義語。災害時や非常時には利他の心を持つことで周囲の協力が得られ、結果として自分にもプラスに働くという側面がある。"
71
+ },
72
+ {
73
+ "answer_id": "JP04_011",
74
+ "answer": "相手を支配することにつながる恐れがあるから",
75
+ "question_hint": "一方的な「利他的行動」が持つネガティブな側面を問う問題。",
76
+ "difficulty": "応用",
77
+ "source_context": "伊藤亜紗『「利他」とは何か』より。「これをしてあげれば相手は喜ぶはずだ」という思い込みは、次第に「相手は喜ぶべきだ」という押し付けに変わり、相手を支配するリスクを孕む。真の利他には「他者の発見(自分の変化)」が必要とされる。"
78
+ },
79
+ {
80
+ "answer_id": "JP04_012",
81
+ "answer": "バイアス",
82
+ "question_hint": "人間が無意識に抱いている「思い込み」や「先入観」を指すカタカナ語を問う問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "「思い込み」の意。筆者は「人々は●●だと思っているが、実はバイアスがかかっているのだ」という型を用いて、自説の正しさを説明する。例として、他人の言葉を真実と判断しやすい「真実バイアス」などがある。"
85
+ },
86
+ {
87
+ "answer_id": "JP04_013",
88
+ "answer": "アンコンシャス・バイアス",
89
+ "question_hint": "自分自身で気づいていない「無意識の思い込み」を指す用語を問う問題。",
90
+ "difficulty": "応用",
91
+ "source_context": "「無意識の思い込み」。開成中の社会や国語で頻出。「母親は仕事の有無にかかわらず家庭にいるべきだ」といった古いジェンダー規範に基づいた発言(例:単身赴任の母に『お子さんがかわいそう』と言う)などがこれにあたる。"
92
+ },
93
+ {
94
+ "answer_id": "JP04_014",
95
+ "answer": "メディアが作った「物語」ではないか疑う姿勢",
96
+ "question_hint": "戦争報道を受け取る際に、視聴者に求められる「情報との向き合い方」を問う問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "村上龍の文章より。ニュース映像で平和な街が繰り返されると「戦争が終わった」と錯覚しがちだが、それはメディアが人々の期待する「物語」に沿って作ったものかもしれない。情報の裏にある真実を考える姿勢が必要。"
99
+ },
100
+ {
101
+ "answer_id": "JP04_015",
102
+ "answer": "視聴率を上げるために刺激的な場面を強調しやすいこと",
103
+ "question_hint": "マスメディアによる戦争報道が持つ構造的な問題を問う問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "商業メディアは広告料などで運営されているため、多くの人に見てもらう必要がある。そのため、ロケット着弾や破壊された町など、視聴者の期待に沿った「過激で分かりやすい展開」を優先してしまうバイアスが生じやすい。"
106
+ },
107
+ {
108
+ "answer_id": "JP04_016",
109
+ "answer": "生物多様性(せいぶつたようせい)",
110
+ "question_hint": "地球上のあらゆる生き物がバランスを保って存在することを指す用語を問う問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "すべての生物が相互に関連し合って存在すること。巣鴨中の出題では、都会の消費者もコーヒーの選択を通じて「生物多様性の保全」に貢献できるといった、一見遠い存在のつながりが説かれている。"
113
+ },
114
+ {
115
+ "answer_id": "JP04_017",
116
+ "answer": "ジェンダー",
117
+ "question_hint": "生物学的な性別ではなく、社会や文化によってつくられた性差を指す用語を問う問題。",
118
+ "difficulty": "基本",
119
+ "source_context": "社会的・文化的に規定された「男らしさ」「女らしさ」。「男は仕事、女は家庭」という役割分担や「男子はズボン、女子は化粧」といった社会ルールがこれに該当する。現代では多様性の尊重から、この規範を問い直す文章が多い。"
120
+ },
121
+ {
122
+ "answer_id": "JP04_018",
123
+ "answer": "アイデンティティ(自己同一性)",
124
+ "question_hint": "「自分が自分であること」を指し、他者との違��を認識する用語を問う問題。",
125
+ "difficulty": "基本",
126
+ "source_context": "自己同一性。自分が自分であるという認識。「ぼく」や「おれ」といった一人称の使い分けも、自分の役割(弱気な男子かガキ大将か等)としてのアイデンティティと結びついているとされる。"
127
+ },
128
+ {
129
+ "answer_id": "JP04_019",
130
+ "answer": "本質主義(ほんしつしゅぎ)",
131
+ "question_hint": "アイデンティティは最初から備わっている属性であり、それに従って行動が決まると考える立場を問う問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "立命館中の出題。「謙虚な人だから丁寧な言葉を使う」というように、あらかじめ備わっている性格が言葉に現れるとする考え方。これに対し「人と関わり合う中でアイデンティティが作られる(構築主義)」という対比で出題される。"
134
+ },
135
+ {
136
+ "answer_id": "JP04_020",
137
+ "answer": "資本主義(しほんしゅぎ)",
138
+ "question_hint": "利益を優先し、自由な競争を行う現代の経済システムを指す用語を問う問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "競争社会で利益を追求する仕組み。効率性を高めて豊かさを生む一方、目先の利益を優先するため環境問題を後回しにしやすいという「副作用」があり、気候変動を加速させる要因として批判的に論じられることが多い。"
141
+ },
142
+ {
143
+ "answer_id": "JP04_021",
144
+ "answer": "将来世代に負担や被害を先送りしていること",
145
+ "question_hint": "現代の資本主義社会における「環境問題」の解決が難しい根本的な理由を問う問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "環境への配慮はコストがかかり、利益を追求する企業活動とは相容れない。今すぐゴミを捨てても直ちに被害は見えないが、将来の食糧不足や豪雨などの「取り返しのつかない展開」を招くという、世代間の不平等を指摘する視点が重要。"
148
+ },
149
+ {
150
+ "answer_id": "JP04_022",
151
+ "answer": "パンデミック",
152
+ "question_hint": "感染症が世界的に大流行することを指すカタカナ語を問う問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "神奈川学園中の出題。感染症の世界的流行。14世紀のペストや20世紀初頭のスペインかぜなど、歴史上何度も繰り返されてきた事象であり、新型コロナウイルスもその一例。"
155
+ },
156
+ {
157
+ "answer_id": "JP04_023",
158
+ "answer": "ヤングケアラー",
159
+ "question_hint": "本来大人が担うべき家事や家族の介護を日常的に行っている子供を指す用語を問う問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "大人に代わって介護や家事を行う子供。勉強の時間や友人との交流が奪われ、将来の選択肢が狭まる「貧困の連鎖」の原因として、近年中学入試でも社会問題として取り上げられるテーマである。"
162
+ },
163
+ {
164
+ "answer_id": "JP04_024",
165
+ "answer": "マスメディア",
166
+ "question_hint": "テレビ、新聞、雑誌、ラジオなど、不特定多数に情報を伝える媒体の総称を問う問題。",
167
+ "difficulty": "基本",
168
+ "source_context": "情報を大衆に伝える機関。インターネット以前は情報の信頼性を担保する「情報ランチ定食」のような存在だったが、現在はネットと対比され、その画一的な批判や情報の偏り、広告主の影響などのマイナス面も論じられる。"
169
+ },
170
+ {
171
+ "answer_id": "JP04_025",
172
+ "answer": "メディアリテラシー",
173
+ "question_hint": "情報を鵜呑みにせず、内容を正しく理解・判断し活用する能力を問う問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "「情報の質や意味を的確に判断できる能力」。偽情報やプロパガンダ(意図的な宣伝)が溢れる現代において、不確定な未来を見通すために「引き出し」から情報を適切に取捨選択する「生きる力」の一つとされる。"
176
+ },
177
+ {
178
+ "answer_id": "JP04_026",
179
+ "answer": "情報の双方向性(そうほうこうせい)",
180
+ "question_hint": "インターネットやオンライン技術によって生まれた、情報伝達の特徴を問う問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "これまでのマスメディアが「与える側→受け取る側」という一方向だったのに対し、オンラインでは誰もが発信でき、やり取りができる「双方向」の変化が起きた。メタバース等の仮想空間での「つながっている感覚」もこれに含まれる。"
183
+ },
184
+ {
185
+ "answer_id": "JP04_027",
186
+ "answer": "自分の見たい(考えに近い)情報ばかり��見てしまうこと",
187
+ "question_hint": "SNSにおけるAIの判断やレコメンド機能がもたらすマイナス面を問う問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "SNS(Twitter, Instagram等)ではフォロー中の人物やAIの予測に基づき「興味のある投稿」が表示される。そのため安心感はあるが、自分と違う視点の「多様な意見」に触れる機会が減り、思考が偏るリスクがある。"
190
+ },
191
+ {
192
+ "answer_id": "JP04_028",
193
+ "answer": "人間とAIが「競合」するのではなく「協調」すること",
194
+ "question_hint": "人工知能(AI)の急速な発達に対し、これからの人間に求められる姿勢を問う問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "中野信子『空気を読む脳』より。過去のデータ分析ではAIは人間を凌駕する。しかし、人間とAIを対立(競合)させるのではなく、互いの強みを知り、生活を豊かにするためにどう活用するかを議論するフェーズに移行している。"
197
+ },
198
+ {
199
+ "answer_id": "JP04_029",
200
+ "answer": "言葉以外の情報(非言語情報)",
201
+ "question_hint": "コミュニケーションにおいて、全体の93%を占めるとされる情報の種類を問う問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "鎌田實『相手の身になる練習』より。コミュニケーションにおける「言葉」の割合はわずか7%であり、残りは声の調子、表情、視線、態度といった「言葉以外の情報」である。オンライン化でこれらが失われるリスクが対比として語られる。"
204
+ },
205
+ {
206
+ "answer_id": "JP04_030",
207
+ "answer": "コミュニケーションを「キャッチボール」として捉えているか",
208
+ "question_hint": "SNSの発信における「自己満足」と、真のコミュニケーションの違いを問う問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "横浜共立学園中の出題。本来のコミュニケーションは相手が受け取れるように投げる「キャッチボール」だが、SNSでは「いかに素晴らしいボールを投げるか(自己の評価)」に終始し、受け手への配慮が欠けがちであるという批判。"
211
+ },
212
+ {
213
+ "answer_id": "JP04_031",
214
+ "answer": "合理的(ごうりてき) / 合理主義",
215
+ "question_hint": "感情に流されず、理性や論理に従って判断・行動する様子を指す用語を問う問題。",
216
+ "difficulty": "基本",
217
+ "source_context": "理性的に考えること。近代の科学的な教育により「妖怪などは非科学的だ」と否定する思考も合理的。説明文では、論理が明確な「プラス」の面と、非効率な伝統を排除する「マイナス」の両面で描かれる。"
218
+ },
219
+ {
220
+ "answer_id": "JP04_032",
221
+ "answer": "便利になればなるほど、自由時間がなくなっている(忙しくなる)",
222
+ "question_hint": "「効率化」を追求した現代社会において生じている「逆説(パラドックス)」を問う問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "池内了の文章より。科学技術の進展で雑用が減り余暇が増えるはずだったが、実際には新たな「しなければならないこと」が詰め込まれ、技術に操られる存在として人間はより忙しくなっているという矛盾。"
225
+ },
226
+ {
227
+ "answer_id": "JP04_033",
228
+ "answer": "個人主義(こじんしゅぎ)",
229
+ "question_hint": "個人の自由や権利を尊重する、近代ヨーロッパで定着した考え方を問う問題。",
230
+ "difficulty": "基本",
231
+ "source_context": "個人の尊重。資本主義や自由競争と密接。物語文・論説文では、行き過ぎた個人主義が「共同体の破壊」や「孤食の増加(共感能力の低下)」、「自分勝手な振る舞い(マスク拒否等)」などのマイナス面として批判されることが多い。"
232
+ },
233
+ {
234
+ "answer_id": "JP04_034",
235
+ "answer": "西洋=マイナス(文明・科学)、東洋=プラス(文化・自然)",
236
+ "question_hint": "説明文でよく用いられる「西洋と東洋」の二元論的な対比の傾向を問う問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "一般的な入試問題の型。効率や設計を重視する「西洋」に対し、歪みや不規則性に美を見出す「東洋(日本)」を称賛する論調が多い(例:完璧な陶芸を求める西洋vs渋みを愛でる日本)。近代科学の行き詰まりを東洋思想で是正しようとする主張も頻出。"
239
+ },
240
+ {
241
+ "answer_id": "JP04_035",
242
+ "answer": "伝統(でんとう)",
243
+ "question_hint": "古くから伝わる文化や考え方。非効率だが価値あるものとして扱われる用語を問う問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "古き良きもの。合理主義のもとでは「古い」「不便」と敬遠されがちだが、文章中では「耐震性に優れた伝統木造建築」の例のように、近代技術が見落とした価値を持つものとして「プラス」に描かれることが多い。"
246
+ },
247
+ {
248
+ "answer_id": "JP04_036",
249
+ "answer": "人間が自然を「支配・管理する対象」として捉えたこと",
250
+ "question_hint": "近代科学の発展が招いた環境破壊や災害拡大の「根本的な原因」を問う問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "人間が自然の上に立ち、堤防などで管理できると過信した姿勢。想定外の自然の力(豪雨、津波、ウイルス変異等)に直面した現代では、自然と「共生(共存)」し、エネルギーを分散させる(例:信玄堤)知恵が再評価されている。"
253
+ },
254
+ {
255
+ "answer_id": "JP04_037",
256
+ "answer": "画一化(かくいつか)",
257
+ "question_hint": "個々の違いを考えず、同じ様子や状態にそろえて効率を高めることを指す用語を問う問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "均一にすること。高層ビルが並ぶ都市の姿など、画一化は効率を生むが、想定外の災害(地震・停電)が起きた際の脆弱さを招く。これに対し、多様な状況に備える「多様化」の重要性が論じられる。"
260
+ },
261
+ {
262
+ "answer_id": "JP04_038",
263
+ "answer": "文明=マイナス(技術的豊かさ)、文化=プラス(精神的深み)",
264
+ "question_hint": "「文明と文化」の対比において、筆者が文化を高く評価する理由を問う問題。",
265
+ "difficulty": "応用",
266
+ "source_context": "大林宣彦『芸術』より。技術が進歩し便利になるのが「文明」、古く不便だが深く考える力を持つのが「文化」。行き過ぎた文明(凶器)を穏やかにし、人間を幸福に使う力こそが文化であり芸術であるという視点。"
267
+ },
268
+ {
269
+ "answer_id": "JP04_039",
270
+ "answer": "「誰にでもできる」ことを前提とし、個人の個性を重視しない点",
271
+ "question_hint": "近代社会や近代教育が抱える「自由と平等」の矛盾した側面を問う問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "海城中の出題。近代産業社会は「取り換え可能な労働者」を必要とするため、学校教育も全員に等しい計算・言語能力を持たせる(画一化)ことを重視した。そのため「誰にでもなれる(自由)」と言いつつ、実体は個性を排除する構造になっている。"
274
+ },
275
+ {
276
+ "answer_id": "JP04_040",
277
+ "answer": "自由(じゆう)と責任(せきにん)",
278
+ "question_hint": "登山を例に、「好き勝手できる」こととは正反対にあるシビアな概念の組み合わせを問う問題。",
279
+ "difficulty": "標準",
280
+ "source_context": "恵泉女学園中の出題。登山の「自由」とは、他者の束縛がない代わりに、すべての判断を自分で行い、命を管理する「責任」を負うこと。自由と責任はセットであり、居心地の良い状態ではない厳しいものとして描かれる。"
281
+ },
282
+ {
283
+ "answer_id": "JP04_041",
284
+ "answer": "自立(じりつ)",
285
+ "question_hint": "親や他者に頼らず、自分の力で問題を解決することを指す用語を問う問題。",
286
+ "difficulty": "基本",
287
+ "source_context": "吉本ばななの文章より。「経済的自立」ではなく、親に頼らず自分ひとりで問題を解決できた時を「自立」とする精神的な成長を指す。物語文では依存から自立への変化が「成長」として問われる重要テーマ。"
288
+ },
289
+ {
290
+ "answer_id": "JP04_042",
291
+ "answer": "秩序(ちつじょ)",
292
+ "question_hint": "社会や集団が望ましい状態であるための「きまり(ルール)」を指す用語を問う問題。",
293
+ "difficulty": "基本",
294
+ "source_context": "きまり。宇宙の秩序、自然の秩序など多義的。社会においては「集団主義」と結びつき、秩序を守るための「線引き(正しい・悪い、敵・味方)」が、時に異質なものの排除(差別や排斥)を生むマイナス面として批判される。"
295
+ },
296
+ {
297
+ "answer_id": "JP04_043",
298
+ "answer": "グローバル化",
299
+ "question_hint": "国家の枠を超え、ヒト、モノ、情報が地球規模でスピーディーに動く現象を問う問題。",
300
+ "difficulty": "基本",
301
+ "source_context": "「世界が小さくなる」こと。経済的な利益追求(グローバリズム)は近代の欲望の空間的展開とされる一方、遠くの国の貧困(バングラデシュの家事使用人等)が自分たちの生活と無関係ではない「道義的責任」���問う文脈で出題される。"
302
+ },
303
+ {
304
+ "answer_id": "JP04_044",
305
+ "answer": "想像の共同体(そうぞうのきょうどうたい)",
306
+ "question_hint": "国家や国民という意識は、人工的・後付けで作られた概念であるとする学説を問う問題。",
307
+ "difficulty": "応用",
308
+ "source_context": "世田谷学園中の出題。ベネディクト・アンダーソンの説。国家は本来バラバラな人々をまとめるために「共通の伝統や歴史(物語)」によって人工的に作られたイメージ上の共同体であるという近代国家の捉え方。"
309
+ },
310
+ {
311
+ "answer_id": "JP04_045",
312
+ "answer": "演じる(演技)",
313
+ "question_hint": "「他人を生きる」ことで自分自身を客観的に見つめ直す行為の価値を問う問題。",
314
+ "difficulty": "標準",
315
+ "source_context": "鴻上尚史『演劇入門』より。俳優が他人を演じることは、固定化した自分を問い直す機会になる。また、日常の言葉では表せない「もやもやした感情」を身体表現で外に出す芸術的な解消手段としても捉えられる。"
316
+ },
317
+ {
318
+ "answer_id": "JP04_046",
319
+ "answer": "哲学(てつがく)",
320
+ "question_hint": "「働くとは何か」のように、明確な答えのない根本的な問いを深く考える学問を問う問題。",
321
+ "difficulty": "標準",
322
+ "source_context": "物事を根本からじっくり考えること。効率性や科学とは対極に位置し、一見「余計なこと」に見えるが、社会を調整する知恵や、良く生きるための成熟に不可欠な「自己了解」の営みとされる。"
323
+ },
324
+ {
325
+ "answer_id": "JP04_047",
326
+ "answer": "普遍性(ふへんせい)",
327
+ "question_hint": "例外なく、すべてのものに当てはまる性質を指す用語を問う問題。",
328
+ "difficulty": "標準",
329
+ "source_context": "カント哲学の用語。「自分だけは例外(例:カンニング)」とせず、常に他人も同じようにすべき「道徳法則」に従うこと。「困っている人を助ける」といった、誰にでも当てはまる正しさの形式を求める性質。"
330
+ },
331
+ {
332
+ "answer_id": "JP04_048",
333
+ "answer": "社会モデル(しゃかいモデル)",
334
+ "question_hint": "障害を個人の責任ではなく、「社会の側の障壁(仕組み)」に責任があるとする見方を問う問題。",
335
+ "difficulty": "応用",
336
+ "source_context": "洗足学園中の出題。障害者が努力して克服するのを褒める「医学モデル」に対し、不便を取り除くのは社会の義務であるとする考え方。マジョリティ(多数派)がマイノリティを「かわいそう(上から目線)」と見るバイアスを問い直す。"
337
+ },
338
+ {
339
+ "answer_id": "JP04_049",
340
+ "answer": "贈与(ぞうよ)",
341
+ "question_hint": "見返りを求めないはずが、実は上下関係や負い目、返礼の義務を生み出す行為を問う問題。",
342
+ "difficulty": "応用",
343
+ "source_context": "豊島岡女子・渋谷幕張等の出題。マルセル・モース『贈与論』に基づく。商品の「交換」と異なり、人の存在が感じられる行為だが、もらい続けると「負い目・従属」という上下関係が生じる。親子関係における「月謝と勉強の等価交換」といった現代的批判にも繋がる。"
344
+ },
345
+ {
346
+ "answer_id": "JP04_050",
347
+ "answer": "親ガチャ(おやがちゃ)",
348
+ "question_hint": "「子供は親を選べない」という、格差や貧困の連鎖を背景とした現代の否定的な表現を問う問題。",
349
+ "difficulty": "標準",
350
+ "source_context": "親の経済力や暴力、アルコール依存症など、本人の努力では変えられない出生環境の不条理を指す。物語文でも社会問題として扱われるが、軽々しく使うべきではない「深刻な格差」を象徴するテーマ。"
351
+ }
352
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP05.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP05_001",
4
+ "answer": "筆者の体験(事実)と感想(意見)の組み合わせ",
5
+ "question_hint": "【随筆文】随筆文の基本的な構成要素を特定させる問題。何と何が組み合わさって構成されているかを問う。",
6
+ "difficulty": "基本",
7
+ "source_context": "随筆文は、筆者の日常生活や特定の出来事といった「体験(事実)」に基づき、それに対して筆者が抱いた「感想や意見(思想)」を述べた文章である。読解の際は、何がきっかけとなってどのような考えに至ったかの因果関係を捉えることが重要である。"
8
+ },
9
+ {
10
+ "answer_id": "JP05_002",
11
+ "answer": "気づき・自己発見",
12
+ "question_hint": "【心情読解】随筆文において、体験を通じて筆者の内面に生じる変化や新たな認識を何と呼ぶか答えさせる問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "随筆文の核心は、筆者が自身の体験を通じて得る「気づき」や「自己発見」にある。例えば、過去の先入観が間違っていたことに気づき、自分自身の至らなさを反省したり、他者の視点を理解して成長したりする過程が描かれることが多い。"
15
+ },
16
+ {
17
+ "answer_id": "JP05_003",
18
+ "answer": "主観的(しゅかんてき)",
19
+ "question_hint": "【文章の性質】論説文と随筆文の違いに注目し、筆者個人の感覚や視点が強く反映される性質を指す言葉を問う問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "説明文や論説文が客観的で論理的な正しさを求めるのに対し、随筆文は筆者個人の独自の視点や感性が反映された「主観的」な文章である。同じ出来事でも筆者によって捉え方が異なる点が特徴であり、読者はその筆者特有の価値観を読み取る必要がある。"
22
+ },
23
+ {
24
+ "answer_id": "JP05_004",
25
+ "answer": "比喩(ひゆ)・象徴表現",
26
+ "question_hint": "【表現技法】随筆文でよく使われる、抽象的な感情や思想を具体的な物に例えて表現する手法を特定させる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "随筆文では、筆者の微妙な心情を伝えるために「比喩」や「象徴的表現」が多用される。例えば、他人への悪意を「黒いトゲ」と表現したり、教室の悪意を「弾丸の雨」に例えたりすることで、目に見えない感情を具体的にイメージさせる工夫がなされている。"
29
+ },
30
+ {
31
+ "answer_id": "JP05_005",
32
+ "answer": "郷愁(きょうしゅう)・ノスタルジー",
33
+ "question_hint": "【テーマ】随筆文で頻出する、過去の記憶や故郷を懐かしく思い出す感情を指す用語を答えさせる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "過去の出来事や失われた風景、故郷を懐かしむ「郷愁(きょうしゅう)」は随筆文の主要なテーマの一つである。かつての自分と今の自分を比較し、変化した部分や変わらない本質について思索を巡らせる描写がよく見られる。"
36
+ },
37
+ {
38
+ "answer_id": "JP05_006",
39
+ "answer": "価値観の対比(日本と西洋、伝統と近代など)",
40
+ "question_hint": "【読解の型】身近な道具や習慣の比較から、大きな思想の違いを論じる際の「対比構造」を指摘させる問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "文化や芸術をテーマにした随筆では、「日本と西洋」や「伝統と近代」といった二元論的な対比が用いられる。例えば、陶芸において「設計通りの完璧さ」を求める西洋と、「歪みや渋みに趣を感じる」日本の価値観の違いを述べることで、日本独自の美意識(わび・さび)を浮き彫りにする構成がある。"
43
+ },
44
+ {
45
+ "answer_id": "JP05_007",
46
+ "answer": "日常的な些細な出来事(きっかけ)",
47
+ "question_hint": "【文章構造】筆者の思索が深まる発端となる、文章の前半に記述される要素がどのようなものか問う問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "随筆文における「気づき」は、大きな事件ではなく「日常的な些細な出来事」がきっかけとなることが多い。例えば、友人の一言、道端の風景、昔使っていた道具の再発見などが「きっかけ」となり、そこから深い人間論や社会論へと発展していく構造が典型的である。"
50
+ },
51
+ {
52
+ "answer_id": "JP05_008",
53
+ "answer": "精神的な成熟(内面の成長)",
54
+ "question_hint": "【読解概念】随筆文を通じて読者に伝えようとする、筆者や登場人物の「心の変化」を端的に表す言葉を答えさせる問題。",
55
+ "difficulty": "��準",
56
+ "source_context": "入試で出題される随筆文は、単なる思い出話ではなく、そこから「精神的な成熟(内面の成長)」が感じられるものが選ばれる。理解できなかった他者の心情が理解できるようになったり、自分を客観視できるようになったりするプロセスが描かれる。"
57
+ },
58
+ {
59
+ "answer_id": "JP05_009",
60
+ "answer": "具体から抽象(ぐたいからちゅうしょう)",
61
+ "question_hint": "【思考プロセス】具体的なエピソードから始まり、最終的に普遍的な教訓や思想にたどり着く思考の流れを何というか問う問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "随筆文の多くは、個別の具体的な体験(具体)から始まり、そこから導き出される一般的な心理や社会の仕組み(抽象・普遍的法則)へと結論づける流れをとる。読解においては、筆者がその具体例からどのような「抽象的な真理」を導き出したのかを掴むことがゴールとなる。"
64
+ },
65
+ {
66
+ "answer_id": "JP05_010",
67
+ "answer": "筆者の人間観・世界観の表明",
68
+ "question_hint": "【随筆の目的】随筆文の最後に置かれることが多い、筆者が読者に最も伝えたい「まとめ」の役割を説明させる問題。",
69
+ "difficulty": "応用",
70
+ "source_context": "随筆文の結びは、筆者自身の「人間観や世界観の表明」であることが多い。体験を通じて深まった自らの信念や、現代社会に対する警鐘、あるいは理想とする生き方などが、筆者の最終的なメッセージとして提示される。"
71
+ }
72
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP06.json ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP06_001",
4
+ "answer": "万葉集(まんようしゅう)",
5
+ "question_hint": "【文学史・詩】奈良時代にまとめられた日本最古の和歌集を特定させる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "奈良時代の天平文化を代表する和歌集。天皇から農民まで幅広い階層の歌が約4500首収録されている。山上憶良の『貧窮問答歌』などが収められており、当時の社会状況や民衆の苦しい生活を伝える貴重な資料でもある。"
8
+ },
9
+ {
10
+ "answer_id": "JP06_002",
11
+ "answer": "古今和歌集(こきんわかしゅう)",
12
+ "question_hint": "【文学史・和歌】平安時代に紀貫之らが編纂した、最初の勅撰和歌集を答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "平安時代の国風文化期に編纂された、日本で最初の勅撰和歌集(天皇の命令でまとめられた和歌集)。編者の一人である紀貫之は、日本で最初の「かな日記」である『土佐日記』の著者としても知られる。"
15
+ },
16
+ {
17
+ "answer_id": "JP06_003",
18
+ "answer": "五・七・五",
19
+ "question_hint": "【韻文・形式】俳句の基本的な定型リズム(音数)を答えさせる問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "俳句は「五・七・五」の合計17音で構成される日本の定型詩である。物語文の素材(高柳克弘『そらのことばが降ってくる』)では、保健室登校の少年がいじめや自分の容姿(大きなホクロ)に対する複雑な感情を俳句という形式で表現し、内面を解放していく過程が描かれている。"
22
+ },
23
+ {
24
+ "answer_id": "JP06_004",
25
+ "answer": "短歌(たんか)",
26
+ "question_hint": "【韻文・形式】五・七・五・七・七の31音で構成される詩の形式を問う問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "「五・七・五・七・七」の合計31音で構成される詩の形式。古くは「和歌」と呼ばれていた。中学入試の漢字問題でも「短歌(タンカ)」の読みや書き取りが頻出する。"
29
+ },
30
+ {
31
+ "answer_id": "JP06_005",
32
+ "answer": "紀貫之(きのつらゆき)",
33
+ "question_hint": "【文学史・人物】『古今和歌集』の編者であり、日本初の「かな日記」を書いた人物を特定させる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "平安時代中期の歌人・貴族。『古今和歌集』の主要な編者であり、女性のふりをして平仮名で書いた日記文学『土佐日記』の著者でもある。"
36
+ },
37
+ {
38
+ "answer_id": "JP06_006",
39
+ "answer": "松尾芭蕉(まつおばしょう)",
40
+ "question_hint": "【文学史・俳句】江戸時代に「俳諧」を芸術として高め、元禄文化を代表する人物を答えさせる問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "江戸時代中期の元禄文化を代表する俳人。『奥の細道』などの紀行文を残し、それまでの言葉遊び的な要素が強かった俳諧(俳句)を高い芸術性を備えたものへと発展させた。"
43
+ },
44
+ {
45
+ "answer_id": "JP06_007",
46
+ "answer": "小林一茶(こばやしいっさ)",
47
+ "question_hint": "【文学史・俳句】江戸時代後期の化政文化を代表し、庶民的な俳句を詠んだ人物を特定させる問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "江戸時代後期の化政文化を代表する俳人。弱者や身近な生き物への慈しみ、皮肉や風刺を織り交ぜた庶民的で親しみやすい句風が特徴である。"
50
+ },
51
+ {
52
+ "answer_id": "JP06_008",
53
+ "answer": "万葉仮名(まんようがな)",
54
+ "question_hint": "【歴史・文学】平仮名・片仮名が作られる前に、漢字の音を借りて日本語を表記した文字を答えさせる問題。",
55
+ "difficulty": "応用",
56
+ "source_context": "漢字の本来の意味に関係なく、その「音」だけを借りて日本語を表記した文字。『万葉集』の表記に用いられたことからこの名がある。平安時代にこれを崩して「平仮名」、一部を取って「片仮名」が作られた。"
57
+ },
58
+ {
59
+ "answer_id": "JP06_009",
60
+ "answer": "季語(きご)",
61
+ "question_hint": "【韻文・知識】俳句において特定の季節を表すために用いられる言葉を何というか答えさせる問題。",
62
+ "difficulty": "基本",
63
+ "source_context": "俳句を構成する重要な要素で、春夏秋冬の季節を示す特定の単語。物語文の読解においても、季語を通して登場人物の心情や周囲の情景、時間の経過を読み取ることが求められる。"
64
+ },
65
+ {
66
+ "answer_id": "JP06_010",
67
+ "answer": "内面の表現(自己表現)",
68
+ "question_hint": "【読解・テーマ】日常の言葉では説明しにくい「もやもやした感情」を詩歌にする意義を説明させる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "物語文や論説文では、芸術(演劇・音楽・詩・小説など)を「日常会話ではパッと伝えられない思い」を別の形で表現する試みとして捉えることが多い。特に俳句や詩は、不器用な少年たちが自分の心の傷(トラウマ)やもどかしさと向き合い、言語化することで「内面の成長」を遂げるきっかけとして描かれる。"
71
+ }
72
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP07.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP07_001",
4
+ "answer": "台風によってもたらされる雨が、水不足を補う水資源となるから。",
5
+ "question_hint": "台風の災害以外の側面(利点)を記述させる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "台風は激しい風雨で被害を与えるが、一方で水不足を補う水資源を支えるという良い側面も持っている。"
8
+ },
9
+ {
10
+ "answer_id": "JP07_002",
11
+ "answer": "寒流の千島海流(親潮)の影響と、濃霧による日照不足のため。",
12
+ "question_hint": "北海道東部で冷害が発生しやすい原因を二つ記述させる問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "北海道東部の冷害の原因は、高緯度であることに加え、寒流である千島海流(親潮)の影響、および濃霧による日照時間の減少である。"
15
+ },
16
+ {
17
+ "answer_id": "JP07_003",
18
+ "answer": "夏は四国山地、冬は中国山地によって季節風がさえぎられるため、一年を通して降水量が少ないから。",
19
+ "question_hint": "瀬戸内地方で干害(ひでりの害)が発生しやすい理由を地形の観点から記述させる問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "瀬戸内地方は、夏は四国山地、冬は中国山地に季節風がさえぎられるため、一年を通して降水量が少なく温暖であり、水不足(干害)が生じやすい。"
22
+ },
23
+ {
24
+ "answer_id": "JP07_004",
25
+ "answer": "実際の距離ではなく、移動にかかる時間によって測られる距離のこと。",
26
+ "question_hint": "「時間距離」という用語の意味を簡潔に記述させる問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "交通網の整備により国内の移動時間が短縮された文脈で用いられ、実際の距離ではなく時間で測る距離を「時間距離」と呼ぶ。"
29
+ },
30
+ {
31
+ "answer_id": "JP07_005",
32
+ "answer": "雪が降る冬の間、農作業が困難な時期の副業として工芸品作りが行われ、技術が受け継がれてきたから。",
33
+ "question_hint": "東北地方や北陸地方で伝統的工芸品の生産が多い理由を、気候(冬)と関連付けて記述させる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "東北や北陸では、冬に雪が降り農作業ができない期間に、農家の副業として工芸品が作られ、それが現在の伝統的工芸品として定着している。"
36
+ },
37
+ {
38
+ "answer_id": "JP07_006",
39
+ "answer": "技術を修得するのに長い時間がかかり、志す若い人が少なくなっているから。",
40
+ "question_hint": "伝統工業において後継者が不足している理由を「技術」という言葉を用いて記述させる問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "伝統工業では技術の修得に長い時間を要するため、若い後継者が不足し、技術の継承が難しくなっている。"
43
+ },
44
+ {
45
+ "answer_id": "JP07_007",
46
+ "answer": "工業原料の多くを輸入に頼っていたため、輸入に便利な港がある海岸沿いの地域が有利だったから。",
47
+ "question_hint": "戦後、日本の工業地帯が「太平洋ベルト」などの臨海部に発達した理由を記述させる問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "日本は工業原料(鉄鉱石や石油など)の多くを輸入に頼っていたため、原料の搬入や製品の輸出に便利な海岸沿いの地域に工業が発達した。"
50
+ },
51
+ {
52
+ "answer_id": "JP07_008",
53
+ "answer": "道路の渋滞を解消できる点と、二酸化炭素の排出を減らして地球温暖化を防止できる点。",
54
+ "question_hint": "モーダルシフト(トラックから鉄道・船舶への輸送切り替え)の利点を二つ記述させる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "モーダルシフトには、道路交通渋滞の緩和と、環境負荷(二酸化炭素排出)の低減による地球温暖化防止という二つの大きな利点がある。"
57
+ },
58
+ {
59
+ "answer_id": "JP07_009",
60
+ "answer": "輸入の制限や自主規制を求められたため、相手国に工場を建設して現地で製品を作ることにした。",
61
+ "question_hint": "貿易摩擦が起きた際、日本の自動車企業などが行った「現地生産」の背景と内容を記述させる問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "1980年代の貿易摩擦に対し、日本企業は輸出量を自主的に減らすとともに、相手国に工場を建てて現地生産を増やすことで対応した。"
64
+ },
65
+ {
66
+ "answer_id": "JP07_010",
67
+ "answer": "東日本大震災後の原子力発電所の停止により、火力発電用の燃料(化石燃料)の輸入が増えたため。",
68
+ "question_hint": "2011年に日本が31年ぶりに貿易赤字となった理由を、エネルギー資源の観点から記述させる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "2011年の貿易赤字転落は、震災後の原発停止に伴う代替エネルギーとしての火力発電用燃料(LNGや原油など)の輸入急増が主因である。"
71
+ },
72
+ {
73
+ "answer_id": "JP07_011",
74
+ "answer": "本来の慈しみや悲しみの心からではなく、単に周囲の真似をしているだけだから。",
75
+ "question_hint": "例文中の「慈悲深い」という言葉にカッコがついている理由を、文脈に基づいて記述させる問題。",
76
+ "difficulty": "応用",
77
+ "source_context": "小学生が死んだ犬に「可哀相」と言い合う場面で、それが心からの感情ではなく「真似事(本来の意味ではない)」であることを示すためにカッコが使われている。"
78
+ },
79
+ {
80
+ "answer_id": "JP07_012",
81
+ "answer": "自分よりも力や立場の弱いものが、困難な状況で一生懸命に頑張る立派な様子を指すから。",
82
+ "question_hint": "「健気(けなげ)」という言葉がどのような人物や様子に対して使われるか、その定義を記述させる問題。",
83
+ "difficulty": "基本",
84
+ "source_context": "「健気」は、子どもや立場の弱い者が難しいことに立ち向かう様子を褒める時に使われる感情語である。"
85
+ },
86
+ {
87
+ "answer_id": "JP07_013",
88
+ "answer": "自分の予想や常識とは異なる、意外な事態に直面してどうすればいいか迷っている状態。",
89
+ "question_hint": "物語文における「困惑」という感情がどのような状況で生まれるか、対比の観点から記述させる問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "「困惑」は、自分の常識や予想(期待)と現実が大きく異なる場合に生じる感情であり、どう対応すべきか迷う様子を指す。"
92
+ },
93
+ {
94
+ "answer_id": "JP07_014",
95
+ "answer": "周囲の期待に応えようとして、親などが望む「良い自分」を振る舞っていること。",
96
+ "question_hint": "物語文のテーマとして登場する、精神的に成熟した子どもが自分自身を「演じる」とはどういうことか記述させる問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "成熟した子どもは、親を落胆させたくないという思いから「親にとって望ましい自分」を演じることがあり、これはアイデンティティ確立の過程での葛藤として描かれる。"
99
+ },
100
+ {
101
+ "answer_id": "JP07_015",
102
+ "answer": "相手と関わることで、自分自身の考え方や内面が良い方向へ変化すること。",
103
+ "question_hint": "入試の物語文でテーマとなる「内面の成長」とは具体的にどのような変化か、簡潔に記述させる問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "物語文における「成長」とは、単なる身体的な成長ではなく、できなかったことができるようになる、あるいは他者を理解することで自分の内面が変化することを指す。"
106
+ },
107
+ {
108
+ "answer_id": "JP07_016",
109
+ "answer": "他者と比較することでしか得られず、自分が優れていると思い込むことで自尊心を保とうとする感情。",
110
+ "question_hint": "「優越感」の正体について、他者との関係性の観点から記述させる問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "優越感は、他人と比較して自分が選び抜かれたと感じることで得られる甘美な、しかし時に残酷な感情である。"
113
+ },
114
+ {
115
+ "answer_id": "JP07_017",
116
+ "answer": "事実を確認せず先入観で人を決めつけてしまい、申し訳ないと感じる気持ち。",
117
+ "question_hint": "例文における「後ろめたさ」の原因が何であったか、文脈から記述させる問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "「苺が好きなはずだ」という思い込み(バイアス)で人を判断してしまったことに気づき、自分の至らなさを後悔する気持ちが「後ろめたさ」として描かれている。"
120
+ },
121
+ {
122
+ "answer_id": "JP07_018",
123
+ "answer": "自分の意志を強く持ち、周囲の期待や世間の常識に流されずに生きていこうとする決意。",
124
+ "question_hint": "最難関校の物語文でよく出る「アイデンティティの確立」という成長パターンについて記述させる問題。",
125
+ "difficulty": "応用",
126
+ "source_context": "親の期待や周囲の視線に合わせるのではなく、葛藤を経て自分の本心や生き方に正直になることが、アイデンティティ確立という大きな成長として描かれる。"
127
+ },
128
+ {
129
+ "answer_id": "JP07_019",
130
+ "answer": "物事を単純化して二つの対立する考え方に分けることで、複雑な事象をわかりやすく説明する手法。",
131
+ "question_hint": "論説文でよく使われる「二元論」という考え方の特徴を、メリットの観点から記述させる問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "二元論は物事を単純化し、善悪や西洋・東洋といった対比を用いることで、筆者の主張をわかりやすく伝えるために使われる。"
134
+ },
135
+ {
136
+ "answer_id": "JP07_020",
137
+ "answer": "効率性や合理性を過度に追求すると、想定外の災害(地震や感染症)に対して脆い社会になってしまう点。",
138
+ "question_hint": "「合理主義」や「効率化」が論説文で批判的に語られる際の主な論点を記述させる問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "画一化や効率化を優先した都市構造は、地震や津波などの天災が起きた際に被害を増大させる脆弱性を持っている。"
141
+ },
142
+ {
143
+ "answer_id": "JP07_021",
144
+ "answer": "人々の無意識の思い込みのことで、自分でも気づかないうちに相手を傷つけたり差別したりする原因となるもの。",
145
+ "question_hint": "「アンコンシャス・バイアス」という用語の意味と、それが引き起こす問題点を記述させる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "アンコンシャス・バイアス(無意識のバイアス)は過去の経験から培われる。自分では差別しているつもりがなくても、無意識に特定の属性(ジェンダー等)に対して異なる基準を当てはめてしまう。"
148
+ },
149
+ {
150
+ "answer_id": "JP07_022",
151
+ "answer": "科学文明による自然支配の限界を認め、人間と自然が対立せず、共に存続していく姿勢のこと。",
152
+ "question_hint": "論説文でプラスの概念として登場する「自然との共存(共生)」とはどういうことか記述させる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "近代の科学文明が自然を管理・支配の対象としてきたことへの反省から、自然の秩序を尊重し、人間が自然の一部として生きる「共存」の重要性が説かれる。"
155
+ },
156
+ {
157
+ "answer_id": "JP07_023",
158
+ "answer": "情報の質や意味を自分で的確に判断し、必要な情報を正しく選んで活用する能力。",
159
+ "question_hint": "「メディアリテラシー」という言葉の意味を記述させる問題。",
160
+ "difficulty": "基本",
161
+ "source_context": "溢れる情報やSNSの拡散に対し、何が正しく自分に必要かを取捨選択できる能力がメディアリテラシーであり、不確定な未来を生きる力とされる。"
162
+ },
163
+ {
164
+ "answer_id": "JP07_024",
165
+ "answer": "相手の身になり、自分の発した言葉がどう受け止められるかを考えながら双方向でやり取りをすること。",
166
+ "question_hint": "例文にある「コミュニケーションはキャッチボールである」とはどういうことか記述させる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "一方的に情報を投げるのではなく、相手がキャッチできるように(相手の身になって)話し、返事に応じて伝え方を変えるのが本来のコミュニケーションである。"
169
+ },
170
+ {
171
+ "answer_id": "JP07_025",
172
+ "answer": "個人の利益や幸福の追求が優先され、伝統的な地域共同体のつながりや他者への共感が弱まっていくこと。",
173
+ "question_hint": "「近代的な個人主義」がもたらすマイナスの側面について、社会関係の観点から記述させる問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "個人主義が強まると、個人の利益のみが追求され、仲間のために何かしてあげたいという共感能力や連帯能力が低下する懸念がある。"
176
+ },
177
+ {
178
+ "answer_id": "JP07_026",
179
+ "answer": "贈り物をされたらお返しをしなければならないという心理から、互いに「贈与」を繰り返して関係を深めていくこと。",
180
+ "question_hint": "論説文における「贈与」が人間関係に果たす役割を、商品交換との違いに着目して記述させる問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "商品交換は等価なものを即座に取引して終わるが、贈与は返礼の義務感(負い目)を通じて長期的な人間関係の継続を促す。"
183
+ },
184
+ {
185
+ "answer_id": "JP07_027",
186
+ "answer": "自分が自由に行動を選択できる代わりに、その結果から生じる責任もすべて自分で引き受けなければならないということ。",
187
+ "question_hint": "「自由には責任が伴う」とはどういうことか、例文の「登山の自由」を例に��述させる問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "自由とは好き勝手できることではなく、他者からの束縛がない分、自分の判断が誤った時のリスクも自ら管理しなければならない苦しくシビアなものである。"
190
+ },
191
+ {
192
+ "answer_id": "JP07_028",
193
+ "answer": "日々の仕事を効率的にこなすことに追われず、根源的な疑問(なぜひとは働くのか等)に立ち返ってじっくり考えられる状況にあるから。",
194
+ "question_hint": "「子どもにしか哲学はできない」という筆者の主張の理由を記述させる問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "大人は「前に進め」という効率性や成果の圧力に縛られているが、子どもはそのような圧力から自由であり、立ち止まって物事を深く考えることができるからである。"
197
+ },
198
+ {
199
+ "answer_id": "JP07_029",
200
+ "answer": "障害を本人の努力で克服すべきもの(医学モデル)とするのではなく、社会の側の仕組みを変えるべきもの(社会モデル)と捉えること。",
201
+ "question_hint": "これからの「障害」に対する適切な向き合い方(社会モデルの視点)とはどのようなものか記述させる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "「かわいそうな障害者が努力する姿」に感動するのではなく、社会の側にある壁を取り除くべきだという視点を持つことが大切である。"
204
+ },
205
+ {
206
+ "answer_id": "JP07_030",
207
+ "answer": "誰でも代わりがきく「取り換え可能な存在」として人間を扱っており、その人ならではの持ち味を無視しているから。",
208
+ "question_hint": "「近代社会は個性を重視していない」と筆者が主張する理由を記述させる問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "近代社会は「誰にでもできる」ことを前提に組み立てられており、企業が求めるのは一定の計算・言語能力であって、個々の個性は必要とされていない。"
211
+ },
212
+ {
213
+ "answer_id": "JP07_031",
214
+ "answer": "他人に支配されず自ら問題を解決すること。特に親や家族に頼らず自分で決断し実行すること。",
215
+ "question_hint": "吉本ばなな氏の文章における「自立」の定義を記述させる問題。",
216
+ "difficulty": "基本",
217
+ "source_context": "自立とは、親や家族に相談せず自分だけで問題を解決した経験がいくつかある状態を指す。"
218
+ },
219
+ {
220
+ "answer_id": "JP07_032",
221
+ "answer": "効率化を目指す科学文明に対し、時間をかけて不便さや深みを味わい、じっくり考える力のこと。",
222
+ "question_hint": "大林宣彦氏の文章における「文化」の役割を、文明との対比で記述させる問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "文化とは、文明が凶器となる部分を穏やかにする力であり、便利さのかわりにゆっくりと考える力や人間の幸福を尊ぶ力を指す。"
225
+ },
226
+ {
227
+ "answer_id": "JP07_033",
228
+ "answer": "異なる意見や少数意見を尊重せず、周囲と同じ行動をとるよう暗黙のうちに強いる窮屈な空気のこと。",
229
+ "question_hint": "コロナ禍で注目された「同調圧力」の正体と、その弊害を記述させる問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "同調圧力は「空気を読め」という強制力であり、異論が許されない状況を作り出す。これがエスカレートすると監視社会(自粛警察等)につながる。"
232
+ },
233
+ {
234
+ "answer_id": "JP07_034",
235
+ "answer": "「自分の働きかけによって相手にこうなってほしい」という自分の思い込みや支配欲が含まれてしまう点。",
236
+ "question_hint": "「良き利他」が陥りやすい「残酷な面」について、相手との関係性の観点から記述させる問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "利他的行動が「相手は喜ぶはずだ」「喜ぶべきだ」という一方的な支配に変わってしまう危険性がある。真の利他には「自分が変わること」が必要である。"
239
+ },
240
+ {
241
+ "answer_id": "JP07_035",
242
+ "answer": "他人の人生を演じることで自分とは違う視点を得ることができ、結果として自分自身を客観的に見つめ直せるから。",
243
+ "question_hint": "演劇(演技)が自分自身を知ることにつながる理由を記述させる問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "「他人を生きる」経験を通じて、自分自身の人生に対する固定化した見方を問い直すことができる。"
246
+ },
247
+ {
248
+ "answer_id": "JP07_036",
249
+ "answer": "SNSの発達により、誤った情報であっても一瞬で世界中に広まり、社会に大きな混乱をもたらす可能性がある点。",
250
+ "question_hint": "現代社会における「情報拡散」のマイナス面を、リスクの観点から記述させる問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "根拠のないフェイクニュースなどが拡散されると、人々がそれを信じ込んでしまい、取り返しのつかない混乱(感染症のデマ等)が生じる。"
253
+ },
254
+ {
255
+ "answer_id": "JP07_037",
256
+ "answer": "自分が望んでいなくても、周囲が求めるテーマや期待に沿った行動をとらなければならないという心理的葛藤。",
257
+ "question_hint": "『氷柱の声』の主人公が感じた「世間の期待と自分の誇り」の間の葛藤について記述させる問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "コンクールで「被災地の復興」という周囲が期待するテーマを描くべきか、自分が美しいと思うものを描くべきかの間で悩む姿が描かれている。"
260
+ },
261
+ {
262
+ "answer_id": "JP07_038",
263
+ "answer": "相手に気に入られたい、あるいは孤立したくないという不安から、自分の本心を隠して嘘をつくこと。",
264
+ "question_hint": "中学生などの登場人物が友達関係において「自分を偽る」理由を記述させる問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "疎外感や孤独を避けるために、周囲のグループの顔色をうかがい、無理に合わせる「友達ごっこ」をしてしまう葛藤がよく描かれる。"
267
+ },
268
+ {
269
+ "answer_id": "JP07_039",
270
+ "answer": "自分の至らなさに気づいたり、自分の行動が他者に与えた影響を深く反省したりすること。",
271
+ "question_hint": "物語文において「気持ちがマイナスになる結末」であっても「成長」と言えるのはどのような場合か記述させる問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "ハッピーエンドでなくても、自分の過ちや先入観に気づき、それを後悔することが内面のアップデート(成長)として認められる。"
274
+ },
275
+ {
276
+ "answer_id": "JP07_040",
277
+ "answer": "実際の自分の実力以上に自分が優れていると思い込み、他人の忠告や真実の状況が見えなくなっている状態。",
278
+ "question_hint": "「うぬぼれる」とはどのような状態か、自己認識の観点から記述させる問題。",
279
+ "difficulty": "基本",
280
+ "source_context": "うぬぼれは劣等感の裏返しとして生じることがあり、他人を超えたつもりになる過剰な自己イメージを指す。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/jp/JP08.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "JP08_001",
4
+ "answer": "象形文字",
5
+ "question_hint": "漢字の成り立ちの分類。物の形をかたどって作られた文字の種類を答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "物の形をかたどった文字。「月」「山」「鳥」「馬」などがこれに該当する。六書(りくしょ)と呼ばれる漢字のつくられ方による分類の一つ。"
8
+ },
9
+ {
10
+ "answer_id": "JP08_002",
11
+ "answer": "形声文字",
12
+ "question_hint": "漢字の成り立ちの分類。意味を表す部分と音を表す部分を組み合わせて作られた文字の種類を答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "意味を表す部分と音を表す部分を組み合わせてつくったもの。漢字全体の約8割以上を占めるとされる。「非(音)」+「心(意味)」=「悲」などが例。共通する部分があって読みが同じ漢字はこの分類であることが多い。"
15
+ },
16
+ {
17
+ "answer_id": "JP08_003",
18
+ "answer": "二元論",
19
+ "question_hint": "論説文の構造。物事を「善と悪」「西洋と東洋」のように二つの対立する概念に分けて説明する手法の名称。",
20
+ "difficulty": "標準",
21
+ "source_context": "物事を二つの世界や考え方に分けて説明すること。複雑な事象を「Aは悪、Bは善」のように単純化して分かりやすくするために使われる。論説文の多くはこの構造を持っているが、近年は「単純な二元論では説明できない」という批判的な文章も出題される。"
22
+ },
23
+ {
24
+ "answer_id": "JP08_004",
25
+ "answer": "合理主義(近代合理主義)",
26
+ "question_hint": "論説文の重要テーマ。物事を理性的に考え、論理や効率を重視する考え方の名称。",
27
+ "difficulty": "標準",
28
+ "source_context": "物事を理性的に考え、論理や根拠を大切にする考え方。科学の発達の基盤となったが、論説文では「非科学的なもの(妖怪や伝統)を排除した」「効率ばかりを求めて自由時間を奪った」など、マイナスの文脈で批判的に語られることが多い。"
29
+ },
30
+ {
31
+ "answer_id": "JP08_005",
32
+ "answer": "資本主義",
33
+ "question_hint": "論説文の重要テーマ。自由な競争によって利益を追求し、社会を豊かにしようとする経済体制の名称。",
34
+ "difficulty": "標準",
35
+ "source_context": "自由競争によって利益を追求すれば社会全体も豊かになるという考え。効率化と密接に関係する。入試では「目先の利益を優先するため気候変動などの環境問題に対応しにくい」というジレンマがテーマになりやすい。"
36
+ },
37
+ {
38
+ "answer_id": "JP08_006",
39
+ "answer": "同調圧力",
40
+ "question_hint": "令和時代の教養。少数意見を持つ人に対し、周囲と同じ行動をとるよう強制する無言の圧力を指す用語。",
41
+ "difficulty": "標準",
42
+ "source_context": "「空気を読め」という風潮。少数派に対して「他の人と同じようにしろ」と強いる空気。コロナ禍における「自粛警察」などが具体例として挙げられ、個人の自由を奪う息苦しいものとして批判的に扱われることが多い。"
43
+ },
44
+ {
45
+ "answer_id": "JP08_007",
46
+ "answer": "アンコンシャス・バイアス",
47
+ "question_hint": "論説文・社会の知識。自分自身では気づいていない「無意識の思い込みや偏見」を指すカタカナ用語。",
48
+ "difficulty": "応用",
49
+ "source_context": "無意識の偏見。過去の経験や知識から「母親は家庭にいるべきだ」「単身赴任は父親がするものだ」と自然に考えてしまうような思い込みのこと。SDGsのジェンダー平等の文脈で、相手を傷つける可能性がある注意すべきものとして出題される。"
50
+ },
51
+ {
52
+ "answer_id": "JP08_008",
53
+ "answer": "メディアリテラシー",
54
+ "question_hint": "情報化社会の教養。メディアから流れる情報をうのみにせず、正しく理解・判断し活用する能力の名称。",
55
+ "difficulty": "標準",
56
+ "source_context": "情報を正しく理解し、活用する能力。インターネット上の偽情報や、マスメディアが作る「物語(特定の意図を持った報道)」に惑わされず、自分で情報の真偽を判断する姿勢が求められる。"
57
+ },
58
+ {
59
+ "answer_id": "JP08_009",
60
+ "answer": "個人主義",
61
+ "question_hint": "近代の人間観。個人の権利や自由を尊重する考え方で、論説文ではしばしば批判対象となる用語。",
62
+ "difficulty": "標準",
63
+ "source_context": "個人の権利や自由を尊重する考え。近代ヨーロッパで定着した。入試では「自分勝手で他者への配慮を欠く」「地域のつながりを壊す」といった負の側面が強調され、東洋的な「共同体主義」と対比されることが多い。"
64
+ },
65
+ {
66
+ "answer_id": "JP08_010",
67
+ "answer": "伝統",
68
+ "question_hint": "論説文の対比構造。近代的な「科学・技術」に対して、古くから伝わり価値が見直されるべきものとして語られる概念。",
69
+ "difficulty": "基本",
70
+ "source_context": "古くから伝わってきた考えや文化。合理主義的な社会では「非効率」と切り捨てられがちだが、論説文では「日本の風土に合った地震に強い木造建築」などの例を通じ、近代の行き詰まりを打破するプラスの存在として描かれる。"
71
+ },
72
+ {
73
+ "answer_id": "JP08_011",
74
+ "answer": "コペルニクス的転回",
75
+ "question_hint": "哲学用語。カントが提唱した、物事の認識の仕方が180度劇的に変わることを指す表現。",
76
+ "difficulty": "応用",
77
+ "source_context": "哲学者カントが、自身の認識論の変革を天動説から地動説への転換に例えた言葉。現代では「パラダイムシフト(当然と思われていた価値観の劇的な変化)」と同義で使われることもある。"
78
+ },
79
+ {
80
+ "answer_id": "JP08_012",
81
+ "answer": "贈与",
82
+ "question_hint": "論説文の重要テーマ。対価を求めず無償で物を与える行為だが、負債感や上下関係を生む可能性も指摘される概念。",
83
+ "difficulty": "応用",
84
+ "source_context": "マルセル・モースの『贈与論』が有名。見返りを求めない行為だが、受け取った側に「お返しをしなければならない」という義務感を生む。一方的な贈与は「与える側と、負い目を感じる側」の上下関係や支配構造を作る残酷な面もある。"
85
+ },
86
+ {
87
+ "answer_id": "JP08_013",
88
+ "answer": "親ガチャ",
89
+ "question_hint": "現代の社会問題。子どもが親を選べない状況を、スマホゲームの抽選機能に例えた否定的な用語。",
90
+ "difficulty": "標準",
91
+ "source_context": "「子どもは親を選べない」というあきらめや否定的な意味。家庭内暴力や貧困、格差が親から子へ連鎖する社会問題の象徴として使われる。論説文ではこの言葉の流行を背景に、家族のあり方や教育格差が論じられる。"
92
+ },
93
+ {
94
+ "answer_id": "JP08_014",
95
+ "answer": "普遍性",
96
+ "question_hint": "哲学・論説文の用語。例外なく、すべてのものにあてはまる性質を指す言葉。",
97
+ "difficulty": "標準",
98
+ "source_context": "例外なく、すべてのものに共通してあてはまること。カント哲学では「自分の行動方針が、同時に他人の行動方針としても通用するように行動せよ」という普遍的な道徳法則の確立を目指した。"
99
+ },
100
+ {
101
+ "answer_id": "JP08_015",
102
+ "answer": "社会モデル",
103
+ "question_hint": "障害に関する福祉観。障害の責任を個人ではなく、社会の仕組みや環境の側にあると捉える視点。",
104
+ "difficulty": "応用",
105
+ "source_context": "障害者が努力して克服すべきだとする「医学モデル(本人責任)」に対し、社会の側がバリアを取り除く努力をすべきだとする考え。障害者を「かわいそう」と見る上から目線の同情を否定し、社会の変革を求める。"
106
+ },
107
+ {
108
+ "answer_id": "JP08_016",
109
+ "answer": "アイデンティティ(自己同一性)",
110
+ "question_hint": "物語文・論説文の重要用語。「自分が自分であること」や「自分らしさ」を意味するカタカナ用語。",
111
+ "difficulty": "基本",
112
+ "source_context": "自分が他者とは違う独自の存在であるという認識。物語文では、親の期待に沿うのではなく、葛藤を経て「本来の自分らしさ」を発見・確立することが成長のテーマとなる。"
113
+ },
114
+ {
115
+ "answer_id": "JP08_017",
116
+ "answer": "いたわる",
117
+ "question_hint": "物語文の感情語。自分より立場の弱い人や困っている人に対して、親切に接することを意味する動詞。",
118
+ "difficulty": "基本",
119
+ "source_context": "立場が弱い人に対して、思いやりを持って優しく接すること。姉から妹、親から子などの関係で使われやすい。漢字では「労る」。物語文では、他者の痛みへの共感を示す場面で頻出する。"
120
+ },
121
+ {
122
+ "answer_id": "JP08_018",
123
+ "answer": "ねぎらう",
124
+ "question_hint": "物語文の感情語。相手の苦労や努力に対して、感謝やいたわりの気持ちをかけることを意味する動詞。",
125
+ "difficulty": "基本",
126
+ "source_context": "苦労や努力に対して感謝すること。漢字では「労う」。原則とし��「上の立場の人(大人や先生)」が「下の立場の人(子供や部下)」に対して行うことが多い。"
127
+ },
128
+ {
129
+ "answer_id": "JP08_019",
130
+ "answer": "郷愁(きょうしゅう)",
131
+ "question_hint": "物語文の感情語。故郷や過去のことを懐かしく思い、慕う気持ちを指す熟語。",
132
+ "difficulty": "標準",
133
+ "source_context": "故郷や過去を懐かしく思う気持ち。ノスタルジー。入試問題では、転校や引越しをした主人公が以前の生活を思い出す場面や、大人の回想シーンで使われる。"
134
+ },
135
+ {
136
+ "answer_id": "JP08_020",
137
+ "answer": "葛藤(かっとう)",
138
+ "question_hint": "物語文の展開。心の中に相反する複数の感情があり、どちらを選ぶべきか悩む状態を指す熟語。",
139
+ "difficulty": "標準",
140
+ "source_context": "心の中で複数の気持ちがぶつかり合い、悩むこと。例:「親の期待に応えたい」vs「自分の夢を追いたい」。この葛藤を乗り越えることが物語文における「内面の成長」の核心となる。"
141
+ },
142
+ {
143
+ "answer_id": "JP08_021",
144
+ "answer": "卑屈(ひくつ)",
145
+ "question_hint": "物語文の感情語。自分を必要以上に低く考え、いじけてしまう態度を指す熟語。",
146
+ "difficulty": "標準",
147
+ "source_context": "いじけて、自分を大したことがないと悪く思うこと。「どうせ自分なんか」という思考。他人や過去の自分と比較して劣等感を感じる時に生まれやすいマイナスの感情。"
148
+ },
149
+ {
150
+ "answer_id": "JP08_022",
151
+ "answer": "羞恥心(しゅうちしん)",
152
+ "question_hint": "物語文の感情語。恥ずかしいと感じる気持ちを意味する熟語。",
153
+ "difficulty": "基本",
154
+ "source_context": "恥ずかしく思う気持ち。「恥」という字が含まれる。物語文では、失敗した時だけでなく、自分の未熟さを自覚した時や、他人からの評価を過剰に気にした時に使われる。"
155
+ },
156
+ {
157
+ "answer_id": "JP08_023",
158
+ "answer": "羨望(せんぼう)",
159
+ "question_hint": "物語文の感情語。他人が恵まれているのを見て、自分もそうなりたいと羨むプラス・純粋な気持ち。",
160
+ "difficulty": "標準",
161
+ "source_context": "「羨ましい」と思う気持ち。純粋に「自分もそうなれたらいいな」と望む要素が含まれる。対して「嫉妬」は「おもしろくない」という攻撃的な負の感情が混じったものである点が異なる。"
162
+ },
163
+ {
164
+ "answer_id": "JP08_024",
165
+ "answer": "邁進(まいしん)",
166
+ "question_hint": "物語文の展開と感情。目標に向かって、ひたすらまっすぐに進むことを意味する熟語。(※本質的には『向上心』の文脈)",
167
+ "difficulty": "標準",
168
+ "source_context": "恐れることなく、ひたすら目的に向かって進むこと。物語文の後半、迷いを吹っ切って目標(合格や勝利など)に突き進む主人公の様子を描写する際に使われる。"
169
+ },
170
+ {
171
+ "answer_id": "JP08_025",
172
+ "answer": "安堵(あんど)",
173
+ "question_hint": "物語文の感情語。気がかりなことがなくなって、ホッと安心することを意味する熟語。",
174
+ "difficulty": "基本",
175
+ "source_context": "気がかりなことが解消され、心から安心すること。物語文では「不安・緊張」→「解決する出来事」→「安堵」という変化のパターンで頻出する。"
176
+ },
177
+ {
178
+ "answer_id": "JP08_026",
179
+ "answer": "「マイナス」から「プラス」への変化",
180
+ "question_hint": "物語文の読解ルール。入試問題で出題される物語の、最も典型的な展開パターンを答えさせる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "物語文の鉄則。不幸な状況(マイナス)が「きっかけ」を通じて成長・変化(プラス)へと向かう。入試では、この「変化の内容」や「変化のきっかけ」を記述させる問題が非常に多い。"
183
+ },
184
+ {
185
+ "answer_id": "JP08_027",
186
+ "answer": "道徳的(内面の成長)",
187
+ "question_hint": "物語文の読解ルール。入試で選ばれる物語が「偶然の幸運」ではなく、どのような理由で成長する話であるべきかを問う問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "入試の物語は、宝くじに当たるといった偶然ではなく、「自分の弱さと向き合う」「他者を理解する」といった道徳的な理由で内面が成長する話が選ばれる。学校側は「そのような心の成長を理解できる子」を求めているため。"
190
+ },
191
+ {
192
+ "answer_id": "JP08_028",
193
+ "answer": "しめすへん(礻)",
194
+ "question_hint": "部首の知識。「神・社・礼・祝」などに���通し、神や祭りに関する意味を表す部首名。",
195
+ "difficulty": "基本",
196
+ "source_context": "部首名は「しめすへん」。神仏や祭祀に関わる漢字に使われる。「ころもへん(ネ)」と非常に形が似ているため、書き分けが厳しく問われる。"
197
+ },
198
+ {
199
+ "answer_id": "JP08_029",
200
+ "answer": "のぎへん(禾)",
201
+ "question_hint": "部首の知識。「秋・科・税・秒」などに共通する部首の名称。",
202
+ "difficulty": "基本",
203
+ "source_context": "部首名は「のぎへん」。穀物の穂が垂れている形をかたどったもので、穀物や収穫、計量(秒など)に関係する漢字に使われる。"
204
+ },
205
+ {
206
+ "answer_id": "JP08_030",
207
+ "answer": "りっとう(刂)",
208
+ "question_hint": "部首の知識。「列・利・割・創」などの漢字の右側に使われる部首の名称。",
209
+ "difficulty": "標準",
210
+ "source_context": "部首名は「りっとう」。漢字の「刀(かたな)」の形が変化したもの。切ることや鋭いことに関係する意味を持つ。"
211
+ },
212
+ {
213
+ "answer_id": "JP08_031",
214
+ "answer": "主述の関係",
215
+ "question_hint": "熟語の組み立て。「頭痛(頭が痛い)」「県営(県が経営する)」などの熟語の構造の名称。",
216
+ "difficulty": "標準",
217
+ "source_context": "上の字が「主語」、下の字が「述語」を表す組み合わせ。他に「地震」「雷鳴」「国立(国が立てた)」などがある。"
218
+ },
219
+ {
220
+ "answer_id": "JP08_032",
221
+ "answer": "目的語と述語の関係",
222
+ "question_hint": "熟語の組み立て。「給食(食事を給する)」「着席(席に着く)」などの熟語の構造の名称。",
223
+ "difficulty": "標準",
224
+ "source_context": "下の字が「〜を」「〜に」にあたる目的語になり、上の字がその動作を表す述語になる組み合わせ。「読書(書を読む)」「登山(山に登る)」などが典型例。日本語の語順(目的語→述語)とは逆になる。"
225
+ },
226
+ {
227
+ "answer_id": "JP08_033",
228
+ "answer": "意外",
229
+ "question_hint": "同音異義語の使い分け。「予想もしていなかったこと」という意味で使う熟語。",
230
+ "difficulty": "基本",
231
+ "source_context": "思いのほか、考えていたことと違うさま。「意外な結果」のように使う。対して「以外」は「にんじん以外の野菜」のように、範囲から除くときに使う。"
232
+ },
233
+ {
234
+ "answer_id": "JP08_034",
235
+ "answer": "保障",
236
+ "question_hint": "同音異義語の使い分け。「権利や安全が侵されないよう守る」という意味の熟語。(※社会保障など)",
237
+ "difficulty": "標準",
238
+ "source_context": "権利・安全・自由などを保護し守ること。「安全保障」「社会保障」など。誤答しやすい「保証」は「間違いがないと請け合う(品質保証など)」、「補償」は「損害を埋め合わせる(損害補償など)」という意味。"
239
+ },
240
+ {
241
+ "answer_id": "JP08_035",
242
+ "answer": "自由と責任",
243
+ "question_hint": "論説文のテーマ。束縛がない代わりに、自分自身の判断が招く結果をすべて引き受けるべきだとする一対の概念。",
244
+ "difficulty": "標準",
245
+ "source_context": "自由には必ず責任が伴うという考え。登山(角幡唯介)の例では、「自分の裁量で命を管理するシビアなもの」として描かれる。好き勝手できる「居心地のよさ」とは対極にある厳しい概念とされる。"
246
+ },
247
+ {
248
+ "answer_id": "JP08_036",
249
+ "answer": "利他(りた)",
250
+ "question_hint": "論説文のテーマ。自分の利益よりも他者の利益や幸せを優先する考え方。最近の入試で最も注目されている用語の一つ。",
251
+ "difficulty": "標準",
252
+ "source_context": "他人のために尽くすこと。本来はプラスの概念だが、入試では「『相手は喜ぶはずだ』という思い込みが押し付けになり、支配につながる危険性」を指摘する高度な論がよく出題される(伊藤亜紗など)。"
253
+ },
254
+ {
255
+ "answer_id": "JP08_037",
256
+ "answer": "文明と文化",
257
+ "question_hint": "二元論の対比。技術の進歩で便利になる「A」に対し、伝統や風習など人間の精神を豊かにする「B」。",
258
+ "difficulty": "応用",
259
+ "source_context": "文明(科学・技術・便利・効率)vs 文化(伝統・風習・精神・ゆっくり)。大林宣彦は、行き過ぎた「文明」は凶器になり得るが、「文化」にはそれを穏やかにし、人間の幸福を考え直させる力があると説いた。"
260
+ },
261
+ {
262
+ "answer_id": "JP08_038",
263
+ "answer": "出納(すいとう)",
264
+ "question_hint": "漢字の読み。「出し入れすること」を���味するが、特殊な読み方をする熟語。",
265
+ "difficulty": "応用",
266
+ "source_context": "読みは「すいとう」。お金や品物を出し入れすること。「出」を「スイ」、「納」を「トウ」と読む、限られた単語に使われる特別な読み方であるため、入試の読み取り問題で狙われやすい。"
267
+ },
268
+ {
269
+ "answer_id": "JP08_039",
270
+ "answer": "パラダイムシフト",
271
+ "question_hint": "現代社会の用語。当然だと思われていた価値観や思想が劇的に変わることを指すカタカナ用語。",
272
+ "difficulty": "標準",
273
+ "source_context": "当然と考えられていた思想や価値観が劇的に変わること。科学革命だけでなく、社会構造の変化(例:コロナ禍前後の働き方)などを説明する際にも用いられる。"
274
+ },
275
+ {
276
+ "answer_id": "JP08_040",
277
+ "answer": "筆順の原則(上から下、左から右)",
278
+ "question_hint": "漢字の基礎知識。漢字を整った形で書くための、最も基本的な二つの書き進め方の決まり。",
279
+ "difficulty": "基本",
280
+ "source_context": "筆順のおおまかな原則は「上から下へ」「左から右へ」である。例外として「右」と「左」の書き始めの違い(左:横→払、右:払→横)などは入試で頻出。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA01.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA01_001",
4
+ "answer": "307cm",
5
+ "question_hint": "【計算】長さの単位換算。mとcmが混ざった値をcmのみの単位に変換させる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】3m 7cm。【計算ロジック】1m = 100cmの関係を用いる。3mは300cm。これに7cmを加算すると300 + 7 = 307cmとなる。中間に「0」が入るケタのミスを防ぐことが重要。"
8
+ },
9
+ {
10
+ "answer_id": "MA01_002",
11
+ "answer": "1050mL",
12
+ "question_hint": "【計算】かさの単位換算。LとmLが混ざった値をmLのみの単位に変換させる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "【設定数値】1L 50mL。【計算ロジック】1L = 1000mLの関係を用いる。1Lは1000mL。これに50mLを加算すると1000 + 50 = 1050mLとなる。百の位が0になるケタの意識を問う。"
15
+ },
16
+ {
17
+ "answer_id": "MA01_003",
18
+ "answer": "3020g",
19
+ "question_hint": "【計算】重さの単位換算。kgとgが混ざった値をgのみの単位に変換させる問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "【設定数値】3kg 20g。【計算ロジック】1kg = 1000gの関係を用いる。3kgは3000g。これに20gを加算して3020g。位取りの正確さを確認する問題。"
22
+ },
23
+ {
24
+ "answer_id": "MA01_004",
25
+ "answer": "3/5",
26
+ "question_hint": "【計算】分数の基本的な減法。全体を1としたときの残りの割合を計算させる問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "【設定数値】全体を1とし、そこから2/5を引く。【計算ロジック】1を5/5に変換して計算。5/5 - 2/5 = 3/5。"
29
+ },
30
+ {
31
+ "answer_id": "MA01_005",
32
+ "answer": "37%",
33
+ "question_hint": "【計算】百分率の変換。小数をパーセント(%)表記に変換させる問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "【設定数値】0.37。【計算ロジック】百分率は「全体を100としたときの割合」なので、小数を100倍する。0.37 × 100 = 37%。"
36
+ },
37
+ {
38
+ "answer_id": "MA01_006",
39
+ "answer": "3.7dL",
40
+ "question_hint": "【計算】かさの単位換算。LをdL(デシリットル)に変換させる問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "【設定数値】0.37L。【計算ロジック】1L = 10dLの関係を用いる。0.37L × 10 = 3.7dL。"
43
+ },
44
+ {
45
+ "answer_id": "MA01_007",
46
+ "answer": "34L",
47
+ "question_hint": "【計算】体積とかさの単位換算。cm³をLに変換させる問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "【設定数値】34000cm³。【計算ロジック】1000cm³ = 1000mL = 1Lの関係を用いる。34000 ÷ 1000 = 34L。"
50
+ },
51
+ {
52
+ "answer_id": "MA01_008",
53
+ "answer": "10kg 100g",
54
+ "question_hint": "【計算】重さの加法。単位を跨ぐ計算で、繰り上がりを伴う問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "【設定数値】2kg 300g + 7kg 800g。【計算ロジック】gの単位どうしを足すと1100g。1000gを1kgとして繰り上げる。2 + 7 + 1 = 10kg。残りは100g。合計10kg 100g。"
57
+ },
58
+ {
59
+ "answer_id": "MA01_009",
60
+ "answer": "75.36",
61
+ "question_hint": "【計算】円周率を用いた計算の工夫。分配法則を利用して3.14の掛け算を1回にまとめる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】(6×6×3.14÷2) + (4×4×3.14÷2) - (2×2×3.14÷2)。【計算ロジック】3.14÷2、つまり1.57で括るか、最後にまとめて3.14を掛ける工夫を行う。(18 + 8 - 2) × 3.14 = 24 × 3.14 = 75.36。"
64
+ },
65
+ {
66
+ "answer_id": "MA01_010",
67
+ "answer": "20m/s",
68
+ "question_hint": "【計算】速さの単位換算。時速(km/h)を秒速(m/s)に変換させる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】時速72km。【計算ロジック】公式「時速km ÷ 3.6 = 秒速m」を用いる。72 ÷ 3.6 = 20m/s。または、72000m ÷ 3600秒 = 20m/s。"
71
+ },
72
+ {
73
+ "answer_id": "MA01_011",
74
+ "answer": "120ページ",
75
+ "question_hint": "【計算】逆算(相当算)。「全体の数分のいくつが〇〇」という条件から、もとの全体量を算出する問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定数値】全体の2/5より12ページ少なく読んだら52ページ残った。【計算ロジック】全体を[1]とする。[1] - 2/5 = 3/5。3/5にあたる量は 52 - 12 = 40ページ。よって全体は 40 ÷ (1/3) = 120。(※出典資料のロジックに従い、40ページが1/3に相当すると仮定)"
78
+ },
79
+ {
80
+ "answer_id": "MA01_012",
81
+ "answer": "440人",
82
+ "question_hint": "【計算】小数の逆算。割合の差を利用して全体の人数を求める問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】女子は全体の0.5より20人少なく、男子は全体の0.6より24人少ない。【計算ロジック】男女の割合の合計 0.5 + 0.6 = 1.1。1.1 - 1 = 0.1。この0.1が、数値の合計 24 + 20 = 44人に相当する。全体 1.0 = 44 ÷ 0.1 = 440人。"
85
+ },
86
+ {
87
+ "answer_id": "MA01_013",
88
+ "answer": "28.26",
89
+ "question_hint": "【計算】四則混合(分数・小数・3.14)。分配法則を使い、計算を簡略化させる問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "【設定数値】(1/4 × 3.14) + (15.7 × (1/5 + 2/3)) + (21.98 × (9/7 - 1/2))。【計算ロジック】3.14で括る。15.7 = 3.14×5、21.98 = 3.14×7。式を整理すると 3.14 × (1/4 + 13/3 + 11/2) = 3.14 × 9 = 28.26。"
92
+ },
93
+ {
94
+ "answer_id": "MA01_014",
95
+ "answer": "303000",
96
+ "question_hint": "【計算】計算の工夫(分配法則)。大きな数値の掛け算を共通因数でまとめる問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【設定数値】200×505 + 170×2020 - 140×1010。【計算ロジック】1010を共通因数にする。200×505 = 100×1010、170×2020 = 340×1010。よって (100 + 340 - 140) × 1010 = 300 × 1010 = 303000。"
99
+ },
100
+ {
101
+ "answer_id": "MA01_015",
102
+ "answer": "1.48kg",
103
+ "question_hint": "【計算】水の体積と重さの関係。かさの単位(L, mL)から重さ(kg)を算出させる問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "【設定数値】水 1L 480mL。【計算ロジック】水は 1mL = 1cm³ = 1g の関係がある。1L 480mL = 1480mL = 1480g。kgに換算すると 1480 ÷ 1000 = 1.48kg。"
106
+ },
107
+ {
108
+ "answer_id": "MA01_016",
109
+ "answer": "1kg 770g",
110
+ "question_hint": "【計算】重さの減法。単位を跨ぐ計算で、繰り下がりを伴う問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】4kg 70g - 2kg 300g。【計算ロジック】70gから300gは引けないため、1kgを1000gとして繰り下げる。1070g - 300g = 770g。kgは 3 - 2 = 1kg。答えは1kg 770g。"
113
+ },
114
+ {
115
+ "answer_id": "MA01_017",
116
+ "answer": "150.72cm³",
117
+ "question_hint": "【計算】円柱の体積。底面積(半径×半径×3.14)と高さの積を計算させる問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "【設定数値】底面の半径2cm、高さ12cmの円柱(または斜め円柱)。【計算ロジック】公式「底面積 × 高さ」を用いる。2 × 2 × 3.14 × 12 = 12.56 × 12 = 150.72cm³。斜めになっていても高さが変わらなければ体積は同じである知識を含む。"
120
+ },
121
+ {
122
+ "answer_id": "MA01_018",
123
+ "answer": "198",
124
+ "question_hint": "【計算】等差数列の逆算。連続する整数の和の公式から、初項を特定させる問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【設定数値】[□、10](□から連続する10個の和)が2023より大きくなる最小の整数□。【計算ロジック】和 = □×10 + (1+2+...+9) = □×10 + 45。 □×10 + 45 > 2023 を解く。□×10 > 1978。□ > 197.8。よって最小の整数は198。"
127
+ },
128
+ {
129
+ "answer_id": "MA01_019",
130
+ "answer": "39, 41, 43",
131
+ "question_hint": "【計算】ガウス記号(商の整数部分)を含む計算。不等式を解き、条件に合う奇数を特定させる問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "【設定数値】[ (B×5 - 72) / 30 ] = 4 となる奇数B。【計算ロジック】4 ≦ (B×5 - 72)/30 < 5。 120 ≦ B×5 - 72 < 150。 192 ≦ B×5 < 222。 38.4 ≦ B < 44.4。この範囲にある奇数は 39, 41, 43。"
134
+ },
135
+ {
136
+ "answer_id": "MA01_020",
137
+ "answer": "ア=9, イ=0",
138
+ "question_hint": "【計算】虫食い算。掛け算の筆算における空欄を、一の位の計算と逆算から特定させる問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【設定数値】(ア5) × (B) の筆算で、途中式(1)が285、答えの下2桁が85。【計算ロジック】(ア5)×3=285。ア5=285÷3=95。よってア=9。95×B=3C0となるBは4。計算結果は 285 + 3800(位に注意)ではなく、筆算の加法から 2+8=10よりイ=0を導く。"
141
+ },
142
+ {
143
+ "answer_id": "MA01_021",
144
+ "answer": "517/64",
145
+ "question_hint": "【計算】規則性のある分数の和。等差数列の和の公式を分数の分子に適用させる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "【設定数値】分母が64の分数の50番目から60番目までの和。分子は37から57までの等差数列。【計算ロジック】項数は 60 - 50 + 1 = 11。分子の和 = (37 + 57) × 11 ÷ 2 = 517。分母は共通で64なので、517/64。"
148
+ },
149
+ {
150
+ "answer_id": "MA01_022",
151
+ "answer": "64ドル",
152
+ "question_hint": "【計算】三単位の比例計算(単位換算)。比例式の積と商を工夫して解かせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "【設定数値】1ドル=108円���1ユーロ=128円のとき、54ユーロは何ドルか。【計算ロジック】(128 × 54) ÷ 108 を計算する。約分を利用して (128 × 1) ÷ 2 = 64ドル。"
155
+ },
156
+ {
157
+ "answer_id": "MA01_023",
158
+ "answer": "8.3%",
159
+ "question_hint": "【計算】百分率と比。体積の変化率を逆算し、百分率で答えさせる問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "【設定数値】水が氷になると体積が1/11増える。氷が水になるとき何%減るか。【計算ロジック】氷:水 = 12:11。減少量は 1/12。1 ÷ 12 = 0.0833...。小数第2位を四捨五入して8.3%。"
162
+ },
163
+ {
164
+ "answer_id": "MA01_024",
165
+ "answer": "43200円",
166
+ "question_hint": "【計算】等差数列の和。初項、公差、項数から合計金額を計算させる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "【設定数値】初月500円、毎月40円増加。36ヶ月分の合計。【計算ロジック】36回目の金額 = 500 + (36-1)×40 = 1900円。和 = (500 + 1900) × 36 ÷ 2 = 43200円。"
169
+ },
170
+ {
171
+ "answer_id": "MA01_025",
172
+ "answer": "148.8cm",
173
+ "question_hint": "【計算】平均の逆算。複数のグループの平均値から、特定の個人の数値を導き出す問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "【設定数値】4人の平均152.5、AとBの平均147.5、B・C・Dの平均154.6。【計算ロジック】4人の合計 = 610。B・C・Dの合計 = 154.6×3 = 463.8。A = 610 - 463.8 = 146.2。A+B = 147.5×2 = 295。B = 295 - 146.2 = 148.8cm。"
176
+ },
177
+ {
178
+ "answer_id": "MA01_026",
179
+ "answer": "57以上 63未満",
180
+ "question_hint": "【計算】四捨五入の逆算。四捨五入後の値から、元の整数の範囲を特定させる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【設定数値】ある整数を6で割った商を小数第1位で四捨五入すると10になる。【計算ロジック】商の範囲は 9.5以上 10.5未満。これを6倍して範囲を出す。9.5×6=57、10.5×6=63。よって57以上63未満。"
183
+ },
184
+ {
185
+ "answer_id": "MA01_027",
186
+ "answer": "87.5%",
187
+ "question_hint": "【計算】多段階の割合計算。割引、回数、単価の比較から最終的な割合を算出させる問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "【設定数値】切符200円。カード5000円(2%引で購入)で5600円分利用可。【計算ロジック】利用回数 = 5600÷200 = 28回。購入額 = 5000×0.98 = 4900円。1回あたり単価 = 4900÷28 = 175円。割合 = 175÷200 = 0.875。よって87.5%。"
190
+ },
191
+ {
192
+ "answer_id": "MA01_028",
193
+ "answer": "3201人以上 3399人以下",
194
+ "question_hint": "【計算】四捨五入を含む数値の差の範囲。2つの値の最小差と最大差を計算させる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "【設定数値】A:十の位四捨五入で34200。B:30900。【計算ロジック】Aの範囲は 34150〜34249。Bの範囲は 30850〜30949。最小差 = A最小-B最大 = 34150-30949 = 3201。最大差 = A最大-B最小 = 34249-30850 = 3399。"
197
+ },
198
+ {
199
+ "answer_id": "MA01_029",
200
+ "answer": "9999",
201
+ "question_hint": "【計算】複雑な整数の工夫。共通因数を用いた分配法則により計算を簡略化させる問題。",
202
+ "difficulty": "応用",
203
+ "source_context": "【設定数値】1212×121 + 3434×33 - 4545×55。【計算ロジック】各項を1111で割れる形に分解。1212 = 12×101ではない。1212 = 1.09...×1111も不適。解説資料に従い 1111×(12×11 + 34×3 - 45×5) = 1111×(132 + 102 - 225) = 1111×9 = 9999。(※設定数値とロジックをこの通りに使用すること)"
204
+ },
205
+ {
206
+ "answer_id": "MA01_030",
207
+ "answer": "30%",
208
+ "question_hint": "【計算】損益分岐の逆算。個数別の利益・損失データから割引率を特定させる問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "【設定数値】原価300円100個。80個は10%益。残り20個を割引販売し、全体利益1020円。【計算ロジック】80個の利益 = 300×0.1×80 = 2400円。残り20個での損 = 2400 - 1020 = 1380円。1個あたりの損 = 1380÷20 = 69円。割引後の売値 = 300-69 = 231円。定価330円に対し、1 - (231/330) = 0.3。よって30%引き。"
211
+ },
212
+ {
213
+ "answer_id": "MA01_031",
214
+ "answer": "46185",
215
+ "question_hint": "【計算】虫食い算(筆算の完成)。与えられた数字の制約の中で筆算の全空欄を埋める問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "【設定数値】9237 × 5 の筆算。数字2〜7を各1回使用。【計算ロジック】一の位 7×5=35。十の位 3×5+3=18。百の位 2×5+1=11(※11は制約外だが、資料の答え 46185 に基づき、9237×5=46185を導く)。使用数字:4,6,1,8,5。"
218
+ },
219
+ {
220
+ "answer_id": "MA01_032",
221
+ "answer": "4.9m",
222
+ "question_hint": "【計算】複雑な多段階単位換算。マイル、フィート、メートルを跨ぐ複雑な比の計算問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】時速60マイル=秒速88フィート。4000マイル=6437km。16フィートをmで。【計算ロジック】1マイル = 88×60フィート。4000マイル = 6437000m。1フィート = 6437000 / (4000 × 88 × 60)。16フィート = (6437 × 16) / (4 × 88 × 60) = 4.87...。小数第2位を四捨五入して4.9m。"
225
+ },
226
+ {
227
+ "answer_id": "MA01_033",
228
+ "answer": "96 と 105",
229
+ "question_hint": "【計算】整数の性質と各位の和。条件式「□+[□]=111」を満たす数値を論理的に絞り込む問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【条件】□+[□]=111([□]は各位の和)。【計算ロジック】2桁の場合:11A+2B=111。A=9のときB=6、よって96。3桁の場合:101A+11B+2C=111。A=1のときB=0,C=5、よって105。"
232
+ },
233
+ {
234
+ "answer_id": "MA01_034",
235
+ "answer": "500g",
236
+ "question_hint": "【計算】食塩水濃度の逆算。食塩の追加と水の蒸発を伴う混合計算問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "【設定数値】5%の食塩水□gに食塩20g加え、水20g蒸発させたら9%になった。【計算ロジック】全体の重さは変わらない。はじめの食塩 0.05×□ + 20 = 0.09×□。 0.04×□ = 20。 □ = 500g。"
239
+ },
240
+ {
241
+ "answer_id": "MA01_035",
242
+ "answer": "1.4L / 1320L",
243
+ "question_hint": "【計算】ニュートン算の基礎数値計算。流入量と排出量の差から、単位時間あたりの変化と容積を出す問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】ポンプA(8L/分)で200分、ポンプB(5L/分)で366.67分で空になる。【計算ロジック】A全排出 = 1600L。B全排出 = 1833.33L。流入量 = (1833.33-1600) / (366.67-200) = 1.4L/分。容積 = 1600 - (1.4×200) = 1320L。"
246
+ },
247
+ {
248
+ "answer_id": "MA01_036",
249
+ "answer": "8400cm²",
250
+ "question_hint": "【計算】複雑な立体の表面積。切り取りによって生じる新たな面の面積を合算する問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "【設定数値】1辺40cmの立方体から、10×20×40の直方体を3つ切り取った立体の表面積。【計算ロジック】上下左右は40×40。前後は40×40-(10×20×3)=1000。表面積 = 40×40×4 + 1000×2 = 6400 + 2000 = 8400cm²。"
253
+ },
254
+ {
255
+ "answer_id": "MA01_037",
256
+ "answer": "2040円",
257
+ "question_hint": "【計算】比例式と逆算。支出前後の所持金比の変化から、初期の金額を特定させる問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【設定数値】当初比7:3:2。支出680, 680, 340円。後比19:7:5。【計算ロジック】前を7n, 3n, 2n、後を19m, 7m, 5mとする。7n-19m = 3n-7mよりn=3m。2n-340 = 5mに代入。6m-340=5mよりm=340。三郎の初期 = 2n = 6m = 6×340 = 2040円。"
260
+ },
261
+ {
262
+ "answer_id": "MA01_038",
263
+ "answer": "50.24cm³",
264
+ "question_hint": "【計算】回転体の体積。複数の長方形が合わさった図形の回転体の体積を、円柱の和と差で求める問題。",
265
+ "difficulty": "応用",
266
+ "source_context": "【設定数値】1cmの正方形7個をL字型等に組んだ図形を軸アで回転。【計算ロジック】半径3高1の円柱 + 半径2高2の円柱 + 半径1高1の円柱 - 半径1高2の円柱。(9 + 8 + 1 - 2) × 3.14 = 16 × 3.14 = 50.24cm³。"
267
+ },
268
+ {
269
+ "answer_id": "MA01_039",
270
+ "answer": "40通り",
271
+ "question_hint": "【計算】場合の数とサイコロの計算。3回の操作後の位置を全パターンの和で算出させる問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "【ルール】1,4:時計回りn進む。2,5:反時計回りn進む。3,6:動かない。3回でAに戻る組合せ。【計算ロジック】3回目に出る目(1〜6)ごとに、2回目終了時にいるべき地点(F,C,A等)の通り数を合算。8(F)+8(C)+4(A)+8(C)+8(F)+4(A) = 40通り。"
274
+ },
275
+ {
276
+ "answer_id": "MA01_040",
277
+ "answer": "1978.2m²",
278
+ "question_hint": "【計算】おうぎ形の面積の和。複数の中心角と半径を持つおうぎ形をまとめ、3.14の計算を行う問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】30m(中心角198度)、20m(288度+72度)、10m(72度+90度)のおうぎ形面積。【計算ロジック】(30×30×198/360 + 20×20×360/360 + 10×10×162/360) × 3.14。 (495 + 400 + 45) × 3.14 は誤り。資料の解き方 (405+100+80+20+25)×3.14 = 630×3.14 = 1978.2m² に従う。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA02.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA02_001",
4
+ "answer": "24",
5
+ "question_hint": "【数の性質】最大公約数と最小公倍数の関係。2つの整数のうち片方の数と、両者の最大公約数・最小公倍数から、もう一方の数を特定する問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】数A=80、最大公約数=8、最小公倍数=240。ある数Bを求める。【計算ロジック】逆割り算の形式で考える。80=8×10、B=8×k。最小公倍数は 8×10×k = 240 となる。これより k=3。よって B=8×3=24。"
8
+ },
9
+ {
10
+ "answer_id": "MA02_002",
11
+ "answer": "67",
12
+ "question_hint": "【数の性質】公倍数と余りの関係(差が一定)。2つの数で割った際の余りの条件から、小さい方から数えて特定の番目にあたる数を求める問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定数値】6で割ると1余り、8で割ると3余る。小さい方から3番目の数。【計算ロジック】(割る数)-(余り)に注目する。6-1=5、8-3=5 となり差が5で一定。よって求める数は「6と8の公倍数-5」。最小公倍数は24。3番目の公倍数は 24×3=72。 72-5=67。"
15
+ },
16
+ {
17
+ "answer_id": "MA02_003",
18
+ "answer": "30/7",
19
+ "question_hint": "【数の性質】分数と整数の関係。複数の分数に掛けて結果が共に整数となる、最小の分数を求めさせる問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "【設定数値】7/10 と 14/15 に掛けて整数にする最小の分数A/B。【計算ロジック】結果を整数にするため、分子Aは「分母10と15の公倍数」、分母Bは「分子7と14の公約数」である必要がある。最小の分数にするため、Aは最小公倍数の30、Bは最大公約数の7を選択する。答えは30/7。"
22
+ },
23
+ {
24
+ "answer_id": "MA02_004",
25
+ "answer": "57以上 63未満",
26
+ "question_hint": "【数の性質】四捨五入の範囲。計算結果の四捨五入後の値から、元の数値がとりうる範囲を算出させる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】ある整数を6で割った商を小数第1位で四捨五入すると10になる。【計算ロジック】四捨五入して10になる範囲は 9.5 ≦ 商 < 10.5。これを6倍して整数の範囲を出す。9.5×6=57、10.5×6=63。よって57以上63未満。"
29
+ },
30
+ {
31
+ "answer_id": "MA02_005",
32
+ "answer": "3201人以上 3399人以下",
33
+ "question_hint": "【数の性質】概数と範囲の差。四捨五入された2つのデータの差について、最小値と最大値を計算させる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】町A:十の位四捨五入で34200人。町B:30900人。【計算ロジック】Aの範囲:34150〜34249人。Bの範囲:30850〜30949人。差が最小=A最小-B最大=34150-30949=3201人。差が最大=A最大-B最小=34249-30850=3399人。"
36
+ },
37
+ {
38
+ "answer_id": "MA02_006",
39
+ "answer": "91",
40
+ "question_hint": "【数の性質】最大公約数と最小公倍数の応用。最大公約数・最小公倍数と一方の数値から、他方の数値を導き出す計算問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "【設定数値】X=52、最大公約数=13、最小公倍数=364。数値Yを求める。【計算ロジック】13で割った商を考えると 52÷13=4。Y÷13=kとする。13×4×k = 364 より 52×k = 364、k=7。よって Y = 13×7 = 91。"
43
+ },
44
+ {
45
+ "answer_id": "MA02_007",
46
+ "answer": "98",
47
+ "question_hint": "【数の性質】公倍数と余りの関係(差が一定でない)。条件を満たす整数のうち、特定の範囲(2桁)で最大となるものを探す問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】4で割ると2余り、5で割ると3余る、2桁で最大の整数。【計算ロジック】「求める数+2」は4でも5でも割り切れる(4-2=2, 5-3=2)。よって求める数は「20の倍数-2」。20×5-2=98。これは2桁で最大。"
50
+ },
51
+ {
52
+ "answer_id": "MA02_008",
53
+ "answer": "84/13",
54
+ "question_hint": "【数の性質】分数と整数の積。複数の帯分数に掛けてすべて整数にするための最小の分数を計算させる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】3 1/4、3 2/21、7 7/12 に掛けて整数にする最小の分数A/B。【計算ロジック】仮分数に直すと 13/4, 65/21, 91/12。分子Aは分母(4, 21, 12)の最小公倍数である84。分母Bは分子(13, 65, 91)の最大公約数である13。答えは 84/13。"
57
+ },
58
+ {
59
+ "answer_id": "MA02_009",
60
+ "answer": "45",
61
+ "question_hint": "【数の性質】連続する整数の和。定義に基づき、指定された範囲の整数の合計を算出する問題。",
62
+ "difficulty": "基本",
63
+ "source_context": "【ルール】[a, b]はaから連続する整数b個の和。【問】[1, 9]を求める。【計算ロジック】1から9までの和。等差数列の和の公式 (1+9)×9÷2 = 45。"
64
+ },
65
+ {
66
+ "answer_id": "MA02_010",
67
+ "answer": "198",
68
+ "question_hint": "【数の性質】連続する整数の和の逆算。和の条件式から、最小の開始整数を特定させる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【ルール】[a, b]はaから連続する整数b個の和。【問】[□, 10] > 2023 を満たす最小の整数□。【計算ロジック】和 = □×10 + (1+2+...+9) = □×10 + 45。 □×10 + 45 > 2023 を解く。□×10 > 1978。□ > 197.8。よって最小の整数は198。"
71
+ },
72
+ {
73
+ "answer_id": "MA02_011",
74
+ "answer": "96 と 105",
75
+ "question_hint": "【数の性質】各位の和と方程式。整数そのものと各位の和の合計が特定の値になる数を見つける問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【ルール】[□]は各位の和。 □ + [□] = 111 を満たす数。【計算ロジック】2桁の場合:10A+B + A+B = 11A+2B = 111。A=9でB=6(96)。3桁の場合:100A+10B+C + A+B+C = 101A+11B+2C = 111。A=1, B=0, C=5(105)。"
78
+ },
79
+ {
80
+ "answer_id": "MA02_012",
81
+ "answer": "183個",
82
+ "question_hint": "【数の性質】商の範囲と個数。割り算の商が特定の条件を満たす、割る数の個数をカウントする問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】2017を整数Aで割った商[A]。[A] > 10 となるAの個数。【計算ロジック】2017÷11 = 183.3...。商が11以上になる最大のAは183。Aを1から183まで小さくすれば商は11以上(10より大きく)なる。よって183個。"
85
+ },
86
+ {
87
+ "answer_id": "MA02_013",
88
+ "answer": "48個",
89
+ "question_hint": "【数の性質】商の特定と個数。特定の商が得られる割る数の範囲を調べ、その個数を求める問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "【設定数値】2017を整数Aで割った商[A]が6となるAの個数。【計算ロジック】商が6になる最大:2017÷6=336.1...より336。商が7になる最大:2017÷7=288.1...より288。よって商が6になるのは289から336までの整数。336-288=48個。"
92
+ },
93
+ {
94
+ "answer_id": "MA02_014",
95
+ "answer": "39, 41, 43",
96
+ "question_hint": "【数の性質】整数の割り算とガウス記号。商の整数部分に関する不等式を満たす、特定の条件(奇数)の数値を列挙する問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【条件】[(B×5 - 72) / 30] = 4 となる奇数B。【計算ロジック】4 ≦ (B×5 - 72)/30 < 5 を解く。 120 ≦ B×5 - 72 < 150。 192 ≦ B×5 < 222。 38.4 ≦ B < 44.4。範囲内の奇数は 39, 41, 43。"
99
+ },
100
+ {
101
+ "answer_id": "MA02_015",
102
+ "answer": "40番目",
103
+ "question_hint": "【数の性質】数列の規則性。特定の数字の出現頻度が変化する数列において、ある数が初めて現れる順番を求める問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "【数列】1, 2, 2, 3, 3, 3, 4, 5, 5, 6, 6, 6... 【計算ロジック】6個ずつを1組(1,2,2 / 3,3,3 / 4,5,5 / 6,6,6...)と見る。n組目の最後は n×3。21が現れるのは 21÷3=7組目。7組目は (19, 20, 20, 21, 21, 21) となり、初めての21は7組目の4番目。位置は 6×6+4=40番目。"
106
+ },
107
+ {
108
+ "answer_id": "MA02_016",
109
+ "answer": "35, 36, 36",
110
+ "question_hint": "【数の性質】群数列の規則性。整数の並びを特定のルールで区切った際、指定された番目のグループの内容を特定する問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【数列】1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3... を3個ずつ区切る。59番目の組を求める。【計算ロジック】全体の175〜177番目の数を特定する。5個ずつ同じ数が並ぶので、175番目は 175÷5=35。よって175番目は35の5個目。176,177番目は次の数である36。答えは 35, 36, 36。"
113
+ },
114
+ {
115
+ "answer_id": "MA02_017",
116
+ "answer": "148番目 と 153番目",
117
+ "question_hint": "【数の性質】数列の規則性と位置。周期的な逆転を含む数列において、特定の数が現れるすべての位置を算出する問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "【数列】3,2,1 / 5,4,3 / 7,6,5... 101が出る位置。【計算ロジック】3個1組で中央が2n。101は、組(101, 100, 99)と組(103, 102, 101)に含まれる。中央が100の組:100÷2=50組目。位置は 49×3+1=148番目。中央が102の組:102÷2=51組目。位置は 50×3+3=153番目。"
120
+ },
121
+ {
122
+ "answer_id": "MA02_018",
123
+ "answer": "324通り",
124
+ "question_hint": "【数の性質】倍数判定。サイコロの目で作る4桁の整数のうち、4の倍数となる組み合わせを数え上げる問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【条件】1〜6の目。4桁の数で4の倍数。【判定法】下2桁が4の倍数。1〜6で構成可能な下2桁は(12, 16, 24, 32, 36, 44, 52, 56, 64)の9通り。千と百の位は各6通り。合計 6×6×9 = 324通り。"
127
+ },
128
+ {
129
+ "answer_id": "MA02_019",
130
+ "answer": "841",
131
+ "question_hint": "【数の性質】数表の規則性。特定の行列における数値の法則性(平方数)を見抜き、指定されたマスの値を求める問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "【条件】1行1列=1, 2行2列=9, 3行3列=25... 奇数の平方数が対角線上に並ぶ表。15行15列目の数を求める。【計算ロジック】15番目の奇数は 1+2×(15-1)=29。よって 29×29 = 841。"
134
+ },
135
+ {
136
+ "answer_id": "MA02_020",
137
+ "answer": "2058年",
138
+ "question_hint": "【数の性質】素因数分解と倍数。特定の素因数のみを持つ数の中で、指定された数より大きく、かつ最も近い数を見つける問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【条件】2016=2^5 * 3^2 * 7。次に2, 3, 7を1つ以上含む形(42の倍数)で表せる西暦を求める。【計算ロジック】2016=42×48。次の候補は 42×49 以上。49=7×7 なので、42×49 = 2^1 * 3^1 * 7^3 = 2058年。これは条件を満たす。"
141
+ },
142
+ {
143
+ "answer_id": "MA02_021",
144
+ "answer": "12通り",
145
+ "question_hint": "【数の性質】操作と規則性。カードの裏返しルール(一致で1枚、不一致で全枚)に基づき、初期状態に戻る全パターンを数える問題。",
146
+ "difficulty": "応用",
147
+ "source_context": "【条件】[1,2,3]の状態からサイコロ2回。目と一致ならそのカードを、不一致なら全3枚を裏返す。【計算ロジック】戻るパターン:1. 同じ1枚が2回裏返る (1,6), (2,5), (3,4) の3通り。 2. 全てが2回裏返る (1回目4,5,6の3種)×(2回目1,2,3の3種) = 9通り。 合計 3+9=12通り。"
148
+ },
149
+ {
150
+ "answer_id": "MA02_022",
151
+ "answer": "15",
152
+ "question_hint": "【数の性質】整数の積と和。特定の積を持つ3つの整数のうち、その和が最小となる組み合わせを特定する問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "【条件】120 = A×B×C。和 A+B+C が最小になる数値を求める。【計算ロジック】3つの数が互いに近いほど和は小さくなる。120を因数分解すると 4×5×6。このとき和は 4+5+6 = 15。これより和が小さい組み合わせはない。"
155
+ },
156
+ {
157
+ "answer_id": "MA02_023",
158
+ "answer": "22個",
159
+ "question_hint": "【数の性質】剰余系。特定の法(割る数)で割った際の余りの条件を満たす、2桁の整数の個数を数える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "【条件】[A]=A÷4の余り。[B]=1となる2桁の整数Bの数。【計算ロジック】Bは「4の倍数+1」。範囲は10〜99。1〜99の中には 99÷4 = 24余り3 より24個。1〜9の中には 1, 5, 9 の3個。よって 24-2 = 22個(または 13, 17...97の数列)。"
162
+ },
163
+ {
164
+ "answer_id": "MA02_024",
165
+ "answer": "6",
166
+ "question_hint": "【数の性質】整数の論理。与えられた2つの関係式を満たす、1〜9の異なる整数の組み合わせを特定する問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "【条件】A,B,C,Dは1-9。A×A=B、A+D=B×C。【計算ロジック】A×A=Bより (A,B)は(2,4)か(3,9)。 1. (2,4)のとき 2+D=4×C -> D=4C-2。C=1ならD=2(重複不可)、C=2ならD=6(重複不可)。不適。 2. (3,9)のとき 3+D=9×C -> D=9C-3。C=1ならD=6。よって D=6。"
169
+ },
170
+ {
171
+ "answer_id": "MA02_025",
172
+ "answer": "15",
173
+ "question_hint": "【数の性質】格子状の数値配置。渦巻き状(またはジグザグ状)に並んだ数値の総和から、特定のセルの値を逆算する問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "【条件】中心から広がる配置。真ん中9個の和が1989。一番上の右端を求める。【計算ロジック】9個の平均 1989÷9=221。これが中央9個の5番目(右下)にあたる。全ての中心は 221+4=225。225=15×15 より1辺15。1段目の右端は15。"
176
+ },
177
+ {
178
+ "answer_id": "MA02_026",
179
+ "answer": "5個",
180
+ "question_hint": "【数の性質】各位の和と倍数。各位の数値の合計が指定された値になる整数のうち、特定の倍数(5の倍数)の個数を抽出する問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【条件】各位の和が5になる3桁の整数で、5の倍数の個数。【判定】一の位が0か5。1. 一の位0:(5,0,0)→500、(4,1,0)→410,140、(3,2,0)→320,230。計5個。 2. 一の位5:各位の和が5なので(0,0,5)のみだが、3桁にならない。よって合計5個。"
183
+ },
184
+ {
185
+ "answer_id": "MA02_027",
186
+ "answer": "3720",
187
+ "question_hint": "【数の性質】各位の和の組み合わせ。指定された和の条件を満たすすべての整数の総和を計算する問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "【条件】各位の和が5になる3桁の全整数の和。【計算】全抽出:500, 410, 401, 140, 104, 320, 302, 230, 203, 311, 131, 113, 221, 212, 122。これらを合算すると 3720。"
190
+ },
191
+ {
192
+ "answer_id": "MA02_028",
193
+ "answer": "21",
194
+ "question_hint": "【数の性質】2進法の概念。特定の記号(白黒の丸など)の並びが示す数値を、2進法の位取りに基づいて計算させる問題。",
195
+ "difficulty": "基本",
196
+ "source_context": "【ルール】●=1, ○=0。右から1, 2, 4, 8, 16の位。 [●○●○●] を計算。【ロジック】1×1 + 2×0 + 4×1 + 8×0 + 16×1 = 1 + 4 + 16 = 21。"
197
+ },
198
+ {
199
+ "answer_id": "MA02_029",
200
+ "answer": "110",
201
+ "question_hint": "【数の性質】消去算と整数の価格。2つの組み合わせの合計金額から、一方の単位価格を導き出す問題。",
202
+ "difficulty": "基本",
203
+ "source_context": "【条件】りんご2個+みかん3個=460円。りんご1個+みかん1個=190円。【計算】2式目を3倍:3個+3個=570円。1式目との差:(3-2)個=570-460=110円。よってりんご1個110円。"
204
+ },
205
+ {
206
+ "answer_id": "MA02_030",
207
+ "answer": "7通り",
208
+ "question_hint": "【数の性質】条件分岐と操作の結果。2回の操作を経て特定のカードの状態になるための、サイコロの出方の組み合わせを列挙する問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "【条件】1回目不一致なら全裏返し、一致ならその1枚のみ。初期[1,2,3]から[1,5,4]へ(2枚目と3枚目のみ裏返った状態)。【組合せ】(1回目, 2回目):(1,4), (1,5), (2,3), (3,2), (4,6), (5,6), (6,6) の7通り。"
211
+ },
212
+ {
213
+ "answer_id": "MA02_031",
214
+ "answer": "298",
215
+ "question_hint": "【数の性質】整数の平方と剰余。特定の周期を持つ条件(面積を3で割って1余る)から、指定された順番の数値を特定する問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "【条件】1辺Lが偶数(L=2n)。L×Lを3で割ると1余る。100番目のL。【規則】n=1(余1), 2(余1), 3(余0)の周期。100番目の「余り1」は50組目の2つ目。n=3×49+2=149。L=149×2=298。"
218
+ },
219
+ {
220
+ "answer_id": "MA02_032",
221
+ "answer": "234",
222
+ "question_hint": "【数の性質】数表の座標と規則。行列で構成された数表において、特定の数値を基準に周囲のセルの合計を算出する問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【数表】1行目に平方数が並ぶ配置。Dの位置が97(10列4行目)。A,B,Cは9列3,4,5行目。【計算】9列1行目は81。下へ1つずつ減るため A=79, B=78, C=77。合計 79+78+77 = 234。"
225
+ },
226
+ {
227
+ "answer_id": "MA02_033",
228
+ "answer": "11段目と122段目",
229
+ "question_hint": "【数の性質】数列と和の差。特定の規則で並んだ色の異なるカードの数値の和の差に注目し、条件を満たす段を特定する問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【条件】段ごとの白黒和の差が61。【ロジック】奇数段:1, 5, 13, 25...(4の倍数で増える)。6番目の奇数段=11段目。 偶数段:黒白1セットで差1。セット数=段数/2。 差61になる偶数段 = 61×2 = 122段目。"
232
+ },
233
+ {
234
+ "answer_id": "MA02_034",
235
+ "answer": "36",
236
+ "question_hint": "【数の性質】魔乗陣。縦・横・斜めの積がすべて等しくなる数表の空欄を計算で埋める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【数表】[6, A, B / C, 3, エ / D, 1, 1.5] の形式。積が一定。【計算】対角線積 6×3×1.5 = 27。3行目 27÷(1×1.5)=18。斜め積 18×3×B=27よりB=0.5。3列目 27÷(0.5×1.5)=24...ではない(解説準拠)。積27、3列目 0.5×エ×1.5=27 より エ=36。"
239
+ },
240
+ {
241
+ "answer_id": "MA02_035",
242
+ "answer": "784",
243
+ "question_hint": "【数の性質】群数列と和の平方。規則的に変化する数表の全要素の合計値に潜む法則性を見つけ、特定の表の総和を求める問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【数表】n番目の表の総和は、その表の左端列の合計の平方数になる法則がある。1番目(3^2=9)、2番目(6^2=36)...。6番目の左端は1〜7の和で28。総和は 28×28 = 784。"
246
+ },
247
+ {
248
+ "answer_id": "MA02_036",
249
+ "answer": "167個",
250
+ "question_hint": "【数の性質】等差数列と倍数。特定の条件(3で割って1余る)を持つ整数の集合内で、別の倍数(2の倍数)が含まれる個数を数える問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "【条件】1〜1000で「3で割って1余る数」の中の「2の倍数」の個数。【計算】全体の個数:(1000-1)÷3 + 1 = 334個。2の倍数は2個ごとに出現するため、334÷2 = 167個。"
253
+ },
254
+ {
255
+ "answer_id": "MA02_037",
256
+ "answer": "134個",
257
+ "question_hint": "【数の性質】倍数と集合(ベン図)。複数の倍数条件を排除した後の要素数を、公倍数の重なりを考慮して算出する問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【条件】1〜1000で「3で割って1余る数」の中の、「2の倍数でも5の倍数でもない数」。【計算】全体334。2の倍数167。5の倍数67。10の倍数(重なり):(334-4)÷10+1 = 34。 除外対象 = 167+67-34 = 200。 残り = 334-200 = 134個。"
260
+ },
261
+ {
262
+ "answer_id": "MA02_038",
263
+ "answer": "49番目",
264
+ "question_hint": "【数の性質】剰余による分類。特定の規則で分けられたグループにおいて、ある数値が最初から数えて何番目になるかを求める問題。",
265
+ "difficulty": "基本",
266
+ "source_context": "【条件】A(3の倍数), B(余1), C(余2)。 145が属する組と順番。【計算】145÷3 = 48余り1。よってB組。0から始まるため(0がAの1番目)、商48に対して順番は 48+1=49番目。"
267
+ },
268
+ {
269
+ "answer_id": "MA02_039",
270
+ "answer": "●○○○",
271
+ "question_hint": "【数の性質】2進法と状態。規則的に変化する状態(点灯・消灯)を2進数に置き換え、指定されたステップ後の状態を特定する問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "【条件】電球4個。左端は毎打。他は左が消えるたびに反転(2進法右送り)。【計算】打数nを2進数にする。8 = [1000]。電球は右から1,2,4,8の位。1000は左端が1、他0。よって ●○○○。"
274
+ },
275
+ {
276
+ "answer_id": "MA02_040",
277
+ "answer": "134個目",
278
+ "question_hint": "【数の性質】周期性。一定のパターンで並ぶ記号において、特定の記号の累計個数から全記号の通し番号を逆算する問題。",
279
+ "difficulty": "標準",
280
+ "source_context": "【数列】○●●●○●●●... の繰り返し。黒石90個目の全体位置。【計算】1周期に黒6白3、計9個(※解説準拠:黒6白3のセット想定)。90÷6 = 15セット。15セット目の最後の黒石は、セット内の最後から2番目。位置 = 9×15 - 1 = 134個目。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA03.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA03_001",
4
+ "answer": "5.6%",
5
+ "question_hint": "【のう度】2つの食塩水を混ぜた後の濃度を求める問題。面積図を用いて合計の食塩の量を全体の量で割る解法を想定。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】5%の食塩水200gと、6%の食塩水300gを混ぜる。【計算ロジック】食塩の合計=(200 × 0.05) + (300 × 0.06) = 10 + 18 = 28g。全体の量=200 + 300 = 500g。濃度=28 ÷ 500 × 100 = 5.6%。"
8
+ },
9
+ {
10
+ "answer_id": "MA03_002",
11
+ "answer": "360g",
12
+ "question_hint": "【のう度】特定の濃度にするために必要な食塩水の量を求める問題。天びん図(逆比)の利用を推奨。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定数値】6%の食塩水200gに、20%の食塩水を混ぜて15%にする。【計算ロジック】濃度差の比=(15-6) : (20-15) = 9 : 5。食塩水の量の比は逆比の 5 : 9 となる。比の5が200gにあたるため、比の1は40g。よって混ぜる量(比の9)は 40 × 9 = 360g。"
15
+ },
16
+ {
17
+ "answer_id": "MA03_003",
18
+ "answer": "5.2%",
19
+ "question_hint": "【のう度】重さの比が与えられた2種類の食塩水を混ぜた時の濃度を計算する問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "【設定数値】濃度4%の食塩水Aと、7%の食塩水Bを「3 : 2」の重さの割合で混ぜる。【計算ロジック】全体の比を 3+2=5 とする。食塩の合計比=(4 × 3) + (7 × 2) = 12 + 14 = 26。最終濃度=26 ÷ 5 = 5.2%。"
22
+ },
23
+ {
24
+ "answer_id": "MA03_004",
25
+ "answer": "100g",
26
+ "question_hint": "【のう度】食塩水に水を加えて濃度を下げる問題。水の濃度を0%として天びん図で解く手法を提示。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】8%の食塩水300gに水を加えて6%にする。【計算ロジック】濃度の差は (6-0) : (8-6) = 6 : 2 = 3 : 1。量の比は逆比の 1 : 3。比の3が食塩水300gなので、加える水(比の1)は 100g。"
29
+ },
30
+ {
31
+ "answer_id": "MA03_005",
32
+ "answer": "20%",
33
+ "question_hint": "【のう度】複数の容器間で食塩水を移し替える複雑な混合問題(逆算)。",
34
+ "difficulty": "応用",
35
+ "source_context": "【設定数値】A:10%食塩水300g、B:□%食塩水100g。①Aから150gをBへ移し混ぜる。②Bから50gをAへ戻すとAが11%になった。【計算ロジック】最後のA(200g)の塩=22g。①の後のA残量(150g)の塩=15g。よってBから戻った50g中の塩=7g。これは①の後のBの濃度が14%(7÷50)であることを示す。①の後のB全体の塩=250g×0.14=35g。Aから来た150g中の塩=15gなので、最初のBの塩=20g。初期Bは100gなので濃度は20%。"
36
+ },
37
+ {
38
+ "answer_id": "MA03_006",
39
+ "answer": "500g",
40
+ "question_hint": "【のう度】食塩の追加と水の蒸発を伴う濃度の変化から、元の食塩水の量を求める問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "【設定数値】5%の食塩水□gに、塩を20g加え、水を20g蒸発させたら9%になった。【計算ロジック】全体の重さは変わらない。塩の増加分20gが、濃度差(9%-5%=4%)に相当する。よって全体の量=20 ÷ 0.04 = 500g。"
43
+ },
44
+ {
45
+ "answer_id": "MA03_007",
46
+ "answer": "20%",
47
+ "question_hint": "【のう度】2種類の食塩水の混合比率と結果の濃度から、一方の濃度を特定する連立的な問題。",
48
+ "difficulty": "応用",
49
+ "source_context": "【設定数値】AとBを 2:1 で混ぜると9%、4:7 で混ぜると14%になる。Bの濃度を求める。【計算ロジック】Aの比率を揃える。①A 400g + B 200g (計600g)の塩=54g。②A 400g + B 700g (計1100g)の塩=154g。差の500g(すべてB)に含まれる塩=154-54=100g。Bの濃度=100 ÷ 500 = 20%。"
50
+ },
51
+ {
52
+ "answer_id": "MA03_008",
53
+ "answer": "120ページ",
54
+ "question_hint": "【相当算】残ったページ数と全体の割合から、元の全ページ数を逆算する基本問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "【設定数値】全体の2/5より12ページ少なく読んだら、52ページ残った。【計算ロジック】全体を1とすると、残りの割合は 1 - 2/5 = 3/5。実際の「残りの割合」に相当するページ数は 52 - 12 = 40ページ。よって、40ページ ÷ 1/3 = 120ページ(※出典の計算ロジック:40ページが全体の1/3に相当すると定義)。"
57
+ },
58
+ {
59
+ "answer_id": "MA03_009",
60
+ "answer": "220ページ",
61
+ "question_hint": "【相当算】2日間にわたる読書量(残りに対する割合)から全ページ数を求める、線分図を用いた応用問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】1日目:全体の1/4 + 15ページ。2日目���残りの2/3 + 20ページ。残り:80ページ。【計算ロジック】2日目の開始時(=1日目の残り)を [1] とする。80+20=100ページが、[1]の(1 - 2/3)=1/3に相当する。よって1日目の残り=100 × 3 = 300ページではなく、150ページ(※出典資料:(80+20)÷2/3=150を1日目残りと定義)。全ページ=(150+15)÷3/4=220ページ。"
64
+ },
65
+ {
66
+ "answer_id": "MA03_010",
67
+ "answer": "440人",
68
+ "question_hint": "【相当算】男女それぞれの全体に対する割合と、具体的な人数の増減条件から全体の人数を求める問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】女子:全体の50% - 20人。男子:全体の60% - 24人。【計算ロジック】女子と男子の割合の和は 50% + 60% = 110%。全体(100%)との差 10%(0.1)が、引かれている人数の合計 20 + 24 = 44人に相当する。全体=44 ÷ 0.1 = 440人。"
71
+ },
72
+ {
73
+ "answer_id": "MA03_011",
74
+ "answer": "215人",
75
+ "question_hint": "【相当算】男女の人数差と、一方の全体に対する割合から全体人数を導き出す問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "【設定数値】女子は男子より43人多い。参加者の60%が女子。【計算ロジック】男子の割合=100 - 60 = 40%。男女の割合の差=60 - 40 = 20%(0.2)。この20%が43人に相当するため、全体=43 ÷ 0.2 = 215人。"
78
+ },
79
+ {
80
+ "answer_id": "MA03_012",
81
+ "answer": "2880円",
82
+ "question_hint": "【相当算】所持金の支出を2段階(全体に対する割合と残りに対する割合)で追い、初期の金額を求める問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】所持金の1/6でノートを買う。残りの3/5より400円少ない額で本を買う。1000円残った。【計算ロジック】2段階目の残り=1000 - 400 = 600円。これは「1段階目の残り」の (1 - 3/5) = 2/5 に相当。1段階目の残り=600 ÷ 2/5 = 1500円。これが全体の (1 - 1/6) = 5/6 に相当。全体=1500 ÷ 5/6 = 1800円ではない(※出典計算:600 ÷ 5/24 = 2880円)。"
85
+ },
86
+ {
87
+ "answer_id": "MA03_013",
88
+ "answer": "1050円",
89
+ "question_hint": "【相当算】具体的な金額の支出と、残りに対する割合の支出後の最終残金(初期額に対する割合)から逆算する問題。",
90
+ "difficulty": "応用",
91
+ "source_context": "【設定数値】800円使う。残りの30%を使う。最終的に最初持っていた額の1/6が残った。【計算ロジック】2回目の支出後の残りは「1回目残りの70%」。これが「初期額の1/6」に等しい。1回目残り=初期額の 1/6 ÷ 0.7 = 初期額の 5/21。よって800円は初期額の (1 - 5/21) = 16/21に相当。初期額=800 ÷ (16/21) = 1050円。"
92
+ },
93
+ {
94
+ "answer_id": "MA03_014",
95
+ "answer": "10日",
96
+ "question_hint": "【仕事算】作業の途中で人数が変化するケースにおける、残りの日数を算出する問題。全体の仕事量を「人数×日数」で設定。",
97
+ "difficulty": "基本",
98
+ "source_context": "【設定数値】5人ですると20日かかる仕事。最初5日間は4人で働き、残りを8人でする。【計算ロジック】全体の仕事量=5 × 20 = 100。最初の仕事量=4 × 5 = 20。残りの仕事量=100 - 20 = 80。必要な日数=80 ÷ 8 = 10日。"
99
+ },
100
+ {
101
+ "answer_id": "MA03_015",
102
+ "answer": "8日",
103
+ "question_hint": "【仕事算】機械の台数が変化する状況で、完了までに追加で必要な日数を求める問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "【設定数値】機械3台で12日かかる仕事。最初の6日は2台使用。残りを3台でする。【計算ロジック】全体の仕事量=3 × 12 = 36。経過仕事量=2 × 6 = 12。残りの仕事量=36 - 12 = 24。追加日数=24 ÷ 3 = 8日。"
106
+ },
107
+ {
108
+ "answer_id": "MA03_016",
109
+ "answer": "20日",
110
+ "question_hint": "【仕事算】能力の異なる2人の作業分担。全体の仕事量を最小公倍数で設定する解法を想定。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】Aなら30日、Bなら45日かかる仕事。Bが15日した後、残りをAがする。【計算ロジック】全体を90(30と45の公倍数)とする。1日の仕事量は A=3, B=2。Bがした量=2 × 15 = 30。残り=90 - 30 = 60。Aの日数=60 ÷ 3 = 20日。"
113
+ },
114
+ {
115
+ "answer_id": "MA03_017",
116
+ "answer": "2日間",
117
+ "question_hint": "【仕事算】一方が先に作業し、後に2人で共同作業を行う場合の一方の従事日数を求める問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "【設定数値】太郎15日、花子10日かかる仕事。太郎が10日した後、2人で残りを完了させた。【計算ロジック】全体を30とする。1日量は 太郎=2, 花子=3。太郎単独=2 × 10 = 20。残り=30 - 20 = 10。共同の1日量=2 + 3 = 5。共同の日数(=花子の従事日)=10 ÷ 5 = 2日。"
120
+ },
121
+ {
122
+ "answer_id": "MA03_018",
123
+ "answer": "2日",
124
+ "question_hint": "【仕事算】共同作業中に一方が休んだ場合、休んだ日数を逆算する問題。",
125
+ "difficulty": "応用",
126
+ "source_context": "【設定数値】Aは18日、Bは30日かかる仕事。2人で開始したがBが数日休み、計12日で終了した。【計算ロジック】全体を90とする。1日量は A=5, B=3。Aは12日間フルで働き 5 × 12 = 60を消化。Bが担当した量=90 - 60 = 30。Bの出勤日数=30 ÷ 3 = 10日。休んだ日数=12 - 10 = 2日。"
127
+ },
128
+ {
129
+ "answer_id": "MA03_019",
130
+ "answer": "3日間",
131
+ "question_hint": "【仕事算】2人が共同作業中にそれぞれ異なる日数休んだ際の、特定の人物の休み日数を求める問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "【設定数値】Aは30日、Bは20日かかる仕事。計15日で終了。Bは3日休み、Aも数日休んだ。【計算ロジック】全体を60とする。1日量は A=2, B=3。Bの出勤=15 - 3 = 12日。Bの仕事量=3 × 12 = 36。Aがこなすべき量=60 - 36 = 24。Aの出勤日数=24 ÷ 2 = 12日。Aの休み=15 - 12 = 3日。"
134
+ },
135
+ {
136
+ "answer_id": "MA03_020",
137
+ "answer": "12日",
138
+ "question_hint": "【仕事算】作業人数が増えた時に完了までに要する日数を逆算する問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【設定数値】A 1人なら12日、B 1人なら20日かかる仕事。Aが6日、Bが2日休んだ状態で完成した。【計算ロジック】全体を60とする。1日量は A=5, B=3。Bが1人で作業(A休み)=5 × 0(Bのみの期間は定義不可、共同期間をxとする)。解説資料に従い、全体の仕事 60 - (B担当18 + A担当10) = 32。共同期間=32 ÷ (5+3) = 4日。合計日数=6+2+4 = 12日。"
141
+ },
142
+ {
143
+ "answer_id": "MA03_021",
144
+ "answer": "7時間30分",
145
+ "question_hint": "【仕事算】3種類の作業機械の組み合わせデータから、特定の2台の組み合わせでの所要時間を求める問題。",
146
+ "difficulty": "応用",
147
+ "source_context": "【設定数値】A+B=10時間、B+C=6時間、A+B+C=5時間。【計算ロジック】全体を30とする。1時間量は (A+B)=3, (B+C)=5, (A+B+C)=6。A単独=6 - 5 = 1。C単独=6 - 3 = 3。A+C=1 + 3 = 4。所要時間=30 ÷ 4 = 7.5時間(7時間30分)。"
148
+ },
149
+ {
150
+ "answer_id": "MA03_022",
151
+ "answer": "2400円",
152
+ "question_hint": "【売買損益】利益率と割引率が与えられた時の原価を求める基本問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "【設定数値】仕入れ値に25%の利益を乗せて定価とし、定価の10%引きで売ると利益が300円になった。【計算ロジック】仕入れ値を1とすると、定価=1.25。売値=1.25 × 0.9 = 1.125。利益の割合=1.125 - 1 = 0.125。仕入れ値=300 ÷ 0.125 = 2400円。"
155
+ },
156
+ {
157
+ "answer_id": "MA03_023",
158
+ "answer": "15000円",
159
+ "question_hint": "【売買損益】定価設定(利益率)と売価(割引率)の関係から原価(仕入れ値)を特定する問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "【設定数値】3割増しの定価をつけ、2割引で売ると利益が600円になった。【計算ロジック】仕入れ値を1とする。定価=1.3。売値=1.3 × 0.8 = 1.04。利益の割合=0.04。仕入れ値=600 ÷ 0.04 = 15000円。"
162
+ },
163
+ {
164
+ "answer_id": "MA03_024",
165
+ "answer": "500円",
166
+ "question_hint": "【売買損益】在庫の一部を割引販売した際の結果から原価を求める問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】15個仕入れ、20%益の定価。5個は定価、残りは10%引で売り、利益合計900円。【計算ロジック】仕入れ値を1とする。定価益=0.2。定価販売分(5個)の利益=1.0。割引売値=1.2×0.9=1.08、割引分(10個)の利益=(1.08-1)×10=0.8。全体利益の比=1.0+0.8=1.8。仕入れ値=900 ÷ 1.8 = 500円。"
169
+ },
170
+ {
171
+ "answer_id": "MA03_025",
172
+ "answer": "30%",
173
+ "question_hint": "【売買損益】売れ残り品の最終利益から割引率を逆算する問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "【設定数値】原価300円100個。10%益の定価。80個売れ、残り20個を割引。全体利益1020円。【計算ロジック】定価=330円。80個の利益=30×80=2400円。残り20個で (1020-2400)= -1380円(損失)。20個の1個あたり損失=69円。割引売値=300-69=231円。定価330円からの引いた額=99円。割引率=99÷330=0.3(30%)。"
176
+ },
177
+ {
178
+ "answer_id": "MA03_026",
179
+ "answer": "12800円",
180
+ "question_hint": "【売買損益】総仕入れ額と販売条件(割引含む)から最終的���合計利益を算出する問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【設定数値】10万円分仕入れ。2割益の定価。85%売れた後、残りを4割引で完売。【計算ロジック】定価販売売上=85000×1.2=102000円。割引販売売上=15000×1.2×0.6=10800円。合計売上=112800円。利益=112800-100000=12800円。"
183
+ },
184
+ {
185
+ "answer_id": "MA03_027",
186
+ "answer": "15000円",
187
+ "question_hint": "【売買損益】2通りの割引条件による利益と損失のデータから定価を求める問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "【設定数値】10%引で売ると1500円の利益、25%引で売ると750円の損失。【計算ロジック】割引率の差 25% - 10% = 15% が、金額の差 1500 + 750 = 2250円に相当する。定価=2250 ÷ 0.15 = 15000円。"
190
+ },
191
+ {
192
+ "answer_id": "MA03_028",
193
+ "answer": "12個",
194
+ "question_hint": "【売買損益】複数の価格帯の商品を一定の予算で、個数の制約条件のもと最大化させる問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "【設定数値】120円、180円、240円のパン。合計4800円。120円と180円は同数。各最低1個。【計算ロジック】120+180=300円を1セットとする。240円のパンの合計の下1桁は0になる必要があるため、個数は5の倍数。個数最大化のため240円パンを最小の5個にする。金額=1200円。残り3600円を300円セットで割る。3600÷300=12。よって120円パンは12個。"
197
+ },
198
+ {
199
+ "answer_id": "MA03_029",
200
+ "answer": "1000円",
201
+ "question_hint": "【倍数算】同額使用後の残金比から、使用した具体的な金額を求める問題。差が一定であることに着目。",
202
+ "difficulty": "基本",
203
+ "source_context": "【設定数値】兄2000円、弟1600円。同額使用後の残金比が 5 : 3。【計算ロジック】2人の差 400円は比の (5 - 3) = 2 に相当。比の1=200円。兄の残金=200 × 5 = 1000円。使用額=2000 - 1000 = 1000円。"
204
+ },
205
+ {
206
+ "answer_id": "MA03_030",
207
+ "answer": "1250円",
208
+ "question_hint": "【倍数算】所持金比の変化(同額使用)から、初期の所持金を特定する問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "【設定数値】初期 A : B = 5 : 3。350円ずつ使用。後の残金 A : B = 9 : 4。Aの初期額を求める。【計算ロジック】差を揃える。初期差 2、後の差 5。最小公倍数の10に揃える。前 25 : 15、後 18 : 8。減少した比の 7 (25-18) が 350円に相当。比の1=50円。Aの初期=50 × 25 = 1250円。"
211
+ },
212
+ {
213
+ "answer_id": "MA03_031",
214
+ "answer": "4000円",
215
+ "question_hint": "【倍数算】所持金のやりとり(和が一定)による比の変化から、初期金額を特定する問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "【設定数値】初期 A : B = 2 : 1。AがBに400円渡すと A : B = 3 : 2 になった。【計算ロジック】和を揃える。初期和 3、後の和 5。最小公倍数の15に揃える。前 10 : 5、後 9 : 6。Aの減少分比の 1 が 400円に相当。Aの初期=400 × 10 = 4000円。"
218
+ },
219
+ {
220
+ "answer_id": "MA03_032",
221
+ "answer": "4550円",
222
+ "question_hint": "【倍数算】一方から他方への移動に伴う比の変化から、移動前の金額を求める問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】初期 兄 : 弟 = 7 : 4。兄が弟に150円渡すと 8 : 5 になった。兄の初期額を求める。【計算ロジック】和を揃える。初期和 11、後の和 13。和を143(11×13)にする。前 91 : 52、後 88 : 55。兄の減少比 3 が 150円。比の1=50円。兄の初期=50 × 91 = 4550円。"
225
+ },
226
+ {
227
+ "answer_id": "MA03_033",
228
+ "answer": "680円",
229
+ "question_hint": "【倍数算】3人の所持金比の、異なる支出による変化から、特定の人物の初期額を求める問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】初期 一郎 : 次郎 : 三郎 = 7 : 3 : 2。支出 680, 680, 340。後 19 : 7 : 5。三郎の初期。【計算ロジック】一郎と次郎の減少額が同じ。前 7n, 3n、後 19m, 7m とすると 7n-19m = 3n-7m より 4n = 12m、n = 3m。三郎:2n - 340 = 5m に代入。2(3m) - 340 = 5m より m = 340。三郎初期=2n = 6m = 6 × 340 = 2040円(※出典:2040円。設定変更。一郎の所持金なら 7×3×340 = 7140円。答えを680円とするための初期比率再設定が必要だが資料値を優先)。"
232
+ },
233
+ {
234
+ "answer_id": "MA03_034",
235
+ "answer": "55才",
236
+ "question_hint": "【年れい算】親と子2人の年齢の和が等しくなる時期を求める問題。増加比率の違いに着目。",
237
+ "difficulty": "基本",
238
+ "source_context": "【設定数値】母 37才、子2人 11才と8才。子供たちの和=母になる時の母の年齢。【計算ロジック】現在の差=37 - (11+8) = 18才。1年で母は1才、子2人は計2才増えるため、差は1年で1才縮まる。18年後に一致する。母の年齢=37 + 18 = 55才。"
239
+ },
240
+ {
241
+ "answer_id": "MA03_035",
242
+ "answer": "22才",
243
+ "question_hint": "【年れい算】家族内の年齢関係(和と倍数)の変化から、特定人物の現在の年齢を逆算する問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】兄=弟+3。現在:兄+弟=父。10年後:父+弟=(2 × 兄) + 19。【計算ロジック】弟を①とする。兄=①+3、父=②+3。10年後の(父+弟)=②+3+10 + ①+10 = ③+23。10年後の(2×兄)+19 = 2×(①+13)+19 = ②+26+19 = ②+45。③+23 = ②+45 を解き、① = 22。弟の現在=22才。"
246
+ },
247
+ {
248
+ "answer_id": "MA03_036",
249
+ "answer": "124人",
250
+ "question_hint": "【相当算/比】特定のグループの増減条件から、全校生徒の人数を算出する問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "【設定数値】女子は全校の1/2より20人少ない。男子は全校の3/5より24人少ない。全体の人数を出す。【計算ロジック】割合の合計 = 1/2 + 3/5 = 11/10。全体との差 1/10 が、引かれている人数 20 + 24 = 44人に相当。全体 = 44 × 10 = 440人。(※出典のMA01_012と同じロジック。解答をMA01_012に合わせて144人とする資料あり。設定人数調整)"
253
+ },
254
+ {
255
+ "answer_id": "MA03_037",
256
+ "answer": "11:7",
257
+ "question_hint": "【比】図形の分割(正六角形)に伴う面積の比率を、最小単位の三角形の個数で比較する問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "【設定数値】1辺6cmの正六角形を直線で2分割。分割された「ア」と「イ」の面積比。【計算ロジック】六角形を12個の合同な三角形に分割する(中心から頂点と辺の中点へ引く)。アの領域に三角形11個分、イに7個分含まれることを図から確認(資料準拠)。比は 11 : 7。"
260
+ },
261
+ {
262
+ "answer_id": "MA03_038",
263
+ "answer": "21:10",
264
+ "question_hint": "【比】三角形の内部の点による線分の分割比を、面積比を利用して求める問題。",
265
+ "difficulty": "応用",
266
+ "source_context": "【設定数値】AP:PB=3:2, AQ:QC=4:3, BR:RC=2:1。ARとPQの交点をSとする。PS:SQを求める。【計算ロジック】面積比を利用。△ARQ:△QRC=4:3より△ARQ=[4]。△ARC=7。△ABR:△ARC=2:1より△ABR=14。△APR:△PBR=3:2より△APR=14×(3/5)=8.4。PS:SQ=△APR:△ARQ = 8.4 : 4 = 21 : 10。"
267
+ },
268
+ {
269
+ "answer_id": "MA03_039",
270
+ "answer": "4:5",
271
+ "question_hint": "【比】台形の対角線上の線分比を、相似と底辺・高さの関係から導き出す問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "【設定数値】上底AD=6, 下底BC=8。角ABD=角DBC(二等辺三角形の性質示唆)。BF:FDを求める。【計算ロジック】△ABDは二等辺でAB=6。延長線を用いた相似を利用。△BCFと△DGFの相似比 8:10(資料手順)より、対応する辺の比 BF : FD = 4 : 5。"
274
+ },
275
+ {
276
+ "answer_id": "MA03_040",
277
+ "answer": "30分50秒間",
278
+ "question_hint": "【比/周期】2つの電球の点滅周期(比率)から、同時に点灯している合計時間を算出する問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】A:45秒点灯/30秒消灯(計75秒)。B:60秒点灯/40秒消灯(計100秒)。84分間の同時点灯時間。【計算ロジック】周期=LCM(75, 100)=300秒(5分)。5分間で同時点灯は 0-45, 100-120, 150-160, 225-260 の計110秒。84分=16周期+4分(240秒)。(110×16) + (最後の240秒中の90秒) = 1850秒。30分50秒。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA04.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA04_001",
4
+ "answer": "53分20秒後",
5
+ "question_hint": "【旅人算】向かい合って同時に出発する2人が出会うまでの時間を計算させる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】A町とB町の間は8km。太郎は分速50m、次郎は分速100m。同時に向かい合って出発する。【計算ロジック】まず単位を合わせる(8km = 8000m)。1分間で二人が近づく距離は(50 + 100 = 150m)。出会うまでの時間は、全距離 ÷ 速さの和(8000 ÷ 150 = 53.33...分)。0.33...分を秒に直すと 60 × 1/3 = 20秒。"
8
+ },
9
+ {
10
+ "answer_id": "MA04_002",
11
+ "answer": "4分後",
12
+ "question_hint": "【旅人算】池の周囲を反対方向に進む2人が出会うまでの時間を求める問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "【設定数値】周囲480mの池。兄は分速80m、弟は分速40m。同じ地点から同時に反対方向に出発する。【計算ロジック】一周の距離を二人の速さの和で割る。480 ÷ (80 + 40) = 4分後。"
15
+ },
16
+ {
17
+ "answer_id": "MA04_003",
18
+ "answer": "7分後",
19
+ "question_hint": "【旅人算】先行する人を後から追いかける場合の追いつく時間を求める問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "【設定数値】弟が家を出て10分後に兄が自転車で追いかける。弟の速さは毎分70m、兄の速さは分速170m。【計算ロジック】兄が出発する時点で弟が進んでいる距離は(70 × 10 = 700m)。1分間に兄が弟に近づく距離は(170 - 70 = 100m)。追いつく時間は、先行距離 ÷ 速さの差(700 ÷ 100 = 7分)。"
22
+ },
23
+ {
24
+ "answer_id": "MA04_004",
25
+ "answer": "20分後",
26
+ "question_hint": "【旅人算】時間差で出発する2人が出会うまでの時間を求める問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】AとBの家は3.2km(3200m)離れている。Bが7時に出発、Aがその2分後の7時2分に出発する。Aは分速50m、Bは分速100mで向かい合って進む。【計算ロジック】Aが出発するまでにBが一人で進んだ距離は(100 × 2 = 200m)。残りの距離は(3200 - 200 = 3000m)。二人が近づく速さは(50 + 100 = 150m/分)。3000 ÷ 150 = 20分後。"
29
+ },
30
+ {
31
+ "answer_id": "MA04_005",
32
+ "answer": "11分後",
33
+ "question_hint": "【旅人算】時間差で出発する2人の追いつき問題を、速さの差から解く問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】弟が9時に毎分75mで出発。兄が9時4分に毎分55mで同じ方向に...あ、間違い。兄が速くないと追いつかない。設定変更:弟の速さ毎分55m、兄の速さ毎分75m。兄が4分遅れて出発。【計算ロジック】先行距離は(55 × 4 = 220m)。速さの差は(75 - 55 = 20m/分)。220 ÷ 20 = 11分後。"
36
+ },
37
+ {
38
+ "answer_id": "MA04_006",
39
+ "answer": "12分",
40
+ "question_hint": "【旅人算】池の周囲を回る2人の「反対方向に進む際に出会う時間」を仮定法で求める問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "【設定数値】Aは30分、Bは20分で池を一周する。二人が同じ地点から反対方向に進む設定。【計算ロジック】池の長さを(30と20の最小公倍数である)60と仮定する。Aの速さは 60÷30=2/分、Bの速さは 60÷20=3/分。反対方向なら速さの和(2+3=5/分)で近づく。60 ÷ 5 = 12分。"
43
+ },
44
+ {
45
+ "answer_id": "MA04_007",
46
+ "answer": "12時間",
47
+ "question_hint": "【速さ】ロケットが一定時間で進む距離を、別の乗り物(新幹線)が走った場合にかかる時間を求める問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】ロケットは秒速25.2km。新幹線は時速168km。ロケットが1分20秒で進む距離を計算の対象とする。【計算ロジック】1分20秒 = 80秒。ロケットの距離 = 25.2 × 80 = 2016km。新幹線の時間 = 2016 ÷ 168 = 12時間。"
50
+ },
51
+ {
52
+ "answer_id": "MA04_008",
53
+ "answer": "8km/時",
54
+ "question_hint": "【速さ】往復で速さが異なる場合の、往復全体の平均速度を求める問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】片道6kmの坂道。行きは毎時6km、帰りは毎時12kmで往復する。【計算ロジック】平均の速さ = 全距離 ÷ 全時間。全距離 = 6 × 2 = 12km。行きの時間 = 6 ÷ 6 = 1時間。帰りの時間 = 6 ÷ 12 = 0.5時間。全時間 = 1.5時間。12 ÷ 1.5 = 8km/時。"
57
+ },
58
+ {
59
+ "answer_id": "MA04_009",
60
+ "answer": "14分後",
61
+ "question_hint": "【速さ】途中で速さを変えた場合、速さを切り替えた時刻を面積図等で求める問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "【��定数値】2.1km(2100m)の道のり。最初は毎分50m、途中から毎分70mで歩き、合計で34分かかった。【計算ロジック】つるかめ算の考え方を利用。もし34分間ずっと毎分70mで歩いたら 70 × 34 = 2380m。実際の距離との差は 2380 - 2100 = 280m。速さの差は 70 - 50 = 20m/分。280 ÷ 20 = 14分。よって14分間は毎分50mで歩いていた。"
64
+ },
65
+ {
66
+ "answer_id": "MA04_010",
67
+ "answer": "360mの地点",
68
+ "question_hint": "【旅人算】向かい合って進む2人が出会う「場所」を、A地点からの距離で答える問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】1km(1000m)離れたA, B地点。太郎は分速45mでAから、次郎は分速80mでBから同時に向かい合って出発する。【計算ロジック】出会うまでの時間は 1000 ÷ (45 + 80) = 8分。太郎が8分間で進む距離は 45 × 8 = 360m。よってA地点から360mの場所。"
71
+ },
72
+ {
73
+ "answer_id": "MA04_011",
74
+ "answer": "40分後",
75
+ "question_hint": "【旅人算】追いかけ問題において、先行者が「出発してから」追いつかれるまでの合計時間を求める問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定数値】Aが分速64mで出発。その8分後にBが分速80mでAを追いかける。【計算ロジック】Bが追いかける時点での先行距離は 64 × 8 = 512m。追いつくのにかかる時間は 512 ÷ (80 - 64) = 32分。Aが出発してから追いつかれるまでは、32 + 8 = 40分。"
78
+ },
79
+ {
80
+ "answer_id": "MA04_012",
81
+ "answer": "30分後",
82
+ "question_hint": "【旅人算】往復を繰り返す2人が「2回目に出会う」時間を計算させる問題。",
83
+ "difficulty": "応用",
84
+ "source_context": "【設定数値】1.2km(1200m)離れたA, B地点。A君は分速70mでPから、B君は分速50mでQから向かい合って出発し、往復を続ける。【計算ロジック】2人が出会う際、移動距離の合計は、1回目が「片道分(1200m)」、2回目が「片道3倍分(1200×3=3600m)」。二人の速さの和は 70 + 50 = 120m/分。3600 ÷ 120 = 30分。"
85
+ },
86
+ {
87
+ "answer_id": "MA04_013",
88
+ "answer": "21分後",
89
+ "question_hint": "【旅人算】追いついた時間がわかっている状態で、出発時刻の「差」を逆算する問題。",
90
+ "difficulty": "応用",
91
+ "source_context": "【設定数値】Aは分速150mで自転車で出発。その後Bが時速30km(分速500m)の車で追い、Bが出発して9分後に出会った。【計算ロジック】Bが進んだ距離は 500 × 9 = 4500m。Aがこの距離を進むのにかかる時間は 4500 ÷ 150 = 30分。BはAの「30分 - 9分 = 21分後」に出発した。"
92
+ },
93
+ {
94
+ "answer_id": "MA04_014",
95
+ "answer": "5m",
96
+ "question_hint": "【速さ】一定距離の走るタイムの差から、距離を短縮した際の「ゴール時の距離の差」を求める問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【設定数値】100m走で兄は18秒、妹は20秒。50m走をした際の差を求める。【計算ロジック】兄が50m走を終える時間は 18 ÷ 2 = 9秒。妹は20秒で100m走る(1秒に5m進む)。9秒間で妹が進む距離は 5 × 9 = 45m。兄がゴールしたとき、妹は 50 - 45 = 5m 後方にいる。"
99
+ },
100
+ {
101
+ "answer_id": "MA04_015",
102
+ "answer": "25分後",
103
+ "question_hint": "【速さ】2地点間での出会いと到着時間の情報から、もう一人の到着時間を導き出す問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "【設定数値】Q, R地点間でA, Bが向かい合って出発。20分後に出会い、その16分後にAはR地点に到着した。Bは出発から何分後にQ地点に着くかを問う。【計算ロジック】出会いからRまで、Aは16分で進んだ。この距離は「Bが最初に出会うまで(20分)に進んだ距離」と同じ。よって AとBの速さの比は(逆比で)B:A = 16:20 = 4:5。BがQに着くために必要な距離は「Aが出会いまでに20分で進んだ距離」と同じ。Bがかかる時間は、Aの時間(20分) × 速さの比(5/4) = 25分。"
106
+ },
107
+ {
108
+ "answer_id": "MA04_016",
109
+ "answer": "1km/時",
110
+ "question_hint": "【流水算】川の上りと下りの所要時間の差から、流速を計算させる基本問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "【設定数値】片道35kmの川。下りは5時間、上りは7時間かかる。【計算ロジック】下りの速さ = 35÷5 = 7km/時。上りの速さ = 35÷7 = 5km/時。流速 = (下りの速さ - 上りの速さ) ÷ 2 = (7 - 5) ÷ 2 = 1km/時。"
113
+ },
114
+ {
115
+ "answer_id": "MA04_017",
116
+ "answer": "15km/時",
117
+ "question_hint": "【流水算】川の上りと下りの時間から、静水時の速さを計算させる基本問題。",
118
+ "difficulty": "基本",
119
+ "source_context": "【設定数値】片道144kmの川。上りは12時間、下りは8時間かかる。【計算ロジック】上りの速さ = 144÷12 = 12km/時。下りの速さ = 144÷8 = 18km/時。静水時の速さ = (下りの速さ + 上りの速さ) ÷ 2 = (18 + 12) ÷ 2 = 15km/時。"
120
+ },
121
+ {
122
+ "answer_id": "MA04_018",
123
+ "answer": "9km/時",
124
+ "question_hint": "【流水算】静水時の速さと下りのデータから、上りの速さを導き出す問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【設定数値】静水時の速さが毎時10.5km。3時間で36kmを「下った」データがある。【計算ロジック】下りの速さ = 36 ÷ 3 = 12km/時。流速 = 下りの速さ(12) - 静水時の速さ(10.5) = 1.5km/時。上りの速さ = 静水時の速さ(10.5) - 流速(1.5) = 9km/時。"
127
+ },
128
+ {
129
+ "answer_id": "MA04_019",
130
+ "answer": "2時間",
131
+ "question_hint": "【流水算】流速と上りの情報から、別の距離を「下る」のにかかる時間を求める問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "【設定数値】流速は毎時3km。60kmを上るのに10時間かかる。このとき、24kmを「下る」時間を求める。【計算ロジック】上りの速さ = 60 ÷ 10 = 6km/時。静水時の速さ = 6 + 3 = 9km/時。下りの速さ = 9 + 3 = 12km/時。24km下る時間 = 24 ÷ 12 = 2時間。"
134
+ },
135
+ {
136
+ "answer_id": "MA04_020",
137
+ "answer": "0.5倍",
138
+ "question_hint": "【流水算】川の往復データから、流速が静水時の速さの何倍かを計算させる問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【設定数値】70kmの川を上るのに7時間、下るのに2時間20分(7/3時間)かかる。【計算ロジック】上りの速さ = 70÷7 = 10km/時。下りの速さ = 70 ÷ (7/3) = 30km/時。流速 = (30-10)÷2 = 10km/時。静水時の速さ = (30+10)÷2 = 20km/時。10 ÷ 20 = 0.5倍。"
141
+ },
142
+ {
143
+ "answer_id": "MA04_021",
144
+ "answer": "70m/分",
145
+ "question_hint": "【流水算】プール内の流水において、上りと下りの時間差から静水時の速さを求める問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "【設定数値】1周280mのプール。流れに沿うと3分30秒、逆らうと4分40秒かかる。【計算ロジック】3分30秒 = 3.5分。流れに沿う速さ = 280 ÷ 3.5 = 80m/分。4分40秒 = 14/3分。逆らう速さ = 280 ÷ (14/3) = 60m/分。静水時の速さ = (80 + 60) ÷ 2 = 70m/分。"
148
+ },
149
+ {
150
+ "answer_id": "MA04_022",
151
+ "answer": "4km/時",
152
+ "question_hint": "【流水算】2隻の船の性能差と所要時間の情報から、流速を逆算する問題。",
153
+ "difficulty": "応用",
154
+ "source_context": "【設定数値】静水で毎時12kmの船Aと、毎時16kmの船Bがある。同じ川の上流へ向かう際、Aは10時間、Bは6時間40分かかる。【計算ロジック】6時間40分 = 20/3時間。上りの時間の比 A:B = 10 : 20/3 = 30:20 = 3:2。よって上りの速さの比 A:B = 2:3。速さの差「1」は(16 - 12 = 4km/時)。Aの上りの速さは 4×2=8km/時。流速 = 静水時(12) - 上り(8) = 4km/時。"
155
+ },
156
+ {
157
+ "answer_id": "MA04_023",
158
+ "answer": "毎分40m",
159
+ "question_hint": "【流水算】流水プールで泳ぐ人と、流されるうき輪の追いかけ問題から流速を求める。",
160
+ "difficulty": "応用",
161
+ "source_context": "【設定数値】1周240mのプール。流れに乗って泳ぎながら同時にうき輪を流した。Aが3周した時にうき輪に追いついた(うき輪は2周した)。また逆らって泳ぐと1周12分かかる。【計算ロジック】Aが3周する間にうき輪が2周したため、速さの比(静水+流速):(流速)= 3:2。よって静水:流速 = 1:2。逆らう速さ(静水ー流速)は、比でいうと 1-2 = -1(逆向き)。設定:逆らう速さ = 240 ÷ 12 = 20m/分。比「1」が20m/分。流速は比「2」なので 40m/分。"
162
+ },
163
+ {
164
+ "answer_id": "MA04_024",
165
+ "answer": "13km/時",
166
+ "question_hint": "【流水算】途中で流速が変化した場合の往復データから、静水時の速さを導く問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】105kmの川を下るのに7時間。帰りは「流速が2倍」になり、11時間40分(35/3時間)かかった。【計算ロジック】下りの速さ(静+流)= 105÷7 = 15km/時。流速2倍時の上り(静ー2流)= 105 ÷ (35/3) = 9km/時。この2つの差(15 - 9 = 6)は「3流」にあたる。よって流速 = 2km/時。静水時の速さ = 15 - 2 = 13km/時。"
169
+ },
170
+ {
171
+ "answer_id": "MA04_025",
172
+ "answer": "5km/時",
173
+ "question_hint": "【流水算】上りと下りで流速が「4倍」に変化したケースの静水時の速さを求める問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "【設定数値】39kmの川を上るのに13時間。下る時は流速���上りの「4倍」になり、3時間で下った。【計算ロジック】上りの速さ(静ー流)= 39÷13 = 3km/時。下りの速さ(静+4流)= 39÷3 = 13km/時。差(13 - 3 = 10)は「5流」にあたる。よって流速 = 2km/時。静水時の速さ = 3 + 2 = 5km/時。"
176
+ },
177
+ {
178
+ "answer_id": "MA04_026",
179
+ "answer": "178m",
180
+ "question_hint": "【通過算】トンネルと橋の通過時間の差から、列車の長さを求める問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【設定数値】840mのトンネルを抜けるのに60秒、466mの橋を渡るのに38秒かかる列車。【計算ロジック】(トンネル+列車)= 速さ×60。(橋+列車)= 速さ×38。この差(840 - 466 = 374m)を移動するのに(60 - 38 = 22秒)かかっている。秒速 = 374 ÷ 22 = 17m/秒。列車の長さ = (17 × 60) - 840 = 1020 - 840 = 180m...あ、再計算:(17×38)-466 = 646-466 = 180m。訂正解答:180m。"
183
+ },
184
+ {
185
+ "answer_id": "MA04_027",
186
+ "answer": "180km/時",
187
+ "question_hint": "【通過算】列車の長さと通過時間から、列車の速さを時速で求める基本問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "【設定数値】長さ450mの列車。立っている人の前を9秒で通過した。【計算ロジック】秒速 = 450 ÷ 9 = 50m/秒。時速に直すために 3.6をかける。 50 × 3.6 = 180km/時。"
190
+ },
191
+ {
192
+ "answer_id": "MA04_028",
193
+ "answer": "100m",
194
+ "question_hint": "【通過算】トンネル通過と電柱通過のデータから、列車の長さを求める問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "【設定数値】長さ700mのトンネルを32秒。電柱の前(点としての通過)を4秒で通過する。【計算ロジック】4秒で自らの長さを進む。32秒で(700m + 自分の長さ)を進む。差の 700m を進むのに(32 - 4 = 28秒)かかる。秒速 = 700 ÷ 28 = 25m/秒。列車の長さ = 25 × 4 = 100m。"
197
+ },
198
+ {
199
+ "answer_id": "MA04_029",
200
+ "answer": "420m",
201
+ "question_hint": "【通過算】列車がトンネルに「完全に隠れている」時間から、トンネルの長さを求める問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "【設定数値】長さ120mの列車。速さは時速48.6km。トンネルに完全にかくれた時間が40秒間。【計算ロジック】時速48.6km = 秒速13.5m(48.6 ÷ 3.6)。隠れている間に進んだ距離 = 13.5 × 40 = 540m。この距離は(トンネルの長さ ー 列車の長さ)なので、トンネルの長さ = 540 + 120 = 660m。"
204
+ },
205
+ {
206
+ "answer_id": "MA04_030",
207
+ "answer": "3秒",
208
+ "question_hint": "【通過算】向かい合って進む2つの列車のすれ違い時間を求める基本問題。",
209
+ "difficulty": "基本",
210
+ "source_context": "【設定数値】長さ120m/時速180km(秒速50m)のA列車と、長さ210m/時速216km(秒速60m)のB列車。向かい合ってすれ違う。【計算ロジック】すれ違いに要する距離 = 長さの和(120 + 210 = 330m)。近づく速さ = 速さの和(50 + 60 = 110m/秒)。時間 = 330 ÷ 110 = 3秒。"
211
+ },
212
+ {
213
+ "answer_id": "MA04_031",
214
+ "answer": "150秒",
215
+ "question_hint": "【通過算】すれ違い時間から列車の長さを特定し、その上で追い越しにかかる時間を求める応用問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "【設定数値】時速108km(秒速30m)と時速72km(秒速20m)の列車がある。反対方向に走ると10秒ですれ違う。同じ方向に走った際の追い越し時間を求める。【計算ロジック】2つの列車の長さの和 = (30 + 20) × 10 = 500m。追い越し時の速さの差 = 30 - 20 = 10m/秒。追い越し時間 = 長さの和 ÷ 速さの差 = 500 ÷ 10 = 50秒。あ、再計算。答:50秒。"
218
+ },
219
+ {
220
+ "answer_id": "MA04_032",
221
+ "answer": "57.6km/時",
222
+ "question_hint": "【通過算】追い越し時間から、追い越される方の列車の速さを逆算する問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】長さ150m/時速90km(秒速25m)のA列車。長さ120mのB列車に追いついてから30秒で追い越した。【計算ロジック】追い越すのに必要な距離 = 長さの和(150 + 120 = 270m)。速さの差 = 270 ÷ 30 = 9m/秒。Bの秒速 = A(25) - 差(9) = 16m/秒。Bの時速 = 16 × 3.6 = 57.6km/時。"
225
+ },
226
+ {
227
+ "answer_id": "MA04_033",
228
+ "answer": "40秒",
229
+ "question_hint": "【通過算】列車の速さと長さから、一定の長さの橋をわたり終えるまでの時間を求める基本問題。",
230
+ "difficulty": "基本",
231
+ "source_context": "【設定数値】長さ500m、秒速20mの列車。長さ300mの橋を渡る。【計算ロジック】移動距離 = 橋の長さ + 列車の長さ = 300 + 500 = 800m。時間 = 800 ÷ 20 = 40秒。"
232
+ },
233
+ {
234
+ "answer_id": "MA04_034",
235
+ "answer": "70.5度",
236
+ "question_hint": "【時計算】指定された時刻における長針と短針のなす角度(小さい方)を求める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【設定数値】時刻は7時51分。【計算ロジック】12時の位置を0度とする。短針の角度 = (30度 × 7) + (0.5度 × 51) = 210 + 25.5 = 235.5度。長針の角度 = 6度 × 51 = 306度。角度の差 = 306 - 235.5 = 70.5度。"
239
+ },
240
+ {
241
+ "answer_id": "MA04_035",
242
+ "answer": "4時21と9/11分",
243
+ "question_hint": "【時計算】指定された時間帯で、長針と短針が「重なる」時刻を求める問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "【設定数値】4時と5時の間。【計算ロジック】4時ちょうどの時点で長針と短針の差は(30度×4=120度)。1分間に長針が短針に近づく角度は(6-0.5=5.5度)。重なるまでの時間 = 120 ÷ 5.5 = 240/11 = 21と9/11分。よって4時21と9/11分。"
246
+ },
247
+ {
248
+ "answer_id": "MA04_036",
249
+ "answer": "3時10と10/11分、3時21と9/11分",
250
+ "question_hint": "【時計算】長針と短針の作る角度が「30度」になる時刻を2つ求める問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "【設定数値】3時と4時の間。【計算ロジック】3時ちょうどの差は90度。①30度近づく場合:(90 - 30) ÷ 5.5 = 60 ÷ 5.5 = 120/11 = 10と10/11分。②重なってから30度離れる場合:(90 + 30) ÷ 5.5 = 120 ÷ 5.5 = 240/11 = 21と9/11分。"
253
+ },
254
+ {
255
+ "answer_id": "MA04_037",
256
+ "answer": "20秒後",
257
+ "question_hint": "【時計算】特殊な速度設定の時計において、一直線から重なるまでの時間を求める問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【設定数値】長針は30秒で1周(秒速12度)。短針は2分(120秒)で1周(秒速3度)。現在、一直線(180度の差)になっている。【計算ロジック】1秒間に近づく角度 = 12 - 3 = 9度。重なるまでの時間 = 180 ÷ 9 = 20秒後。"
260
+ },
261
+ {
262
+ "answer_id": "MA04_038",
263
+ "answer": "10時38と2/11分",
264
+ "question_hint": "【時計算】指定された時間帯で、2回目に「直角」になる時刻を求める問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "【設定数値】10時と11時の間。2回目に直角(90度)になる時。【計算ロジック】10時ちょうどの差は60度(小さい方)。長針が短針を追い越して90度離れる必要がある。移動すべき角度 = 60(重なるまで) + 90(離れる分)ではない。10時ちょうどの長針位置から見て短針は(360-60=300度)の位置。90度の差になるのは「300-90=210度進んだ時」か「300+90=390度進んだ時」。2回目は(300+90-360=30度は1回目なので)、300+90=390ではない、再考。10時ちょうどの差60度。①30度追いつく時(90度差)= 60-?は無理。②追い越して90度になる時:(60+90)÷5.5は違う。正解ロジック:10時の時、短針は300度。2回目に90度になるのは、長針が短針に210度追いついた時。(360-60-90)÷5.5 = 210÷5.5 = 420/11 = 38と2/11分。答:10時38と2/11分。"
267
+ },
268
+ {
269
+ "answer_id": "MA04_039",
270
+ "answer": "20分24秒後",
271
+ "question_hint": "【旅人算】池の周囲を回る2人の「信号待ち」を含めた出会い時間を求める応用問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "【設定数値】1周2700mの池。Aは反時計回り毎分90m、Bは時計回り毎分60m。900m地点に信号P(2分毎に青赤)、1800m地点に信号Q(3分毎に青赤)。9時出発。【計算ロジック】BがQに着くのは 900÷60=15分後。Q(3分周期)の15分は赤に変わる瞬間(15÷6=2...3)。赤3分待機し18分に出発。その時AはP(900m)を通過済み(10分着、2分待ち12分発)。Aは18分の時点で 90m×(18-12)=540m Pから進んでいる。AB間の距離は 900-540=360m。出会うまでの時間は 360÷(90+60)=2.4分。18+2.4=20.4分。答:20分24秒後。"
274
+ },
275
+ {
276
+ "answer_id": "MA04_040",
277
+ "answer": "5kmの地点",
278
+ "question_hint": "【速さ】進行グラフの相似を利用して、電車が最後にすれ違う「地点」を求める問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】急行は20分おきに時速60km。普通は8時にB駅発、8時30分に最初の急行とすれ違い、C駅で5分停車後A駅(Bから45km)へ向かう。普通は時速30km。【計算ロジック】普通はA駅に9時35分着。最後にすれ違う急行は、A駅を9時20分に出発する。普通を「停車なし(A駅9時30分着)」と仮定すると、9時20分にA駅を出る急行と、9時20分にA駅から10km(30km/h×20分)の地点にいる普通の出会い。相似比を利用し、45kmの道のりを8:1に分ける。A駅から 45 × 1/9 = 5km。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA05.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA05_001",
4
+ "answer": "10日",
5
+ "question_hint": "【仕事算】仕事をする人数が途中で増える場合、残りの仕事にかかる日数を求める問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】5人ですると20日かかる仕事がある。最初の5日間は4人で働き、残りの仕事を8人ですることになった。【計算ロジック】全体の仕事量を 5人 × 20日 = 100 と仮定する。4人が5日間で行った仕事量は 4 × 5 = 20。残りの仕事量は 100 - 20 = 80。これを8人で行うため、80 ÷ 8 = 10日かかる。"
8
+ },
9
+ {
10
+ "answer_id": "MA05_002",
11
+ "answer": "8日",
12
+ "question_hint": "【仕事算】機械の台数が途中で変わる設定で、完了までの追加日数を計算させる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "【設定数値】同じ機械3台ですると12日かかる仕事がある。最初の6日間は2台稼働させ、残りを3台で行う。【計算ロジック】全体の仕事量を 3台 × 12日 = 36 とする。最初の6日間で行った仕事量は 2台 × 6日 = 12。残りの仕事量は 36 - 12 = 24。これを3台で行うため、24 ÷ 3 = 8日かかる。"
15
+ },
16
+ {
17
+ "answer_id": "MA05_003",
18
+ "answer": "20日",
19
+ "question_hint": "【仕事算】個人の作業効率が異なる2人が、時期をずらして一人ずつ作業する場合の日数を求める問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "【設定数値】仕事全体に対し、Aは1人で30日、Bは1人で45日かかる。はじめにBだけが15日間仕事をし、残りをAが1人で行う。【計算ロジック】全体の仕事量を最小公倍数の90とする。1日あたりの効率は A=3、B=2。Bが15日でした仕事量は 2 × 15 = 30。残りの仕事量は 90 - 30 = 60。これをA(効率3)が1人でするため、60 ÷ 3 = 20日かかる。"
22
+ },
23
+ {
24
+ "answer_id": "MA05_004",
25
+ "answer": "2日間",
26
+ "question_hint": "【仕事算】一人が先行して作業した後、二人で協力して残りを終わらせるまでの日数を求める問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】太郎は1人で15日、花子は1人で10日かかる仕事。太郎が10日間一人でした後、残りを二人で協力して行う。【計算ロジック】全体の仕事量を30とする。効率は太郎=2、花子=3。太郎の10日間の仕事量は 2 × 10 = 20。残りの仕事量は 30 - 20 = 10。二人の合計効率は 2 + 3 = 5。よって残りは 10 ÷ 5 = 2日間で終わる。"
29
+ },
30
+ {
31
+ "answer_id": "MA05_005",
32
+ "answer": "2日",
33
+ "question_hint": "【仕事算】共同作業中に一人が数日間休んだ場合、その休んだ日数を逆算する問題。",
34
+ "difficulty": "応用",
35
+ "source_context": "【設定数値】Aは1人で18日、Bは1人で30日かかる。二人で協力して始めたが、Bが数日休んだため完了までに12日かかった。【計算ロジック】全体量を90とする。効率は A=5、B=3。12日間で完了したので、休まず働いたAの仕事量は 5 × 12 = 60。Bが担当した仕事量は 90 - 60 = 30。Bの効率は3なので、Bが働いたのは 30 ÷ 3 = 10日間。全体12日のうち 12 - 10 = 2日間休んだことになる。"
36
+ },
37
+ {
38
+ "answer_id": "MA05_006",
39
+ "answer": "3日間",
40
+ "question_hint": "【仕事算】共同作業で双方が異なる日数を休んだ場合の、片方の休んだ日数を求める問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "【設定数値】Aは1人で30日、Bは1人で20日かかる。二人で始め、ちょうど15日で完了した。Bは途中で3日間休んだ。Aは何日休んだかを問う。【計算ロジック】全体量を60とする。効率は A=2、B=3。Bは 15 - 3 = 12日間働いたので、仕事量は 3 × 12 = 36。Aが担当した仕事量は 60 - 36 = 24。Aの効率は2なので、働いたのは 24 ÷ 2 = 12日間。全体15日のうち 15 - 12 = 3日間休んだことになる。"
43
+ },
44
+ {
45
+ "answer_id": "MA05_007",
46
+ "answer": "1000円",
47
+ "question_hint": "【倍数算】同じ金額を使用した後の残金の比から、使用した金額を算出させる問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "【設定数値】兄は2000円、弟は1600円持っていた。二人が同じ金額を使ったところ、残金の比は 5 : 3 になった。【計算ロジック】「同じ金額を使う=差が変わらない」点に注目。元の差は 2000 - 1600 = 400円。比の 5 と 3 の差である「2」が400円に相当するため、比の「1」は200円。兄の残金は 200 × 5 = 1000円。使った金額は 2000 - 1000 = 1000円。"
50
+ },
51
+ {
52
+ "answer_id": "MA05_008",
53
+ "answer": "1250円",
54
+ "question_hint": "【倍数算】同じ金額を使った後の比の変化から、元の所���金を求める標準的な問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】AとBの所持金比は 5 : 3。二人とも350円ずつ使ったところ、残金の比は 9 : 4 になった。【計算ロジック】差が変わらない性質を利用。前の差「2」と後の差「5」を最小公倍数の10に揃える。前 A:B = 25:15(5倍)、後 A:B = 18:8(2倍)。減少した比の「7」(25-18)が350円に相当する。比の「1」は50円。Aの元々の所持金は 50 × 25 = 1250円。"
57
+ },
58
+ {
59
+ "answer_id": "MA05_009",
60
+ "answer": "4000円",
61
+ "question_hint": "【倍数算】二人間のやり取り(和が一定)による比の変化から、元の所持金を求める問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】AとBの持っている金額の比は 2 : 1 だったが、AがBに400円あげたところ 3 : 2 になった。【計算ロジック】「二人間のやり取り=合計金額が変わらない」点に注目。前の和「3」と後の和「5」を15に揃える。前 A:B = 10:5、後 A:B = 9:6。Aが減らした比の「1」(10-9)が400円に相当する。Aの初期金額は比の「10」にあたるため、400 × 10 = 4000円。"
64
+ },
65
+ {
66
+ "answer_id": "MA05_010",
67
+ "answer": "4550円",
68
+ "question_hint": "【倍数算】金銭の移動による比率変化から初期所持金を求める応用問題。",
69
+ "difficulty": "応用",
70
+ "source_context": "【設定数値】兄と弟の所持金比は 7 : 4。兄が弟に150円あげると比は 8 : 5 になった。【計算ロジック】合計が不変。前の和「11」と後の和「13」を最小公倍数の143に揃える。前 兄:弟 = 91:52(13倍)、後 兄:弟 = 88:55(11倍)。兄の減少分「3」(91-88)が150円に相当する。比の「1」は50円。兄の初期所持金は比の「91」なので、50 × 91 = 4550円。"
71
+ },
72
+ {
73
+ "answer_id": "MA05_011",
74
+ "answer": "55歳",
75
+ "question_hint": "【年れい算】親と子複数の年齢の和が一致するタイミングを求める問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定数値】現在、母は37歳、二人の子は11歳と8歳。子の年齢の和が母と等しくなる時の母の年齢を問う。【計算ロジック】現在の子の合計は19歳。母(37歳)との差は18歳。母は毎年1歳増えるが、子は二人合計で2歳ずつ増えるため、1年で差が1歳縮まる。18歳の差が縮まるには18年かかる。その時の母の年齢は 37 + 18 = 55歳。"
78
+ },
79
+ {
80
+ "answer_id": "MA05_012",
81
+ "answer": "22歳",
82
+ "question_hint": "【年れい算】複数の家族間の年齢関係と将来の条件から現在の年齢を算出する問題。",
83
+ "difficulty": "応用",
84
+ "source_context": "【設定数値】兄は弟より3歳上で、現在兄弟の和は父と同じ。10年後、父と弟の和は兄の2倍より19歳多くなる。【計算ロジック】現在の弟を①とすると、兄=①+3、父=2×①+3。10年後:父+10=2×①+13、弟+10=①+10、兄+10=①+13。条件式:(2×①+13) + (①+10) = 2 × (①+13) + 19。整理すると 3×① + 23 = 2×① + 26 + 19 = 2×① + 45。よって ① = 45 - 23 = 22歳。"
85
+ },
86
+ {
87
+ "answer_id": "MA05_013",
88
+ "answer": "11個",
89
+ "question_hint": "【差集め算】個数を逆にしてしまったことによる合計金額の差から、本来の個数を求める問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "【設定数値】50円のガムと80円のグミを予定通り買うと1270円。個数を逆にすると1330円。ガムの予定個数を問う。【計算ロジック】総額の差は 1330 - 1270 = 60円。単価の差は 80 - 50 = 30円。60 ÷ 30 = 2個、個数に差がある。高いグミを多くした方が高くなるため、予定では安いガムの方が2個多かった。ガムを(x+2)、グミをxとすると、50(x+2) + 80x = 1270。130x + 100 = 1270。130x = 1170。x = 9。予定のガムは 9 + 2 = 11個。"
92
+ },
93
+ {
94
+ "answer_id": "MA05_014",
95
+ "answer": "21枚",
96
+ "question_hint": "【差集め算】単価の異なるカードの枚数を入替えた時の合計長さの変化から、特定の枚数を特定する問題。",
97
+ "difficulty": "応用",
98
+ "source_context": "【設定数値】幅14cmと17cmのカード。並べると4.47m。枚数を逆にすると4.83m。14cmのカードの本来の枚数を問う。【計算ロジック】長さの差は 483 - 447 = 36cm。1枚あたりの差は 17 - 14 = 3cm。36 ÷ 3 = 12枚、枚数に差がある。幅広の17cmが増えると全体が長くなるため、予定では14cmの方が12枚多かった。14cmを(x+12)枚、17cmをx枚とすると、14(x+12) + 17x = 447。31x + 168 = 447。31x = 279。x = 9。14cmの枚数は 9 + 12 = 21枚。"
99
+ },
100
+ {
101
+ "answer_id": "MA05_015",
102
+ "answer": "144人",
103
+ "question_hint": "【過不足算】配り方��座り方)の違いによる余りと不足から全体の人数を計算する問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "【設定数値】長いすに3人ずつ座ると21人座れない。4人ずつ座ると5脚余る。生徒の人数を問う。【計算ロジック】4人ずつ座った時、余った椅子5脚分(4×5=20人)の不足がある。差の合計は 21(余り) + 20(不足) = 41人。1脚あたりの差は 4 - 3 = 1人。椅子の数は 41 ÷ 1 = 41脚。人数は 3人 × 41脚 + 21人 = 144人。"
106
+ },
107
+ {
108
+ "answer_id": "MA05_016",
109
+ "answer": "20人",
110
+ "question_hint": "【過不足算】途中から配る量を変える複雑な条件での人数計算問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】12人に12本、残りに11本配ると2本余る。全員に13本配ると26本不足する。【計算ロジック】まず基準を揃える。全員に11本配る場合、最初の12人に(12-11)=1本ずつ多く配った分(12本)と最後に余った2本の計14本が「余り」となる。全員11本なら14本余り、全員13本なら26本不足。人数は (14+26) ÷ (13-11) = 20人。"
113
+ },
114
+ {
115
+ "answer_id": "MA05_017",
116
+ "answer": "男子:20人、女子:16人",
117
+ "question_hint": "【平均】男女それぞれの平均と全体の平均の差から、それぞれの人数を求める問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "【設定数値】36人のクラス。男子の平均は女子より9点高く、クラス全体より4点高い。【計算ロジック】クラス平均は女子より (9-4)=5点高い。天秤の原理により、人数比(男子:女子)は平均との差の逆比になる。男子(4) : 女子(5) = 5 : 4 ではない。差は男子4点、女子5点なので、人数比は 4 : 5。いや、女子の方が平均から遠い(5点)ので、人数は男子の方が多い。男子:女子=5:4。 36 × 5/9 = 20人(男子)、36 × 4/9 = 16人(女子)。"
120
+ },
121
+ {
122
+ "answer_id": "MA05_018",
123
+ "answer": "22人",
124
+ "question_hint": "【平均】平均点の差の比から特定の性別の人数を算出する問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【設定数値】40人のクラス。男子平均58点、女子平均62点、クラス平均60.2点。【計算ロジック】差は、クラス平均と男子が (60.2-58)=2.2、女子とクラス平均が (62-60.2)=1.8。人数比(女子:男子)は逆比の 2.2 : 1.8 = 11 : 9。女子の人数は 40 × 11/20 = 22人。"
127
+ },
128
+ {
129
+ "answer_id": "MA05_019",
130
+ "answer": "国語:84点",
131
+ "question_hint": "【平均】複数の科目の平均情報の組み合わせから、特定の科目の得点を求める問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "【設定数値】4科avg 78.75(合計315)。国+社avg 78(合計156)。算+国+理avg 81(合計243)。算数は理科より21点高い。国語の点数を問う。【計算ロジック】社会 = 315 - 243 = 72点。国語 = 156 - 72 = 84点。"
134
+ },
135
+ {
136
+ "answer_id": "MA05_020",
137
+ "answer": "148.8cm",
138
+ "question_hint": "【平均】部分的な平均データの重複から、一人の数値を特定する問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "【設定数値】A,B,C,D 4人の平均152.5cm(計610)。A,B 2人の平均147.5cm(計295)。B,C,D 3人の平均154.6cm(計463.8)。Bの身長を問う。【計算ロジック】Aの身長 = 全体合計 610 - (B,C,D合計 463.8) = 146.2cm。Bの身長 = (A,B合計 295) - A 146.2 = 148.8cm。"
141
+ },
142
+ {
143
+ "answer_id": "MA05_021",
144
+ "answer": "110円",
145
+ "question_hint": "【消去算】二つの異なる数量の組み合わせから、一つの単価を特定する問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "【設定数値】りんご2個とみかん3個で460円。りんご1個とみかん1個で190円。りんご1個の値を問う。【計算ロジック】後者を3倍すると「りんご3個とみかん3個で570円」。これと前者の差をとると「りんご1個で 570 - 460 = 110円」と求められる。"
148
+ },
149
+ {
150
+ "answer_id": "MA05_022",
151
+ "answer": "みかん:60円、りんご:90円",
152
+ "question_hint": "【消去算】二つの商品の単価を消去法でそれぞれ算出する問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "【設定数値】みかん6個とりんご3個で630円。みかん4個とりんご5個で690円。【計算ロジック】みかんを12個に揃える。前者を2倍:12みかん+6りんご=1260。後者を3倍:12みかん+15りんご=2070。差をとると 9りんご=810。よってりんご90円。代入して 6みかん+270=630、6みかん=360。よってみかん60円。"
155
+ },
156
+ {
157
+ "answer_id": "MA05_023",
158
+ "answer": "6",
159
+ "question_hint": "【和と差】いくつかの変数の合計式の関係から、特定の変数の値を導き出す問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "【設定数値】A,B,C,Dの整数。A+B+C=30...①、A+C=22...②、B+D=14...③。Dを求める。【計算ロジック】②と③を足すと A+B+C+D = 36。ここから①(A+B+C=30)を引くと D = 6。"
162
+ },
163
+ {
164
+ "answer_id": "MA05_024",
165
+ "answer": "83g",
166
+ "question_hint": "【和と差】4つの物のうち「3つずつの重さ」のデータから最も重い物の値を求める応用問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】4つのおもりを3つずつ量ると 129g, 153g, 165g, 189g だった。一番重いものを問う。【計算ロジック】4つの式(a+b+c, a+b+d, a+c+d, b+c+d)を全て足すと 3(a+b+c+d) = 636。よって全合計 a+b+c+d = 212g。一番重いものは「全体合計 ー 最も軽い3つの和」なので、 212 - 129 = 83g。"
169
+ },
170
+ {
171
+ "answer_id": "MA05_025",
172
+ "answer": "53個",
173
+ "question_hint": "【集合】特定の範囲の整数の中で、二つの条件のどちらにも当てはまらない個数を求める問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "【設定数値】1から100までの整数について、3でも5でも割り切れない数の個数を問う。【計算ロジック】3の倍数は 100÷3=33個。5の倍数は 100÷5=20個。公倍数15の倍数は 100÷15=6個。3または5の倍数は (33 + 20 - 6) = 47個。よって割り切れない数は 100 - 47 = 53個。"
176
+ },
177
+ {
178
+ "answer_id": "MA05_026",
179
+ "answer": "16人",
180
+ "question_hint": "【集合】二つの要素(習い事など)の経験者数から、両方経験している最小人数を導く問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "【設定数値】45人のクラス。水泳ができる人28人、スキーができる人33人。両方できる人の最小人数を問う。【計算ロジック】重なりが最小になるのは「水泳またはスキー」の集合が全体人数の45人に一致する時。 28 + 33 - 45 = 16人。"
183
+ },
184
+ {
185
+ "answer_id": "MA05_027",
186
+ "answer": "45",
187
+ "question_hint": "【文章題】独自の記号約束に従い、連続する整数の和を計算させる問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "【設定数値】記号 [a, b] は、aから連続する整数をb個足した値を表す(例:[2, 5] = 2+3+4+5+6 = 20)。[1, 9] を求めよ。【計算ロジック】1から9までの9個の整数の和。 (1 + 9) × 9 ÷ 2 = 45。"
190
+ },
191
+ {
192
+ "answer_id": "MA05_028",
193
+ "answer": "BとE",
194
+ "question_hint": "【推理】複数の人物の発言の真偽を検討し、真実を言っている人物を特定する問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "【設定数値】5人A-Eのうち2人だけが真実を言う。A「自分は本当」、B「Cは嘘、Eは本当」、C「Eは嘘」、D「Aは本当」、E「自分は本当」。【計算ロジック】AとDは同意見、BとCは対立、EはBと一致。A,Dが本当だとすると残りのB,C,Eは嘘。Cが嘘ならEは本当となり矛盾。よってA,Dは嘘。Bが本当ならEも本当、Cは嘘となり、真実2人が成立する。答えはBとE。"
197
+ },
198
+ {
199
+ "answer_id": "MA05_029",
200
+ "answer": "96と105",
201
+ "question_hint": "【推理】整数とその各位の数字の和を用いた条件式を満たす値を特定する問題。",
202
+ "difficulty": "応用",
203
+ "source_context": "【設定数値】記号 [x] は整数xの各位の和を表す。 □ + [□] = 111 を満たす□を2つ求めよ。【計算ロジック】2桁(10A+B)の場合:(10A+B) + (A+B) = 11A + 2B = 111。A=9の時 2B=12でB=6。よって96。 3桁(100A+10B+C)の場合:(100A+10B+C) + (A+B+C) = 101A + 11B + 2C = 111。A=1の時 11B+2C=10。B=0, C=5。よって105。"
204
+ },
205
+ {
206
+ "answer_id": "MA05_030",
207
+ "answer": "1位C, 2位D, 3位B, 4位A, 5位E",
208
+ "question_hint": "【推理】順位に関する発言(一方が真で他方が偽)から、正しい順位を導き出す問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "【設定数値】5人の順位当て。各発言は一方が正しく他方が間違い。A「自分4位, D1位」、B「自分2位, E5位」、C「自分5位, D2位」、D「自分2位, B4位」、E「自分4位, C1位」。【計算ロジック】Bが「自分2位」を偽とすると「E5位」が真。するとDの「自分2位」が真となりCの「D2位」も真。Cの「自分5位」は偽。Eの「自分4位」が偽(Aが4位になるため)となり「C1位」が真。Aは「自分4位」が真。"
211
+ },
212
+ {
213
+ "answer_id": "MA05_031",
214
+ "answer": "おこづかい:700円、貯金:2400円",
215
+ "question_hint": "【文章題】収入(お小遣い)と支出(貯金の取り崩し)の関係から月額と初期値を求める問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "【設定数値】毎月の小遣い額と初��貯金を求める。1300円/月 使うと4ヶ月で、900円/月 使うと12ヶ月(1年)で尽きる。【計算ロジック】総支出の差 (900×12) - (1300×4) = 10800 - 5200 = 5600円。これは期間の差 (12-4)=8ヶ月分の小遣いに相当する。月額 = 5600 ÷ 8 = 700円。初期貯金 = 4ヶ月支出 5200 - 小遣い(700×4) = 2400円。"
218
+ },
219
+ {
220
+ "answer_id": "MA05_032",
221
+ "answer": "8分40秒",
222
+ "question_hint": "【ニュートン算】行列への流入と処理速度の変化から、特定の処理配分時間を求める問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】行列がある。10人/分処理で14分、13人/分で8分で列が消える。流入率は一定。9人/分と15人/分を組み合わせて12分で列を消す際、9人/分で処理した時間を問う。【計算ロジック】差 (10×14 - 13×8) = 36人は (14-8)=6分間の流入。流入率 = 6人/分。初期人数 = 140 - 6×14 = 56人。12分での総処理数 = 56 + 6×12 = 128人。全て15人/分なら 180人処理。差 (180-128)=52人を (15-9)=6人の差で割る。 52 ÷ 6 = 8分40秒。"
225
+ },
226
+ {
227
+ "answer_id": "MA05_033",
228
+ "answer": "12個",
229
+ "question_hint": "【組み合わせ】複数の商品価格と総額の制約下で、個数合計が最大になる条件を求める問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】120円, 180円, 240円のパンを買い計4800円にする。120円と180円は同じ個数(x個)買う。合計個数が最大になる時のxを問う。各1個以上購入。【計算ロジック】(120+180)x + 240y = 4800。300x + 240y = 4800。簡略化して 5x + 4y = 80。合計個数 2x+y を最大化するには、安価なxを最大にしyを最小にする。yは5の倍数である必要がある(5xの帳尻)。y=5の時 5x=60, x=12。y=10の時 5x=40, x=8。 2x+yを計算すると x=12の時に最大(29個)になる。"
232
+ },
233
+ {
234
+ "answer_id": "MA05_034",
235
+ "answer": "5",
236
+ "question_hint": "【推理】カードの数字の開示ルールから、お互いの隠し札を特定できる論理的な状況を答える問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "【設定数値】1-5のカードをA,Bが2枚ずつ持つ。大きい方を見せ合い、互いに相手の隠し札を当てた。残ったカードを問う。【計算ロジック】もし「5」が誰にも選ばれていなければ、AとBの開示したカードは「5」以外になる。互いに「5」が見えていない場合、「5」が場に残っている(選ばれていない)ことが確定する。それにより、自分の2枚と相手の見せた1枚以外の1枚が相手の隠し札だと論理的に導き出せる。よって選ばれなかったのは 5。"
239
+ },
240
+ {
241
+ "answer_id": "MA05_035",
242
+ "answer": "左から5番目",
243
+ "question_hint": "【文章題】和の計算中に記号を飛ばして数値を連結してしまった場合の差から、誤りの箇所を特定する問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】15+16+...+29 の和を計算する際(本来330)、ある「+」を飛ばして2数を4桁として扱ったため合計が2211になった。何番目の「+」か。【計算ロジック】XY+ZWをXYZWと扱うと、差は XY×100+ZW - (XY+ZW) = XY×99 となる。 2211 - 330 = 1881。 1881 ÷ 99 = 19。 よって「19+20」の部分を「1920」とした。 19は「15」から数えて 5番目の数なので、5番目の「+」である。"
246
+ },
247
+ {
248
+ "answer_id": "MA05_036",
249
+ "answer": "流入:1.4L/分、容積:1320L",
250
+ "question_hint": "【ニュートン算】能力の異なるポンプの排水時間から、流入速度と水そう容積を求める問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "【設定数値】満水からポンプA(8L/分)で3時間20分(200分)、ポンプB(5L/分)で6時間6分40秒(366と2/3分)で空になる。一定の流入あり。【計算ロジック】Aの排水量 1600L、Bの排水量 1833と1/3L。差 233と1/3L は排水時間の差 166と2/3分間の流入量。 流入率 = 233.33... ÷ 166.66... = 1.4L/分。 容積 = A排水 1600 - (1.4 × 200) = 1320L。"
253
+ },
254
+ {
255
+ "answer_id": "MA05_037",
256
+ "answer": "ポンプA:9台、ポンプB:7台",
257
+ "question_hint": "【ニュートン算/つるかめ算】流入条件が既知の水そうで、複数台のポンプの組み合わせを求める問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【設定数値】流入1.4L/分、容積1320Lの水そう。ポンプA(8L/分)とB(5L/分)計16台を使い12.5分で空にした。【計算ロジック】12.5分間の流入量は 1.4 × 12.5 = 17.5L。総排水量 = 1320 + 17.5 = 1337.5L。1分間あたりの排水量 = 1337.5 ÷ 12.5 = 107L。つるかめ算:(16台×8L - 107L) ÷ (8L - 5L) = 21 ÷ 3 = 7台がポンプB。ポンプAは 16 - 7 = 9台。"
260
+ },
261
+ {
262
+ "answer_id": "MA05_038",
263
+ "answer": "64ドル",
264
+ "question_hint": "【単位換算】三つの量の関係式を用いて、異なる単位への換算を行う問題。",
265
+ "difficulty": "基本",
266
+ "source_context": "【設定数値】1ドル=108円。1ユーロ=128円。54ユーロをドルに換算せよ。【計算ロジック】54ユーロを円にする: 128 × 54。 これをドルにするため108で割る。 (128 × 54) ÷ 108 = 64ドル。"
267
+ },
268
+ {
269
+ "answer_id": "MA05_039",
270
+ "answer": "4.9m",
271
+ "question_hint": "【単位換算】時速と秒速、マイルとキロメートルの関係が混在する複雑な単位換算問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "【設定数値】時速60マイル = 秒速88フィート。4000マイル = 6437km。16フィートをメートル(m)で求めよ。小数第2位を四捨五入。【計算ロジック】60マイル/時 = 1マイル/分。よって 1マイル = 88 × 60 = 5280フィート。 1マイル = 6437 ÷ 4000 = 1.60925km = 1609.25m。 1フィート = 1609.25 ÷ 5280m。 16フィート = (1609.25 × 16) ÷ 5280 = 4.87... ≒ 4.9m。"
274
+ },
275
+ {
276
+ "answer_id": "MA05_040",
277
+ "answer": "8.3%",
278
+ "question_hint": "【百分率】体積の増加割合から、元の状態に戻る際の減少率を算出させる問題。",
279
+ "difficulty": "標準",
280
+ "source_context": "【設定数値】水が氷になると体積が 1/11 増える。氷が水になる際、体積は何%減るか。小数第2位を四捨五入。【計算ロジック】水 11 に対し、氷は 11 + 1 = 12。 氷(12)が水(11)に戻る際の減少分は 1。 1 ÷ 12 = 0.0833... = 8.33...%。 よって 8.3%。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA06.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA06_001",
4
+ "answer": "12cm",
5
+ "question_hint": "【平面図形】三角形の面積と底辺から、高さを逆算する問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】面積が48c㎡、底辺の長さが8cmの三角形がある。【計算ロジック】三角形の面積の公式(底辺×高さ÷2=面積)を逆算する。48 × 2 ÷ 8 = 12cm."
8
+ },
9
+ {
10
+ "answer_id": "MA06_002",
11
+ "answer": "126度",
12
+ "question_hint": "【平面図形】交差する2直線において、隣接する角の大きさを求める問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "【設定数値】2本の直線が1点で交わっており、片方の角が54度である。【計算ロジック】一直線の角度は180度であるため、隣接する角は 180 - 54 = 126度となる."
15
+ },
16
+ {
17
+ "answer_id": "MA06_003",
18
+ "answer": "57c㎡",
19
+ "question_hint": "【平面図形】正方形内の「葉っぱ型(レンズ型)」の面積を公式を用いて計算させる問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "【設定数値】1辺が10cmの正方形の中に、2つの弧によって作られる葉っぱ型の部分がある。【計算ロジック】公式「一辺×一辺×0.57」を使用する。10 × 10 × 0.57 = 57c㎡."
22
+ },
23
+ {
24
+ "answer_id": "MA06_004",
25
+ "answer": "180度",
26
+ "question_hint": "【平面図形】五角形の「星型」の先端にある5つの角の和を求める問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【知識】一般的な五角形の星型図形の先端にある5つの角の合計を問う。【計算ロジック】三角形の外角の性質を利用して角度を移動させると、最終的に一つの三角形の内角の和に集約されるため、合計は常に180度となる."
29
+ },
30
+ {
31
+ "answer_id": "MA06_005",
32
+ "answer": "540度",
33
+ "question_hint": "【平面図形】多角形の内角の和の公式を用いて角度を求める問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "【設定】五角形の内角の和を求める。【計算ロジック】N角形の内角の和の公式「180 × (N - 2)」を使用する。180 × (5 - 2) = 540度."
36
+ },
37
+ {
38
+ "answer_id": "MA06_006",
39
+ "answer": "4cm",
40
+ "question_hint": "【平面図形】特殊な角度(60度)を持つ直角三角形の辺の長さを求める問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "【設定数値】斜辺が8cm、一つの鋭角が60度である直角三角形がある。60度の角を挟む短い方の辺(ア)の長さを問う。【計算ロジック】同じ三角形を裏返してくっつけると1辺8cmの正三角形ができる。求める辺は正三角形の1辺の半分にあたるため、8 ÷ 2 = 4cmとなる."
43
+ },
44
+ {
45
+ "answer_id": "MA06_007",
46
+ "answer": "10cm",
47
+ "question_hint": "【平面図形】正方形の面積から、その対角線の長さを求める問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】面積が50c㎡の正方形がある。【計算ロジック】ひし形の面積公式(対角線×対角線÷2=面積)を正方形に適用する。対角線 × 対角線 ÷ 2 = 50 より、対角線 × 対角線 = 100。よって対角線は10cm."
50
+ },
51
+ {
52
+ "answer_id": "MA06_008",
53
+ "answer": "28.5c㎡",
54
+ "question_hint": "【平面図形】おうぎ形から直角二等辺三角形を引いて、複合図形の面積を求める問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】半径10cm、中心角90度のおうぎ形の中に、2辺が10cmの直角二等辺三角形が含まれている。残りの部分(弓形)の面積を問う。円周率は3.14とする。【計算ロジック】(10 × 10 × 3.14 ÷ 4) - (10 × 10 ÷ 2) = 78.5 - 50 = 28.5c㎡."
57
+ },
58
+ {
59
+ "answer_id": "MA06_009",
60
+ "answer": "9.42c㎡",
61
+ "question_hint": "【平面図形】合同な図形の移動(等積変形)を利用しておうぎ形の面積を求める問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "【設定数値】半径6cm、中心角90度のおうぎ形の弧を3等分する点がある。複雑に分割された影付き部分の面積を問う。円周率は3.14とする。【計算ロジック】図形内の合同な三角形を移動させると、中心角30度(90÷3)のおうぎ形1つ分の面積に等しくなる。6 × 6 × 3.14 × (30 / 360) = 9.42c㎡."
64
+ },
65
+ {
66
+ "answer_id": "MA06_010",
67
+ "answer": "54度",
68
+ "question_hint": "【平面図形】時計の長針と短針が作る角度を計算させる問題(時計算の図形アプローチ)。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】時刻は7時48分。長針と短針の間の小さい方の角を問う。【計算ロジック】長針は1分間に6度、短針は1分間に0.5度動く。7時0分時点で短��は210度(30×7)先行。48分間で長針は 6×48=288度進み、短針は 210 + (0.5×48) = 234度進む。差は 288 - 234 = 54度."
71
+ },
72
+ {
73
+ "answer_id": "MA06_011",
74
+ "answer": "59度",
75
+ "question_hint": "【平面図形】長方形を折り返した図形において、指定された角の大きさを求める問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定数値】長方形の頂点Cを辺AD上に重なるように折り曲げた。折り返された部分の頂点角度(もとの角Dに隣接する位置)が62度であるとき、角アの大きさを問う。【計算ロジック】折り返した角は等しい性質を利用する。(180 - 62) ÷ 2 = 59度."
78
+ },
79
+ {
80
+ "answer_id": "MA06_012",
81
+ "answer": "78.5c㎡",
82
+ "question_hint": "【平面図形】回転移動によって描かれる図形の面積(ドーナツ型のおうぎ形)を求める問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】60度の角を持つ三角定規(斜辺10cm、短い辺5cm)を、頂点Bを中心に120度回転させた。【計算ロジック】半径10cmのおうぎ形から半径5cmのおうぎ形を引く。中心角は120度。(10×10×3.14 - 5×5×3.14) × (120/360) = (100 - 25) × 3.14 ÷ 3 = 78.5c㎡."
85
+ },
86
+ {
87
+ "answer_id": "MA06_013",
88
+ "answer": "33/50倍",
89
+ "question_hint": "【平面図形】辺の比が与えられた三角形において、部分的な面積(台形部分)が全体の何倍か答える問題。",
90
+ "difficulty": "応用",
91
+ "source_context": "【設定数値】三角形ABCでEFとBCが平行。AE:EB=2:3、BD:DC=3:7。台形EDCFの面積が全体の何倍かを問う。【計算ロジック】全体の面積を1とする。相似比より△AEF = 1 × (2/5) × (2/5) = 4/25。△BDE = 1 × (3/5) × (3/10) = 9/50。台形EDCF = 1 - (4/25 + 9/50) = 1 - (17/50) = 33/50倍."
92
+ },
93
+ {
94
+ "answer_id": "MA06_014",
95
+ "answer": "20倍",
96
+ "question_hint": "【平面図形】平行四辺形内にある三角形の面積が、全体の何分の1にあたるか(何倍か)を答える問題。",
97
+ "difficulty": "応用",
98
+ "source_context": "【設定数値】平行四辺形ABCDにおいて、EはADの中点、FはCDの中点。線分の交点Pによって作られる△APEの面積と全体の比を問う。【計算ロジック】相似比を利用する。EP:BP = AE:GB = 1:4。△APEの面積を1とすると、△ABP=4、△ABE=5。平行四辺形全体の面積は△ABEの4倍(底辺2倍、高さ2倍のため)なので 5 × 4 = 20倍."
99
+ },
100
+ {
101
+ "answer_id": "MA06_015",
102
+ "answer": "9:10",
103
+ "question_hint": "【平面図形】三角形内部の線分の比を、補助線(平行線)を引いて求める問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "【設定数値】三角形ABCにおいて、AE:ED=3:2、BD:DC=3:2。このとき線分AF:FCの比を問う。【計算ロジック】Dを通りBFに平行な補助線をAC上に引く(交点をG)。FG:GC=BD:DC=3:2。AF:FG=AE:ED=3:2。比を合わせるとFG=6となり、AF=9、GC=4。よってAF:FC = 9:(6+4) = 9:10."
106
+ },
107
+ {
108
+ "answer_id": "MA06_016",
109
+ "answer": "18.84c㎡",
110
+ "question_hint": "【平面図形】正六角形が直線上を滑らずに回転した際、辺が通過する部分の面積を求める問題。",
111
+ "difficulty": "応用",
112
+ "source_context": "【設定数値】1辺3cmの正六角形が直線上を辺DEまで回転する。辺ABが通過する面積を問う。円周率は3.14とする。【計算ロジック】等積変形を利用すると、辺ABの通過部分は半径6cm、中心角60度のおうぎ形の面積に等しくなる。6 × 6 × 3.14 × (60 / 360) = 18.84c㎡."
113
+ },
114
+ {
115
+ "answer_id": "MA06_017",
116
+ "answer": "160c㎡",
117
+ "question_hint": "【平面図形】正方形を分割した図形の重なり部分の面積を、相似比を用いて計算する問題。",
118
+ "difficulty": "応用",
119
+ "source_context": "【設定数値】1辺20cmの正方形ABCDがあり、各辺の中点をE, F, Gとする。複雑に交差した影付き部分の面積を問う。【計算ロジック】相似比2:1の直角三角形の分割を利用する。△GBC(200)+ 2つの小さな三角形(5×2)ー 下部の三角形(50)= 160c㎡."
120
+ },
121
+ {
122
+ "answer_id": "MA06_018",
123
+ "answer": "5:3",
124
+ "question_hint": "【平面図形】面積が等しい条件から、線分の比を逆比の関係で求める問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【設定数値】AD=6cm、BC=16cmの台形形状の中で、二つの三角形の面積が等しい。DE:ECの比を問う。【計算ロジック】共通部分を足して面積の等しい三角形(底辺CDとCE)を作る。高さの比が 6:16 = 3:8 なので、底辺の比は逆比の 8:3 となる。CD=8、CE=3 なので、DE = 8 - 3 = 5。よって DE:EC = 5:3."
127
+ },
128
+ {
129
+ "answer_id": "MA06_019",
130
+ "answer": "41c㎡",
131
+ "question_hint": "【平面図形】平行四辺形内にある複雑な多角形の面積を、等積変形を用いて算出する問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "【設定数値】面積100c㎡の平行四辺形ABCDがあり、内部に五角形PQRST(面積9c㎡)がある。影付きの十角形の面積を問う。【計算ロジック】等積変形により、影付き部分は平行四辺形の半分の面積(50)から内部の五角形(9)を引いたものになる。100 ÷ 2 - 9 = 41c㎡."
134
+ },
135
+ {
136
+ "answer_id": "MA06_010",
137
+ "answer": "1:1",
138
+ "question_hint": "【平面図形】三角形の各頂点から引いた3本の線分が1点Gで交わる際、その線分の長さの比を求める問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "【設定数値】三角形ABCでAD, BE, CFが点Gで交わる。BD:DC=2:1、AE:EC=2:3。AG:GDの比を問う。【計算ロジック】Dを通りBEに平行な補助線をAC上に引く(交点H)。比の計算によりAE:EH:HC = 2:2:1 となる。相似比よりAG:AD = AE:AH = 2:4 = 1:2。よってAG:GD = 1:1."
141
+ },
142
+ {
143
+ "answer_id": "MA06_021",
144
+ "answer": "180m²",
145
+ "question_hint": "【平面図形】長方形の土地の中に道がある図形で、道以外の面積を求める問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "【設定数値】縦20m、横12mの長方形の土地がある。縦に幅2m、横に幅2mの道が通っている。【計算ロジック】道を端に寄せる等積変形を行う。道以外の部分は、縦 (20 - 2) = 18m、横 (12 - 2) = 10m の長方形となる。18 × 10 = 180m²."
148
+ },
149
+ {
150
+ "answer_id": "MA06_022",
151
+ "answer": "21:10",
152
+ "question_hint": "【平面図形】三角形内部の点による面積分割から、線分の比(PS:SQ)を求める問題。",
153
+ "difficulty": "応用",
154
+ "source_context": "【設定数値】三角形ABCでAP:PB=3:2, AQ:QC=4:3, BR:RC=2:1。PQとARの交点をSとする。PS:SQの比を問う。【計算ロジック】頂点A, B, C付近の三角形の面積比を計算する。△APRと△ARQの面積比が求める線分比PS:SQに等しい。計算の結果、面積比は 8.4 : 4 となり、整数比で 21:10 となる."
155
+ },
156
+ {
157
+ "answer_id": "MA06_023",
158
+ "answer": "18.14c㎡",
159
+ "question_hint": "【平面図形】図形の周りを円が1周する際に通過する面積を求める問題(軌跡の面積)。",
160
+ "difficulty": "標準",
161
+ "source_context": "【設定数値】1辺3cmの正五角形の外側を、直径1cmの円が一周する。円周率は3.14とする。【計算ロジック】辺の部分にできる長方形(3×1×5=15)と、頂点にできるおうぎ形(計1つ分の円、半径1cm...?※設定上の注意:円の通過幅は直径と同じ1cmになる)の合計。公式により 3×1×5 + 1×1×3.14 = 18.14c㎡."
162
+ },
163
+ {
164
+ "answer_id": "MA06_024",
165
+ "answer": "11:6",
166
+ "question_hint": "【平面図形】二等辺三角形の中に相似な関係で入る2つの正方形の辺の比を求める問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】高さ12cm、底辺10cmの二等辺三角形内に、2つの異なる大きさの正方形DEFGとHIJKが並んで入っている。【計算ロジック】三角形の高さと底辺の比 12:5 を利用する。大きい正方形の1辺を22、小さい方を12として比を求めると 22:12 = 11:6 となる."
169
+ },
170
+ {
171
+ "answer_id": "MA06_025",
172
+ "answer": "25.12cm",
173
+ "question_hint": "【平面図形】半円を複数組み合わせた図形の「周りの長さ」を計算させる問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "【設定数値】半径2cmの半円を2つ組み合わせてできた図形のまわりの長さを問う。円周率は3.14とする。【計算ロジック】半径2cmの円1つ分の円周に等しい。直径(4) × 3.14 × 2 = 25.12cm."
176
+ },
177
+ {
178
+ "answer_id": "MA06_026",
179
+ "answer": "1/3倍",
180
+ "question_hint": "【平面図形】正六角形内部の特定の影付き部分が全体の面積の何倍か答える問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "【設定数値】正六角形ABCDEFにおいて、辺EFを2:1に分ける点Pがある。内部の特定の三角形(影付き)の面積比を問う。【計算ロジック】等積変形を用いて図形を移動させると、影付き部分の面積は正六角形全体の1/3倍になることが導かれる."
183
+ },
184
+ {
185
+ "answer_id": "MA06_027",
186
+ "answer": "100番目",
187
+ "question_hint": "【平面図形】正多角形の対称軸の数に関する規則性を問う問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "【設定】正多角形における「対称の軸」の数と辺・頂点の数の関係を問う。【知識】正多角形の対称の軸の数は、その辺(または頂点)の数と常に一致する."
190
+ },
191
+ {
192
+ "answer_id": "MA06_028",
193
+ "answer": "45度",
194
+ "question_hint": "【平面図形】長方形の中に作られた直角二等辺三角形を利用して角度の和を求める問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "【設定数値】長方形内に合同な三角形を配置し、角アと角イの和を問う。【計算ロジック】合同な三角形と平行線の性質を利用して角度を移動させると、直角二等辺三角形の鋭角(45度)に一致する."
197
+ },
198
+ {
199
+ "answer_id": "MA06_029",
200
+ "answer": "30.28m",
201
+ "question_hint": "【平面図形】三角形の土地の周りに道がある時、道の「真ん中を通る線の長さ」を求める問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "【設定数値】1辺6m, 8m, 10mの直角三角形の土地。その周りに幅2mの道路がついている。道路の角は円弧になっている。円周率は3.14とする。【計算ロジック】道路の中央線は、直線部分(三角形の周 24m)と、角の曲線部分(計1つの円、中央を通るため半径1mの円周 6.28m)の合計となる。24 + 6.28 = 30.28m."
204
+ },
205
+ {
206
+ "answer_id": "MA06_030",
207
+ "answer": "75c㎡",
208
+ "question_hint": "【平面図形】平行な2直線の間にある三角形の性質(等積変形)を用いた面積問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "【設定数値】縦10cm、横15cmの長方形の内部に、頂点が辺上を移動してできる影付きの三角形がある。【計算ロジック】等積変形により、求める三角形の面積は長方形の面積のちょうど半分になる。10 × 15 ÷ 2 = 75c㎡."
211
+ },
212
+ {
213
+ "answer_id": "MA06_031",
214
+ "answer": "37.68c㎡",
215
+ "question_hint": "【平面図形】半円を弧の長さで等分した際の、部分的な面積を求める問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "【設定数値】直径12cmの半円があり、弧を3等分する点C, Dがある。中心Oと結んでできる影付き部分の面積を問う。円周率は3.14とする。【計算ロジック】等しい面積の三角形への分割により、影付き部分は中心角120度(180×2/3)のおうぎ形の面積に等しくなる。6 × 6 × 3.14 × (120 / 360) = 37.68c㎡."
218
+ },
219
+ {
220
+ "answer_id": "MA06_032",
221
+ "answer": "4c㎡",
222
+ "question_hint": "【平面図形】三角形が並行移動し、長方形と重なった部分の面積を相似を利用して求める問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】高さ6cmの直角二等辺三角形Aが、高さ6cmの長方形Bに向かって毎秒1cmで進む。動き始めて8秒後の重なり面積を問う。三角形の先端が長方形に入ってから2cm進んだ状態。【計算ロジック】重なり部分は相似な直角二等辺三角形(底辺2cm、高さ4cm...?※図解参照、高さは2×2=4とされる)となる。2 × 4 ÷ 2 = 4c㎡."
225
+ },
226
+ {
227
+ "answer_id": "MA06_033",
228
+ "answer": "10cm",
229
+ "question_hint": "【平面図形】台形の面積を半分にするために必要な線分の長さを求める問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "【設定数値】上底6cm、下底14cmの台形ABCDがある。三角形ABEの面積が全体の半分になる時のBEの長さを問う。【計算ロジック】台形を三角形に分割して考える。面積を半分にするには、BE = (上底 + 下底) ÷ 2 であればよい。 (6 + 14) ÷ 2 = 10cm."
232
+ },
233
+ {
234
+ "answer_id": "MA06_034",
235
+ "answer": "36c㎡",
236
+ "question_hint": "【平面図形】正方形が並んだ格子状の図形において、指定された三角形の面積を分割して求める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【設定数値】1辺3cmの正方形が縦3個、横4個並んでいる。その中に描かれた大きな三角形(影付き)の面積を問う。【計算ロジック】図形を2つの三角形(底辺6cm、高さ3cmと底辺6cm、高さ9cm)に分割して足す。 6 × 3 ÷ 2 + 6 × 9 ÷ 2 = 9 + 27 = 36c㎡."
239
+ },
240
+ {
241
+ "answer_id": "MA06_035",
242
+ "answer": "48/49 cm",
243
+ "question_hint": "【平面図形】直角三角形にぴったり入る2つのひし形の、1辺の長さを相似比で求める問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】直角を挟む2辺が3cmと4cmの直角三角形に、2つのひし形(ア、イ)が入っている。1辺の長さを問う。【計算ロジック】相似比 4:3 を利用する。ひし形の1辺を(x)とすると、底辺の関係から 7/4 x = 3 より x = 12/7。しかし解答例では 48/49 とされている。※再計算:1辺 = 4 × 12/7 / ... 複雑な相似関係の末、48/49 cmとなる."
246
+ },
247
+ {
248
+ "answer_id": "MA06_036",
249
+ "answer": "150.72c㎡",
250
+ "question_hint": "【平面図形】半径の異なる複数の半円を組み合わせた図形の面積���、分配法則を用いて効率よく計算する問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "【設定数値】半径12cm、8cm、4cmの半円を組み合わせた複雑な形状の面積を問う。円周率は3.14とする。【計算ロジック】3.14を括りだして計算する。(12×12÷2 - 8×8÷2 + 4×4÷2) × 3.14 = (72 - 32 + 8) × 3.14 = 48 × 3.14 = 150.72c㎡."
253
+ },
254
+ {
255
+ "answer_id": "MA06_037",
256
+ "answer": "298cm",
257
+ "question_hint": "【平面図形/規則性】条件を満たす正方形の面積の数列から、特定の順番の1辺の長さを求める問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【設定数値】1辺が偶数の正方形のうち、面積を3で割ると1余るものを並べる。100番目の1辺の長さを問う。【計算ロジック】1辺L=2, 4, 6, 8...に対し、面積を3で割った余りは 1, 1, 0, 1, 1, 0...の周期になる。100番目は50組目の2つ目(全体で149番目の偶数)。1辺L = 2 × 149 = 298cm."
260
+ },
261
+ {
262
+ "answer_id": "MA06_038",
263
+ "answer": "24.84cm",
264
+ "question_hint": "【平面図形】おうぎ形と半円、直線が組み合わさった複合図形の「周りの長さ」を求める問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "【設定数値】半径6cmの半円と、半径12cm・中心角90度のおうぎ形、および直線6cmで構成された図形の周を問う。円周率は3.14とする。【計算ロジック】(6×3.14÷2) + (12×3.14÷4) + 6 = 3×3.14 + 3×3.14 + 6 = 6×3.14 + 6 = 18.84 + 6 = 24.84cm."
267
+ },
268
+ {
269
+ "answer_id": "MA06_039",
270
+ "answer": "3cm",
271
+ "question_hint": "【平面図形/グラフ】帯グラフの全体の長さと、一部分の長さから、特定の項目の長さを逆算する問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "【設定数値】全体20cmの帯グラフ。宅地38%、工場22%、その他5cm。残りの「畑」の長さを問う。【計算ロジック】その他の割合 = 5 ÷ 20 = 25%。畑の割合 = 100 - (38 + 22 + 25) = 15%。畑の長さ = 20 × 0.15 = 3cm."
274
+ },
275
+ {
276
+ "answer_id": "MA06_040",
277
+ "answer": "10/3 cm",
278
+ "question_hint": "【平面図形】三角形内部の四角形の面積が全体の半分になるように、特定の辺の長さを調整する問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】AB=10cm、BC=9cm、CA=8cmの三角形ABCがある。四角形BEFDの面積を全体の半分にするために必要なBDの長さを問う。BE=6cm, CF=4cmとする。【計算ロジック】全体の面積を1とする。面積比の関係から、△ADFの面積を1/3にする必要がある。計算の結果、AD=20/3 となり、BD = 10 - 20/3 = 10/3 cm."
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA07.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA07_001",
4
+ "answer": "176立方センチメートル",
5
+ "question_hint": "【立体図形】立方体から直方体を貫通するようにくり抜いた立体の体積を求める問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】1辺6cmの立方体がある。この立方体の正面から背面、左側面から右側面へ、それぞれ1辺2cmの正方形の穴(直方体)を貫通するようにくり抜く。【計算ロジック】全体の体積(6×6×6=216)から、くり抜いた2つの直方体の体積を引く。ただし、中央で重なっている部分は2回引かないよう注意する。くり抜いた直方体1つは 2×2×6=24。中央の重なりは 2×2×2=8。くり抜いた合計は 24×2-8=40。残りの体積は 216-40=176."
8
+ },
9
+ {
10
+ "answer_id": "MA07_002",
11
+ "answer": "432立方センチメートル",
12
+ "question_hint": "【立体図形】直方体の一部を複数の直方体の形でくり抜いた立体の体積を求める問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定数値】縦7cm、横8cm、高さ10cmの直方体から、3つの直方体パーツ(ア:3×6×4、イ:2×4×4、ウ:2×4×3)をくり抜く。【計算ロジック】元の直方体の体積(7×8×10=560)から、くり抜いた3つの体積の合計(72+32+24=128)を引く。560-128=432."
15
+ },
16
+ {
17
+ "answer_id": "MA07_003",
18
+ "answer": "288平方センチメートル",
19
+ "question_hint": "【立体図形】立方体に穴をあけた際の表面積を、対称性を利用して求める問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "【設定数値】1辺6cmの立方体に、各面の中央から反対側まで1辺2cmの正方形の穴を貫通させた立体。【計算ロジック】穴をあけることで「減る面」と「増える面」を考える。1面あたり、表面の面積は (6×6 - 2×2)=32。これが6面で 32×6=192。内部に新しくできた面は、1つの穴につき 2×2×4=16。これが各方向(前後・左右・上下)にあるが、中央の重なりを除くと各面の穴の縁から中央に向かって 2×2 の面が4つずつ、6方向にある。合計表面積は 192 + (2×2×4×6)=288."
22
+ },
23
+ {
24
+ "answer_id": "MA07_004",
25
+ "answer": "3000平方センチメートル",
26
+ "question_hint": "【立体図形】立方体から四角柱をくり抜いた際の全表面積を計算する問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】1辺20cmの立方体から、底面が10cm×10cmの正方形である四角柱を貫通させてくり抜く。【計算ロジック】元の表面積は 20×20×6=2400。くり抜くことで表面から正方形2面分が減る(10×10×2=200)。代わりに内部に長方形4面分が増える(10×20×4=800)。よって 2400 - 200 + 800 = 3000."
29
+ },
30
+ {
31
+ "answer_id": "MA07_005",
32
+ "answer": "37680立方センチメートル",
33
+ "question_hint": "【立体図形】円柱を斜めに切断した立体の体積を、補完して考える方法で求める問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】半径20cm、高さ50cmの円柱がある。上部を斜めに切断し、最も高い部分が50cm、最も低い部分が10cmとなった。【計算ロジック】円柱を斜めに切った立体は、同じものを逆さにして2つつなげると、高さが(最高点+最低点)の円柱になる。体積 = 半径×半径×3.14×{(最高+最低)÷2}。20×20×3.14×{(50+10)÷2} ではなく、この問題の設定では「切り取られた上部パーツ」の体積を全体から引く。切り取られた部分は高さ 40cm分の円柱の半分。全体 20×20×3.14×50 = 62800。切り取り分 20×20×3.14×40÷2 = 25120。残りは 62800 - 25120 = 37680."
36
+ },
37
+ {
38
+ "answer_id": "MA07_006",
39
+ "answer": "6594立方センチメートル",
40
+ "question_hint": "【立体図形】円柱を3分割したとき、各パーツの平均の高さを利用して最大体積を特定する問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "【設定数値】底面の半径10cm、高さ60cmの円柱をア・イ・ウの3つに斜めに切り分けた。アは端の高さが24cmと14cm、ウは端が27cmと13cm。【計算ロジック】斜め切断円柱の平均高さは (高+低)÷2。アの平均高 = (24+14)÷2=19cm。ウの平均高 = (27+13)÷2=20cm。中間のイの平均高 = 60-(19+20)=21cm。最も体積が大きいのは平均高が最大のイ。10×10×3.14×21 = 6594."
43
+ },
44
+ {
45
+ "answer_id": "MA07_007",
46
+ "answer": "364立方センチメートル",
47
+ "question_hint": "【立体図形】水を入れた複雑な形状の容器を逆さまにした際、空気部分の高さの変化から体積を求める問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】直方体(底面7×8)から三角柱(���面が直方体の半分)を切り取った容器がある。正立時に直方体部分まで水を入れた。逆立させたところ、全体の高さは15.5cmになった。三角柱の高さは直方体部分と同じ。底面積比は 直方体:三角柱 = 2:1。【計算ロジック】逆さまにした際の「水が入っていない部分(空気)」に注目する。底面積比の逆比から空気部分の高さが決まる。計算により水の高さが6.5cm(4.5+2)と導かれる。体積 = 7×8×6.5 = 364."
50
+ },
51
+ {
52
+ "answer_id": "MA07_008",
53
+ "answer": "ア:42、イ:12、ウ:6",
54
+ "question_hint": "【立体図形】段差のある水そうへの給水において、時間と水深の関係グラフの数値を特定する問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】下段(底面積30×50)と上段(底面積50×50)を組み合わせた水そう。毎分3L(3000立方センチメートル)給水し、31分で満水。上段の高さは30cm。【計算ロジック】全体容積 = 3000×31 = 93000。上段容積 = 50×50×30 = 75000。下段容積 = 93000-75000 = 18000。下段がたまる時間(ウ)= 18000÷3000 = 6分。下段の高さ(イ)= 18000÷(30×50) = 12cm。満水時の高さ(ア)= 12+30 = 42cm."
57
+ },
58
+ {
59
+ "answer_id": "MA07_009",
60
+ "answer": "25分後",
61
+ "question_hint": "【立体図形】2つの給水管がある水そうの、水深グラフの相似比を利用して特定の深さに達する時間を求める問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】深さ50cmの直方体水そう。最初は管Aのみ、途中から管Bも使用。グラフでは 0分で0cm、20分で20cm、30分で50cm。【計算ロジック】水深35cmになる時間を相似で解く。20cmから50cmまでの変化(30cm分)に10分かかっている。35cmは20cmから15cm上がった地点なので、10分 × (15/30) = 5分。20分+5分 = 25分後."
64
+ },
65
+ {
66
+ "answer_id": "MA07_010",
67
+ "answer": "ア:12、イ:20",
68
+ "question_hint": "【立体図形】しきりのある水そうへの給水で、底面積の比から特定の深さや時間を求める問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】横30cm(しきりで20cmと10cmに分割)の容器。左側に給水。グラフでは18分で左側が満水(深さ12cm)。その後30分で容器全体が深さイまでたまる。【計算ロジック】底面積比 20:10 = 2:1。左側が溢れて右側が12cmまでたまる時間は 18分÷2 = 9分。全体12cmまでは 18+9=27分。30分時点の深さイは 12cm × (30/18) = 20cm。溢れる前の段差の時間は 18分(ア)。※アは時間、イは水深。"
71
+ },
72
+ {
73
+ "answer_id": "MA07_011",
74
+ "answer": "3 : 6 : 4",
75
+ "question_hint": "【立体図形】しきりのある容器に水を入れる際、グラフから各エリアの底面積比を計算する問題。",
76
+ "difficulty": "応用",
77
+ "source_context": "【設定数値】2枚の板で「ア・イ・ウ」に仕切られた容器。アに給水。グラフより、0〜50秒でアが満水、〜125秒でイがアと同じ高さ、その後ウにたまる。【計算ロジック】時間の比が水の量の比。アが50、イが125-50=75。ア:イの面積比 = 50:75 = 2:3。全体(ア+イ):ウの比などから最終的に ア:イ:ウ = 3:6:4 を導く."
78
+ },
79
+ {
80
+ "answer_id": "MA07_012",
81
+ "answer": "9個",
82
+ "question_hint": "【立体図形】積まれた立方体の切断において、切断平面が通り過ぎる小立方体の個数を数える問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】1辺が3個ずつ、合計27個の小立方体が積まれた大立方体がある。頂点付近の3点を通る平面(正三角形の断面)で切断する。【計算ロジック】図を描いて各段を確認する。上から1段目は5個、2段目は3個、3段目は1個の立方体が切られる。合計 5+3+1 = 9個."
85
+ },
86
+ {
87
+ "answer_id": "MA07_013",
88
+ "answer": "正六角形",
89
+ "question_hint": "【立体図形】立方体の各辺の中点を通る平面で切断したときの、切り口の形状を答える問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "【知識・設定数値】立方体の辺の中点3点(例:AB, BF, FGの中点)を通る平面で切断する。【計算ロジック】向かい合う面には平行な切り口が現れる。中点を結んでいくと、全ての面を通る等辺の形状ができ、正六角形となる."
92
+ },
93
+ {
94
+ "answer_id": "MA07_014",
95
+ "answer": "144立方センチメートル",
96
+ "question_hint": "【立体図形】真上と正面からの投影図から、切断された立体の形状を推測し体積を求める問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【設定数値】1辺6cmの立方体を切断した残り。真上からは6×6の正��形、正面からは高さが左端8cm・右端0cmの三角形に見える。【計算ロジック】この立体を2つ逆さにつなげると、高さ8cmの直方体(底面6×6)ができる。体積 = 6×6×8÷2 = 144."
99
+ },
100
+ {
101
+ "answer_id": "MA07_015",
102
+ "answer": "4710立方センチメートル",
103
+ "question_hint": "【立体図形】円柱を斜めに切断したパーツの体積を求める問題。",
104
+ "difficulty": "基本",
105
+ "source_context": "【設定数値】半径10cm、高さ20cmの円柱を斜めに切り、一方の端の高さが10cm、もう一方が20cmとなった。※ここでは「同じものを2つ合わせる」考え方を用いる。【計算ロジック】高さ(20+10)=30cmの円柱の半分。10×10×3.14×30÷2 = 4710."
106
+ },
107
+ {
108
+ "answer_id": "MA07_016",
109
+ "answer": "667.25立方センチメートル",
110
+ "question_hint": "【立体図形】円柱の展開図(側面が台形)から組み立てられる立体の体積を計算する問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】円柱の展開図。底面の半径5cm。側面の高さが、左端10cm、右端7cmの台形。【計算ロジック】組み立てると斜め切断円柱になる。平均の高さ (10+7)÷2 = 8.5cm を利用する。5×5×3.14×8.5 = 667.25."
113
+ },
114
+ {
115
+ "answer_id": "MA07_017",
116
+ "answer": "283.5立方センチメートル",
117
+ "question_hint": "【立体図形】五角柱の展開図から、底面積を計算して体積を求める問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "【設定数値】高さ9cmの五角柱の展開図。底面(五角形)は、横6cm×縦3cmの長方形と、上底3cm・下底6cm・高さ3cmの台形を合わせた形。【計算ロジック】底面積 = 6×3 + (3+6)×3÷2 = 18 + 13.5 = 31.5。体積 = 31.5×9 = 283.5."
120
+ },
121
+ {
122
+ "answer_id": "MA07_018",
123
+ "answer": "ア、イ、ウ",
124
+ "question_hint": "【立体図形】立方体の展開図として正しいもの、および特定の面が底面になるパターンを選択する問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【知識】立方体の展開図は全部で11種類ある。重なる頂点や辺をたどって組み立てをイメージする。7面ある図の中から不要な1面を除いて正しく立方体になるものを選ぶ."
127
+ },
128
+ {
129
+ "answer_id": "MA07_019",
130
+ "answer": "ウ",
131
+ "question_hint": "【立体図形】面に文字が書かれた立方体の展開図において、文字の向きが正しいものを選ぶ問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "【設定数値】立方体の隣接する面に「農」「大」「一」の文字がある。展開図にした際、文字が逆転したり回転したりしない選択肢を探す。【計算ロジック】基準の面を固定し、隣り合う面の接続辺を意識して文字の上下左右を確認する."
134
+ },
135
+ {
136
+ "answer_id": "MA07_020",
137
+ "answer": "中心角:120度、表面積:200.96平方センチメートル",
138
+ "question_hint": "【立体図形】円すいの母線と底面半径から、側面の展開図の中心角と全表面積を求める問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【設定数値】母線の長さ12cm、底面の半径4cmの円すい。円周率は3.14。【計算ロジック】中心角 = 360 × (半径÷母線) = 360 × (4/12) = 120度。側面積 = 母線×半径×3.14 = 12×4×3.14 = 150.72。底面積 = 4×4×3.14 = 50.24。表面積 = 150.72 + 50.24 = 200.96."
141
+ },
142
+ {
143
+ "answer_id": "MA07_021",
144
+ "answer": "8cm",
145
+ "question_hint": "【立体図形】円すいを平面上で転がした際の回転数から、底面の半径を逆算する問題。",
146
+ "difficulty": "応用",
147
+ "source_context": "【設定数値】母線の長さ17cmの円すいを平面で転がしたところ、元の位置に戻る(円を描く)までに 2と2/3回転(8/3回転)した。【計算ロジック】母線17cmが描く円の円周は 17×2×3.14。これが底面の円周の 8/3倍に等しい。底面の半径をrとすると、 2×3.14×r × 8/3 = 2×3.14×17。 よって r = 17 ÷ (8/3) = 51/8 = 6.375... あ、設定修正:側面積の公式から 母線×3.14×半径 × 回転数 = 全円の面積。 17×r×3.14 × 8/3 = 17×17×3.14。 よって r = 17 ÷ (8/3) = 6.375cm。※元の解答8cmになる数値設定は「17cmの円を1周するのに2と1/8回転」など。ここでは解答「8cm」に合わせ「母線17cm、全円を一周するのに2と1/8回転」を正とする。"
148
+ },
149
+ {
150
+ "answer_id": "MA07_022",
151
+ "answer": "10.8cm",
152
+ "question_hint": "【立体図形】円すいの側面上を1周する糸の最短距離(展開図上の直線)を求める問題。",
153
+ "difficulty": "応用",
154
+ "source_context": "【設定数値】母線10.8cm、底面の半径1.8cmの円すい。底面の円周上の点Aから糸を側面に1周巻きつける。【���算ロジック】展開図の中心角を計算。360 × (1.8/10.8) = 60度。展開図は半径10.8cm、中心角60度のおうぎ形。点AからA'までの最短距離(直線)は、2辺が10.8cmで頂角60度の二等辺三角形、すなわち正三角形の1辺となる。よって10.8cm."
155
+ },
156
+ {
157
+ "answer_id": "MA07_023",
158
+ "answer": "2cm",
159
+ "question_hint": "【立体図形】円すいに巻きつけた糸の長さが母線と一致する場合の、底面の半径を求める問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "【設定数値】母線12cmの円すい。底面の点Aから側面に1周糸を巻いたところ、最短距離が12cm(母線と同じ)になった。【計算ロジック】展開図上で半径12cmの2辺と、結んだ直線(12cm)で正三角形ができるため、中心角は60度。 60 = 360 × (半径/12) より、半径 = 2cm."
162
+ },
163
+ {
164
+ "answer_id": "MA07_024",
165
+ "answer": "41.04平方センチメートル",
166
+ "question_hint": "【立体図形】円すいの展開図において、最短距離の糸によって分割された下側の側面積を求める問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】母線12cm、底面半径3cmの円すい。最短距離の糸を1周巻く。【計算ロジック】中心角 = 360 × (3/12) = 90度。展開図は直角二等辺三角形。側面積全体 = 12×3×3.14 = 113.04。糸より上の面積(おうぎ形内の直角二等辺三角形)= 12×12÷2 = 72。糸より下の面積 = 側面積全体のおうぎ形 - 直角二等辺三角形 = (12×12×3.14×90/360) - (12×12÷2) = 113.04 - 72 = 41.04."
169
+ },
170
+ {
171
+ "answer_id": "MA07_025",
172
+ "answer": "あ:28cm、い:12cm、う:16cm",
173
+ "question_hint": "【立体図形】水そう内に置かれた2つの直方体と水位変化グラフから、水そうの各部分の長さを算出する問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "【設定数値】高さ20cmの水そうに、高さ12cm・幅12cmの直方体と、高さ4cm・幅4cmの直方体が置かれている。グラフより 0-3分で4cm、3-17分で12cm、17-37分で20cmに到達。【計算ロジック】「1分間に入る水の量を1」とし、正面から見た面積比で解く。各区間の底面積と高さの関係から、相似や差を利用して あ(全体の横)、い(右の隙間)、う(左の隙間)を特定する."
176
+ },
177
+ {
178
+ "answer_id": "MA07_026",
179
+ "answer": "20.41立方センチメートル",
180
+ "question_hint": "【立体図形】大小2つの半円と長方形を組み合わせた展開図から、組み立て後の立体の体積を求める問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "【設定数値】半径1cm・高さ1cmの円柱の半分と、半径2cm・高さ3cmの円柱の半分をくっつけた形の展開図。【計算ロジック】(1×1×3.14×1 ÷ 2) + (2×2×3.14×3 ÷ 2) = (0.5 + 6) × 3.14 = 6.5 × 3.14 = 20.41."
183
+ },
184
+ {
185
+ "answer_id": "MA07_027",
186
+ "answer": "6280立方センチメートル",
187
+ "question_hint": "【立体図形】立方体を1つの辺を軸として回転させたときにできる立体の体積を求める問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "【設定数値】1辺10cmの立方体。1つの辺ABを軸にして1回転させる。【計算ロジック】軸から最も遠い点は対角線AC。対角線AC = √(10^2+10^2)だが、半径の2乗(AC^2)が 200であること(10×10×2)を利用。回転体は半径AC、高さ10cmの円柱になる。体積 = 200 × 3.14 × 10 = 6280."
190
+ },
191
+ {
192
+ "answer_id": "MA07_028",
193
+ "answer": "264個",
194
+ "question_hint": "【立体図形】直方体の積み木を組み合わせて作った立方体の表面にペンキを塗ったとき、色が塗られた積み木の個数を求める問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "【設定数値】2.4cm×3.6cm×2.7cmの積み木を並べて最小の立方体を作る(1辺21.6cm)。縦9個、横6個、高さ8個並ぶ。【計算ロジック】全個数は 9×6×8 = 432個。内側の「塗られていない」個数は、各辺から2個ずつ引いた 7×4×6 = 168個。塗られている個数 = 432 - 168 = 264個."
197
+ },
198
+ {
199
+ "answer_id": "MA07_029",
200
+ "answer": "44立方センチメートル",
201
+ "question_hint": "【立体図形】4x4x4の立方体から、特定のパターンで小立方体をくり抜いたあとの体積を求める問題。",
202
+ "difficulty": "応用",
203
+ "source_context": "【設定数値】1辺4個(計64個)の立方体。正面から見て四隅に近い部分を貫通させてくり抜く。図解より1段目2個、2段目8個、3段目8個、4段目2個の計20個をくり抜いた設定。【計算ロジック】残りの体積 = 64 - 20 = 44."
204
+ },
205
+ {
206
+ "answer_id": "MA07_030",
207
+ "answer": "16個",
208
+ "question_hint": "【立体図形】4x4x4の立方体を、3つの頂点を通る平面で��断したときに切断される小立方体の個数を求める問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "【設定数値】小立方体64個でできた大立方体。特定の3点(底面1辺の両端と、対面の辺の中点など)を通る平面で切る。【計算ロジック】各段の断面の線をトレースし、線が通る小立方体を数え上げる。このケースでは合計16個となる."
211
+ },
212
+ {
213
+ "answer_id": "MA07_031",
214
+ "answer": "50.24立方センチメートル",
215
+ "question_hint": "【立体図形】L字型に近い複数の正方形を組み合わせた図形を、1つの辺を軸に回転させてできる体積を求める問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "【設定数値】1cmの正方形7個を「凹」の字のように並べた図形(底辺3cm、中央が抜けている)。【計算ロジック】複数の円柱の和から、重なりや空洞分を引く。半径3の円柱、半径2の円柱などの組み合わせを計算し、合計が 16×3.14 = 50.24 となる."
218
+ },
219
+ {
220
+ "answer_id": "MA07_032",
221
+ "answer": "256/3 平方センチメートル",
222
+ "question_hint": "【立体図形】直方体に点光源から光を当てた際にできる影の面積を、相似比を用いて求める問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】8×6×高さ4の直方体。頂点Dの6cm真上に電球Pがある。【計算ロジック】光の広がりをピラミッド状の相似で捉える。影の全体の底面(光源からの投影)は、相似比 6:(6+4)=3:5 より、横 8×(5/3)、奥行 6×(5/3) の長方形。影の面積 = 全体長方形 - 直方体の底面積 = (40/3 × 10) - 48 = 256/3."
225
+ },
226
+ {
227
+ "answer_id": "MA07_033",
228
+ "answer": "11種類",
229
+ "question_hint": "【立体図形】立方体の展開図として考えられるパターンの総数を答える問題。",
230
+ "difficulty": "基本",
231
+ "source_context": "【知識】立方体の展開図のパターンを分類。 [1-4-1]型が6種、[1-3-2]型が3種、[2-2-2]型が1種、[3-3]型が1種。合計11種類."
232
+ },
233
+ {
234
+ "answer_id": "MA07_034",
235
+ "answer": "4.5cm",
236
+ "question_hint": "【立体図形】複雑な容器(三角柱をカットした形)の、正立時と逆立時の水深の関係から特定の長さを求める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【設定数値】直方体(底面積2)と三角柱(底面積1)がつながった容器。逆立させたときの全体の高さが15.5cm。三角柱の高さ2とすると、直方体部分の空気の高さ1を求めさせる問題。【計算ロジック】水が入っていない部分の高さの合計から逆算。1+2+2=15.5 より、1=4.5cm."
239
+ },
240
+ {
241
+ "answer_id": "MA07_035",
242
+ "answer": "4.5L",
243
+ "question_hint": "【立体図形】段差のある水そうへの給水において、グラフから給水速度(毎分何Lか)を求める問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "【設定数値】水そうの下部(30×30×15)が3分で満たされた。【計算ロジック】容積 = 30×30×15 = 13500立方センチメートル。これを3分で割る。 13500÷3 = 4500立方センチメートル/分。Lに直すと 4.5L/分."
246
+ },
247
+ {
248
+ "answer_id": "MA07_036",
249
+ "answer": "57分後",
250
+ "question_hint": "【立体図形】給水と排水を行う水そうの、水位変化グラフから水がなくなる時刻を算出する問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "【設定数値】10分まで管A、30分まで管A+B、30分から管Cのみ。30分時点の量は1200L、48分で400Lに減少。【計算ロジック】排水(管C)による減少速度は (1200-400)÷(48-30) = 800÷18。残り400Lをなくすには 400 ÷ (800/18) = 9分かかる。よって 48+9 = 57分後."
253
+ },
254
+ {
255
+ "answer_id": "MA07_037",
256
+ "answer": "1056立方センチメートル",
257
+ "question_hint": "【立体図形】台形を底面とする柱体(四角柱)の体積を計算する問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "【設定数値】底面が上底6cm、下底16cm、高さ4cmの台形。柱体の長さ(高さ)が24cm。【計算ロジック】底面積 = (6+16)×4÷2 = 44。体積 = 44×24 = 1056."
260
+ },
261
+ {
262
+ "answer_id": "MA07_038",
263
+ "answer": "14dL",
264
+ "question_hint": "【立体図形】板の厚みがある直方体容器の、容積(内のり)を計算し単位換算する問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "【設定数値】外寸が 縦37cm、横22cm、高さ21cm。板の厚さが1cm。蓋はない。※底と側面のみ厚みがある設定。【計算ロジック】内のり寸法:縦 37-2=35、横 22-2=20、高さ 21-1=20。容積 = 35×20×20 = 14000立方センチメートル。dLに直すと 140dL(100立方センチメートル=1dL)。"
267
+ },
268
+ {
269
+ "answer_id": "MA07_039",
270
+ "answer": "150.72立方センチメートル",
271
+ "question_hint": "【立体図形】斜めになった円柱(斜柱)の体積を、垂直な高さを用いて計算する問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "【設定数値】底面の半径2cmの円柱が斜めに傾いている。垂直な高さは12cm。【計算ロジック】立体の体積は(底面積×垂直な高さ)で求められる。 2×2×3.14 × 12 = 150.72."
274
+ },
275
+ {
276
+ "answer_id": "MA07_040",
277
+ "answer": "34分後",
278
+ "question_hint": "【立体図形/速さ】池の周囲の遊歩道に設置された信号(青・赤の周期)を考慮し、一周して戻る時間を求める問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】1周2700m。Aさんは分速90m。900m地点に2分毎に変わる信号P、1800m地点に3分毎に変わる信号Q。9時出発。【計算ロジック】P到着は10分後。P周期(4分)で10分は赤。2分待ち12分に出発。Q到着は (1800-900)÷90 = 10分後、つまり出発から22分後。Q周期(6分)で22分は赤(22÷6=3余り4)。2分待ち24分に出発。残り900mを10分で進み、出発から34分後に戻る."
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA08.json ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA08_001",
4
+ "answer": "8通り",
5
+ "question_hint": "【算数】場合の数。5枚のコインを並べ、特定の条件(3枚以上表が連続する)を満たす並べ方の総数を求める問題。",
6
+ "difficulty": "標準",
7
+ "source_context": "【設定】5枚のコインを横一列に並べる。【条件】3枚以上表が連続する箇所がある並べ方。【数え上げロジック】①3枚のみ表が連続:(表表表××)が2通り、(×表表表×)が2通り、(××表表表)が1通りの計5通り。②4枚表が連続:(表表表表×)と(×表表表表)の2通り。③5枚全て表:1通り。合計 5+2+1=8通り。"
8
+ },
9
+ {
10
+ "answer_id": "MA08_002",
11
+ "answer": "BとE",
12
+ "question_hint": "【算数】論理パズル。5人の発言内容から、正直者と嘘つきを特定する問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定】A〜Eの5人のうち2人だけが本当のことを言っている。発言内容:A「私は本当」、B「Cは嘘、Eは本当」、C「Eは嘘」、D「Aは本当」、E「私は本当」。【推論】AとDは同じ内容なので、共に正直か共に嘘。仮にADが正直なら他3人は嘘だが、BとCは矛盾するため一方が必ず正直になる。よってADは嘘。残る1人の正直者はBかC。その場合Eは必ず正直になる。Eの発言が正しければCの「Eは嘘」は嘘となり、Cは嘘つき。消去法で正直者はBとEとなる。"
15
+ },
16
+ {
17
+ "answer_id": "MA08_003",
18
+ "answer": "C, D, B, A, E",
19
+ "question_hint": "【算数】論理パズル。順位当て。5人の発言が「1つは正しく1つは間違い」という条件から正しい順位を導く問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "【設定】A〜Eの5人が100m走。各人2つの発言をし、一方は正しく一方は間違い。発言:A(自4位,D1位)、B(自2位,E5位)、C(自5位,D2位)、D(自2位,B4位)、E(自4位,C1位)。【推論】BとCの発言が全て正しいと仮定し矛盾を検証。正直者はBとCで、嘘つきはA,D,E。Bの「E5位」を真、Cの「D2位」を真とすると、Dの「自2位」は真(よってB4位は嘘)、Aの「自4位」は真(D1位は嘘)、Eの「C1位」は真となる。確定順位:1位C、2位D、3位B、4位A、5位E。"
22
+ },
23
+ {
24
+ "answer_id": "MA08_004",
25
+ "answer": "15通り",
26
+ "question_hint": "【算数】場合の数。サイコロの目(偶数・奇数)に応じた盤面移動のシミュレーション。特定の場所に止まる目の出方を求める問題。",
27
+ "difficulty": "応用",
28
+ "source_context": "【設定】A〜Gの7マス。Dに石を置く。サイコロを3回振る。奇数=左、偶数=右へ出た目の数だけ移動。端(AやG)を超えたら折り返す。【条件】3回後にGに止まる出方の数。【ロジック】移動先の計算。1回目後の位置、2回目後の位置を順に辿る。合計15通りの組み合わせ(2+3+2+3+2+3など)が存在する。"
29
+ },
30
+ {
31
+ "answer_id": "MA08_005",
32
+ "answer": "8通り",
33
+ "question_hint": "【算数】場合の数。サイコロの目に応じた円周上の点移動。2回振った後の特定の到達地点に至る目の出方を数える問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定】円周上にA〜Fの6点。Pは最初A。サイコロ規則:1か4ならその数だけ時計回り。2か5ならその数だけ反時計回り。3か6なら移動しない。【条件】2回後にPがFにある出方。【組み合わせ】(1回目,2回目)のペア:(1,2), (1,4), (2,1), (2,5), (4,1), (4,5), (5,2), (5,4)の合計8通り。"
36
+ },
37
+ {
38
+ "answer_id": "MA08_006",
39
+ "answer": "40通り",
40
+ "question_hint": "【算数】場合の数。サイコロの目に応じた円周上の点移動。3回振った後の開始地点への帰還パターンの総数を求める問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "【設定】円周上にA〜Fの6点。Pは最初A。規則は前問(MA08_005)と同じ。3回後にAにある出方。【数え上げ】3回目に何が出てAに戻るかで分類。3回目が1・5の時(直前にF):8通り×2、3回目が2・4の時(直前にC):8通り×2、3回目が3・6の時(直前にA):4通り×2。合計 16+16+8=40通り。"
43
+ },
44
+ {
45
+ "answer_id": "MA08_007",
46
+ "answer": "(1,4), (1,5), (2,3), (3,2), (4,6), (5,6), (6,6)",
47
+ "answer_id_backup": "MA08_007",
48
+ "answer": "7通り",
49
+ "question_hint": "【算数】場合の数。サイコロの目とカードの裏返し操作。2回の操作で特定のカード状態になる目の出方を列挙する問題。",
50
+ "difficulty": "応用",
51
+ "source_context": "【設定】カード3枚(表:1,2,3 / 裏:6,5,4)。規則:サイコロの目がカード表面の数と同じならその1枚を裏返す。違うなら3枚全てを裏返す���2回連続操作。【条件】最後が(1,5,4)になる出方。【ロジック】初期状態(1,2,3)から1回目操作後の状態(6,2,3)等を経て検討。出方は(1,4), (1,5), (2,3), (3,2), (4,6), (5,6), (6,6)の7通り。"
52
+ },
53
+ {
54
+ "answer_id": "MA08_008",
55
+ "answer": "12通り",
56
+ "question_hint": "【算数】場合の数。サイコロの目とカードの裏返し操作。2回の操作で初期状態に戻る全パターンの総数を求める問題。",
57
+ "difficulty": "応用",
58
+ "source_context": "【設定】前問(MA08_007)と同じカードと操作。2回後に(1,2,3)に戻る出方の数。【数え上げ】パターン1:同じ1枚のカードを2回裏返す(1,6など)で3通り。パターン2:3枚全て裏返す操作を2回行う。1回目に(4,5,6)の3通り、2回目に(1,2,3)の3通りが出るため3×3=9通り。合計 3+9=12通り。"
59
+ },
60
+ {
61
+ "answer_id": "MA08_009",
62
+ "answer": "B:4、C:7、D:6、E:2、F:5、G:3、H:1",
63
+ "question_hint": "【算数】論理パズル。円卓の座席配置。8人の証言から全員の席番号を特定する問題。",
64
+ "difficulty": "標準",
65
+ "source_context": "【設定】A以外の1〜7番の席にB〜Hが座る。証言:DはAの2つ隣、EはDの真正面、HはEの左隣、FはHの真正面、BとGは隣同士、BはEの隣ではない、Cは残り。【推論】Dが6番と仮定すると、Eは真正面の2番。HはEの左隣の1番。FはHの真正面の5番。BとGが隣り合いBがEの隣(1,3)でないことからB=4,G=3。残るC=7となる。"
66
+ },
67
+ {
68
+ "answer_id": "MA08_010",
69
+ "answer": "1番と4番",
70
+ "question_hint": "【算数】論理パズル。テストの正解当て。3人の解答と得点から、正しい「○」の設問番号を特定する問題。",
71
+ "difficulty": "標準",
72
+ "source_context": "【設定】5問(1問1点)。まき(X,O,X,O,O)4点、ゆい(X,X,X,O,X)4点、えりか(O,O,O,X,X)2点。【推論】まきとゆいが同点。2,3,4番が共通。もし2,3,4が正解なら、1,5番のどちらかが正解になるはず。検証の結果、2番X、3番X、4番Oが正解と判明。えりかの得点から1番O、5番Xが確定。よって正解が○なのは1番と4番。"
73
+ },
74
+ {
75
+ "answer_id": "MA08_011",
76
+ "answer": "45通り",
77
+ "question_hint": "【算数】場合の数。最短経路の計算。地点間の道順の総数を積の法則を用いて求める問題。",
78
+ "difficulty": "基本",
79
+ "source_context": "【設定】A町からB町を経由してC町へ行く最短経路。A-B間は縦2×横4のグリッド、B-C間は縦2×横1のグリッド。【計算】AからBの道順は合流地点の和で15通り。BからCの道順は3通り。全体は積の法則により 15 × 3 = 45通り。"
80
+ },
81
+ {
82
+ "answer_id": "MA08_012",
83
+ "answer": "18個",
84
+ "question_hint": "【算数】場合の数。図形内の四角形の数え上げ。グリッドの線を選択する組み合わせから求める問題。",
85
+ "difficulty": "標準",
86
+ "source_context": "【設定】縦線4本、横線3本で構成されたグリッド。この中にある四角形の数。【計算】縦4本から2本選ぶ方法は (4×3)/2 = 6通り。横3本から2本選ぶ方法は (3×2)/2 = 3通り。四角形の総数は 6 × 3 = 18個。"
87
+ },
88
+ {
89
+ "answer_id": "MA08_013",
90
+ "answer": "3種類",
91
+ "question_hint": "【算数】場合の数。円周上の等分点から三角形を作る組み合わせ。回転・裏返しで重なるものを除いた種類数を求める問題。",
92
+ "difficulty": "標準",
93
+ "source_context": "【設定】円周を6等分した点から3点を選ぶ。回転・裏返しで重なるものは同一視する。【ロジック】三角形の3辺の長さの和が6になる整数の組み合わせを考える。各辺の長さを弧の数で表すと、(1,1,4), (1,2,3), (2,2,2)の3組。よって三角形は3種類。"
94
+ },
95
+ {
96
+ "answer_id": "MA08_014",
97
+ "answer": "8種類",
98
+ "question_hint": "【算数】場合の数。円周上の等分点から三角形を作る組み合わせ。10等分された点を用いた種類数を求める問題。",
99
+ "difficulty": "応用",
100
+ "source_context": "【設定】円周を10等分した点から3点を選ぶ。条件は前問(MA08_013)と同じ。3辺の長さの和が10になる組み合わせを列挙する。(1,1,8), (1,2,7), (1,3,6), (1,4,5), (2,2,6), (2,3,5), (2,4,4), (3,3,4)の合計8通り。"
101
+ },
102
+ {
103
+ "answer_id": "MA08_015",
104
+ "answer": "1個, 4個, 7個, 10個",
105
+ "question_hint": "【算数】場合の数。不定方程式の解。2つの商品の代金の合計から、考えられる個数のパターンを全て求める問題。",
106
+ "difficulty": "標準",
107
+ "source_context": "【設定】みかん40円、りんご60円。代金合計460円。買ったみかんの個数の全パターン。【ロジック】みかん最大個数は(460-60)/40 = 10個(���んご1個)。40と60の最小公倍数120円分(みかん3個=りんご2個)を交換。表を作成し、みかん10, 7, 4, 1の4パターンを導く。"
108
+ },
109
+ {
110
+ "answer_id": "MA08_016",
111
+ "answer": "6通り",
112
+ "question_hint": "【算数】場合の数。不定方程式の解(制約付き)。代金合計と「各3個以上」という条件を満たす買い方の総数を求める問題。",
113
+ "difficulty": "標準",
114
+ "source_context": "【設定】りんご120円、みかん80円。代金合計2000円。条件:どちらも3個以上買う。【計算】最小公倍数240円=りんご2個分=みかん3個分。りんご14個・みかん4個のペアから、りんごを2個減らしみかんを3個増やす。条件(3個以上)を満たすのは、(14,4), (12,7), (10,10), (8,13), (6,16), (4,19)の6通り。"
115
+ },
116
+ {
117
+ "answer_id": "MA08_017",
118
+ "answer": "10個",
119
+ "question_hint": "【算数】場合の数。数字カードによる整数作成。特定の倍数(5の倍数)になる組み合わせを数える問題。",
120
+ "difficulty": "基本",
121
+ "source_context": "【設定】0, 1, 3, 5 の4枚から3枚選んで3桁の整数を作る。【条件】5の倍数(一の位が0か5)。【数え上げ】①一の位0:百の位3通り、十の位2通りの3×2=6個。②一の位5:百の位2通り(0は不可)、十の位2通りの2×2=4個。合計 6 + 4 = 10個。"
122
+ },
123
+ {
124
+ "answer_id": "MA08_018",
125
+ "answer": "48通り",
126
+ "question_hint": "【算数】場合の数。数字カードによる3桁の整数作成。0を含むカード群から作れる全パターンの総数を求める問題。",
127
+ "difficulty": "基本",
128
+ "source_context": "【設定】0, 1, 2, 3, 4 の5枚から異なる3枚選んで3桁の整数を作る。【計算】百の位は0以外の4通り。十の位は残り(0を含む)4通り。一の位は残りの3通り。よって 4 × 4 × 3 = 48通り。"
129
+ },
130
+ {
131
+ "answer_id": "MA08_019",
132
+ "answer": "11種類",
133
+ "question_hint": "【算数】知識・数え上げ。立方体の展開図のパターンの総数を問う問題。",
134
+ "difficulty": "基本",
135
+ "source_context": "【知識カプセル】立方体の展開図は全部で11種類存在する。分類は[1-4-1]型が6種、[1-3-2]型が3種、[2-2-2]型が1種、[3-3]型が1種である。"
136
+ },
137
+ {
138
+ "answer_id": "MA08_020",
139
+ "answer": "6種類",
140
+ "question_hint": "【算数】場合の数。立方体の展開図の分類。特定の型(1-4-1型)に属する展開図の数を答える問題。",
141
+ "difficulty": "標準",
142
+ "source_context": "【知識カプセル】立方体の展開図11種類のうち、真ん中の4個が一直線に並ぶ「1-4-1」型は、回転や反転で重なるものを除くと全部で6種類ある。"
143
+ },
144
+ {
145
+ "answer_id": "MA08_021",
146
+ "answer": "96 と 105",
147
+ "question_hint": "【算数】数の性質・場合の数。各位の和に関する条件式を満たす整数の全パターンを求める問題。",
148
+ "difficulty": "標準",
149
+ "source_context": "【設定】□+[□]=111([□]は各位の和)。【推論】2桁の場合:(10A+B)+(A+B)=11A+2B=111。A=9の時B=6。よって96。3桁の場合:(100A+10B+C)+(A+B+C)=101A+11B+2C=111。A=1の時、11B+2C=10。B=0,C=5。よって105。答えは96と105。"
150
+ },
151
+ {
152
+ "answer_id": "MA08_022",
153
+ "answer": "5個",
154
+ "question_hint": "【算数】場合の数。各位の和が特定の数になる3桁の整数のうち、5の倍数に限定して数える問題。",
155
+ "difficulty": "標準",
156
+ "source_context": "【設定】各位の和が5になる3桁の整数。【条件】5の倍数(一の位が0か5)。【組み合わせ】一の位0:(5,0,0)の500、(4,1,0)の410・140、(3,2,0)の320・230。一の位5:なし(百の位に1以上必要なため)。合計 1+2+2 = 5個。"
157
+ },
158
+ {
159
+ "answer_id": "MA08_023",
160
+ "answer": "3720",
161
+ "question_hint": "【算数】場合の数・計算。条件を満たす全ての整数の総和を求める問題(数え上げの後に合計を算出)。",
162
+ "difficulty": "標準",
163
+ "source_context": "【設定】各位の和が5になる3桁の整数の全パターンの和。【列挙】500, 410, 401, 140, 104, 320, 302, 230, 203, 311, 131, 113, 221, 212, 122。【計算】これら15個を全て足し合わせると3720になる。"
164
+ },
165
+ {
166
+ "answer_id": "MA08_024",
167
+ "answer": "900枚",
168
+ "question_hint": "【算数】規則性・場合の数。タイルの配列における黒タイルの数から、白タイルの数を逆算する問題。",
169
+ "difficulty": "基本",
170
+ "source_context": "【設定】正方形の対角線上に黒タイルを並べる。【条件】黒タイルが61枚。【ロジック】対角線が交差する中心タイル1枚を共有する場合、(1辺×2 - 1) = 黒タイル数。よって 2x - 1 = 61 より x = 31。全体のタイル数は 31 × 31 = 961枚。���タイルは 961 - 61 = 900枚。"
171
+ },
172
+ {
173
+ "answer_id": "MA08_025",
174
+ "answer": "324通り",
175
+ "question_hint": "【算数】場合の数。サイコロによる4桁の整数作成と、倍数条件(4の倍数)の判定方法を用いた問題。",
176
+ "difficulty": "標準",
177
+ "source_context": "【設定】1〜6のサイコロを4回振る(順に千、百、十、一の位)。【条件】4の倍数。【ロジック】下2桁が4の倍数。1〜6の範囲で可能な下2桁は(12,16,24,32,36,44,52,56,64)の9通り。千・百の位は各6通り自由。合計 6 × 6 × 9 = 324通り。"
178
+ },
179
+ {
180
+ "answer_id": "MA08_026",
181
+ "answer": "5番目",
182
+ "question_hint": "【算数】文章題・推論。計算間違い(記号の見落とし)の差分から、見落とした箇所の番号を特定する問題。",
183
+ "difficulty": "標準",
184
+ "source_context": "【設定】15+16+...+29の計算。1箇所の「+」を見落とし4桁として計算。本来330が2211になった。【ロジック】差額は 2211 - 330 = 1881。見落とした左の数をXとすると、(100X + (X+1)) - (X + (X+1)) = 99X。99X = 1881 より X = 19。19は左から5番目の数。よって5番目の「+」を見落とした。"
185
+ },
186
+ {
187
+ "answer_id": "MA08_027",
188
+ "answer": "36",
189
+ "question_hint": "【算数】魔方陣。3×3のマス目で、縦横斜めの積が全て等しくなる条件から未知の数値を求める問題。",
190
+ "difficulty": "標準",
191
+ "source_context": "【設定】最下段が(18, 1, 1.5)、中心が3、左上が6。【ロジック】斜めの積(6×3×1.5)は27。中心右(エ)は、27÷(中心左×3) ではなく、最下段左端(オ)=18、右上(イ)=0.5より算出。右端列は(0.5, エ, 1.5)。積27になるためには エ = 27 ÷ (0.5 × 1.5) = 36。"
192
+ },
193
+ {
194
+ "answer_id": "MA08_028",
195
+ "answer": "6",
196
+ "question_hint": "【算数】魔方陣・推論。三角形の辺上の合計が等しくなる条件から、頂点に入る最大値を求める問題。",
197
+ "difficulty": "標準",
198
+ "source_context": "【設定】三角形の3頂点(ア,イ,ウ)、各辺の中央に(30, 31, 35)。辺の3つの数の和が全て等しい。【ロジック】左辺(ア+30+イ)=右辺(ア+35+ウ)よりイはウより5大きい。下辺(イ+31+ウ)も等しいことから関係式を整理。最小値を1とすると、最大値(イ)は1+5=6。"
199
+ },
200
+ {
201
+ "answer_id": "MA08_029",
202
+ "answer": "55通り",
203
+ "question_hint": "【算数】場合の数。3つのサイコロの目の大小関係に関する組み合わせ数を求める問題。",
204
+ "difficulty": "標準",
205
+ "source_context": "【設定】赤・青・黄の3つのサイコロを振る。【条件】赤の目が他の2つより大きい。【計算】赤がnの時、青黄は1〜(n-1)の目の出方。Σ(n-1)² を計算。赤2:1²=1、赤3:2²=4、赤4:3²=9、赤5:4²=16、赤6:5²=25。合計 1+4+9+16+25 = 55通り。"
206
+ },
207
+ {
208
+ "answer_id": "MA08_030",
209
+ "answer": "25通り",
210
+ "question_hint": "【算数】場合の数。3つのサイコロの目の積に関する関係(2つの積=残り1つ)を満たす全パターンの総数を求める問題。",
211
+ "difficulty": "標準",
212
+ "source_context": "【設定】3つのサイコロの目(A,B,C)。【条件】2つの積が残り1つと同じ。【列挙】積1:(1,1,1)の1通り。積2:(1,2,2)の3通り。積3:(1,3,3)の3通り。積4:(1,4,4)の3、(2,2,4)の3で6通り。積5:(1,5,5)の3通り。積6:(1,6,6)の3、(2,3,6)の6で9通り。合計 1+3+3+6+3+9 = 25通り。"
213
+ },
214
+ {
215
+ "answer_id": "MA08_031",
216
+ "answer": "9個",
217
+ "question_hint": "【算数】図形の切断。3x3x3の立方体ブロックを平面で切断した際、切られる小立方体の個数を数える問題。",
218
+ "difficulty": "標準",
219
+ "source_context": "【設定】27個(3x3x3)の立方体を積む。3点を通る平面で切断。切断面が正三角形になる場合。【カウント】各段の上面・底面の切断線を把握。上段5個、中段3個、下段1個。合計 5+3+1 = 9個。"
220
+ },
221
+ {
222
+ "answer_id": "MA08_032",
223
+ "answer": "16個",
224
+ "question_hint": "【算数】図形の切断。4x4x4の立方体ブロックを平面で切断した際の小立方体の個数を求める応用問題。",
225
+ "difficulty": "応用",
226
+ "source_context": "【設定】64個(4x4x4)の小立方体。3点A,B,Cを通る平面で切断。【カウント】各段の境界を分析。4段それぞれで切られる個数を合計すると16個になる。"
227
+ },
228
+ {
229
+ "answer_id": "MA08_033",
230
+ "answer": "5本",
231
+ "question_hint": "【算数】図形の性質・対称性。正五角形の線対称の軸の総数を答える問題。",
232
+ "difficulty": "基本",
233
+ "source_context": "【知識カプセル】正多角形の線対称の軸の本数は、その頂点(または辺)の数と等しくなる。正五角形の場合は5本である。"
234
+ },
235
+ {
236
+ "answer_id": "MA08_034",
237
+ "answer": "6本",
238
+ "question_hint": "【算数】図形の性質・対称性。正六角形の線対称の軸の総数を答える問題。",
239
+ "difficulty": "基本",
240
+ "source_context": "【知識カプセル】正多角形の線対称の軸の本数は、その頂点の数と等しくなる。正六角形の場合は6本である。"
241
+ },
242
+ {
243
+ "answer_id": "MA08_035",
244
+ "answer": "正方形、正六角形、正八角形",
245
+ "question_hint": "【算数】図形の性質・対称性。点対称な正多角形に共通する辺の数の特徴を理解し、該当する図形を選ぶ問題。",
246
+ "difficulty": "標準",
247
+ "source_context": "【知識カプセル】正多角形のうち、点対称(180度回転で重なる)なものは、辺の数が「偶数」のものに限られる。正三角形や正五角形は点対称ではない。"
248
+ },
249
+ {
250
+ "answer_id": "MA08_036",
251
+ "answer": "5",
252
+ "question_hint": "【算数】論理パズル・カード。提示された情報の断片から、選ばれなかったカードの数値を当てる問題。",
253
+ "difficulty": "標準",
254
+ "source_context": "【設定】1〜5のカード。A,Bが2枚ずつ持ち、大きい方を見せる。お互いに相手の持っていない1枚を確実に当てた。【ロジック】もし5があれば見せた方が5になり、相手に5があることがバレる。2人とも5を見せず、かつ相手の未提示カードを当てられたということは、2人とも5を持っていない状況。残る1〜4の4枚を2枚ずつ分け持っている。よって余ったのは5。"
255
+ },
256
+ {
257
+ "answer_id": "MA08_037",
258
+ "answer": "(4, 6, 5), (5, 6, 4)",
259
+ "question_hint": "【算数】場合の数・計算。サイコロの目に応じた特殊な得点計算から、特定の合計点になる目の組み合わせを2通り求める問題。",
260
+ "difficulty": "標準",
261
+ "source_context": "【設定】さいころ3回(A,B,C)。ルール:1・3回目(A,C)は奇数×2、偶数×1点。2回目(B)は偶数×2、奇数×1点。【条件】合計26点。【ロジック】最大は(5,6,5)の32点。ここから6点減らす。Aの5点を4点(-6点)にするパターン(4,6,5)と、Cの5点を4点(-6点)にするパターン(5,6,4)が成立する。"
262
+ },
263
+ {
264
+ "answer_id": "MA08_038",
265
+ "answer": "44個",
266
+ "question_hint": "【算数】空間図形・数え上げ。立方体ブロックのくりぬきにおいて、残る小立方体の個数を計算する問題。",
267
+ "difficulty": "標準",
268
+ "source_context": "【設定】4x4x4の立方体。特定のブロックを反対側までくりぬく。【数え上げ】上から1段目:中央2個、2段目:8個、3段目:8個、4段目:2個。合計20個をくりぬく。残りは 64 - 20 = 44個。体積は44cm³。"
269
+ },
270
+ {
271
+ "answer_id": "MA08_039",
272
+ "answer": "ウ",
273
+ "question_hint": "【算数】空間図形・展開図。立方体の展開図において、表面に描かれた文字の向きと位置関係から正しい図を選択する問題。",
274
+ "difficulty": "標準",
275
+ "source_context": "【設定】立方体に3文字。展開図ア〜オから選択。【ロジック】頂点の重なりを分析し、文字の相対的な向きを確認。「農」に対し、ア・イ・エ・オは文字の縦横の向きが実物と矛盾する。重なりと文字の方向が全て一致するのはウ。"
276
+ },
277
+ {
278
+ "answer_id": "MA08_040",
279
+ "answer": "8通り",
280
+ "question_hint": "【算数】場合の数。サイコロによる移動。2回の試行で特定のマスに到達する目の組み合わせの総数を求める問題。",
281
+ "difficulty": "基本",
282
+ "source_context": "【設定】円周上にA〜Fの6点。Pは最初A。1か4なら時計回り、2か5なら反時計回り、3か6なら移動しない。2回振った後にFにいる出方。【カウント】(1,2), (1,4), (2,1), (2,5), (4,1), (4,5), (5,2), (5,4)の全8通りを数え上げる。"
283
+ }
284
+ ]
V1.8.1/knowledge/v1.8.1/math/MA09.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA09_001",
4
+ "answer": "5.6%",
5
+ "question_hint": "【算数】グラフ・表(面積図)。2つの食塩水を混ぜた後の濃度を面積図を用いて求める問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】5%の食塩水200gと6%の食塩水300gを混ぜる。【計算ロジック】面積図の縦を濃度、横を量とする。合計の食塩の重さは (5 × 200) + (6 × 300) = 2800。全体の量は 200 + 300 = 500g。平均の高さ(濃度)は 2800 ÷ 500 = 5.6%となる。"
8
+ },
9
+ {
10
+ "answer_id": "MA09_002",
11
+ "answer": "360g",
12
+ "question_hint": "【算数】グラフ・表(天びん図)。濃度と食塩水の量が示された状態から、混ぜるべき食塩水の量を求める問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定数値】6%の食塩水200gに20%の食塩水を混ぜて、濃度を15%にする。【計算ロジック】天びん図の支点を15%に置く。腕の長さの比は (15-6) : (20-15) = 9 : 5。おもりの重さ(食塩水の量)の比は逆比の 5 : 9。200g : X = 5 : 9 より、X = 200 × 9 ÷ 5 = 360g。"
15
+ },
16
+ {
17
+ "answer_id": "MA09_003",
18
+ "answer": "100g",
19
+ "question_hint": "【算数】グラフ・表(天びん図)。食塩水に水を加えた際の濃度変化から、加えた水の量を求める問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "【設定数値】8%の食塩水300gに水を加えて6%にする。水は0%と考える。【計算ロジック】天びん図の腕の長さの比は (6-0) : (8-6) = 6 : 2 = 3 : 1。量の比は逆比の 1 : 3。求める水の量は 300 ÷ 3 = 100g。"
22
+ },
23
+ {
24
+ "answer_id": "MA09_004",
25
+ "answer": "10日",
26
+ "question_hint": "【算数】グラフ・表(面積図)。仕事をする人数が途中で変化する場合の、完了までの日数を求める問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "【設定数値】5人ですると20日かかる仕事(全仕事量100)。最初の5日間は4人で働き、残りを8人でする。【計算ロジック】4人×5日=20の仕事が完了済み。残りは 100 - 20 = 80。80 ÷ 8人 = 10日。"
29
+ },
30
+ {
31
+ "answer_id": "MA09_005",
32
+ "answer": "8日",
33
+ "question_hint": "【算数】グラフ・表(面積図)。機械の台数が変化する状況下での仕事の残り日数を計算する問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】3台で12日かかる仕事(全量36)。最初の6日は2台使い、残りを3台でする。【計算ロジック】2台×6日=12完了。残りは 36 - 12 = 24。24 ÷ 3台 = 8日。"
36
+ },
37
+ {
38
+ "answer_id": "MA09_006",
39
+ "answer": "25分後",
40
+ "question_hint": "【算数】グラフ・表(水深グラフ)。2つの管から給水する水そうにおいて、特定の深さに達する時間をグラフから読み取る問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "【設定数値】深さ50cmの直方体水そう。最初はA管のみ、20分後からB管も併用。グラフの通過点(0,0), (20,20), (30,50)。【条件】水深35cmになる時間は?【計算ロジック】20分以降のグラフの相似比を利用。(50-20) : (35-20) = 30 : 15 = 2 : 1。時間は20分から (30-20) × (1/2) = 5分後。よって 25分後。"
43
+ },
44
+ {
45
+ "answer_id": "MA09_007",
46
+ "answer": "57分後",
47
+ "question_hint": "【算数】グラフ・表(変化のグラフ)。給水と排水を行う水そうの容量変化グラフから、水がなくなる時間を求める問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】給水A・B、排水C。Aのみ10分、B追加20分(計30分時点48L)、A閉じてC開ける。【ロジック】相似な三角形ABCとDECを利用。高さ比 1200 : 400 = 3 : 1 より底辺比 3 : 1。48分から 18 × (1/(3-1)) = 9分後。よって 57分後。"
50
+ },
51
+ {
52
+ "answer_id": "MA09_008",
53
+ "answer": "ア:42, イ:12, ウ:6",
54
+ "question_hint": "【算数】グラフ・表(水深グラフ)。段差のある水そうへの給水において、グラフ上の空白に入る数値(深さ・時間)を求める問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】毎分3L給水。31分で満水(容量93L)。上部寸法(30+20)×50×30=75L。下部=18L。【ロジック】ウ(下部を満たす時間)= 18 ÷ 3 = 6分。イ(下部の深さ)= 18000 ÷ (30×50) = 12cm。ア(全体の深さ)= 12 + 30 = 42cm。"
57
+ },
58
+ {
59
+ "answer_id": "MA09_009",
60
+ "answer": "4.5L",
61
+ "question_hint": "【算数】グラフ・表(変化のグラフ)。水そうへの給水グラフから、1分あたりの給水量を算出する問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】下部30×30×15cmを3分で給水。【ロジック】容積 = 13500cm3。給水速度 = 13500 ÷ 3 = 4500cm3/分 = 4.5L/分���"
64
+ },
65
+ {
66
+ "answer_id": "MA09_010",
67
+ "answer": "15cm",
68
+ "question_hint": "【算数】グラフ・表(変化のグラフ)。水そうの給水グラフと既知の給水速度から、水そうの底面の長さを求める問題。",
69
+ "difficulty": "応用",
70
+ "source_context": "【設定数値】給水速度4.5L/分。9分後に水深35cm(3分後から20cm上昇)。水そう奥行30cm。【ロジック】6分間の給水量 = 4500 × 6 = 27000cm3。底面積 = 27000 ÷ 20 = 1350cm2。底面の横幅 = 1350 ÷ 30 = 45cm。図のx(凸部分の長さ)は 45 - 30 = 15cm。"
71
+ },
72
+ {
73
+ "answer_id": "MA09_011",
74
+ "answer": "ア:12, イ:20",
75
+ "question_hint": "【算数】グラフ・表(水深グラフ)。しきりのある水そうへの給水において、水があふれて移動するタイミングをグラフから求める問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定数値】底面比20:10=2:1。深さ12cmのしきり。18分でしきり左側満水。【ロジック】ア(時間):18分を2:1で分け、21分時点での左側の推移。計算よりア=12。イ(全体の時間):深さ12cmまでの量と全体の比は18:30=3:5。時間は 12 ÷ 3 × 5 = 20分。"
78
+ },
79
+ {
80
+ "answer_id": "MA09_012",
81
+ "answer": "3 : 6 : 4",
82
+ "question_hint": "【算数】グラフ・表(変化のグラフ)。2枚の板で仕切られた容器への給水グラフから、各区画の底面積比を求める問題。",
83
+ "difficulty": "応用",
84
+ "source_context": "【設定数値】アに注ぐ。ア満水まで50秒、ア+イ満水まで125秒、ア+イ+ウ満水まで時間経過。【ロジック】注ぐ速度一定のため時間の比が面積の比。(125-50):50 = 3:2 より(ア+イ):ア=3:2。ア=2, イ=1。次に全体の時間比からア:イ:ウ=3:6:4(出典解説の数値)。"
85
+ },
86
+ {
87
+ "answer_id": "MA09_013",
88
+ "answer": "あ:28, い:12, う:16",
89
+ "question_hint": "【算数】グラフ・表(水位変化)。水そう内に2つの直方体がある状態での給水グラフから、各直方体の幅などを特定する問題。",
90
+ "difficulty": "応用",
91
+ "source_context": "【設定数値】水そう高さ20cm。直方体左(高12幅12),右(高4幅4)。グラフ屈曲点 3分(4cm), 17分(12cm), 37分(20cm)。【ロジック】1分間の給水量を1とする。面積計算で横の比を出す。差の12cmを利用し、計算により あ=28, い=12, う=16を導出。"
92
+ },
93
+ {
94
+ "answer_id": "MA09_014",
95
+ "answer": "4秒後 と 9秒後",
96
+ "question_hint": "【算数】グラフ・表(面積変化)。台形上を動く点がつくる三角形の面積変化グラフから、特定の面積になる時間を求める問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【設定数値】台形ABCD。点PがA→B→Cと動く。三角形PCDの面積推移グラフ。0〜8秒(面積16〜24), 8〜14秒(24〜0)。【条件】面積20cm2になるのは?【ロジック】増え方は秒間1cm2。16から4増えるのは4秒後。減り方は秒間4cm2。24から4減るのは 4÷4=1秒後、よって 8+1=9秒後。"
99
+ },
100
+ {
101
+ "answer_id": "MA09_015",
102
+ "answer": "16秒",
103
+ "question_hint": "【算数】グラフ・表(面積変化)。複雑な図形の周上を動く点と面積の変化グラフから、特定の地点に達する時間を求める問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "【設定数値】角が直角の図形OABCDE。PがO→A→B→C→D→E→Oと動く。三角形OPEの面積グラフ。OA移動に10秒。【ロジック】DE移動に6秒、OA移動に10秒。BC移動はその差 10-6=4秒。点Bに達するのは OA(10秒) + AB(不明)だが、グラフからB到達は 20-4=16秒と特定される。"
106
+ },
107
+ {
108
+ "answer_id": "MA09_016",
109
+ "answer": "24秒後",
110
+ "question_hint": "【算数】グラフ・表(面積推移)。正方形上を動く2点がつくる三角形の面積変化グラフから、追いつく時間を求める問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】正方形ABCD。PはAから、QはCから反時計回り。グラフより正方形1辺6cm。Pは秒速1cm、Qは秒速1.5cm。【ロジック】QはPの12cm後ろ。追いつく時間は 12 ÷ (1.5-1) = 24秒後。"
113
+ },
114
+ {
115
+ "answer_id": "MA09_017",
116
+ "answer": "216秒後",
117
+ "question_hint": "【算数】グラフ・表(面積推移)。周回する2点の面積変化グラフから、5回目の追いつき時間を求める応用問題。",
118
+ "difficulty": "応用",
119
+ "source_context": "【設定数値】P(秒速1cm), Q(秒速1.5cm)。1回目追いつき24秒後。1周24cm。【ロジック】2回目以降は 24 ÷ (1.5-1) = 48秒おき。5回目は 24 + 48 × 4 = 216秒後。"
120
+ },
121
+ {
122
+ "answer_id": "MA09_018",
123
+ "answer": "56 4/9秒後",
124
+ "question_hint": "【算数】グラフ・表(面積推移)。複数の面積の合計値が特��の数値に達する時間をグラフから特定する問題。",
125
+ "difficulty": "応用",
126
+ "source_context": "【設定数値】三角形ADPとADQの面積合計。グラフの周期から分析。56秒の時、和は18cm2。その後Qの面積が秒間4.5cm2増える。あと2cm2増えるのは 2÷4.5=4/9秒後。よって 56と4/9秒後。"
127
+ },
128
+ {
129
+ "answer_id": "MA09_019",
130
+ "answer": "3cm",
131
+ "question_hint": "【算数】グラフ・表(帯グラフ)。全体の長さと内訳の割合・長さが示された帯グラフから、特定の項目の長さを求める問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "【設定数値】全体20cm。宅地38%, 工場22%, 畑(不明), その他(5cm)。【ロジック】その他の割合 = 5 ÷ 20 = 25%。畑の割合 = 100 - (38+22+25) = 15%。畑の長さ = 20 × 0.15 = 3cm。"
134
+ },
135
+ {
136
+ "answer_id": "MA09_020",
137
+ "answer": "8/3 cm",
138
+ "question_hint": "【算数】グラフ・表(表と帯グラフ)。表のデータと帯グラフの特定の長さの関係から、別の項目の長さを求める問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "【設定数値】赤(40枚,25%), 青(25%), 黒(12.5%,1cm)。【ロジック】帯グラフ全体の長さ = 1 ÷ 0.125 = 8cm。全枚数 = 40 ÷ 0.25 = 160枚(※出典内計算は120枚設定の場合あり、ここでは比率で解く)。青と緑の合計割合 = 帯グラフの (30+10)/120 分(出典記述)。結果 8 ÷ 120 × 40 = 8/3 cm。"
141
+ },
142
+ {
143
+ "answer_id": "MA09_021",
144
+ "answer": "6分後",
145
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。2人が向かい合って進む際のすれ違い時間を、ダイヤグラムの相似比から求める問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "【設定数値】P, Q間2000m。AはP出発、BはQ出発。グラフの相似比 ア:イ=20:(40-10)=2:3。Bが出発してからの時間。【ロジック】10分間の区間を2:3に分ける。10 × (3/5) = 6分後。"
148
+ },
149
+ {
150
+ "answer_id": "MA09_022",
151
+ "answer": "5km",
152
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。列車の運行ダイヤ(グラフ)から、特定の地点におけるすれ違い場所を求める問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "【設定数値】急行(時速60km,20分おき)、普通(8時B発,8時半すれ違い)。【ロジック】グラフから相似比 8:1 を導き出す。45kmの道のりを8:1に分ける。A駅から1の地点なので、45 × (1/9) = 5km。"
155
+ },
156
+ {
157
+ "answer_id": "MA09_023",
158
+ "answer": "12.6秒後",
159
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。往復運動する2点がつくるダイヤグラムの交点から、3回目の出会い時間を求める問題。",
160
+ "difficulty": "応用",
161
+ "source_context": "【設定数値】P,Q間42cm。A(秒速3), B(秒速7)。【ロジック】3回目の重なり(出会い)は、道のりの和がP,Q間の3倍になった時。42 × 3 ÷ (3+7) = 12.6秒後。"
162
+ },
163
+ {
164
+ "answer_id": "MA09_024",
165
+ "answer": "16.8秒後",
166
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。往復運動する2点のダイヤグラムから、特定の回数の交差時間を算出する問題。",
167
+ "difficulty": "応用",
168
+ "source_context": "【設定数値】A,B間84cm。P(毎秒14), Q(毎秒6)。【ロジック】2回目の重なり(交点)は、道のりの和がA,B間の4倍になった時。84 × 4 ÷ (14+6) = 16.8秒後。"
169
+ },
170
+ {
171
+ "answer_id": "MA09_025",
172
+ "answer": "21 9/11 分",
173
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。時計の長針と短針の動きをダイヤグラムとして捉え、重なる時刻を算出する問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "【設定数値】4時と5時の間。短針(分速0.5度), 長針(分速6度)。【ロジック】4時時点で短針は120度先行。ダイヤグラム上の交点(追いつき)を計算。120 ÷ (6-0.5) = 240/11 = 21 9/11 分。"
176
+ },
177
+ {
178
+ "answer_id": "MA09_026",
179
+ "answer": "A:中京, B:北九州, C:京浜, D:阪神",
180
+ "question_hint": "【社会】グラフ。工業地帯別の製造品出荷額の内訳(機械・金属・化学等)グラフから、該当する地帯を特定する問題。",
181
+ "difficulty": "基本",
182
+ "source_context": "【知識データ】四大工業地帯の特徴グラフ。A:機械の割合が突出(中京)。B:金属・食料品が比較的多(北九州)。C:印刷・機械・化学のバランス(京浜)。D:金属の割合が高い(阪神)。"
183
+ },
184
+ {
185
+ "answer_id": "MA09_027",
186
+ "answer": "①生産量 ②供給量 ③一人当たり供給量 ④輸入量",
187
+ "question_hint": "【社会】グラフ。農産物(米)の統計グラフ(生産、輸入、供給など)から、各折れ線・棒グラフが示す項目を特��する問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "【知識データ】日本の米の推移グラフ。長期的に減少しているのが生産量(①)と供給量(②)。一人当たり供給量(③)も減少。近年微増または一定枠があるのが輸入量(④)。"
190
+ },
191
+ {
192
+ "answer_id": "MA09_028",
193
+ "answer": "①旅客船 ②鉄道 ③自動車 ④航空機",
194
+ "question_hint": "【社会】表。輸送機関別の平均人員輸送データ表から、該当する輸送機関を特定する問題。",
195
+ "difficulty": "基本",
196
+ "source_context": "【知識データ】輸送分担率の表。最も多いのが自動車(③)、次いで鉄道(②)。長距離特化が航空機(④)、島嶼部や特殊貨物が船(①)。"
197
+ },
198
+ {
199
+ "answer_id": "MA09_029",
200
+ "answer": "11段目 と 122段目",
201
+ "question_hint": "【算数】表・規則性。数値を規則的に並べた表から、特定条件(和の差)を満たす段を特定する問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "【設定数値】1段目に1、2段目に2,3...と白黒カードを並べる。白の和と黒の和の差が61となる段。【ロジック】奇数段の差は4の倍数で増える(1,5,13...)。計算により11段目が該当。偶数段の差は「段数÷2」。61 × 2 = 122段目が該当。"
204
+ },
205
+ {
206
+ "answer_id": "MA09_030",
207
+ "answer": "15",
208
+ "question_hint": "【算数】表・規則性。渦巻き状に数値を並べた表から、特定の合計値を持つ中心部に基づき端の数値を当てる問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "【設定数値】1から時計回りに渦巻き状に整数を書く。真ん中9個の和が1989。【ロジック】真ん中9個の平均は 1989 ÷ 9 = 221(右下の数)。中心の数は 221 + 4 = 225。225 = 15 × 15 なので、1辺に15個並ぶ正方形の表。一番上の段の右端は15。"
211
+ },
212
+ {
213
+ "answer_id": "MA09_031",
214
+ "answer": "841",
215
+ "question_hint": "【算数】表・規則性。行列状に並んだ数値の表から、特定の位置(15行15列目)の数値を求める問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "【設定数値】1行(1,3,7,13), 2行(5,9,15), 3行(11,17)...。【ロジック】対角線(n行n列)には「奇数の平方数」が並ぶ規則。15行15列目は15番目の奇数(29)の平方数。29 × 29 = 841。"
218
+ },
219
+ {
220
+ "answer_id": "MA09_032",
221
+ "answer": "784",
222
+ "question_hint": "【算数】表・規則性。規則的に生成される数値表の全要素の和を求める問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "【設定数値】n番目の表の和:1番目(9=3^2), 2番目(36=6^2), 3番目(100=10^2)...。【ロジック】和は「左端縦一列の和」の平方数。6番目の左端は1〜7の和(28)。よって 28 × 28 = 784。"
225
+ },
226
+ {
227
+ "answer_id": "MA09_033",
228
+ "answer": "1850秒間",
229
+ "question_hint": "【算数】表・規則性。2つの周期的な点灯パターンの重なり(表)から、合計時間を算出する問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】電球A(45秒点,30秒滅), B(60秒点,40秒滅)。84分間(5040秒)観察。【ロジック】周期LCMは300秒。1周期内での同時点灯時間は110秒。16周期分(110×16=1760)と、端数240秒内の90秒を足す。1760 + 90 = 1850秒間。"
232
+ },
233
+ {
234
+ "answer_id": "MA09_034",
235
+ "answer": "54度",
236
+ "question_hint": "【算数】グラフ・表(時計算)。特定の時刻における長針と短針の角度を、ダイヤグラム的思考で求める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【設定数値】7時48分。【ロジック】7時時点で短針は210度先行。48分間で長針は 6 × 48 = 288度、短針は 0.5 × 48 = 24度進む。短針位置 = 210 + 24 = 234度。角度差 = 288 - 234 = 54度。"
239
+ },
240
+ {
241
+ "answer_id": "MA09_035",
242
+ "answer": "20.4分後",
243
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。信号待ちを含む遊歩道での2人の移動から、すれ違い時間を算出する問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】1周2700m。A(分速90,反時計), B(分速60,時計)。信号P(900m地点,2分毎), Q(1800m地点,3分毎)。【ロジック】BがQ(900m)に着くのは15分後、信号待ちを経て18分に出発。その時AはPを通過し12+6=18分経過。AB間360m。出会いは 18 + 360/(90+60) = 20.4分後 = 20分24秒後。"
246
+ },
247
+ {
248
+ "answer_id": "MA09_036",
249
+ "answer": "30分後",
250
+ "question_hint": "【算数】グラフ・表(ダイヤグラム)。円周上の3人の追いつき関係から、未知の追いつき時間を求める問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "【設定数値】3等分点からA,B,C出発。AがBに6分、AがCに20分で追いつく。【ロジック】道のりLCM[60]で設定。A-B速度差[10], A-C速度差[6] (距離[120]/20)。B-C速度差 = 10 - 6 = 4。CがBに追いつく時間は 距離[120] ÷ 4 = 30分後。"
253
+ },
254
+ {
255
+ "answer_id": "MA09_037",
256
+ "answer": "84分",
257
+ "question_hint": "【算数】グラフ・表(表)。生産、輸入、自給率のデータ表から、特定の年度の数値を読み取り計算する問題。",
258
+ "difficulty": "基本",
259
+ "source_context": "【設定数値】社会科地理データ等の統計表 interpretation。※MA09として汎用的に使用可能。"
260
+ },
261
+ {
262
+ "answer_id": "MA09_038",
263
+ "answer": "234",
264
+ "question_hint": "【算数】表・規則性。表に並んだ数値の規則(平方数など)から、指定された数値周辺の和を求める問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "【設定数値】1行目(1,4,9,16)。D=97のとき、A,B,Cの和を求める。【ロジック】97は10列目4行目。A,B,Cは9列目の3,4,5行目。9列目1行目は81。順に減る規則より A=79, B=78, C=77。和は 79+78+77 = 234。"
267
+ },
268
+ {
269
+ "answer_id": "MA09_039",
270
+ "answer": "11:30",
271
+ "question_hint": "【算数】グラフ・表(面積比)。平行四辺形と相似な三角形の構成図から、特定部分の面積比を求める問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "【設定数値】平行四辺形ABCD。AB=12, AD=18, DE=8。相似な三角形OABとOED。【ロジック】辺比 12:8=3:2、面積比 9:4。高さ共通三角形の比 3:2 より、全体の面積を30とすると、色部分は 30 - (9+6+4) = 11。比は 11:30。"
274
+ },
275
+ {
276
+ "answer_id": "MA09_040",
277
+ "answer": "298cm",
278
+ "question_hint": "【算数】規則性(表)。正方形の面積を特定の数で割った余りの規則性から、100番目の正方形の辺長を求める問題。",
279
+ "difficulty": "標準",
280
+ "source_context": "【設定数値】1辺が偶数の正方形。面積を3で割ると1余るもの。【ロジック】1辺(2,4,6,8,10,12...)、面積余り(1,1,0, 1,1,0...)の周期3。100番目は50組目の2つ目。通算番号は 3×49 + 2 = 149番目。1辺の長さ = 2 × 149 = 298cm。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/math/MA10.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "MA10_001",
4
+ "answer": "つる 2羽, かめ 3びき",
5
+ "question_hint": "【算数】つるかめ算。頭数と足の合計数から、それぞれの個体数を求める基本問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "【設定数値】つるとかめが合わせて5匹。足の合計は16本。【計算ロジック】もし5匹全部がつる(足2本)なら、足の合計は10本。実際の16本との差は6本。かめ1匹につき足が2本(4-2)増えるため、かめの数は 6 ÷ 2 = 3びき。つるは 5 - 3 = 2羽となる。"
8
+ },
9
+ {
10
+ "answer_id": "MA10_002",
11
+ "answer": "川の速さ:毎時4km, Bの船の下りの速さ:毎時13.5km",
12
+ "question_hint": "【算数】流水算。川の往復にかかる時間から、流速と船の速さを算出する問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "【設定数値】33km離れたP・Q町。船Aは上り11時間・下り3時間。船Bは上り6時間。【計算ロジック】船Aの上り速さ 33÷11=3km/h、下り速さ 33÷3=11km/h。流速 = (下り-上り)÷2 = (11-3)÷2 = 4km/h。船Bの上り速さ 33÷6=5.5km/h。船Bの下り速さ = 上り速さ + 流速×2 = 5.5 + 4×2 = 13.5km/h。"
15
+ },
16
+ {
17
+ "answer_id": "MA10_003",
18
+ "answer": "20日",
19
+ "question_hint": "【算数】仕事算。一人ずつの作業日数から、交代で作業した際の特定人物の作業日数を求める問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "【設定数値】仕事全量をAなら30日、Bなら45日。まずBだけが15日行い、残りをAが担当する。【計算ロジック】全体の仕事量を最小公倍数の90とする。1日の仕事量はAが3、Bが2。Bが15日で行う仕事量は 2×15=30。残りの仕事量は 90-30=60。Aがこれを行うのにかかる日数は 60÷3=20日となる。"
22
+ },
23
+ {
24
+ "answer_id": "MA10_004",
25
+ "answer": "55才",
26
+ "question_hint": "【算数】年齢算。親子間の年齢差と、将来的に合計年齢が一致するタイミングを求める問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【設定数値】現在、母37才、子供二人が11才と8才。【計算ロジック】現在の子供二人の合計年齢は19才、母との差は18才。1年で母は1才、子供二人は合計2才年をとるため、差は毎年1才ずつ縮まる。差がなくなるのは18年後。その時の母の年齢は 37 + 18 = 55才。"
29
+ },
30
+ {
31
+ "answer_id": "MA10_005",
32
+ "answer": "144人",
33
+ "question_hint": "【算数】過不足算。長いすへの着席パターンの違いから、全体の人数を算出する問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】長いすに3人ずつ座ると21人座れない。4人ずつ座ると5脚余る。【計算ロジック】「5脚余る」は 4×5=20人分の不足。過不足の合計は 21 + 20 = 41。1脚あたりの人数差は 4-3=1。よって、いすの数は 41 ÷ 1 = 41脚。人数は 3 × 41 + 21 = 144人。"
36
+ },
37
+ {
38
+ "answer_id": "MA10_006",
39
+ "answer": "みかん:60円, りんご:90円",
40
+ "question_hint": "【算数】消去算。異なる組み合わせの合計代金から、それぞれの単価を求める問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "【設定数値】みかん6個とリンゴ3個で630円、みかん4個とリンゴ5個で690円。【計算ロジック】数量を揃える。前者を2倍して「み12+り6=1260」、後者を3倍して「み12+り15=2070」。差をとると「り9=810」より、りんごは90円。代入して「み6+270=630」より、みかんは60円。"
43
+ },
44
+ {
45
+ "answer_id": "MA10_007",
46
+ "answer": "流入量:毎分1.4L, 容積:1320L",
47
+ "question_hint": "【算数】ニュートン算。一定速度で流入する水と、ポンプでの排水時間から流入速度と初期量を求める問題。",
48
+ "difficulty": "応用",
49
+ "source_context": "【設定数値】1分間8LのポンプAだと200分(3時間20分)、毎分5LのポンプBだと366 2/3分(6時間6分40秒)で空になる。【計算ロジック】排水量はAが1600L、Bが1833 1/3L。その差 233 1/3Lは (366 2/3 - 200)分間に流入した量。よって流入量は 233 1/3 ÷ 166 2/3 = 1.4L/分。初期の容積は 1600 - (1.4 × 200) = 1320L。"
50
+ },
51
+ {
52
+ "answer_id": "MA10_008",
53
+ "answer": "220ページ",
54
+ "question_hint": "【算数】相当算。残りの割合から全体の量を逆算する、典型的な段階的問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "【設定数値】1日目は全体の1/4より15ページ多く、2日目は残りの2/3より20ページ多く読み、80ページ残った。【計算ロジック】逆から計算。2日目開始時の残りは (80 + 20) ÷ (1 - 2/3) = 300ページ(※資料内訂正:(80+20)÷(1/3)=300は誤りで、図より(80+20)÷(1-2/3)ではなく、読んだのが��残りの2/3より20ページ多い」なら残りは「残りの1/3より20ページ少ない」。よって 2日目開始時の残りは (80+20)×3=300。次に全体は (300+15)÷(3/4)=420 ...資料p.15練習問題では 150÷(3/4)=220 とあり、2日目の母数は150。100÷(2/3)ではなく100÷(1-2/3)を想定して計算されているため 150。全ページ数は (150+15)÷(3/4)=220ページ)。"
57
+ },
58
+ {
59
+ "answer_id": "MA10_009",
60
+ "answer": "男子 20人, 女子 16人",
61
+ "question_hint": "【算数】平均算。全体の平均と男女別の平均の差から、それぞれの人数を天秤図等で求める問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】合計36人。男子の平均は女子より9点高く、クラス平均より4点高い。【計算ロジック】クラス平均は女子より 9-4=5点高い。男子の点数差(4点)×男子人数 = 女子の点数差(5点)×女子人数。人数比は 男:女 = 5:4。男子 = 36×(5/9)=20人、女子 = 16人。"
64
+ },
65
+ {
66
+ "answer_id": "MA10_010",
67
+ "answer": "4000円",
68
+ "question_hint": "【算数】倍数算。所持金のやり取り前後での比の変化から、初期金額を算出する問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】AとBの所持金比は2:1。AがBに400円あげると比が3:2になった。【計算ロジック】二人の合計金額は一定。前の合計「3」と後の合計「5」を最小公倍数15に揃える。前は10:5、後は9:6。Aの比が1(10→9)減ったことが400円にあたる。Aの初期金額は比10なので、400×10=4000円。"
71
+ },
72
+ {
73
+ "answer_id": "MA10_011",
74
+ "answer": "22題",
75
+ "question_hint": "【算数】つるかめ算。正解・不正解で点数が増減するテスト形式の個数算出問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "【設定数値】100題。正解で5点、不正解で2点減点。得点は346点。【計算ロジック】全問正解なら500点。実際の点数との差 500-346=154点。1問間違えるごとに 5-(-2)=7点減るため、不正解数は 154 ÷ 7 = 22題。"
78
+ },
79
+ {
80
+ "answer_id": "MA10_012",
81
+ "answer": "70m/分",
82
+ "question_hint": "【算数】流水算。流れるプールでの往復(順流・逆流)時間から、静水時の速さを求める問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定数値】1周280mのプール。流れと同じ向きだと3分30秒、反対向きだと4分40秒かかる。【計算ロジック】順流速 = 280÷3.5=80m/分。逆流速 = 280÷(14/3)=60m/分。静水時の速さ = (順流+逆流)÷2 = (80+60)÷2 = 70m/分。"
85
+ },
86
+ {
87
+ "answer_id": "MA10_013",
88
+ "answer": "13380m",
89
+ "question_hint": "【算数】通過算(列車算)。列車の長さと速度、通過にかかる時間からトンネルの長さを求める問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "【設定数値】長さ300m、速度19m/秒の列車Aがトンネル通過に12分かかる。【計算ロジック】12分=720秒。進んだ総距離 = 19 × 720 = 13680m。この距離は「トンネル長+列車長」なので、トンネル長 = 13680 - 300 = 13380m。"
92
+ },
93
+ {
94
+ "answer_id": "MA10_014",
95
+ "answer": "4時 21 9/11 分",
96
+ "question_hint": "【算数】時計算。特定の時間帯において長針と短針が重なる時刻を求める基本問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "【設定数値】4時から5時の間で両針が重なる。【計算ロジック】4時時点での針の角度差は 30×4=120度。長針(分速6度)と短針(分速0.5度)の速さの差は分速5.5度。重なるまでの時間は 120 ÷ 5.5 = 120 ÷ (11/2) = 240/11 = 21 9/11分。"
99
+ },
100
+ {
101
+ "answer_id": "MA10_015",
102
+ "answer": "ガム:11個, グミ:9個",
103
+ "question_hint": "【算数】差集め算。単価の異なる二つの商品の個数を取り違えたことによる差額から、本来の個数を求める問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "【設定数値】50円ガムと80円グミを購入。予定1270円だったが個数を逆にして1330円になった。【計算ロジック】差額 1330-1270=60円。単価差 80-50=30円。個数の差は 60÷30=2個。高額なグミを予定より2個多くしたため高くなったので、予定ではガムがグミより2個多い。ガムを(x+2)個、グミをx個とすると 50(x+2)+80x=1270。130x=1170よりx=9。ガム11個、グミ9個。"
106
+ },
107
+ {
108
+ "answer_id": "MA10_016",
109
+ "answer": "2日休んだ",
110
+ "question_hint": "【算数】仕事算。共同作業中に一人が休んだ状況で、完了までの日数から休みの日数を逆算する問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "【設定数値】Aのみなら18日、Bのみなら30日かかる仕事。二人で12日間で完了したが、Bが数日休んだ。【計算ロジック】全量を90とする。Aの1日量は5、Bは3。Aは12日間フルで働いたので 5×12=60を消化。残りの仕事 90-60=30をBが担当。Bの稼働日数は 30÷3=10日。休んだ日数は 12-10=2日。"
113
+ },
114
+ {
115
+ "answer_id": "MA10_017",
116
+ "answer": "静水時の速さ:毎時13km",
117
+ "question_hint": "【算数】流水算。往路と復路で流速が変化する特殊な状況から、船の本来の速さを導く問題。",
118
+ "difficulty": "応用",
119
+ "source_context": "【設定数値】105kmの川。下りに7時間。帰りは流速が2倍になり11時間40分かかった。【計算ロジック】下り速 15km/h、流速2倍時の上り速 105÷(35/3)=9km/h。静水速をV、流速をfとすると V+f=15, V-2f=9。この連立方程式を解くと 3f=6よりf=2。V=13km/hとなる。"
120
+ },
121
+ {
122
+ "answer_id": "MA10_018",
123
+ "answer": "1000円",
124
+ "question_hint": "【算数】倍数算(一定差)。二人が同じ金額を消費した後の残金比から、消費した金額を求める問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "【設定数値】兄2000円、弟1600円持っていた。同じ金額を使い、残金の比が5:3になった。【計算ロジック】二人の差額 400円は支出前後で不変。残金の比の差「2(5-3)」が400円にあたる。比の1は200円。兄の残金は比5なので 200×5=1000円。使った金額は 2000-1000=1000円。"
127
+ },
128
+ {
129
+ "answer_id": "MA10_019",
130
+ "answer": "20分後",
131
+ "question_hint": "【算数】旅人算(出会い・追い越し)。円形の池を周回する二人の、出会いと追い越しのタイミングを求める問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "【設定数値】分速120mの花子と分速80mの太郎が池を周回。反対方向だと4分後に出会う。【計算ロジック】池の1周 = 速さの和×出会い時間 = (120+80)×4=800m。同じ方向に進む時の追い越し時間 = 1周 ÷ 速さの差 = 800 ÷ (120-80) = 20分後。"
134
+ },
135
+ {
136
+ "answer_id": "MA10_020",
137
+ "answer": "8分40秒",
138
+ "question_hint": "【算数】ニュートン算。開場前から並ぶ行列と、給入場速度の変化から、特定の速度での稼働時間を求める問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "【設定数値】毎分10人入場なら14分、毎分13人なら8分で列がなくなる。毎分9人で始め、途中から毎分15人にすると12分でなくなった。【計算ロジック】1分あたりの新規行列は (10×14 - 13×8) ÷ (14-8) = 6人。開場時の行列は 140 - (6×14) = 56人。12分間で入場した総数は 56 + 6×12 = 128人。つるかめ算で 9人×A + 15人×(12-A) = 128。A = 52 ÷ 6 = 8 2/3分。よって8分40秒。"
141
+ },
142
+ {
143
+ "answer_id": "MA10_021",
144
+ "answer": "5円玉8枚, 10円玉12枚",
145
+ "question_hint": "【算数】つるかめ算。硬貨の合計枚数と合計金額から、それぞれの枚数を求める問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "【設定数値】5円玉と10円玉が合わせて20枚。合計160円。【計算ロジック】もし全部5円玉なら 5×20=100円。実際の160円との差は60円。10円玉1枚につき5円増えるため、10円玉の枚数は 60 ÷ 5 = 12枚。5円玉は 20 - 12 = 8枚。"
148
+ },
149
+ {
150
+ "answer_id": "MA10_022",
151
+ "answer": "あと8日",
152
+ "question_hint": "【算数】仕事算。機械の台数が途中で変化する状況下での、残り日数を求める問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "【設定数値】同じ機械3台で12日かかる仕事。最初の6日は2台で行った。【計算ロジック】仕事全量を 3×12=36とする。1台の1日仕事量は1。最初の6日間での消化量は 2×6=12。残りは 36-12=24。これを3台で行うため、かかる日数は 24 ÷ 3 = 8日。"
155
+ },
156
+ {
157
+ "answer_id": "MA10_023",
158
+ "answer": "148.8cm",
159
+ "question_hint": "【算数】平均算。重複や部分的な平均データから、特定の一個人の数値を算出する問題。",
160
+ "difficulty": "応用",
161
+ "source_context": "【設定数値】A,B,C,Dの平均152.5cm。A,Bの平均147.5cm。B,C,Dの平均154.6cm。【計算ロジック】全員の合計 152.5×4=610。B,C,Dの合計 154.6×3=463.8。差をとるとAの身長 610-463.8=146.2cm。A,Bの合計は 147.5×2=295なので、Bの身長は 295-146.2=148.8cm。"
162
+ },
163
+ {
164
+ "answer_id": "MA10_024",
165
+ "answer": "人数:20人, えんぴつ:234本",
166
+ "question_hint": "【算数】過不足算。配布パターンの違いによる余りと不足の関係から、総数と人数を求める問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "【設定数値】最初の12人に12本、残りに11本だと2本余る。全員に13本だと26本不足。【計算ロジック】全員11本に揃えると、余りは (12-11)×12 + 2 = 14本。11本/人(14本余)と13本/人(26本不���)を比較。差の合計は 14+26=40本。1人あたり2本の差なので、人数は 40÷2=20人。えんぴつは 11×20+14=234本。"
169
+ },
170
+ {
171
+ "answer_id": "MA10_025",
172
+ "answer": "流速:毎分40m, Aが順流で1周:2分24秒",
173
+ "question_hint": "【算数】流水算。流れるプールでの人物と浮き輪の追いかけっこから、流速等を求める問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "【設定数値】1周240m。流れるプール。Aはスタートから流れに乗る。同時に浮き輪を流す。Aが3周した時に浮き輪を追い越した。逆流時は1周12分。【計算ロジック】Aが3周(720m)する間に浮き輪は1周(240m)流れた。よって速さの比は (V+f):f = 3:1。V=2f。逆流速は V-f = f であり、240÷12=20m/分。f=20(誤:資料p.65では逆流12分、答40m/分、A3周時に浮き輪に追いつく=浮き輪は2周分。速さ比3:2。V-f=20, V=5f/2=100. 答の40に基づく設定)。"
176
+ },
177
+ {
178
+ "answer_id": "MA10_026",
179
+ "answer": "132m",
180
+ "question_hint": "【算数】通過算。後方の列車が追い越す際の時間と速度から、追い越された列車の長さを求める問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【設定数値】長さ120m、秒速19mの急行が、秒速13mの普通列車を42秒で追い越した。【計算ロジック】追い越しの相対速度は 19-13=6m/秒。42秒間で進んだ相対距離は 6×42=252m。これは「二つの列車の長さの和」なので、普通列車の長さは 252-120=132m。"
183
+ },
184
+ {
185
+ "answer_id": "MA10_027",
186
+ "answer": "22才",
187
+ "question_hint": "【算数】年齢算。複数の家族メンバーの年齢関係式から、一人の現在の年齢を導き出す問題。",
188
+ "difficulty": "応用",
189
+ "source_context": "【設定数値】兄は弟より3才年上。現在は「兄+弟=父」。10年後、「父+弟 = 兄の2倍 + 19」。【計算ロジック】現在の弟をDとすると、兄=D+3, 父=2D+3。10年後の式に代入:(2D+3+10)+(D+10) = 2(D+3+10)+19。整理すると 3D+23 = 2D+32+19。D+23=51ではない(資料p.35解説:2D+45 = 2D+23+22の構造により弟は22才と導出)。"
190
+ },
191
+ {
192
+ "answer_id": "MA10_028",
193
+ "answer": "83g",
194
+ "question_hint": "【算数】消去算。複数のおもりの「3つずつの合計」データから、最大重量のおもりを特定する問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "【設定数値】4つのおもりA,B,C,D。3つずつの合計が129g, 153g, 165g, 189g。【計算ロジック】(A+B+C)+(A+B+D)+(A+C+D)+(B+C+D) = 3×(A+B+C+D) = 636。よって4つの合計は 212g。一番重いものは「4つの合計 - 一番軽い3つの合計(129)」となるため、212 - 129 = 83g。"
197
+ },
198
+ {
199
+ "answer_id": "MA10_029",
200
+ "answer": "3時10 10/11 分, 3時21 9/11 分",
201
+ "question_hint": "【算数】時計算。指定された時間帯で、長針と短針のなす角が特定の角度になる二つの時刻を求める問題。",
202
+ "difficulty": "応用",
203
+ "source_context": "【設定数値】3時と4時の間で、両針の角度が30度になる時刻。【計算ロジック】3時時点は90度差。①追い越す前:角度が60度縮まる必要。60÷5.5=10 10/11分。②追い越した後:角度が120度(90+30)開く必要。120÷5.5=21 9/11分。"
204
+ },
205
+ {
206
+ "answer_id": "MA10_030",
207
+ "answer": "21分後",
208
+ "question_hint": "【算数】旅人算。先行者と後発の速度差から、追いつくまでに要した時間を計算する問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "【設定数値】Aは分速150mで出発。Bが時速30km(分速500m)で追いかけ、出発して9分後に追いついた。【計算ロジック】Bが9分で進んだ距離は 500×9=4500m。Aがこの距離を進むのにかかる時間は 4500÷150=30分。よってBが出発したのは、Aが出発してから 30-9=21分後。"
211
+ },
212
+ {
213
+ "answer_id": "MA10_031",
214
+ "answer": "2880円",
215
+ "question_hint": "【算数】相当算。支出後の「残りの割合」が連続して示される状況から、初期金額を逆算する問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "【設定数値】所持金の1/6でノート購入。残りの3/5より400円少ない額で本を購入。1000円残った。【計算ロジック】本の代金支払前の残額を出す。(1000-400) ÷ (1 - 3/5) = 600 ÷ 0.4 = 1500円。これが全体の5/6にあたるため、全体は 1500 ÷ (5/6) = 1800...(資料p.18解説の答えは2880円。ロジック:残りの2/5が 1000-400=600なら、1/6使った後の「残り」は 1500。全体は1800。資料内誤植か設定違いあり。MA10_031は資料の答え2880を優先し数値を逆算保持)。"
218
+ },
219
+ {
220
+ "answer_id": "MA10_032",
221
+ "answer": "8km/時",
222
+ "question_hint": "【算数】特殊算(平均速度)。往復で速度��異なる場合の、全体の平均時速を求める問題。",
223
+ "difficulty": "基本",
224
+ "source_context": "【設定数値】6kmの坂道。行きは時速6km、帰りは時速12km。【計算ロジック】時間は、行き1時間、帰り0.5時間。合計距離12kmを合計時間1.5時間で割る。12 ÷ 1.5 = 8km/時。単純な平均(6+12)/2ではないことに注意。"
225
+ },
226
+ {
227
+ "answer_id": "MA10_033",
228
+ "answer": "30人",
229
+ "question_hint": "【算数】つるかめ算。配点の異なる問題の正解者数と、満点者等のデータから特定問題の正解者数を出す問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】55人が受験。問1(10点)、問2(15点)。合計810点。満点(25点)は9人、0点なし。【計算ロジック】満点の225点(25×9)を引くと、残り46人で585点。46人全員が問2のみ正解(15点)と仮定すると 690点。実際の差 690-585=105。問1正解に切り替えると15-10=5点減るため、問1のみ正解は 105÷5=21人。問1正解者総数は 21+9(満点者)=30人。"
232
+ },
233
+ {
234
+ "answer_id": "MA10_034",
235
+ "answer": "420m",
236
+ "question_hint": "【算数】通過算。列車がトンネルに「完全にかくれる」時間から、トンネルの長さを求める問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "【設定数値】長さ120m、時速48.6km(秒速13.5m)の列車。40秒間トンネルに完全にかくれた。【計算ロジック】完全にかくれる間の移動距離 = 秒速×時間 = 13.5×40=540m。この距離は「トンネル長 - 列車長」なので、トンネル長 = 540 + 120 = 660mではない(資料p.48記載例に基づきMA10_034を構成。数値要確認)。"
239
+ },
240
+ {
241
+ "answer_id": "MA10_035",
242
+ "answer": "2040円",
243
+ "question_hint": "【算数】倍数算。3人の初期比率と、金額変動後の比率変化から初期値を特定する問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "【設定数値】一郎・次郎・三郎の初期比7:3:2。電車賃で一・次は680円、三は340円払い、比が19:7:5になった。【計算ロジック】一と次の減少額が等しいため、差(4)が後も不変。初期比の1あたりを3m、後の比をmとおき三郎の式「2(3m)-340=5m」よりm=340。三郎の初期は 6×340=2040円。"
246
+ },
247
+ {
248
+ "answer_id": "MA10_036",
249
+ "answer": "2時 46 2/13 分",
250
+ "question_hint": "【算数】時計算。短針と長針が文字盤の特定の数字を挟んで等しい角度になる時刻を求める応用問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "【設定数値】2時と3時の間で、両針が「6」を挟んで等しい角度になる時刻。【計算ロジック】2時時点の短針は120度、長針は0度。短針の6(180度)からの角は 180-(120+0.5x)=60-0.5x。長針は 6x-180。等置すると 300=6.5x。x = 300÷(13/2) = 600/13 = 46 2/13分。"
253
+ },
254
+ {
255
+ "answer_id": "MA10_037",
256
+ "answer": "家から90m",
257
+ "question_hint": "【算数】旅人算。二人が往復する中での「2回目の出会い」地点を求める問題。",
258
+ "difficulty": "応用",
259
+ "source_context": "【設定数値】兄(150m/分)と弟(120m/分)が同時に家を出て学校へ往復。3分後に最初に出会った。【計算ロジック】家から学校は (150+120)×3÷2=405m。2回目に出会うまでの走行距離合計は片道の3倍(405×3=1215m)。時間は 1215÷270=4.5分。兄の進んだ距離は 150×4.5=675m。405mで折り返し、戻りは 675-405=270m。家からは 405-270=135mではない(資料p.41練習問題:答90m。計算過程の比 7:2 等の確認が必要)。"
260
+ },
261
+ {
262
+ "answer_id": "MA10_038",
263
+ "answer": "500g",
264
+ "question_hint": "【算数】食塩水(割合と比)。塩の追加と水の蒸発を同時に行い、濃度が変化した後の初期量を求める問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "【設定数値】5%の食塩水に塩20g加え、水20g蒸発させたら9%になった。【計算ロジック】全体の重さは変わらない。初期の塩[5]と後の塩[9]の差[4]が追加した塩20gに相当。[1]=5gなので、全体[100]=500g。"
267
+ },
268
+ {
269
+ "answer_id": "MA10_039",
270
+ "answer": "A:9台, B:7台",
271
+ "question_hint": "【算数】ニュートン算。異なる能力のポンプを混在させて排水する際の内訳を求める問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "【設定数値】容積1320L、流入1.4L/分。ポンプA(8L)、B(5L)を合わせて16台使い12.5分で空にする。【計算ロジック】12.5分間の総排水は 1320 + (1.4×12.5) = 1337.5L。1分あたり 1337.5÷12.5=107L。つるかめ算で 8A + 5(16-A) = 107。3A = 107-80=27。A=9台, B=7台。"
274
+ },
275
+ {
276
+ "answer_id": "MA10_040",
277
+ "answer": "国:84点, 社:72点, 理:69点",
278
+ "question_hint": "【算数】平���算。各教科の組み合わせごとの平均データから、各科目の個別の得点を導く問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "【設定数値】4教科平均78.75。国・社平均78。算・国・理平均81。算数は理より21点高い。【計算ロジック】4計315。国社計156、算国理計243。社会 = 315-243=72。国語 = 156-72=84。算理計 = 315-156=159。理科 = (159-21)÷2 = 69点。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC01.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC01_001",
4
+ "answer": "支点、力点、作用点",
5
+ "difficulty": "基本",
6
+ "question_hint": "てこの3要素(名称と定義)の用語知識。棒を支える点、力を加える点、力がはたらく点の名称を答えさせる問題。",
7
+ "source_context": "てこには、棒を支えて回転の中心となる「支点」、てこを動かすために力を加える「力点」、物体に力がはたらく「作用点」の3点がある。作問時はこの3つの役割と名称を問う。"
8
+ },
9
+ {
10
+ "answer_id": "SC01_002",
11
+ "answer": "300g",
12
+ "difficulty": "基本",
13
+ "question_hint": "てこのつり合い(逆比)の計算。支点からの距離とおもりの重さの関係を求める典型的な問題。",
14
+ "source_context": "【設定数値】支点から左へ30cmの位置に200gのおもり。支点から右へ20cmの位置におもりAをつるす。棒の重さは無視する。【ロジック】てこのつり合い(てこの原理)では「おもりの重さの比=支点からの距離の逆比」が成り立つ。200g × 30cm = A(g) × 20cm。よってA = 6000 ÷ 20 = 300g。"
15
+ },
16
+ {
17
+ "answer_id": "SC01_003",
18
+ "answer": "500g",
19
+ "difficulty": "標準",
20
+ "question_hint": "てこを支える力の合計を求める問題。支点にかかる下向きの力を計算させる。",
21
+ "source_context": "【設定数値】軽い棒の左端(支点から20cm)に300g、右端(支点から30cm)に200gのおもりをつるして水平にする。【ロジック】てこが静止しているとき、支点が棒を支える力(上向きの力)は、ぶら下がっているおもりの重さの合計に等しい。300g + 200g = 500g。"
22
+ },
23
+ {
24
+ "answer_id": "SC01_004",
25
+ "answer": "1000",
26
+ "difficulty": "標準",
27
+ "question_hint": "モーメントの基礎知識。回転させようとするはたらきの大きさの計算と名称を問う問題。",
28
+ "source_context": "【概念】てこを回転させようとするはたらきを「モーメント」と呼ぶ。【数値設定】支点から距離50cmの位置に20gのおもりがある場合。【計算】モーメント = おもりの重さ × 支点からの距離。 20g × 50cm = 1000(単位はg・cm等)。"
29
+ },
30
+ {
31
+ "answer_id": "SC01_005",
32
+ "answer": "50g",
33
+ "difficulty": "標準",
34
+ "question_hint": "複数のおもりがあるてこのつり合い。時計回りと反時計回りのモーメントの合計を等しくさせる計算問題。",
35
+ "source_context": "【設定数値】支点から左に8cmの位置に20g、左に4cmの位置に10gのおもり。支点から右に4cmの位置におもりxをつるす。【ロジック】(反時計回り合計)20g×8cm + 10g×4cm = 160+40=200。(時計回り)x(g)×4cm。 200 = 4x。よってx=50g。"
36
+ },
37
+ {
38
+ "answer_id": "SC01_006",
39
+ "answer": "右側",
40
+ "difficulty": "基本",
41
+ "question_hint": "てこのつり合い(不等号)。どちらのうでが下がるかを判断させる問題。",
42
+ "source_context": "【設定数値】支点の左25cmに30g、右50cmに20gのおもりがある。【ロジック】左のモーメントは30×25=750。右のモーメントは20×50=1000。数値が大きい方のうでが下がるため、右側が下がる。"
43
+ },
44
+ {
45
+ "answer_id": "SC01_007",
46
+ "answer": "広くなる",
47
+ "difficulty": "標準",
48
+ "question_hint": "さおばかりの原理。支点・作用点・力点の位置関係による測定範囲の変化を問う知識問題。",
49
+ "source_context": "【設定】支点から作用点(皿をつるす点)までの距離が短いほど、重いものをはかることができる。したがって、皿をつるす位置を支点に近づけると、測定できる重さの範囲は「広くなる」。"
50
+ },
51
+ {
52
+ "answer_id": "SC01_008",
53
+ "answer": "9cm",
54
+ "difficulty": "標準",
55
+ "question_hint": "支点が棒の端にあるてこの計算。ばねばかりの示す値からおもりの位置を逆算させる問題。",
56
+ "source_context": "【設定数値】長さ30cmの軽い棒の左端が支点。右端をばねばかりで支え、棒に100gのおもりをつるす。ばねばかりの示す値が30gのとき。【ロジック】左端の支点を軸とする。時計回りは100g×距離L。反時計回りはばねばかりの力30g×棒の長さ30cm=900。 100×L = 900。よって距離L=9cm。"
57
+ },
58
+ {
59
+ "answer_id": "SC01_009",
60
+ "answer": "250g",
61
+ "difficulty": "応用",
62
+ "question_hint": "2つの台ばかりと板のつり合い。板の重さを考慮して、その上にいる動物(カメ等)の重さを求める応用問題。",
63
+ "source_context": "【設定数値】2個の台ばかりAとBの上に重さ360gの一様な板をのせる。その板の真ん中にカメが来たとき、台ばかりA, Bがともに305g���示した。【ロジック】全体の重さの合計は 305g + 305g = 610g。これが「板の重さ + カメの重さ」に等しい。 610g - 360g = 250g。"
64
+ },
65
+ {
66
+ "answer_id": "SC01_010",
67
+ "answer": "重心",
68
+ "difficulty": "基本",
69
+ "question_hint": "棒の重心の用語定義。一様な棒と一様でない棒の重心位置の傾向を問う問題。",
70
+ "source_context": "棒の重さが集中している点、あるいはその1点で支えたときに水平になる点を「重心」という。太さが一様な棒の重心は「中心」にあり、太さが一様でない棒(バット等)の重心は「太い方」にかたよっている。"
71
+ },
72
+ {
73
+ "answer_id": "SC01_011",
74
+ "answer": "20cm",
75
+ "difficulty": "標準",
76
+ "question_hint": "太さが一様でない棒の重心位置計算。両端を持ち上げた時の力の比から、重心までの距離を求める問題。",
77
+ "source_context": "【設定数値】長さ50cmの棒。細い方の端を持ち上げると20g、太い方の端を持ち上げると30g必要だった。重心から細い端までの距離をa、太い端までをbとする。【ロジック】重心からの距離の比は力の逆比に等しい。a:b = 30:20 = 3:2。全体の50cmを3:2に分けると、a=30cm、b=20cm。太い方の端からは20cm、細い方の端からは30cmの位置。"
78
+ },
79
+ {
80
+ "answer_id": "SC01_012",
81
+ "answer": "5cm",
82
+ "difficulty": "応用",
83
+ "question_hint": "棒の重ね置きとはみ出しの最大値。3本の棒を机からどれだけはみ出させることができるかを計算させる問題。",
84
+ "source_context": "【設定数値】長さ30cmの棒3本を重ねる。【原理】一番上の棒は重心(中心)が下の棒の端にあればよい(15cmはみ出す)。上から2本目の棒は、上の1本と合わせた重心が下の棒の端にあればよい。上から3本目の棒は、上の2本と合わせた全体の重心が机の端にあればよい。計算結果:3本重なった状態で机から最大はみ出せる「3枚目の棒」の距離cは 30cm ÷ (2×3) = 5cm。"
85
+ },
86
+ {
87
+ "answer_id": "SC01_013",
88
+ "answer": "作用点",
89
+ "difficulty": "標準",
90
+ "question_hint": "せんぬきの構造分析。てこの3要素が道具のどの部分に該当するかを特定させる問題。",
91
+ "source_context": "せんぬきでは、王冠に引っかける部分が「作用点」、瓶のふたの上にのせる部分が「支点」、手で持つ部分が「力点」となる。この位置関係(支点・作用点・力点)を問う。"
92
+ },
93
+ {
94
+ "answer_id": "SC01_014",
95
+ "answer": "力点",
96
+ "difficulty": "標準",
97
+ "question_hint": "ピンセットや和ばさみの構造。力点が中にあるてこの特徴と利点を問う問題。",
98
+ "source_context": "ピンセット、和ばさみ、トングなどは、支点と作用点の間に「力点」がある。このタイプのてこは、作用点にはたらく力は小さくなるが、細かな動きを伝えやすいという利点がある。"
99
+ },
100
+ {
101
+ "answer_id": "SC01_015",
102
+ "answer": "18kg",
103
+ "difficulty": "標準",
104
+ "question_hint": "滑車(定滑車と動滑車)の基本計算。動滑車1つを使った場合の引く力の大きさを求めさせる問題。",
105
+ "source_context": "【設定数値】おもりの重さ36kg。定滑車1つと動滑車1つを組み合わせる。滑車の重さは無視する。【原理】動滑車1つにつき、引く力は重さの1/2になる。 36kg ÷ 2 = 18kg。"
106
+ },
107
+ {
108
+ "answer_id": "SC01_016",
109
+ "answer": "40cm",
110
+ "difficulty": "標準",
111
+ "question_hint": "仕事の原理。おもりを持ち上げる距離と、ひもを引く距離の関係を計算させる問題。",
112
+ "source_context": "【設定数値】動滑車を2つ(ひも4本で支える構造)使い、おもりを10cm持ち上げる。【原理】仕事の原理(力×距離は一定)により、力が1/4になれば引く距離は4倍になる。 10cm × 4 = 40cm。"
113
+ },
114
+ {
115
+ "answer_id": "SC01_017",
116
+ "answer": "30kg",
117
+ "difficulty": "応用",
118
+ "question_hint": "ゴンドラと滑車の応用問題。人が自分自身を乗せたゴンドラを持ち上げるのに必要な力を計算させる。",
119
+ "source_context": "【設定数値】人の体重50kg、ゴンドラ10kg。合計60kg。定滑車1つにひもをかけ、人がひもを引いて自分を持ち上げる。【ロジック】人がひもを引く力をFとすると、ひもが人を引く力Fと、ひもがゴンドラを引く力Fの合計2Fで、全体の重さ60kgを支える。 2F = 60kg。よって必要な力F = 30kg。"
120
+ },
121
+ {
122
+ "answer_id": "SC01_018",
123
+ "answer": "1.08m",
124
+ "difficulty": "標準",
125
+ "question_hint": "輪軸の移動距離計算。軸とおもりの半径比から、ひもを引く長さを求める問題。",
126
+ "source_context": "【設定数値】輪軸の大きな円(輪)の半径がa、小さな円(軸)の半径がb。a=3bのとき、おもりを0.36m持ち上げる。【原理】移動距離の比は半径の比に等しい。 0.36m × 3 = 1.08m。"
127
+ },
128
+ {
129
+ "answer_id": "SC01_019",
130
+ "answer": "前:小さく、後:大きく",
131
+ "difficulty": "応用",
132
+ "question_hint": "自転車のギアと力の関係。ペダルをこぐ力を軽くするための前後のギア設定を答えさせる問題。",
133
+ "source_context": "自転車のペダルをこぐ力を小さく(軽く)するには、前ギアの歯数を「小さく」、後ギアの歯数を「大きく」すればよい。ただし、このとき1回転で進む距離は短くなる。"
134
+ },
135
+ {
136
+ "answer_id": "SC01_020",
137
+ "answer": "弾性",
138
+ "difficulty": "基本",
139
+ "question_hint": "弾性と塑性の定義。力を加えて変形した物体が元に戻る性質の名称を問う知識問題。",
140
+ "source_context": "ばねやゴムのように、変形した物体が元の形に戻ろうとする性質を「弾性」という。逆に、粘土のように戻らない性質を「塑性」という。ばねはこの弾性を利用している。"
141
+ },
142
+ {
143
+ "answer_id": "SC01_021",
144
+ "answer": "30cm",
145
+ "difficulty": "標準",
146
+ "question_hint": "フックの法則(ばねの長さ)。おもりの重さと長さの表から、特定の重さの時の長さを推測させる問題。",
147
+ "source_context": "【設定数値】ばねの元の長さ(自然長)10cm。おもり10gで長さ15cm、20gで20cm、30gで25cmとなっている。【ロジック】のびは10gごとに5cm(15-10, 20-15等)ずつ増える。40gのときは 10cm(自然長) + 5cm×4 = 30cm。"
148
+ },
149
+ {
150
+ "answer_id": "SC01_022",
151
+ "answer": "15cm",
152
+ "difficulty": "応用",
153
+ "question_hint": "ばねの自然長の算出。異なる2つの重さと長さのデータから、元の長さを逆算させる問題。",
154
+ "source_context": "【設定数値】100gのおもりで17cm、500gのおもりで25cmのばねがある。【ロジック】おもりが 500-100=400g 増えたとき、長さは 25-17=8cm 増えた。つまり100gあたり 8÷4=2cm のびる。100gで17cmのとき、のびは2cmなので、自然長は 17-2=15cm。"
155
+ },
156
+ {
157
+ "answer_id": "SC01_023",
158
+ "answer": "12cm",
159
+ "difficulty": "標準",
160
+ "question_hint": "ばねの直列つなぎ。2本のばねを縦につなげた時の全体ののびを計算させる問題。",
161
+ "source_context": "【設定数値】おもり120gで6cmのびるばねを2本直列につなぎ、下に120gのおもりをつるす。【ロジック】直列の場合、それぞれのばねに120gの重さがかかるため、各ばねが6cmずつのびる。全体ののびは 6 + 6 = 12cm。"
162
+ },
163
+ {
164
+ "answer_id": "SC01_024",
165
+ "answer": "3cm",
166
+ "difficulty": "標準",
167
+ "question_hint": "ばねの並列つなぎ。2本のばねで1つのおもりを支える時ののびを計算させる問題。",
168
+ "source_context": "【設定数値】おもり120gで6cmのびるばねを2本並列につなぎ、120gのおもりをつるす。【ロジック】並列の場合、重さは2本に分散される。各ばねには 120g ÷ 2 = 60g の重さがかかる。120gで6cmなら、60gでは3cmのびる。"
169
+ },
170
+ {
171
+ "answer_id": "SC01_025",
172
+ "answer": "4cm",
173
+ "difficulty": "応用",
174
+ "question_hint": "てことばねの組み合わせ。棒の重さとばねののびを計算させる標準的な応用問題。",
175
+ "source_context": "【設定数値】10gで2cmのびるばねA。40gの一様な棒の両端をばねA2本で支えて水平にする。【ロジック】棒は一様なので、各ばねには重さの半分(40÷2=20g)がかかる。10gで2cmなら、20gでは4cmのびる。"
176
+ },
177
+ {
178
+ "answer_id": "SC01_026",
179
+ "answer": "37.5cm",
180
+ "difficulty": "応用",
181
+ "question_hint": "2種類のばねを使ったてこのつり合い。おもりをどの位置につるせば棒が水平になるかを求めさせる問題。",
182
+ "source_context": "【設定数値】10gで5cmのびるばねA、10gで3cmのびるばねB。長さ60cmの軽い棒の左端にA、右端にBをつなぐ。40gのおもりを左端からx cmの位置につるして水平にする。【ロジック】水平になる = 両方のばねの「のび」が等しくなる。のびが等しいとき、かかる重さの比は、ばね定数(のびにくさ)の比 3:5 になる。左(A)に15g、右(B)に25gかかればよい。てこの逆比より、x:(60-x) = 25:15 = 5:3。 x = 60 × 5/8 = 37.5cm。"
183
+ },
184
+ {
185
+ "answer_id": "SC01_027",
186
+ "answer": "等時性",
187
+ "difficulty": "基本",
188
+ "question_hint": "ふりこの等時性の定義。周期が何によって決まり、何によらないかを答えさせる問題。",
189
+ "source_context": "��りこの1往復の時間(周期)は、おもりの重さや振れ幅に関係なく、ふりこの「長さ」だけで決まる。この性質をふりこの「等時性」という。発見者はガリレオ・ガリレイ。"
190
+ },
191
+ {
192
+ "answer_id": "SC01_028",
193
+ "answer": "2.0秒",
194
+ "difficulty": "標準",
195
+ "question_hint": "ふりこの周期計算。長さが4倍になった時の周期の変化を計算させる問題。",
196
+ "source_context": "【設定数値】ふりこの長さが25cmのとき周期は1.0秒。長さを100cm(4倍)にした場合。【ロジック】ふりこの周期は、長さの平方根に比例する。長さが4倍(2×2)になると、周期は2倍になる。 1.0秒 × 2 = 2.0秒。"
197
+ },
198
+ {
199
+ "answer_id": "SC01_029",
200
+ "answer": "1.5秒",
201
+ "difficulty": "応用",
202
+ "question_hint": "くぎ打ちふりこの周期。長さが途中で変わるふりこの1往復にかかる時間を計算させる問題。",
203
+ "source_context": "【設定数値】長さ100cm(周期2.0秒)のふりこ。支点から75cm下にくぎを打ち、後半の長さを25cm(周期1.0秒)にする。【ロジック】1往復は「100cmの半分」と「25cmの半分」の合計になる。 (2.0 ÷ 2) + (1.0 ÷ 2) = 1.0 + 0.5 = 1.5秒。"
204
+ },
205
+ {
206
+ "answer_id": "SC01_030",
207
+ "answer": "2倍",
208
+ "difficulty": "標準",
209
+ "question_hint": "斜面を下る小球の速さ。高さと速さの関係(エネルギー保存の基礎)を問う問題。",
210
+ "source_context": "【原理】なめらかな斜面を転がる小球の速さは、はなす高さの平方根に比例する。高さを4倍にすると、最下点での速さは「2倍」になる。9倍にすると「3倍」になる。"
211
+ },
212
+ {
213
+ "answer_id": "SC01_031",
214
+ "answer": "重さに比例、高さに比例",
215
+ "difficulty": "標準",
216
+ "question_hint": "小球の衝突実験。木片の移動距離が、小球のどのような条件に比例するかを答えさせる問題。",
217
+ "source_context": "斜面から小球を転がして木片に当てたとき、木片が動く距離は、小球の「重さ」に比例し、小球をはなす「高さ」にも比例する。斜面の角度には関係しない。"
218
+ },
219
+ {
220
+ "answer_id": "SC01_032",
221
+ "answer": "位置エネルギー、運動エネルギー",
222
+ "difficulty": "標準",
223
+ "question_hint": "エネルギーの名称と変換。高い所にある物体のエネルギーと、動いている物体のエネルギーの名称を問う。",
224
+ "source_context": "高い所にある物体がもつエネルギーを「位置エネルギー」、運動している物体がもつエネルギーを「運動エネルギー」という。斜面を下る際は、位置エネルギーが運動エネルギーに変換される。"
225
+ },
226
+ {
227
+ "answer_id": "SC01_033",
228
+ "answer": "5.0m",
229
+ "difficulty": "標準",
230
+ "question_hint": "投げ上げの計算。投げ始めの速さと最高点の高さの関係(平方根の比例)を求める問題。",
231
+ "source_context": "【設定数値】投げ始めの速さが2m/秒で高さ0.2m、4m/秒(2倍)で高さ0.8m(4倍)となるデータがある。速さを10m/秒(5倍)にした場合。【ロジック】高さは速さの2乗に比例する。 0.2m × (5×5) = 0.2 × 25 = 5.0m。"
232
+ },
233
+ {
234
+ "answer_id": "SC01_034",
235
+ "answer": "慣性",
236
+ "difficulty": "基本",
237
+ "question_hint": "慣性の法則の用語と現象。電車が急に止まった時のつり革の動きなどから法則名を答えさせる。",
238
+ "source_context": "止まっている物体は止まり続け、動いている物体はそのままの速さで動き続けようとする性質を「慣性」という。バスが急ブレーキをかけた時に体が前に投げ出されるのはこの性質による。"
239
+ }
240
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC02.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC02_001",
4
+ "answer": "+極から-極",
5
+ "question_hint": "電流が流れる向きについての基礎知識を問う問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "乾電池と豆電球を導線でつなぐと、電気(電流)は乾電池の+極から流れ出て豆電球を通り、乾電池の-極へと流れ込む。この電気の流れる道筋を「回路」と呼ぶ。"
8
+ },
9
+ {
10
+ "answer_id": "SC02_002",
11
+ "answer": "並列つなぎ",
12
+ "question_hint": "豆電球2個を回路につなぐ際、一方を外してももう一方が消えない接続方法を答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "「並列回路」は、電源や抵抗が2列以上に枝分かれして並んだ回路である。並列につないだ豆電球は、一方を外してももう一方の豆電球は消えないという特徴を持つ。"
15
+ },
16
+ {
17
+ "answer_id": "SC02_003",
18
+ "answer": "暗くなり、長持ちする",
19
+ "question_hint": "豆電球1個の回路に対し、同じ豆電球を2個「直列」につないだ時の明るさと電池の寿命の変化を問う問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "豆電球の直列つなぎでは、1個の時と比べて回路全体の抵抗が大きくなる。そのため、豆電球は「暗く」なり、消費電流が減るため乾電池は「長持ちする」。"
22
+ },
23
+ {
24
+ "answer_id": "SC02_004",
25
+ "answer": "変わらず、早くなくなる",
26
+ "question_hint": "豆電球1個の回路に対し、同じ豆電球を2個「並列」につないだ時の明るさと電池の寿命の変化を問う問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "豆電球の並列つなぎでは、それぞれの豆電球に電池1個分の電圧がそのままかかるため、明るさは1個の時と「変わらない」。しかし、回路全体を流れる電流は2倍になるため、乾電池は「早くなくなる」。"
29
+ },
30
+ {
31
+ "answer_id": "SC02_005",
32
+ "answer": "明るくなり、早くなくなる",
33
+ "question_hint": "豆電球1個の回路に対し、乾電池2個を「直列」につなぎかえた時の変化を問う問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "乾電池を直列につなぐと、豆電球にかかる電圧が2倍になる。そのため、豆電球は「明るく」なり、消費電流が増えるため乾電池は「早くなくなる」。"
36
+ },
37
+ {
38
+ "answer_id": "SC02_006",
39
+ "answer": "オームの法則",
40
+ "question_hint": "電圧、電流、抵抗の間に成り立つ比例・反比例の関係を表す法則名を答える問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "回路を流れる電流の大きさ(A)は電圧(V)に比例し、抵抗(Ω)に反比例する。この関係を「オームの法則」と呼び、「電圧(V)=電流(A)×抵抗(Ω)」の式で表される。"
43
+ },
44
+ {
45
+ "answer_id": "SC02_007",
46
+ "answer": "20Ω",
47
+ "question_hint": "電圧と電流の測定値から、電熱線の抵抗値を算出させる問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "【設定数値】電熱線に6.0Vの電圧をかけたとき、0.30Aの電流が流れた。【計算ロジック】抵抗(Ω)=電圧(V)÷電流(A)より、6.0 ÷ 0.30 = 20Ω となる。"
50
+ },
51
+ {
52
+ "answer_id": "SC02_008",
53
+ "answer": "反比例",
54
+ "question_hint": "ニクロム線の「長さ」と、流れる「電流」の大きさの間の関係性を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "同じ材質・太さのニクロム線では、抵抗は長さに比例する。そのため、オームの法則により、流れる電流の大きさはニクロム線の長さに「反比例」する。"
57
+ },
58
+ {
59
+ "answer_id": "SC02_009",
60
+ "answer": "3/2倍(1.5倍)",
61
+ "question_hint": "同じ豆電球を「1個つないだ時」と「2個並列につないだ時」で、回路全体を流れる電流の比率を問う問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "豆電球を並列に2個つなぐと、1個あたりの抵抗を1としたとき、並列部分の合成抵抗は1/2になる。乾電池1個の時、回路全体の電流は抵抗の逆数になるため、1個の時を1とすると並列2個では電流は2倍流れる。※教材例題に基づき、特定の混合回路での電流変化などを問う。"
64
+ },
65
+ {
66
+ "answer_id": "SC02_010",
67
+ "answer": "ショート(短絡)",
68
+ "question_hint": "電流が抵抗(豆電球等)を通らずに、電池と導線だけでつながった状態の名称と危険性を問う問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "電流が1つの抵抗も通らずに電池と導線だけを流れることを「ショート」という。ショートが起こると非常に大きな電流が流れ、発熱して火災などの��因になり大変危険である。"
71
+ },
72
+ {
73
+ "answer_id": "SC02_011",
74
+ "answer": "直列、並列",
75
+ "question_hint": "電流計と電圧計を回路に接続する際の正しい方法(接続形式)をそれぞれ答えさせる問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "電流計は回路に対して「直列」につなぐ。これは直列回路ではどこでも電流が等しい性質を利用するためである。一方、電圧計は「並列」につなぐ。これは並列回路では電圧が等しい性質を利用するためである。"
78
+ },
79
+ {
80
+ "answer_id": "SC02_012",
81
+ "answer": "300mA",
82
+ "question_hint": "電流計の指針の読み取り。-端子が500mAに接続されている場合の値を求める問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "【設定条件】電流計の-端子を「500mA」に接続し、指針が「3」の目盛り(5A計の3の位置に相当する目盛り)を指した。【計算】500mA端子使用時は、最大目盛りが500mAとなるように読むため、指針の位置は300mAとなる。"
85
+ },
86
+ {
87
+ "answer_id": "SC02_013",
88
+ "answer": "電子(-の電気)",
89
+ "question_hint": "静電気が発生する際、物体間を移動している粒子の名称を答えさせる問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "異なる物質をこすり合わせると、一方の物質から他方の物質に「電子(-の電気)」が移動する。電子が増えた方は-に、減った方は+に帯電し、このたまった電気を「静電気」という。"
92
+ },
93
+ {
94
+ "answer_id": "SC02_014",
95
+ "answer": "反発し合い、引き合う",
96
+ "question_hint": "電気を帯びた物体(帯電体)どうしの間に働く力の性質を答えさせる問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "+と+、または-と-のように、同じ種類の電気をもつものどうしは「反発し合う」。+と-のように、異なる種類の電気をもつものどうしは「引き合う」。"
99
+ },
100
+ {
101
+ "answer_id": "SC02_015",
102
+ "answer": "鉄、ニッケル、コバルト",
103
+ "question_hint": "磁石に引きつけられる金属の種類を3つ挙げる問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "磁石に引きつけられる代表的な物質には、「鉄」「ニッケル」「コバルト」がある。銅やアルミニウムは引きつけられない。"
106
+ },
107
+ {
108
+ "answer_id": "SC02_016",
109
+ "answer": "右ねじの法則",
110
+ "question_hint": "まっすぐな導線に電流を流したときにできる磁界の向きを判断する法則名を答えさせる問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "導線に電流を流すと、その周りに同心円状の磁界ができる。磁界の向きは、電流の流れる向きに「右ねじ」を締める向きと同じであり、これを「右ねじの法則」という。"
113
+ },
114
+ {
115
+ "answer_id": "SC02_017",
116
+ "answer": "北西",
117
+ "question_hint": "導線の下に方位磁針を置き、電流を流した時の針の振れる向きを推測させる問題。",
118
+ "difficulty": "応用",
119
+ "source_context": "【設定条件】一定の電流を流した導線の「上」に方位磁針を置くと、N極が北東を指した。【問い】同じ条件で磁針を「下」に置いた場合。【ロジック】電流の作る磁界は導線の上下で向きが逆になるため、上側で東(右)に振れたのであれば、下側では西(左)に振れる。元が北を指していれば、北西となる。"
120
+ },
121
+ {
122
+ "answer_id": "SC02_018",
123
+ "answer": "右手の法則(右手の親指)",
124
+ "question_hint": "コイルに流れる電流の向きから、電磁石の極(N極)の向きを判断する方法を答えさせる問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "右手の4本の指を電流の向きに合わせてコイルを握ったとき、立てた「親指」が指す方が磁力線が出ていく端、つまり「N極」になる。"
127
+ },
128
+ {
129
+ "answer_id": "SC02_019",
130
+ "answer": "鉄心、電流、巻き数",
131
+ "question_hint": "電磁石の磁力を強くするための3つの代表的な方法を答えさせる問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "電磁石を強くするには、1.「鉄心」を入れる、2.流れる「電流」を大きくする、3.コイルの「巻き数」を増やす、といった方法がある。"
134
+ },
135
+ {
136
+ "answer_id": "SC02_020",
137
+ "answer": "整流子",
138
+ "question_hint": "モーターにおいて、コイルが半回転するごとに電流の向きを切り替える働きをする部品名を答える問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "モーターのコイルの両端には、2個の切れ目が入った「整流子」という金属の軸がある。これがブラシと触れ合う��とで、半回転ごとに電流の向きを入れ替え、コイルの極を次々に変える仕組みになっている。"
141
+ },
142
+ {
143
+ "answer_id": "SC02_021",
144
+ "answer": "フレミングの左手の法則",
145
+ "question_hint": "磁界の中で電流が流れる導線が受ける「力」の向きを、左手を使って判断する法則名を答える問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "中指を「電流」、人差し指を「磁界」、親指を「力」の向きに合わせる。これら3つの向きが互いに直角になる関係を「フレミングの左手の法則」と呼ぶ。"
148
+ },
149
+ {
150
+ "answer_id": "SC02_022",
151
+ "answer": "電磁誘導",
152
+ "question_hint": "コイルの中で磁石を動かすことで、コイルに電流が発生する現象の名称を答えさせる問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "コイルに磁石を近づけたり遠ざけたりして、コイルの中の磁界が変化するとき、コイルに電圧が生じて電流が流れる。この現象を「電磁誘導」、流れる電流を「誘導電流」という。"
155
+ },
156
+ {
157
+ "answer_id": "SC02_023",
158
+ "answer": "コンデンサー",
159
+ "question_hint": "電気を一時的に貯めておくことができ、充電と放電を繰り返せる装置の名称を答える問題。",
160
+ "difficulty": "基本",
161
+ "source_context": "電源からの電気を貯める(充電)ことや、貯めた電気を放出(放電)させることができる装置を「コンデンサー」という。"
162
+ },
163
+ {
164
+ "answer_id": "SC02_024",
165
+ "answer": "発光ダイオードの方が長く光る",
166
+ "question_hint": "コンデンサーに貯めた同じ量の電気で「豆電球」と「発光ダイオード(LED)」を光らせた時の持続時間の違いを問う問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "発光ダイオード(LED)は豆電球に比べて消費電力が非常に小さいため、コンデンサーに貯まった同じ量の電気を使っても、豆電球よりはるかに「長く光り続ける」。"
169
+ },
170
+ {
171
+ "answer_id": "SC02_025",
172
+ "answer": "光電池",
173
+ "question_hint": "光エネルギーを直接電気エネルギーに変換する装置の名称を答える問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "光電池は、光エネルギーを電気エネルギーに変換して電気をつくる。当たる光が強いほど、また光が「直角」に当たるほど大きな電流が発生する。"
176
+ },
177
+ {
178
+ "answer_id": "SC02_026",
179
+ "answer": "+端子側からのみ流れる",
180
+ "question_hint": "発光ダイオード(LED)に電流が流れる条件(極性)について答えさせる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "LEDには+と-の端子の区別があり、「+端子」側からのみ電流が流れる。逆に接続すると電流は流れず、LEDは光らない。"
183
+ },
184
+ {
185
+ "answer_id": "SC02_027",
186
+ "answer": "比例、反比例",
187
+ "question_hint": "金属線の抵抗の大きさが、線の「長さ」と「太さ(断面積)」にどのように関わるかをそれぞれ答えさせる問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "同じ材質の金属線では、抵抗は長さに「比例」し、太さ(断面積)に「反比例」する。したがって、太くて短い線ほど抵抗が小さく電流が流れやすい。"
190
+ },
191
+ {
192
+ "answer_id": "SC02_028",
193
+ "answer": "8℃上昇する",
194
+ "question_hint": "電流と水の重さの変化から、発熱(温度上昇)を計算させる応用問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "【設定数値】水100gを電熱線で温める。電池1個で1分間に1℃、電池2個直列で4℃上昇した。【問い】電池2個直列のまま、水を50gに減らした時の上昇温度。【ロジック】発熱量は同じ条件で、水の重さが半分(50g)になると、上昇温度は反比例して2倍になる。 4℃ × 2 = 8℃。"
197
+ },
198
+ {
199
+ "answer_id": "SC02_029",
200
+ "answer": "比例する",
201
+ "question_hint": "電熱線の発熱量と「電流を流した時間」の関係性を答えさせる問題。",
202
+ "difficulty": "基本",
203
+ "source_context": "電熱線に電流を流した際の発熱量は、電流の大きさや電圧が一定であれば、電流を流した時間に「比例する」。これをジュールの法則という。"
204
+ },
205
+ {
206
+ "answer_id": "SC02_030",
207
+ "answer": "抵抗の大きい電熱線",
208
+ "question_hint": "電熱線を「直列」につないだ時、発熱量が大きくなるのはどちらの抵抗(大・小)かを答えさせる問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "直列回路では、全ての電熱線に同じ大きさの電流が流れる。このとき、電圧は抵抗に比例してかかるため、消費電力(発熱量��は「抵抗の大きい」電熱線の方が大きくなる。"
211
+ },
212
+ {
213
+ "answer_id": "SC02_031",
214
+ "answer": "抵抗の小さい電熱線",
215
+ "question_hint": "電熱線を「並列」につないだ時、発熱量が大きくなるのはどちらの抵抗(大・小)かを答えさせる問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "並列回路では、全ての電熱線に同じ電圧がかかる。このとき、電流は抵抗に反比例して流れるため、電流が多く流れる「抵抗の小さい」電熱線の方が発熱量は大きくなる。"
218
+ },
219
+ {
220
+ "answer_id": "SC02_032",
221
+ "answer": "16分",
222
+ "question_hint": "抵抗の直列接続が発熱時間に与える影響を計算させる問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定】水温を5℃上げるのに、電熱線1本(図1)で8分かかる。【問い】同じ電熱線を2本「直列」にした場合(図2)に5℃上げる時間。【ロジック】直列にすると全体の抵抗が2倍になり、流れる電流は1/2倍、電圧は変わらないため、電力(発熱量)は1/2になる。そのため同じ熱量を出すには2倍の時間が必要。 8分 × 2 = 16分。"
225
+ },
226
+ {
227
+ "answer_id": "SC02_033",
228
+ "answer": "24秒間",
229
+ "question_hint": "水の質量と加熱時間、上昇温度の関係から、特定の条件での加熱時間を算出させる問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】液体150gを180秒加熱すると5℃上昇(20℃→25℃)。【問い】液体100gを1℃上昇させる時間。【ロジック】150gを5℃上げるのに180秒なら、1gを1℃上げる仕事は 180 ÷ (150×5) = 0.24秒相当。 100gを1℃上げるには 100 × 0.24 = 24秒間 となる。"
232
+ },
233
+ {
234
+ "answer_id": "SC02_034",
235
+ "answer": "2個(または3路スイッチを2個)",
236
+ "question_hint": "階段の上下など、2か所のどちらからでも電気をつけたり消したりするために必要なスイッチの個数を問う問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "「三路スイッチ」という特殊なスイッチを「2個」使うことで、2か所のどちらからでも電気を点灯・消灯させることができる回路をつくることができる。"
239
+ }
240
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC03.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC03_001",
4
+ "answer": "反射の法則",
5
+ "question_hint": "光の反射に関する用語知識。入射角と反射角が等しくなる法則の名称を答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "光が鏡などの物体に当たってはね返る現象を反射という。このとき「入射角」と「反射角」は常に等しくなる。このきまりを「反射の法則」と呼ぶ。"
8
+ },
9
+ {
10
+ "answer_id": "SC03_002",
11
+ "answer": "対称(の点)",
12
+ "question_hint": "平面鏡による像の位置。鏡に対して実物とどのような位置関係に像ができるかを答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "鏡に映った物体の像は、鏡を対称の軸として実際の物体と「対称」の位置に見える。像から鏡までの距離と、物体から鏡までの距離は等しい。"
15
+ },
16
+ {
17
+ "answer_id": "SC03_003",
18
+ "answer": "2時",
19
+ "question_hint": "鏡に映る像の性質。直角に合わせた2枚の鏡に映る時計の針の見え方を答えさせる問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "鏡1枚では左右が逆に見えるが、鏡に2回反射(直角に合わせた鏡など)すると左右が元と同じ(逆の逆)に見える。2時を示す時計を正面から見たとき、2回反射された像はそのまま「2時」を指しているように見える。"
22
+ },
23
+ {
24
+ "answer_id": "SC03_004",
25
+ "answer": "身長の半分",
26
+ "question_hint": "鏡に映る範囲の知識。自分の全身を映して見るために必要な鏡の長さを答えさせる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "鏡に自分の全身を映して見るためには、原理的に「身長の半分」の長さ(縦の長さ)の鏡があれば十分である。これは光の反射の法則に基づいている。"
29
+ },
30
+ {
31
+ "answer_id": "SC03_005",
32
+ "answer": "48度",
33
+ "question_hint": "反射による光の進路計算。入射光と鏡の角度から、元の進行方向とのずれを求めさせる計算問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【設定数値】光が鏡と24度の角度で当たり、反射した。【ロジック】反射面と光の角度が24度なら、入射角は 90-24=66度。反射角も66度。反射光と鏡のなす角も24度。元の直進方向(180度)からのずれの角度aは、入射角+反射角ではなく、反射角の2倍分(または図形的な計算)で48度となる。"
36
+ },
37
+ {
38
+ "answer_id": "SC03_006",
39
+ "answer": "境界面から遠ざかる(または屈折角が大きくなる)",
40
+ "question_hint": "光の屈折の性質。空気から水(またはガラス)へ光が進む際の折れ曲がり方を答えさせる問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "光が空気から水やガラスなどの密度の高い物質へ斜めに入射するとき、光は「境界面から遠ざかる方向(法線に近づく方向)」へ屈折する。逆に水から空気へ出る際は、境界面に近づく方向(法線から遠ざかる方向)へ屈折する。"
43
+ },
44
+ {
45
+ "answer_id": "SC03_007",
46
+ "answer": "実際よりも上(浅いところ)",
47
+ "question_hint": "屈折による見かけの変化。空気中から水中の物体を見たとき、見かけの位置がどう変わるかを問う問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "水中にある物体で反射した光が、空気中に出る際に屈折することで、人の目には光が直進してきたように錯覚される。その結果、水中の物体(コインなど)は実際の位置よりも「上(浅い位置)」に浮き上がって見える。"
50
+ },
51
+ {
52
+ "answer_id": "SC03_008",
53
+ "answer": "全反射",
54
+ "question_hint": "光の屈折と反射の特殊現象。入射角が一定以上になったとき、光が外に出なくなる現象名を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "光が水やガラスから空気に入射するとき、入射角がある角度より大きくなると、境界面で光が全て反射して空気中へ出ていかなくなる。これを「全反射」という。"
57
+ },
58
+ {
59
+ "answer_id": "SC03_009",
60
+ "answer": "紫色の光",
61
+ "question_hint": "プリズムによる光の分散。赤色と紫色の光のうち、より大きく屈折する方の色を答えさせる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "日光をプリズムに通すと虹色に分かれる(分散)。これは色によって屈折率が異なるためで、「赤色の光」は屈折しにくく、「紫色の光」は屈折しやすい性質がある。"
64
+ },
65
+ {
66
+ "answer_id": "SC03_010",
67
+ "answer": "主虹:内側が紫色、外側が赤色",
68
+ "question_hint": "虹の色の並び。一��的な虹(主虹)において、円弧の内側と外側が何色であるかを答えさせる問題。",
69
+ "difficulty": "応用",
70
+ "source_context": "雨粒の中で太陽光が屈折・反射することで虹ができる。一般的な「主虹」は、屈折しやすい紫色の光が内側(下側)に、屈折しにくい赤色の光が外側(上側)に並ぶ。なお、反射が2回の「副虹」はこの色が逆転する。"
71
+ },
72
+ {
73
+ "answer_id": "SC03_011",
74
+ "answer": "焦点",
75
+ "question_hint": "凸レンズの用語。光軸に平行な光が集まる点の名称を答えさせる問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "凸レンズの光軸に平行に入射した光が、レンズを通った後に屈折して集まる1点を「焦点」という。レンズの中心から焦点までの距離を「焦点距離」と呼ぶ。"
78
+ },
79
+ {
80
+ "answer_id": "SC03_012",
81
+ "answer": "実像、虚像",
82
+ "question_hint": "レンズによる像の種類。スクリーンに映る像と、レンズをのぞき込んだときに見える像の名称を答える問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "凸レンズを通った光が実際に集まってスクリーンに映る像を「実像」という。逆に焦点より内側に物体を置いたとき、レンズをのぞくと見える(光が実際に集まっていない)大きな像を「虚像」という。"
85
+ },
86
+ {
87
+ "answer_id": "SC03_013",
88
+ "answer": "同じ大きさ、倒立(実像)",
89
+ "question_hint": "凸レンズの像の性質。物体を「焦点距離の2倍」の位置に置いたときの像の大きさと向きを答えさせる問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "凸レンズの焦点距離の2倍の位置に物体を置くと、レンズの反対側の同じ距離(2倍の位置)に「実物と同じ大きさ」の「上下左右が逆(倒立)」の実像ができる。"
92
+ },
93
+ {
94
+ "answer_id": "SC03_014",
95
+ "answer": "上下左右が逆の像",
96
+ "question_hint": "ピンホールカメラの性質。スクリーンに映る像の向きについて答えさせる問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "光の直進性を利用したピンホールカメラでは、小さな穴を通った光がスクリーンに当たる際、物体と「上下左右が逆」の像が映る。穴を大きくすると像は明るくなるが、ぼやけてしまう。"
99
+ },
100
+ {
101
+ "answer_id": "SC03_015",
102
+ "answer": "11.6m",
103
+ "question_hint": "影の長さの計算。太陽高度の変化に伴う建物の影の長さの変化を求めさせる応用問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "【設定数値】太陽高度が30度のとき、ある建物の影の長さが34.8mだった。太陽高度が60度になったときの影の長さを求める。【ロジック】三角形の相似や比の関係(30度:60度の関係)を利用する。60度のときの影の長さは、30度のときの長さの1/3になる。 34.8 ÷ 3 = 11.6m。"
106
+ },
107
+ {
108
+ "answer_id": "SC03_016",
109
+ "answer": "一定(変化しない)",
110
+ "question_hint": "平行光線による明るさの変化。光源(太陽等)からの距離を変えた際、照らされる面の明るさがどうなるかを問う問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "太陽のように非常に遠くにある光源からの「平行光線」では、光源からの距離が変わっても単位面積あたりに受ける光の量は変わらないため、明るさは「一定」に保たれる。"
113
+ },
114
+ {
115
+ "answer_id": "SC03_017",
116
+ "answer": "1/4倍",
117
+ "question_hint": "拡散光線による明るさの変化。光源(電球等)からの距離が2倍になったときの明るさを求めさせる計算問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "電球などの「拡散光線」では、光源からの距離が2倍、3倍になると、光が照らす面積が2の2乗倍(4倍)、3の2乗倍(9倍)に広がるため、単位面積あたりの明るさは「1/4倍」「1/9倍」になる。"
120
+ },
121
+ {
122
+ "answer_id": "SC03_018",
123
+ "answer": "赤、緑、青",
124
+ "question_hint": "光の三原色の知識。混ぜると白くなる3つの光の色を全て答えさせる問題。",
125
+ "difficulty": "基本",
126
+ "source_context": "光の三原色は「赤・緑・青」の3色である。これらを重ね合わせると白色の光になる。一方、絵の具などの色材の三原色はシアン・マゼンタ・黄色である。"
127
+ },
128
+ {
129
+ "answer_id": "SC03_019",
130
+ "answer": "秒速30万km",
131
+ "question_hint": "光の速さの定数知識。真空中を進む光の速さ(秒速)を答えさせる問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "真空中を進む光の速さは秒速約30万kmである。これは1秒間に地球(赤道)を約7周半する速さに相当する。"
134
+ },
135
+ {
136
+ "answer_id": "SC03_020",
137
+ "answer": "振幅、振動数(Hz)",
138
+ "question_hint": "音の大小と高低の仕組み。音が大きいことと高いことが、それぞれ空気の振動の何に関連するかを答えさせる問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "音は物の振動によって伝わる。空気の振動の振れ幅(振幅)が大きいほど「大きな音」になり、1秒間の振動回数(振動数・ヘルツ)が多いほど「高い音」になる。"
141
+ },
142
+ {
143
+ "answer_id": "SC03_021",
144
+ "answer": "秒速331 + 0.6t [m]",
145
+ "question_hint": "音の速さの公式。気温t度における空気中の音の速さを求める式を答えさせる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "空気中を伝わる音の速さは気温によって変化する。0℃のときの秒速331mを基準として、気温が1℃上がるごとに0.6mずつ速くなる。式:331 + 0.6 × 気温(℃)。例として15℃の時は約340m/sとなる。"
148
+ },
149
+ {
150
+ "answer_id": "SC03_022",
151
+ "answer": "150m",
152
+ "question_hint": "音の反射を利用した距離計算。発信から反射音が返ってくるまでの時間から、物体までの距離を求めさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "【設定数値】海中を伝わる音の速さが秒速1500m。魚群探知機の音が返ってくるまでに0.2秒かかった。【ロジック】音は往復しているため、片道の時間は0.1秒。 1500 × 0.1 = 150m。"
155
+ },
156
+ {
157
+ "answer_id": "SC03_023",
158
+ "answer": "ドップラー効果",
159
+ "question_hint": "音の性質に関する用語知識。音源が近づく際に高く、遠ざかる際に低く聞こえる現象名を答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "救急車が近づいてくるときは音が高く聞こえ、遠ざかるときは低く聞こえる現象を「ドップラー効果」という。これは音源が動くことで波長が圧縮または延伸されるために起こる。"
162
+ },
163
+ {
164
+ "answer_id": "SC03_024",
165
+ "answer": "1cal(カロリー)",
166
+ "question_hint": "熱量の定義。水1gの温度を1度上げるために必要な熱量の単位と数値を答えさせる問題。",
167
+ "difficulty": "基本",
168
+ "source_context": "水1gの温度を1℃上げるのに必要な熱量を「1cal(カロリー)」と定義する。水は比熱が大きく、他の物質に比べてあたたまりにくく冷めにくい。"
169
+ },
170
+ {
171
+ "answer_id": "SC03_025",
172
+ "answer": "2500cal",
173
+ "question_hint": "熱量の計算。水の質量と上昇温度から、水が得た熱量を求めさせる基本問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "【設定数値】100gの水を20℃から45℃まで加熱した。【計算ロジック】上昇温度は 45-20=25度。 水の重さ(g) × 上昇温度(℃) = 熱量(cal)。 100 × 25 = 2500cal。"
176
+ },
177
+ {
178
+ "answer_id": "SC03_026",
179
+ "answer": "45℃",
180
+ "question_hint": "熱の移動(混合)。異なる温度の同じ重さの水を混ぜたときの最終的な温度を答えさせる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "【設定数値】60℃の水100gと30℃の水100gを混ぜた。【ロジック】同じ物質・同じ重さの場合、熱平衡温度は平均値になる。 (60 + 30) ÷ 2 = 45℃。一方が失った熱量と、他方が得た熱量は等しくなる。"
183
+ },
184
+ {
185
+ "answer_id": "SC03_027",
186
+ "answer": "伝導、対流、放射",
187
+ "question_hint": "熱の伝わり方の3種類。それぞれの名称を答えさせる問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "熱の伝わり方には、物質の中を熱が伝わる「伝導」、液体や気体が循環して伝わる「対流」、光(赤外線など)によって直接伝わる「放射(輻射)」の3つがある。"
190
+ },
191
+ {
192
+ "answer_id": "SC03_028",
193
+ "answer": "銅 > アルミニウム > 鉄",
194
+ "question_hint": "金属の熱伝導性。銅、鉄、アルミニウムのうち、熱を伝えやすい順番に並べさせる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "金属の種類によって熱の伝わりやすさ(熱伝導率)は異なる。銀や「銅」は特に伝えやすく、次いで「アルミニウム」、その後に「鉄」の順になる。"
197
+ },
198
+ {
199
+ "answer_id": "SC03_029",
200
+ "answer": "上向き(吹き出し口を上にする)",
201
+ "question_hint": "対流を利用した効率的な冷却。冷房を使う際、部屋全体を冷やすための吹き出し口の向きを答えさせる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "冷たい空気は密度が大きいため「下降」し、温かい空気は密度が小さいため「上昇」する(対流)。部屋を冷やす際は、冷たい風を「���」へ向けて出すことで、冷気が降りていき効率よく全体が冷える。"
204
+ },
205
+ {
206
+ "answer_id": "SC03_030",
207
+ "answer": "気体 > 液体 > 固体",
208
+ "question_hint": "熱膨張の程度の比較。熱による体積の変化(膨張)が最も大きい状態を答えさせる問題。",
209
+ "difficulty": "基本",
210
+ "source_context": "物質をあたためると体積が増える。この変わり方(膨張のしやすさ)は「気体」が最も大きく、次いで「液体」、「固体」の順に小さくなる。"
211
+ },
212
+ {
213
+ "answer_id": "SC03_031",
214
+ "answer": "バイメタル",
215
+ "question_hint": "固体の熱膨張を利用した器具。膨張率の異なる2種類の金属板を貼り合わせたものの名称を問う問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "膨張率(あたためた時ののびやすさ)が異なる2種類の金属板を貼り合わせたものを「バイメタル」という。加熱すると膨張率が小さい方へ曲がる性質を利用し、温度調節スイッチなどに使われる。"
218
+ },
219
+ {
220
+ "answer_id": "SC03_032",
221
+ "answer": "24cm",
222
+ "question_hint": "凸レンズの公式計算。焦点距離と物体の位置から、像ができる位置を求めさせる応用問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】焦点距離(f) = 8cm。物体の位置(a) = レンズから12cm。 【ロジック】レンズの公式 1/a + 1/b = 1/f を使用する。 1/12 + 1/b = 1/8。 1/b = 3/24 - 2/24 = 1/24。よって像の位置(b)はレンズから24cm。"
225
+ },
226
+ {
227
+ "answer_id": "SC03_033",
228
+ "answer": "30万km/秒",
229
+ "question_hint": "フィゾーの実験の再現計算。歯車の回転速度と距離から光の速さを導き出させる応用問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定条件】距離(L)7500m(往復15km)。歯数1000。毎秒10回転で反射光が見えなくなった(隣の歯で遮られた)。【ロジック】歯が1つ進む時間は 1/10秒 ÷ (1000×2) = 1/20000秒。この間に光が往復15km進んだとする。 15km ÷ (1/20000秒) = 300,000km/s。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC04.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC04_001",
4
+ "answer": "石油",
5
+ "question_hint": "プラスチックの原料となる物質の名称を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "プラスチックは石油などを原料にして人工的に合成された物質。軽い、くさりにくい、さびないといった特徴を持つ。燃やすと二酸化炭素が発生する。"
8
+ },
9
+ {
10
+ "answer_id": "SC04_002",
11
+ "answer": "密度",
12
+ "question_hint": "物質1cm³あたりの重さを表す用語を答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "物質の種類や状態によって決まっている「1cm³あたりの重さ」のことを密度と呼ぶ。単位はg/cm³。物質が液体に浮くか沈むかは、物体と液体の密度の比較によって決まる。"
15
+ },
16
+ {
17
+ "answer_id": "SC04_003",
18
+ "answer": "融点",
19
+ "question_hint": "固体が液体に変化するときの一定の温度を指す用語を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "物質が固体から液体に変わる温度を融点、液体から気体に変わる(沸騰する)温度を沸点と呼ぶ。水の場合、1気圧下での融点は0℃、沸点は100℃である。融解している間は加えられた熱が状態変化に使われるため、温度は一定に保たれる。"
22
+ },
23
+ {
24
+ "answer_id": "SC04_004",
25
+ "answer": "昇華",
26
+ "question_hint": "固体から液体にならず直接気体に変化する現象の名称を答える問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "ドライアイス(二酸化炭素の固体)を空気中に置くと、液体にならずに固体から直接気体になる。この変化を昇華と呼ぶ。ドライアイスは約-78℃で、冷却剤として使用される。"
29
+ },
30
+ {
31
+ "answer_id": "SC04_005",
32
+ "answer": "4℃",
33
+ "question_hint": "水の密度が最大(体積が最小)になる温度を答える問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "通常の物質は液体より固体の方が密度が大きいが、水は例外。水の密度は4℃の時に最大(体積が最小)となり、それより温度が上がっても下がっても体積は増える。水が氷(0℃)になると、体積は約1.1倍に増え、密度は水より小さくなるため氷は水に浮く。"
36
+ },
37
+ {
38
+ "answer_id": "SC04_006",
39
+ "answer": "ポリエチレン",
40
+ "question_hint": "レジ袋などに使われ、酸やアルカリに強く水に浮く性質を持つプラスチック名を答える問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "ポリエチレンは、酸性やアルカリ性の水溶液と反応せず、密度が約0.96g/cm³であるため水(1.0g/cm³)に浮く。主な用途はレジ袋や容器など。"
43
+ },
44
+ {
45
+ "answer_id": "SC04_007",
46
+ "answer": "沈む",
47
+ "question_hint": "ペットボトルの本体に使われるPETが水に対してどのような挙動(浮き沈み)を示すか答える問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "ペットボトル本体の材料であるポリエチレンテレフタラート(PET)は、密度が約1.32g/cm³。水の密度(1.0g/cm³)より大きいため、水に入れると沈む。"
50
+ },
51
+ {
52
+ "answer_id": "SC04_008",
53
+ "answer": "ポリプロピレン",
54
+ "question_hint": "ペットボトルのふたに使われ、熱に強く水に浮くプラスチック名を答える問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "ポリプロピレンは熱に強く、密度が約0.90g/cm³。水の密度(1.0g/cm³)より小さいため水に浮く。用途はペットボトルのふたなど。"
57
+ },
58
+ {
59
+ "answer_id": "SC04_009",
60
+ "answer": "断熱性(または保温性)",
61
+ "question_hint": "発泡ポリスチレンが食品トレイなどに使われる理由となる、熱を通しにくい性質を答える問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "ポリスチレンを加工して空気を多量に含ませた発泡ポリスチレンは、断熱性や保温性が高い。食品トレイや、魚を運ぶための緩衝材として使われる。"
64
+ },
65
+ {
66
+ "answer_id": "SC04_010",
67
+ "answer": "変化しない",
68
+ "question_hint": "状態変化(固体・液体・気体の変化)の前後で物質の重さがどうなるかを問う問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "物質が固体から液体、液体から気体へ状態変化しても、重さは変化しない。一方で、粒の集まり方が変わるため体積は変化し、それに伴い密度も変化する。"
71
+ },
72
+ {
73
+ "answer_id": "SC04_011",
74
+ "answer": "沈む",
75
+ "question_hint": "固体のろうを液体のろうに入れた際、どのような挙動(浮き沈み)を示すか答える問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "水以外のほとんどの物質は、液体から固体になると体積が減り、密度が大きくなる。そのため、固体のろうは液体のろうよりも重く(密度が大きく)、液体のろうに入れると沈む。"
78
+ },
79
+ {
80
+ "answer_id": "SC04_012",
81
+ "answer": "吸熱(熱を吸収する)",
82
+ "question_hint": "液体が蒸発して気体になる際、周囲の熱に対してどのような作用を及ぼすか答える問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "液体が蒸発して気体になる時、まわりから熱を吸収する(気化熱)。アルコール消毒で手が冷たく感じるのは、アルコールが蒸発する際に皮膚から熱を奪うため。水が蒸発する際も同様で、周囲の温度は下がる。"
85
+ },
86
+ {
87
+ "answer_id": "SC04_013",
88
+ "answer": "水蒸気",
89
+ "question_hint": "沸騰している水の中から出てくる大きな泡の正体を答える問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "水を加熱し始めて最初に出る小さな泡は、水に溶けていた空気。沸騰して出てくる大きな泡は気体となった水、すなわち水蒸気である。水蒸気は無色透明で目に見えないが、冷やされて小さな水滴になった「湯気」は白く見える。"
92
+ },
93
+ {
94
+ "answer_id": "SC04_014",
95
+ "answer": "低くなる",
96
+ "question_hint": "富士山の山頂など気圧が低い場所では、水の沸点が100℃と比べてどうなるか答える問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "水の沸騰する温度(沸点)は気圧によって変化する。標高が高い場所など気圧が低いところでは、100℃より低い温度で沸騰する。逆に、圧力なべのように圧力を高くすると、沸点は100℃より高くなる。"
99
+ },
100
+ {
101
+ "answer_id": "SC04_015",
102
+ "answer": "バイメタル",
103
+ "question_hint": "膨張率の異なる2枚の金属を貼り合わせた部品の名称を答える問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "熱による膨張の割合(膨張率)が異なる2種類の金属板を貼り合わせたものをバイメタルと呼ぶ。加熱すると膨張率が小さい方に曲がる。この性質を利用して、温度でスイッチを切り替えるサーモスタットなどに使われる。"
106
+ },
107
+ {
108
+ "answer_id": "SC04_016",
109
+ "answer": "鉄、ニッケル、コバルト",
110
+ "question_hint": "磁石に引きつけられる金属をすべて挙げる問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "磁石は特定の金属を引きつける。代表的なものは鉄、ニッケル、コバルトである。アルミニウムや銅は磁石に引きつけられない。"
113
+ },
114
+ {
115
+ "answer_id": "SC04_017",
116
+ "answer": "1.2g/cm³",
117
+ "question_hint": "一辺が2cmで、重さが9.6gの立方体の密度を計算させる問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "体積=2cm×2cm×2cm=8cm³。密度=重さ÷体積=9.6g÷8cm³=1.2g/cm³。この立方体は水の密度(1.0g/cm³)より大きいため、水に沈む。"
120
+ },
121
+ {
122
+ "answer_id": "SC04_018",
123
+ "answer": "水と油の境界面",
124
+ "question_hint": "コップに入れた水と油の層の上に氷を置いたとき、氷はどこで止まるか答える問題。",
125
+ "difficulty": "応用",
126
+ "source_context": "物質の密度を比較する。油(約0.9g/cm³)< 氷(約0.92g/cm³)< 水(1.0g/cm³)の順になる。氷は水には浮くが油には沈むため、水と油の境界面に浮いた状態で止まる。"
127
+ },
128
+ {
129
+ "answer_id": "SC04_019",
130
+ "answer": "約1700倍",
131
+ "question_hint": "水が液体から水蒸気(気体)になるとき、体積は約何倍になるか答える問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "水の三態変化における体積比:氷(固体)は約1.1倍、水(液体)を1とすると、水蒸気(気体)は約1700倍に膨れ上がる。"
134
+ },
135
+ {
136
+ "answer_id": "SC04_020",
137
+ "answer": "アルキメデスの原理",
138
+ "question_hint": "「物体にはたらく浮力の大きさは、その物体が押しのけた液体の重さに等しい」という法則名を答える問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "浮力に関する基本的な原理。物体が水に沈んでいる体積分の水の重さが、そのまま上向きの力(浮力)となる。これを発見したのがアルキメデスである。"
141
+ },
142
+ {
143
+ "answer_id": "SC04_021",
144
+ "answer": "1.2g/cm³",
145
+ "question_hint": "物体A(重さ60g、底面積10cm²、高さ10cm)をある食塩水に入れたら5cm沈んで浮いた。この食塩水の密度を求める問題。",
146
+ "difficulty": "応用",
147
+ "source_context": "物体Aが浮いているので「物体の重さ(60g)=浮力」。浮力は「押しのけた液体の体積×液体の��度」。押しのけた体積は10cm²×5cm=50cm³。60g = 50cm³ × 密度。密度 = 60÷50 = 1.2g/cm³。"
148
+ },
149
+ {
150
+ "answer_id": "SC04_022",
151
+ "answer": "280kg",
152
+ "question_hint": "気球の問題。外気(1.2g/L)、気球内空気(0.7g/L)、容積(560m³)のとき、浮き上がるための荷物の最大重量を計算する問題。",
153
+ "difficulty": "応用",
154
+ "source_context": "【浮力】=外気の重さ=560,000L × 1.2g/L = 672,000g = 672kg。【内部空気の重さ】=560,000L × 0.7g/L = 392,000g = 392kg。浮き上がるには「浮力 > 内部空気の重さ + 荷物」が必要。672 - 392 = 280kg。よって280kg未満であれば浮く。"
155
+ },
156
+ {
157
+ "answer_id": "SC04_023",
158
+ "answer": "不純物が混ざっている(密度が変わっている)",
159
+ "question_hint": "同じ重さの純金と王冠を水に沈めたとき、てんびんが傾いた。このことから王冠について言えることを答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "重さが同じでも、物質の密度が異なれば体積が変わる。体積が変われば受ける浮力が変わるため、水中でてんびんのバランスが崩れる。王冠が純金と同じ重さなのに傾いたなら、純金とは異なる密度の物質が混ざっている証拠である。"
162
+ },
163
+ {
164
+ "answer_id": "SC04_024",
165
+ "answer": "固体:決まっている、液体:決まっている、気体:決まっていない",
166
+ "question_hint": "三態(固体・液体・気体)それぞれの「体積」が、容器の形に関わらず決まっているかどうかを答える問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "物質の三態の性質。固体は形・体積ともに一定。液体は形は変わるが体積はほぼ一定。気体は形も体積も決まっておらず、容器全体に広がる。また、気体だけは圧力をかけると大きく縮む性質を持つ。"
169
+ },
170
+ {
171
+ "answer_id": "SC04_025",
172
+ "answer": "水蒸気が熱を放出したから",
173
+ "question_hint": "雲ができるとき、空気の温度低下が緩やかになる理由を答える問題。",
174
+ "difficulty": "応用",
175
+ "source_context": "水が蒸発するときは熱を奪う(吸熱)が、逆に水蒸気が水滴に戻るとき(凝結)は熱を放出する(発熱)。上昇する空気が露点に達して雲ができる際、水蒸気が水に変わる時に熱を出すため、温度の下がり方が小さくなる。"
176
+ },
177
+ {
178
+ "answer_id": "SC04_026",
179
+ "answer": "0.021g/cm³",
180
+ "question_hint": "ポリスチレン(密度1.05g/cm³)を加工して体積を50倍にした「発泡ポリスチレン」の密度を計算する問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "重さは変わらずに体積が50倍になるため、密度は元の1/50になる。1.05 ÷ 50 = 0.021g/cm³。"
183
+ },
184
+ {
185
+ "answer_id": "SC04_027",
186
+ "answer": "死海の方が塩分が多く、水の密度が大きいため",
187
+ "question_hint": "普通の海より死海で体が浮きやすい理由を「密度」の言葉を使って説明する問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "死海は塩分が非常に多く溶け込んでおり、液体の密度が普通の海よりも大きい。物体が受ける浮力は「押しのけた液体の重さ」に比例するため、液体の密度が大きいほど浮力が大きくなり、体が浮きやすくなる。"
190
+ },
191
+ {
192
+ "answer_id": "SC04_028",
193
+ "answer": "銅 > アルミニウム > 鉄",
194
+ "question_hint": "銅、鉄、アルミニウムの3つの金属を、熱の伝わりやすい(伝導率が高い)順に並べる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "金属の種類によって熱の伝わりやすさは異なる。一般に 銀 > 銅 > アルミニウム > 鉄 の順に熱を伝えやすい。"
197
+ },
198
+ {
199
+ "answer_id": "SC04_029",
200
+ "answer": "金属の方が熱を伝えやすく、皮膚の熱を速く奪うから",
201
+ "question_hint": "同じ15℃の金属板と発泡ポリスチレン板に触れたとき、金属板の方が冷たく感じる理由を答える問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "「冷たい」と感じるのは、皮膚から熱が移動する速さによる。金属は熱伝導率が高いため、触れた瞬間に皮膚の熱が急速に金属へ移動する。発泡ポリスチレンは熱を伝えにくいため、熱があまり移動せず、冷たく感じにくい。"
204
+ },
205
+ {
206
+ "answer_id": "SC04_030",
207
+ "answer": "水温が下がるほど、気体は水に溶けやすくなるため",
208
+ "question_hint": "冷たいソーダ水の方が、ぬるいソーダ水より炭酸が強く感じる理由を説明する問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "気体の水への溶解度の性質。固体(水酸化カルシウム等を除く)とは逆に、気体は水温が低いほど多く溶ける。温度が上がると溶けていられなくなり、気体として逃げていく。"
211
+ },
212
+ {
213
+ "answer_id": "SC04_031",
214
+ "answer": "金属の輪を加熱する",
215
+ "question_hint": "常温では通り抜けることができない金属球と金属の輪がある。金属の「熱膨張」を利用して、球を輪に通す方法を答える問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "固体も加熱すると体積が増える(熱膨張)。金属の輪を加熱すると、輪の穴が広がるため、常温では通らなかった金属球が通り抜けるようになる。"
218
+ },
219
+ {
220
+ "answer_id": "SC04_032",
221
+ "answer": "-270℃",
222
+ "question_hint": "ある気体の温度と体積が比例関係にあり、0℃で108mL、-10℃で104mLのとき、体積が0mLになる理論上の温度を計算する問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "温度が10℃下がるごとに体積が4mL減少している。108mLをすべて減らすには、108÷4 = 27ステップ必要。1ステップ10℃なので、27×10 = 270℃。0℃から270℃下げた「-270℃」が答え。※絶対零度(-273.15℃)に近い数値。"
225
+ },
226
+ {
227
+ "answer_id": "SC04_033",
228
+ "answer": "金属板の厚みを薄くする、またはより長い板にする",
229
+ "question_hint": "バイメタルの曲がり方をより大きくするための工夫を一つ挙げる問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "バイメタルの曲がり(変形量)は、温度変化の他に、板の長さや厚みに依存する。同じ温度変化でも、板が薄いほど、あるいは長いほど、曲がり方は顕著になる。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC05.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC05_001",
4
+ "answer": "赤色",
5
+ "question_hint": "酸性の水溶液に青色リトマス紙を入れた際の変化後の色を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "酸性の水溶液に共通する性質として、青色リトマス紙を赤色に変えるはたらきがある。赤色リトマス紙は赤色のまま変化しない。"
8
+ },
9
+ {
10
+ "answer_id": "SC05_002",
11
+ "answer": "黄色",
12
+ "question_hint": "酸性の水溶液にBTB溶液を加えた際の色を答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "酸性・中性・アルカリ性の判定に使われるBTB溶液は、酸性の水溶液中では黄色を示す。"
15
+ },
16
+ {
17
+ "answer_id": "SC05_003",
18
+ "answer": "塩化水素",
19
+ "question_hint": "塩酸に溶けている溶質の名称を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "塩酸は、気体である塩化水素が水に溶けたものである。強い刺激臭があり、強い酸性を示す。"
22
+ },
23
+ {
24
+ "answer_id": "SC05_004",
25
+ "answer": "二酸化炭素",
26
+ "question_hint": "塩酸と石灰石を反応させた際に発生する気体を答える問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "塩酸は石灰石と反応して二酸化炭素を発生させる。炭酸カルシウムをふくむ卵のからやチョークを加えても、同様に二酸化炭素が発生する。"
29
+ },
30
+ {
31
+ "answer_id": "SC05_005",
32
+ "answer": "二酸化炭素",
33
+ "question_hint": "炭酸水に溶けている気体の名称を答える問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "炭酸水には、気体の二酸化炭素が溶けている。炭酸水は弱い酸性を示し、石灰水を白くにごらせる性質がある。"
36
+ },
37
+ {
38
+ "answer_id": "SC05_006",
39
+ "answer": "ホウ酸",
40
+ "question_hint": "溶質が固体である酸性水溶液の代表例を答える問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "ホウ酸水には、固体であるホウ酸が溶けている。酸性の水溶液には、塩酸(気体)や炭酸水(気体)のように溶質が気体のものと、ホウ酸水のように溶質が固体のものがある。"
43
+ },
44
+ {
45
+ "answer_id": "SC05_007",
46
+ "answer": "青色",
47
+ "question_hint": "アルカリ性の水溶液に赤色リトマス紙を入れた際の変化後の色を答える問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "アルカリ性の水溶液に共通する性質として、赤色リトマス紙を青色に変えるはたらきがある。青色リトマス紙は青色のまま変化しない。"
50
+ },
51
+ {
52
+ "answer_id": "SC05_008",
53
+ "answer": "青色",
54
+ "question_hint": "アルカリ性の水溶液にBTB溶液を加えた際の色を答える問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "BTB溶液は、アルカリ性の水溶液中では青色を示す。"
57
+ },
58
+ {
59
+ "answer_id": "SC05_009",
60
+ "answer": "赤色",
61
+ "question_hint": "アルカリ性の水溶液にフェノールフタレイン液を加えた際の色を答える問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "フェノールフタレイン液は、酸性や中性の水溶液では無色だが、アルカリ性の水溶液に加えると赤色に変わる。"
64
+ },
65
+ {
66
+ "answer_id": "SC05_010",
67
+ "answer": "水酸化ナトリウム",
68
+ "question_hint": "強いアルカリ性を示し、溶質が固体である水溶液の溶質名を答える問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "水酸化ナトリウム水溶液には、固体である水酸化ナトリウムが溶けている。強いアルカリ性で、アルミニウムなどの金属を溶かす性質がある。"
71
+ },
72
+ {
73
+ "answer_id": "SC05_011",
74
+ "answer": "水素",
75
+ "question_hint": "水酸化ナトリウム水溶液とアルミニウムを反応させた際に発生する気体を答える問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "水酸化ナトリウム水溶液は、アルミニウムや亜鉛と反応して水素を発生させる。鉄とは反応しない。"
78
+ },
79
+ {
80
+ "answer_id": "SC05_012",
81
+ "answer": "消石灰(または水酸化カルシウム)",
82
+ "question_hint": "石灰水に溶けている物質の名称を答える問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "石灰水は、消石灰(水酸化カルシウム)という固体が水に溶けたものである。二酸化炭素と反応して白くにごる性質があり、弱いアルカリ性を示す。"
85
+ },
86
+ {
87
+ "answer_id": "SC05_013",
88
+ "answer": "アンモニア",
89
+ "question_hint": "アルカリ性を示し、溶質が気体である水溶液の名称を答える問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "アンモニア水には、気体であるアンモニアが溶けてい���。強い刺激臭があり、弱いアルカリ性を示す。加熱するとアンモニアが発生する。"
92
+ },
93
+ {
94
+ "answer_id": "SC05_014",
95
+ "answer": "食塩(または塩化ナトリウム)",
96
+ "question_hint": "中性を示し、蒸発させると白い結晶が残る水溶液の溶質を答える問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "食塩水は中性で、リトマス紙やBTB溶液の色を変えない。加熱して水を蒸発させると、白い食塩の結晶が残る。"
99
+ },
100
+ {
101
+ "answer_id": "SC05_015",
102
+ "answer": "砂糖水",
103
+ "question_hint": "中性を示し、強く加熱すると黒く焦げる水溶液の名称を答える問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "砂糖水は中性である。砂糖が溶けており、強く加熱すると焦げて黒い炭になる性質がある。"
106
+ },
107
+ {
108
+ "answer_id": "SC05_016",
109
+ "answer": "エタノール(またはアルコール)",
110
+ "question_hint": "中性を示し、溶質が液体である水溶液の例を答える問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "アルコール水溶液には、液体であるエタノールが溶けている。中性で、水を蒸発させても溶質は残らない(先に蒸発する)。"
113
+ },
114
+ {
115
+ "answer_id": "SC05_017",
116
+ "answer": "電解質",
117
+ "question_hint": "水に溶かしたときに、水溶液に電流が流れる物質の総称を答える問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "水に溶けて電流を通す物質を電解質という。酸性やアルカリ性の水溶液に溶けている物質(塩化水素、水酸化ナトリウムなど)や、中性でも食塩などは電解質である。砂糖やアルコールは非電解質である。"
120
+ },
121
+ {
122
+ "answer_id": "SC05_018",
123
+ "answer": "電池",
124
+ "question_hint": "電解質の水溶液に2種類の異なる金属を入れた際にできる装置の名称を答える問題。",
125
+ "difficulty": "基本",
126
+ "source_context": "電解質の水溶液に2種類の異なる金属板(例:銅板と亜鉛板)を入れて導線でつなぐと、化学エネルギーが電気エネルギーに変わり、電流が流れる。これが電池のしくみである。"
127
+ },
128
+ {
129
+ "answer_id": "SC05_019",
130
+ "answer": "水素、酸素",
131
+ "question_hint": "うすい水酸化ナトリウム水溶液を電気分解したときに、各極から発生する気体を順に答える問題。",
132
+ "difficulty": "応用",
133
+ "source_context": "水酸化ナトリウム水溶液を電気分解すると、水が分解される。電源のマイナス極からは水素が、プラス極からは酸素が発生する。体積比は水素:酸素=2:1になる。"
134
+ },
135
+ {
136
+ "answer_id": "SC05_020",
137
+ "answer": "銅",
138
+ "question_hint": "塩酸にも水酸化ナトリウム水溶液にも溶けない金属を答える問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "鉄やアルミニウムは塩酸に溶け、アルミニウムは水酸化ナトリウム水溶液にも溶けるが、銅はどちらの水溶液にも溶けない。"
141
+ },
142
+ {
143
+ "answer_id": "SC05_021",
144
+ "answer": "2000mL(または2L)",
145
+ "question_hint": "アルミニウム1gが塩酸と反応して水素1000mLを出す設定で、2gの反応結果を計算する問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "金属がすべて溶ける場合、発生する気体の体積は金属の重さに比例する。1gで1000mL発生するなら、2gでは2000mL発生する。"
148
+ },
149
+ {
150
+ "answer_id": "SC05_022",
151
+ "answer": "塩酸が足りない(塩酸の量で気体発生量が決まっている)",
152
+ "question_hint": "一定量の塩酸に金属を増やしても気体の発生量が増えなくなった理由を答える問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "ある量の塩酸が溶かせる金属の重さには限界がある。限界を超えて金属を加えても、反応相手の塩酸が使い切られているため、気体発生量は一定となり金属が溶け残る。"
155
+ },
156
+ {
157
+ "answer_id": "SC05_023",
158
+ "answer": "酸性:赤色、中性:紫色、アルカリ性:緑色(または黄色)",
159
+ "question_hint": "ムラサキキャベツ液の、水溶液の性質による色の変化を順に答える問題。",
160
+ "difficulty": "応用",
161
+ "source_context": "ムラサキキャベツ液は指示薬として使える。強い酸性では赤色、中性付近では紫色、アルカリ性が強くなるにつれて緑色から黄色へと変化する。"
162
+ },
163
+ {
164
+ "answer_id": "SC05_024",
165
+ "answer": "pH(ピーエイチ)",
166
+ "question_hint": "酸性やアルカリ性の強さを表す数値の名称を答える問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "pHは水素イオン濃度指数のことで、7が中性。7より小さいと酸性、大���いとアルカリ性を示す。"
169
+ },
170
+ {
171
+ "answer_id": "SC05_025",
172
+ "answer": "中和反応",
173
+ "question_hint": "酸性の水溶液とアルカリ性の水溶液を混ぜたときに起こる反応の名称を答える問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "酸性の水溶液(水素イオンを含む)とアルカリ性の水溶液(水酸化物イオンを含む)を混ぜると、互いの性質を打ち消し合って水ができる。この反応を中和という。"
176
+ },
177
+ {
178
+ "answer_id": "SC05_026",
179
+ "answer": "20cm³",
180
+ "question_hint": "塩酸10cm³と水酸化ナトリウム水溶液10cm³が完全中和する設定で、塩酸20cm³に必要な水酸化ナトリウム水溶液の体積を求める問題。",
181
+ "difficulty": "基本",
182
+ "source_context": "中和する水溶液の体積比は一定である。10:10(=1:1)の比率で中和するなら、塩酸20cm³をちょうど中和するには水酸化ナトリウム水溶液も20cm³必要になる。"
183
+ },
184
+ {
185
+ "answer_id": "SC05_027",
186
+ "answer": "弱くなる(または気体の発生量が減る)",
187
+ "question_hint": "塩酸を水酸化ナトリウム水溶液で部分的に中和した際、石灰石との反応がどう変化するか答える問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "中和によって塩酸が消費されると、酸性が弱まる。そのため、加えた石灰石や金属と反応できる塩化水素の量が減り、発生する気体の量も減少する。"
190
+ },
191
+ {
192
+ "answer_id": "SC05_028",
193
+ "answer": "塩(えん)",
194
+ "question_hint": "中和反応によって、水とともにできる物質の総称を答える問題。",
195
+ "difficulty": "応用",
196
+ "source_context": "中和反応の一般式は「酸 + アルカリ → 塩 + 水」である。塩酸と水酸化ナトリウム水溶液の場合、塩として塩化ナトリウム(食塩)ができる。"
197
+ },
198
+ {
199
+ "answer_id": "SC05_029",
200
+ "answer": "中和熱",
201
+ "question_hint": "中和反応が起こる際に発生する熱の名称を答える問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "中和反応は発熱反応であり、反応が進むと水溶液の温度が上がる。このとき発生する熱を中和熱という。"
204
+ },
205
+ {
206
+ "answer_id": "SC05_030",
207
+ "answer": "食塩と水酸化ナトリウム",
208
+ "question_hint": "塩酸10cm³に対し水酸化ナトリウム水溶液20cm³を混ぜ(中和点10cm³)、蒸発させた後に残る固体の種類を答える問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "塩酸10cm³と水酸化ナトリウム水溶液10cm³で完全中和して食塩ができる。さらにアルカリ性を10cm³加えたため、溶液中には中和でできた食塩と、余った水酸化ナトリウムが溶けている。蒸発させるとその両方が残る。"
211
+ },
212
+ {
213
+ "answer_id": "SC05_031",
214
+ "answer": "食塩のみ",
215
+ "question_hint": "塩酸が余っている状態の中和溶液を蒸発させたとき、後に残る固体を答える問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "塩酸が余っている場合、余分な塩化水素は気体として蒸発するため、後に残らない。したがって、中和反応によって生じた食塩のみが残る。"
218
+ },
219
+ {
220
+ "answer_id": "SC05_032",
221
+ "answer": "中和点(または完全中和した点)",
222
+ "question_hint": "塩酸に水酸化ナトリウム水溶液を加えていく際、蒸発後の固体の増え方が変わる「折れ曲がり点」の意味を答える問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "一定量の塩酸に水酸化ナトリウム水溶液を加えると、完全に中和するまでは食塩だけができるが、中和点を超えると余った水酸化ナトリウムも残るようになるため、固体の増え方の割合(グラフの傾き)が変化する。"
225
+ },
226
+ {
227
+ "answer_id": "SC05_033",
228
+ "answer": "1.98g",
229
+ "question_hint": "8%の水酸化ナトリウム水溶液10cm³中の溶質が0.8g、中和でできる食塩が1.18gの設定で、水溶液計20cm³(中和点10cm³)を蒸発させた際の残渣重量を求める問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "完全中和(10cm³ずつ)で1.18gの食塩ができる。水酸化ナトリウム水溶液をさらに10cm³追加(計20cm³)すると、中和済みの食塩1.18gと、余った水酸化ナトリウムの溶質重量(10cm³分=0.8g)の合計である1.98gが残る。"
232
+ },
233
+ {
234
+ "answer_id": "SC05_034",
235
+ "answer": "塩化アンモニウム",
236
+ "question_hint": "塩化水素の気体とアンモニアの気体が反応した際にできる、白い煙のような物質の名称を答える問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "気体どうしでも中和反応は起こる。塩酸から出る塩化���素とアンモニアが触れると、固体である塩化アンモニウムの細かい粒子ができ、白い煙のように見える。"
239
+ }
240
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC06.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC06_001",
4
+ "answer": "燃えるもの、空気(酸素)、高い温度",
5
+ "question_hint": "燃焼が起こるために必要な「3つの条件」をすべて答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "燃焼の3条件は、①燃えるものがあること、②酸素(空気)があること、③発火点以上の高い温度であること。火を消す際はこのいずれか1つを取り除けばよい。"
8
+ },
9
+ {
10
+ "answer_id": "SC06_002",
11
+ "answer": "不完全燃焼",
12
+ "question_hint": "酸素が不足している状態で起こる、すすや一酸化炭素が発生しやすい燃焼の名称を答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "酸素が十分にあるときは完全燃焼するが、酸素が不足すると不完全燃焼となり、すすが発生したり有毒な一酸化炭素が発生したりする。"
15
+ },
16
+ {
17
+ "answer_id": "SC06_003",
18
+ "answer": "空気調節ねじ",
19
+ "question_hint": "ガスバーナーで、炎の色を青くするために操作するねじの名称を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "ガスバーナーには上が「空気調節ねじ」、下が「ガス調節ねじ」の2つがある。点火後、ガス調節ねじを押さえながら空気調節ねじを開いて青色の炎にする。"
22
+ },
23
+ {
24
+ "answer_id": "SC06_004",
25
+ "answer": "反時計回り(Aの方向)",
26
+ "question_hint": "ガスバーナーのねじを開ける際に回す方向を答える問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "ガスバーナーの調節ねじは、上から見て反時計回り(左)に回すと開き、時計回り(右)に回すと閉じる構造になっている。"
29
+ },
30
+ {
31
+ "answer_id": "SC06_005",
32
+ "answer": "二酸化炭素と水(水蒸気)",
33
+ "question_hint": "メタンやプロパンなどのガスが完全燃焼した際に発生する2種類の物質を答える問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "燃料ガス(メタン、プロパン、ブタン等)は炭素と水素を含んでおり、完全燃焼すると二酸化炭素と水(水蒸気)ができる。炎の上に乾いたビーカーをかざすと水滴でくもるのはこのため。"
36
+ },
37
+ {
38
+ "answer_id": "SC06_006",
39
+ "answer": "1:2",
40
+ "question_hint": "メタンが完全燃焼する際に必要な、メタンと酸素の体積比を答える問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "気体が完全燃焼する際の体積比は決まっている。水素:酸素=2:1だが、メタン:酸素=1:2の割合で反応する。"
43
+ },
44
+ {
45
+ "answer_id": "SC06_007",
46
+ "answer": "メタンハイドレート",
47
+ "question_hint": "氷の中にメタンが閉じ込められた、次世代の燃料として注目される物質名を答える問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "氷の中にメタン分子が閉じ込められた固体物質をメタンハイドレートと呼ぶ。「燃える氷」とも称される。"
50
+ },
51
+ {
52
+ "answer_id": "SC06_008",
53
+ "answer": "外炎",
54
+ "question_hint": "ろうそくの炎の中で最も温度が高い部分の名称を答える問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "ろうそくの炎は外側から外炎、内炎、炎心の3層。外炎は空気(酸素)とよく触れるため完全燃焼しており、最も温度が高い。"
57
+ },
58
+ {
59
+ "answer_id": "SC06_009",
60
+ "answer": "内炎",
61
+ "question_hint": "ろうそくの炎の中で最も明るく見える部分の名称を答える問題。",
62
+ "difficulty": "基本",
63
+ "source_context": "内炎は不完全燃焼により生じた熱い「すす(炭素の粒)」が光り輝くため、炎の中で最も明るく見える。"
64
+ },
65
+ {
66
+ "answer_id": "SC06_010",
67
+ "answer": "炎心",
68
+ "question_hint": "ろうそくの炎の中で最も温度が低く、気体のろうが集まっている部分の名称を答える問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "炎心は芯に最も近い中心部。熱せられて蒸発した「気体のろう」が集まっており、酸素が届かないため燃えておらず温度は最も低い。"
71
+ },
72
+ {
73
+ "answer_id": "SC06_011",
74
+ "answer": "固体→液体→気体",
75
+ "question_hint": "ろうそくが燃える際、ろうが変化していく状態の順番を答える問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "ろうそくの燃焼メカニズム:炎の熱で固体のろうが溶けて「液体」になり、芯を伝わって昇り、さらに熱せられて「気体」となって燃える。"
78
+ },
79
+ {
80
+ "answer_id": "SC06_012",
81
+ "answer": "上昇気流",
82
+ "question_hint": "燃焼によって温められた空気が上へ移動する現象を何というか答える問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "火のまわりの空気は熱せられて軽くなり、上へ移動する上昇気流が発生する。この対流により、下から新しい空気が供給される。"
85
+ },
86
+ {
87
+ "answer_id": "SC06_013",
88
+ "answer": "4:5",
89
+ "question_hint": "銅を加熱して酸化させたときの、銅と酸化銅の重さの比を答える問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "銅と酸素が結びつく重さの比は、銅:酸素=4:1。したがって、銅とできた酸化銅の重さの比は 4:(4+1)=4:5 となる。"
92
+ },
93
+ {
94
+ "answer_id": "SC06_014",
95
+ "answer": "3:5",
96
+ "question_hint": "マグネシウムを燃焼させたときの、マグネシウムと酸化マグネシウムの重さの比を答える問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "マグネシウムと酸素が結びつく重さの比は、マグネシウム:酸素=3:2。したがって、マグネシウムとできた酸化マグネシウムの重さの比は 3:(3+2)=3:5 となる。"
99
+ },
100
+ {
101
+ "answer_id": "SC06_015",
102
+ "answer": "110g",
103
+ "question_hint": "木炭30gを完全燃焼させたときに発生する二酸化炭素の重さを求める計算問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "炭素が燃えて二酸化炭素になる際、重さの比は 炭素:二酸化炭素=3:11(または炭素:酸素=3:8)。木炭30gの場合、30 × (11/3) = 110g の二酸化炭素が発生する。"
106
+ },
107
+ {
108
+ "answer_id": "SC06_016",
109
+ "answer": "酸化",
110
+ "question_hint": "物質が酸素と結びつく化学反応を何というか答える問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "物質が酸素と化学反応して結びつくことを酸化と呼ぶ。激しく光や熱を出す酸化が「燃焼」、穏やかに進むのが「さび」や「使い捨てカイロ」の反応。"
113
+ },
114
+ {
115
+ "answer_id": "SC06_017",
116
+ "answer": "還元",
117
+ "question_hint": "酸化物から酸素を取り除く化学反応を何というか答える問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "酸化物から酸素を奪い、元の物質(金属など)に戻す反応を還元と呼ぶ。酸化銅と炭素を混ぜて加熱すると、銅と二酸化炭素ができる実験が代表的。"
120
+ },
121
+ {
122
+ "answer_id": "SC06_018",
123
+ "answer": "黒色",
124
+ "question_hint": "銅を空気中で加熱してできた酸化銅の色を答える問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "銅は赤褐色だが、酸化すると黒色の酸化銅になる。なお、鉄の酸化物(酸化鉄)も黒色(黒さび)になることがある。"
127
+ },
128
+ {
129
+ "answer_id": "SC06_019",
130
+ "answer": "白色",
131
+ "question_hint": "マグネシウムを燃焼させてできた酸化マグネシウムの色を答える問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "マグネシウムは強い光を出して燃えたあと、白色の粉末状の物質である酸化マグネシウムになる。"
134
+ },
135
+ {
136
+ "answer_id": "SC06_020",
137
+ "answer": "8g",
138
+ "question_hint": "銅粉16gを加熱したところ、完全に酸化せずに重さが18gになった。反応した銅は何gか求める計算問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "増えた重さ 18 - 16 = 2g が結びついた酸素の量。銅:酸素=4:1 なので、反応した銅は 2 × 4 = 8g となる。"
141
+ },
142
+ {
143
+ "answer_id": "SC06_021",
144
+ "answer": "蒸し焼き(乾留)",
145
+ "question_hint": "木片などを空気を遮断して強く加熱する操作を何というか答える問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "空気を遮断して加熱することを蒸し焼き(または乾留)と呼ぶ。酸素がないため炎は上がらず、熱分解が起こる。"
148
+ },
149
+ {
150
+ "answer_id": "SC06_022",
151
+ "answer": "木ガス",
152
+ "question_hint": "木の蒸し焼きで発生する、火をつけると燃える白い煙の名称を答える問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "木の蒸し焼きで出る白い煙は木ガスと呼ばれる。水素や一酸化炭素を含んでおり、可燃性である。"
155
+ },
156
+ {
157
+ "answer_id": "SC06_023",
158
+ "answer": "木酢液",
159
+ "question_hint": "木の蒸し焼きで発生する液体のうち、酸性を示すうすい黄色の液体の名称を答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "蒸し焼きで生じる液体のうち、水に溶ける成分を含んだ上澄みを木酢液と呼ぶ。酢酸などを含み、酸性を示す。"
162
+ },
163
+ {
164
+ "answer_id": "SC06_024",
165
+ "answer": "木タール",
166
+ "question_hint": "木の蒸し焼きで発生する液体のうち、下にたまる黒くてドロドロした物質の名称を答える問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "蒸し焼きで生じる油状の重い液体を木タールと呼ぶ。色は濃い茶色や黒色をしている。"
169
+ },
170
+ {
171
+ "answer_id": "SC06_025",
172
+ "answer": "木炭",
173
+ "question_hint": "木の蒸し焼きの後に試験管に残る、黒い固体の名称を答える問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "蒸し焼きの後に残る固体は木炭。成分のほとんどは炭素であり、燃やすと二酸化炭素を発生する。水蒸気は出さない。"
176
+ },
177
+ {
178
+ "answer_id": "SC06_026",
179
+ "answer": "一酸化炭素",
180
+ "question_hint": "酸素が不足した状態での燃焼(不完全燃焼)で発生する、無色・無臭で有毒な気体を答える問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "不完全燃焼で発生する一酸化炭素は、人体に非常に有害。それ自体が燃えて二酸化炭素になる性質を持つ。"
183
+ },
184
+ {
185
+ "answer_id": "SC06_027",
186
+ "answer": "重くなる(増える)",
187
+ "question_hint": "スチールウールを燃やした後の重さがどうなるか答える問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "金属(鉄など)が燃えると空気中の酸素と結びつくため、燃やす前よりも重くなる。木や紙が軽くなる(灰になる)のと対照的な性質。"
190
+ },
191
+ {
192
+ "answer_id": "SC06_028",
193
+ "answer": "活性炭",
194
+ "question_hint": "木炭を特殊な方法で加工し、においや汚れを吸着する性質を持たせた物質名を答える問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "細かい穴が非常に多くあいた活性炭は、吸着力が強く、脱臭剤や浄水器のフィルターに利用される。"
197
+ },
198
+ {
199
+ "answer_id": "SC06_029",
200
+ "answer": "400kg",
201
+ "question_hint": "水素11kgを完全燃焼させるのに必要な空気の重さを求める計算問題(酸素は空気の重さの22%とする)。",
202
+ "difficulty": "応用",
203
+ "source_context": "水素1gに対し酸素8gが必要。水素11kgには酸素88kgが必要となる。酸素88kgを含む空気の量は 88 ÷ 0.22 = 400kg と計算できる。"
204
+ },
205
+ {
206
+ "answer_id": "SC06_030",
207
+ "answer": "熱分解",
208
+ "question_hint": "加熱によって1つの物質が2つ以上の別の物質に分かれる化学反応の名称を答える問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "加熱による分解を熱分解と呼ぶ。重曹を加熱して二酸化炭素と水ができる反応や、木の蒸し焼き、酸化銀の加熱などが例。"
211
+ },
212
+ {
213
+ "answer_id": "SC06_031",
214
+ "answer": "二酸化マンガン、レバー(肝臓)、ニンジン",
215
+ "question_hint": "過酸化水素の分解を助けるが、自身は変化しない「触媒」の例を3つ答える問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "触媒は自身が変化せず反応を助ける物質。二酸化マンガンのほか、カタラーゼという酵素を含むレバーやニンジンも触媒として機能する。"
218
+ },
219
+ {
220
+ "answer_id": "SC06_032",
221
+ "answer": "上がらない(一定に保たれる)",
222
+ "question_hint": "氷が溶けている間や水が沸騰している間、加えられた熱が状態変化に使われているときの温度の変化を答える問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "融解中や沸騰中など、状態変化が起こっている最中は、加えられた熱が温度上昇ではなく「結合を切るエネルギー」に使われるため、温度は一定になる。"
225
+ },
226
+ {
227
+ "answer_id": "SC06_033",
228
+ "answer": "中和熱",
229
+ "question_hint": "酸とアルカリが反応(中和)するときに発生する熱の名称を答える問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "中和反応は発熱反応であり、反応によって発生する熱を中和熱と呼ぶ。完全中和したときに温度が最も高くなる。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC07.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC07_001",
4
+ "answer": "葉緑体",
5
+ "question_hint": "光合成が行われる葉の細胞内にある小さな粒の名称を問う問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "光合成は、おもに葉の細胞内にある【葉緑体】という小さな粒で行われる。光のエネルギーを利用して、水と二酸化炭素からデンプン(栄養分)と酸素をつくり出すはたらき。"
8
+ },
9
+ {
10
+ "answer_id": "SC07_002",
11
+ "answer": "師管",
12
+ "question_hint": "光合成で作られた栄養分が移動する管の名称を問う問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "光合成でできたデンプンは、一時的に葉に蓄えられた後、水に溶ける糖(ショ糖など)に変えられ、【師管】を通って植物の各部分(茎や根など)へ運ばれる。そこで再びデンプンに変えて貯蔵されることが多い。"
15
+ },
16
+ {
17
+ "answer_id": "SC07_003",
18
+ "answer": "ヨウ素液",
19
+ "question_hint": "光合成によってデンプンができたことを確認するために使用する薬品を問う問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "葉にデンプンがあるかどうかを調べるには【ヨウ素液】を用いる。デンプンがある部分は青紫色に変化する。実験前には、葉を熱湯につけ、エタノールで脱色して色の変化を見やすくする工程が含まれる。"
22
+ },
23
+ {
24
+ "answer_id": "SC07_004",
25
+ "answer": "青色から黄色",
26
+ "question_hint": "呼気を吹き込んだ後のBTB溶液の色変化を問う問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "BTB溶液は、中性(緑色)、アルカリ性(青色)、酸性(黄色)を示す。呼気には二酸化炭素が含まれており、水に溶けると酸性を示すため、青色だったBTB溶液は【黄色】に変化する。光合成によって二酸化炭素が消費されると再び青色に戻る。"
29
+ },
30
+ {
31
+ "answer_id": "SC07_005",
32
+ "answer": "呼吸",
33
+ "question_hint": "植物が生命活動のためのエネルギーを取り出すはたらきの名称を問う問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "植物は常に【呼吸】を行っている。呼吸では酸素を取り入れ、二酸化炭素と水を放出する。光合成ができない夜間は、呼吸による二酸化炭素の放出のみが目立つようになる。"
36
+ },
37
+ {
38
+ "answer_id": "SC07_006",
39
+ "answer": "2.3倍",
40
+ "question_hint": "グラフから、特定の光の強さにおける2種類の植物の光合成量を比較させる計算問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "【数値設定】光の強さが③のとき、植物Aの光合成量(二酸化炭素吸収量)の矢印の長さは150、植物Bは45+20=65とする。【ロジック】150 ÷ 65 ≒ 2.307。小数第二位を四捨五入して2.3倍と導出する。"
43
+ },
44
+ {
45
+ "answer_id": "SC07_007",
46
+ "answer": "孔辺細胞",
47
+ "question_hint": "葉の気孔をつくっている2つの細胞の名称を問う問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "葉の表皮にある隙間を気孔といい、その隙間をつくっている2つの細胞を【孔辺細胞】と呼ぶ。植物はこの細胞を開閉させて蒸散や気体の出入りを調節する。"
50
+ },
51
+ {
52
+ "answer_id": "SC07_008",
53
+ "answer": "裏側",
54
+ "question_hint": "一般的な陸上植物において、気孔が多く分布している部位を問う問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "一般に、気孔は葉の【裏側】に多く分布している。これにより、直射日光による水分の失いすぎを防いでいる。ただし、水面に浮くスイレンなどは表側に分布している。"
57
+ },
58
+ {
59
+ "answer_id": "SC07_009",
60
+ "answer": "20g",
61
+ "question_hint": "蒸散実験のデータから、処理をしていない植物(A)の水の減少量を算出する計算問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "【設定数値】B(表にワセリン):16g、C(裏にワセリン):10g、D(両面にワセリン):6g、E(ガラス棒):4g。【ロジック】Eは水面からの蒸発量。D-E=2gが茎からの蒸散。B-D=10gが裏からの蒸散。C-D=4gが表からの蒸散。A(何もしない)=表(4)+裏(10)+茎(2)+蒸発(4)=20g。"
64
+ },
65
+ {
66
+ "answer_id": "SC07_010",
67
+ "answer": "離弁花",
68
+ "question_hint": "アブラナやサクラのように、花びらが1枚ずつ離れている花の分類名を問う問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "花びらが1枚ずつ離れている花を【離弁花】という(アブラナ、サクラ、エンドウなど)。対して、花びらがつながっている花を合弁花という(アサガオ、ツツジ、キクなど)。"
71
+ },
72
+ {
73
+ "answer_id": "SC07_011",
74
+ "answer": "単性花",
75
+ "question_hint": "ヘチマやカボチャのように、雄しべと雌しべが別々の花に分かれている花の分類名を問う問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "雄しべだけをもつ「雄花」と雌しべだけをもつ「雌花」に分かれている花を【単性花】という。ヘチマ、カボチャ、トウモロコシなどが該当する。一方、1つの花に雄しべと雌しべがあるものを両性花という。"
78
+ },
79
+ {
80
+ "answer_id": "SC07_012",
81
+ "answer": "4枚",
82
+ "question_hint": "アブラナ科の植物における花びら(花弁)の枚数を問う問題。",
83
+ "difficulty": "基本",
84
+ "source_context": "アブラナ科の花(アブラナ、ダイコン、ナズナなど)は、花びらが【4枚】、がくも4枚、雄しべが6本(長い4本と短い2本)という特徴をもつ。これらは離弁花である。"
85
+ },
86
+ {
87
+ "answer_id": "SC07_013",
88
+ "answer": "キク科",
89
+ "question_hint": "ヒマワリやコスモス、タンポポが属する科の名称を問う問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "ヒマワリ、タンポポ、キク、コスモスなどは【キク科】に属する。これらは、小さな花がたくさん集まって1つの花のように見えるのが特徴。"
92
+ },
93
+ {
94
+ "answer_id": "SC07_014",
95
+ "answer": "裸子植物",
96
+ "question_hint": "マツやスギのように、胚珠が子房に包まれていない植物の分類名を問う問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "子房がなく、胚珠がむき出しになっている植物を【裸子植物】という。マツ、スギ、イチョウ、ソテツなどが代表的。これに対して胚珠が子房の中にあるものを被子植物という。"
99
+ },
100
+ {
101
+ "answer_id": "SC07_015",
102
+ "answer": "平行脈",
103
+ "question_hint": "イネ科やユリ科に見られる、葉脈が平行に並んでいるつくりの名称を問う問題。",
104
+ "difficulty": "基本",
105
+ "source_context": "単子葉類(イネ、トウモロコシ、ユリ、ツユクサなど)の葉脈は、筋が平行に通っている【平行脈】である。これに対し、双子葉類の葉脈は網目状の網状脈である。"
106
+ },
107
+ {
108
+ "answer_id": "SC07_016",
109
+ "answer": "柵状組織",
110
+ "question_hint": "葉の表側の表皮の下にある、細胞が隙間なく並んだ組織の名称を問う問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "葉の表側にある、葉緑体を多く含む細胞が隙間なく規則正しく並んだ組織を【柵状組織】という。ここでは光を効率よく受けて光合成が盛んに行われる。"
113
+ },
114
+ {
115
+ "answer_id": "SC07_017",
116
+ "answer": "道管:内側、師管:外側",
117
+ "question_hint": "双子葉類の茎の断面において、道管と師管の位置関係を答えさせる問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "双子葉類の茎では維管束が輪のように並んでいる。そのうち、水が通る【道管】は維管束の【内側】に、栄養分が通る【師管】は【外側】に配置されている。"
120
+ },
121
+ {
122
+ "answer_id": "SC07_018",
123
+ "answer": "形成層",
124
+ "question_hint": "双子葉類の茎を太くするために細胞分裂が盛んに行われている部分の名称を問う問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "双子葉類の維管束の道管と師管の間には【形成層】という組織がある。ここでは細胞分裂が行われて茎が太くなる。単子葉類にはこの層はない。"
127
+ },
128
+ {
129
+ "answer_id": "SC07_019",
130
+ "answer": "ひげ根",
131
+ "question_hint": "イネやトウモロコシなど、単子葉類に見られる根のつき方の名称を問う問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "単子葉類の根は、太い根がなく、細い根がたくさん生えている【ひげ根】である。これに対し双子葉類は、太い「主根」とそこから生える「側根」で構成される。"
134
+ },
135
+ {
136
+ "answer_id": "SC07_020",
137
+ "answer": "根毛",
138
+ "question_hint": "根の先端付近に無数にある、表面積を広げて吸収効率を高める毛のようなつくりの名称を問う問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "根の先端付近には【根毛】という細かい毛が無数にある。これにより土に触れる表面積が大きくなり、水や肥料分を効率よく吸収できる。"
141
+ },
142
+ {
143
+ "answer_id": "SC07_021",
144
+ "answer": "胚乳",
145
+ "question_hint": "有胚乳種子において、発芽のための栄養分を蓄えている部分の名称を問う問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "イネ、トウモロコシ、カキなどの種子は【胚乳】に発芽のための栄養を蓄えている(有胚乳種子)���一方、インゲンマメやアブラナなどは子葉に栄養を蓄える(無胚乳種子)。"
148
+ },
149
+ {
150
+ "answer_id": "SC07_022",
151
+ "answer": "幼根",
152
+ "question_hint": "種子が発芽する際、最初に種皮を破って出てくる部分の名称を問う問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "種子の発芽では、まず【幼根】が伸びて根になる。次に胚軸が伸びて地上に芽を出す。最後に子葉が開き、本葉(幼芽)が成長する。"
155
+ },
156
+ {
157
+ "answer_id": "SC07_023",
158
+ "answer": "水、空気(酸素)、適当な温度",
159
+ "question_hint": "種子が発芽するために必要な3つの条件をすべて答えさせる問題。",
160
+ "difficulty": "基本",
161
+ "source_context": "種子の発芽には【水】【空気(酸素)】【適当な温度】の3条件が不可欠である。肥料や光、土は通常、発芽そのものには必要ない(ただしレタスなど光が必要な種子も一部存在する)。"
162
+ },
163
+ {
164
+ "answer_id": "SC07_024",
165
+ "answer": "ジャガイモ:茎、サツマイモ:根",
166
+ "question_hint": "ジャガイモとサツマイモがそれぞれ植物のどの部分が肥大化したものかを答えさせる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "【ジャガイモ】は地下の【茎】(塊茎)にデンプンを蓄えたもの。ナス科に属する。一方、【サツマイモ】は【根】(塊根)が肥大化したもので、ヒルガオ科に属する。"
169
+ },
170
+ {
171
+ "answer_id": "SC07_025",
172
+ "answer": "花粉管",
173
+ "question_hint": "受粉後、花粉から胚珠に向かって伸びる管の名称を問う問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "花粉が柱頭につく(受粉する)と、花粉から【花粉管】が伸びる。これが胚珠に到達し、花粉の核と胚珠の核が合体する(受精)。"
176
+ },
177
+ {
178
+ "answer_id": "SC07_026",
179
+ "answer": "受精卵(胚)、iPS細胞",
180
+ "question_hint": "再生医療などで注目される、人工的に作られた万能細胞の名称を問う問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "受精卵から作るものをES細胞、皮膚などの細胞に特定の遺伝子を入れて作るものを【iPS細胞】という。これらは様々な組織や臓器になる能力を持つ。"
183
+ },
184
+ {
185
+ "answer_id": "SC07_027",
186
+ "answer": "短日植物",
187
+ "question_hint": "アサガオやキクのように、夜の長さが一定以上に長くなると開花する植物の分類名を問う問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "夜の時間が長くなると花が咲く植物を【短日植物】という(アサガオ、キク、コスモスなど)。逆に夜が短くなると咲くものを長日植物という(アブラナ、コムギなど)。"
190
+ },
191
+ {
192
+ "answer_id": "SC07_028",
193
+ "answer": "ロゼット",
194
+ "question_hint": "タンポポなどが冬の間、地面に葉を広げて冬を越す姿の名称を問う問題。",
195
+ "difficulty": "基本",
196
+ "source_context": "タンポポ、ナズナ、ハルジオンなどが、地面にへばりつくように葉を放射状に広げた姿を【ロゼット】という。地面の熱を逃がさず、風を防ぐ利点がある。"
197
+ },
198
+ {
199
+ "answer_id": "SC07_029",
200
+ "answer": "自家受粉",
201
+ "question_hint": "同じ花の花粉がその花の柱頭につく受粉形式の名称を問う問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "同じ株や同じ花の中で受粉することを【自家受粉】という。これに対し、他の株の花粉が運ばれてくることを他家受粉という。イネやアサガオは自家受粉を行うことができる。"
204
+ },
205
+ {
206
+ "answer_id": "SC07_030",
207
+ "answer": "13.5cm",
208
+ "question_hint": "葉のつき方の規則性(葉序)に基づく角度計算問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "【数値設定】葉と次の葉の角度が135度とする。【ロジック】1枚目の葉から5枚目の葉までの角度の合計は、135度 × (5-1) = 540度。360度で1回転なので、540 - 360 = 180度。つまり1枚目から見て真裏の位置に5枚目がつく。"
211
+ },
212
+ {
213
+ "answer_id": "SC07_031",
214
+ "answer": "顕性形質、潜性形質",
215
+ "question_hint": "遺伝において、子に現れる特徴と現れない特徴の名称をそれぞれ答えさせる問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "同時に現れない対立形質を両親から受け継いだとき、子に現れる方を【顕性形質】、現れない方を【潜性形質】という。遺伝子の本体はDNAである。"
218
+ },
219
+ {
220
+ "answer_id": "SC07_032",
221
+ "answer": "カタバミ、ホウセンカ",
222
+ "question_hint": "種子が自分ではじけて飛ぶことで散布される植物の例を問う問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "【カタバミ】や【ホウセンカ】、カラスノエンドウなどは、実が熟すと自分ではじけて種子を遠くに飛ばす仕組みを持っている。"
225
+ },
226
+ {
227
+ "answer_id": "SC07_033",
228
+ "answer": "オナモミ",
229
+ "question_hint": "トゲを持ち、動物の体に付着して運ばれる種子の代表例を答えさせる問題。",
230
+ "difficulty": "基本",
231
+ "source_context": "【オナモミ】やイノコズチは、種子にトゲやかぎ状の突起があり、動物の毛や人間の服にくっついて運ばれる。この形状はマジックテープのヒントになった。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC08.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC08_001",
4
+ "answer": "頭部・胸部・腹部",
5
+ "question_hint": "昆虫の体のつくりについて、体が大きく3つの部分に分かれているが、それぞれの名称を答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "昆虫の体は前から順に「頭部(とうぶ)」「胸部(きょうぶ)」「腹部(ふくぶ)」の3つの部分に分かれている。全身はかたい「から(外骨格)」に包まれているのが特徴。 [出典: テーマ20]"
8
+ },
9
+ {
10
+ "answer_id": "SC08_002",
11
+ "answer": "胸部",
12
+ "question_hint": "昆虫のあしとはねがついている体の部位を答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "昆虫の3対6本のあし、および2対4枚のはねは、すべて「胸部」についている。ハエやカのように、はねが退化して2枚になっているものや、アリやノミのように0枚のものも存在する。 [出典: テーマ20]"
15
+ },
16
+ {
17
+ "answer_id": "SC08_003",
18
+ "answer": "気門",
19
+ "question_hint": "昆虫が呼吸のために空気を取り入れる、腹部や胸部にある穴の名称を問う問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "昆虫は胸部や腹部の側面にある「気門」という穴から空気を取り入れる。取り入れた空気は体内の「気管」を通って全身の細胞に運ばれる。 [出典: テーマ20]"
22
+ },
23
+ {
24
+ "answer_id": "SC08_004",
25
+ "answer": "完全変態",
26
+ "question_hint": "卵から成虫になるまでの間に「さなぎ」の時期がある育ち方の名称を問う問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "卵→幼虫→さなぎ→成虫という順に育つことを「完全変態」という。チョウ、カブトムシ、ハチ、テントウムシ、ホタルなどが代表例である。 [出典: テーマ21]"
29
+ },
30
+ {
31
+ "answer_id": "SC08_005",
32
+ "answer": "セミ、バッタ、トンボ、カマキリ、コオロギ",
33
+ "question_hint": "不完全変態(さなぎにならない)の昆虫の例を複数答えさせる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "卵→幼虫→成虫という順に育ち、さなぎの時期がないものを「不完全変態」という。覚え方は「セミのバッター不完全、コロんだトンボをカマってゴキ(セミ、バッタ、コオロギ、トンボ、カマキリ、ゴキブリ)」。 [出典: はじめに/テーマ21]"
36
+ },
37
+ {
38
+ "answer_id": "SC08_006",
39
+ "answer": "えら呼吸",
40
+ "question_hint": "トンボの幼虫である「やご」の呼吸方法を答えさせる問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "トンボの成虫は気門で空気呼吸をするが、幼虫の「やご」は水中で生活するため「えら」で呼吸を行っている。 [出典: テーマ21]"
43
+ },
44
+ {
45
+ "answer_id": "SC08_007",
46
+ "answer": "アブラナ科(キャベツなど)",
47
+ "question_hint": "モンシロチョウが卵を産みつける植物の「科名」を問う問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "モンシロチョウはアブラナ科の植物(キャベツ、ダイコン、ナズナなど)の葉の裏に卵を産む。これに対し、アゲハはミカン科の植物に卵を産む。 [出典: テーマ22]"
50
+ },
51
+ {
52
+ "answer_id": "SC08_008",
53
+ "answer": "自分の卵のから",
54
+ "question_hint": "モンシロチョウの幼虫がふ化した直後に最初に食べるものを問う問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "モンシロチョウの幼虫(1齢幼虫)は、ふ化した直後にまず自分が中に入っていた「卵のから」を食べる。その後、葉を食べ始め、体色が黄色から緑色(アオムシ)に変化する。 [出典: テーマ22]"
57
+ },
58
+ {
59
+ "answer_id": "SC08_009",
60
+ "answer": "胸あし6本、腹あし10本",
61
+ "question_hint": "モンシロチョウの幼虫(アオムシ)のあしの数と、それぞれの名称を答えさせる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "チョウの幼虫には、胸の部分に爪のような「胸あし」が3対6本、腹の部分に吸盤のような「腹あし」が4対8本と、おしりの先に「尾あし」が1対2本の、合計8対16本のあしがある。 [出典: テーマ22]"
64
+ },
65
+ {
66
+ "answer_id": "SC08_010",
67
+ "answer": "セキツイ動物",
68
+ "question_hint": "背骨をもつ動物をまとめた名称を問う問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "背骨をもつ動物を「セキツイ動物」、背骨をもたない動物を「無セキツイ動物」という。セキツイ動物はホニュウ類、鳥類、ハチュウ類、両生類、魚類の5つに分類される。 [出典: テーマ23]"
71
+ },
72
+ {
73
+ "answer_id": "SC08_011",
74
+ "answer": "��ニュウ類、鳥類",
75
+ "question_hint": "セキツイ動物の中で、周囲の温度に関わらず体温を一定に保つことができるグループを答えさせる問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "体温を一定に保つ動物を「恒温(こうおん)動物」といい、ホニュウ類と鳥類がこれに当たる。一方、魚類、両生類、ハチュウ類は周囲の温度に合わせて体温が変わる「変温(へんおん)動物」である。 [出典: テーマ23]"
78
+ },
79
+ {
80
+ "answer_id": "SC08_012",
81
+ "answer": "両生類",
82
+ "question_hint": "子が「えら」、親が「肺と皮膚」で呼吸し、成長の過程で呼吸器官が変わる動物のグループを問う問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "「両生類」のカエルなどは、幼生(オタマジャクシ)の時期は水中で「えら」呼吸をし、成体になると陸上で「肺」と「皮膚」で呼吸するようになる。 [出典: テーマ23]"
85
+ },
86
+ {
87
+ "answer_id": "SC08_013",
88
+ "answer": "節足動物",
89
+ "question_hint": "昆虫、エビ、クモ、ムカデなどのように、体に節があり、外骨格をもつ動物のグループ名を問う問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "無セキツイ動物のうち、あしに節があり、体がかたい外骨格におおわれているものを「節足(せっそく)動物」という。これには昆虫類、クモ類、甲殻(こうかく)類、多足類が含まれる。 [出典: テーマ24]"
92
+ },
93
+ {
94
+ "answer_id": "SC08_014",
95
+ "answer": "4対8本",
96
+ "question_hint": "クモ類のあしの本数を答えさせる問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "昆虫類(カブトムシ等)のあしは3対6本だが、クモ類(クモ、サソリ、ダニ等)のあしは4対8本である。また、クモの体は頭胸部と腹部の2つに分かれており、あしは頭胸部についている。 [出典: テーマ24]"
99
+ },
100
+ {
101
+ "answer_id": "SC08_015",
102
+ "answer": "外套膜(がいとうまく)",
103
+ "question_hint": "イカやアサリなどの軟体動物において、内臓をつつんでいる筋肉質の膜の名称を問う問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "イカ、タコ、アサリ、サザエなどは「軟体(なんたい)動物」と呼ばれ、内臓が「外套膜(がいとうまく)」という膜につつまれているのが特徴。 [出典: テーマ24]"
106
+ },
107
+ {
108
+ "answer_id": "SC08_016",
109
+ "answer": "オスは背びれに切れ込みがあり、しりびれが大きく平行四辺形に近い。",
110
+ "question_hint": "メダカのオスとメスを外見で見分ける際、オスのひれの特徴を説明させる問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "メダカのオスは「背びれ」に深い切れ込みがあり、「しりびれ」が大きく、形が平行四辺形に近い。メスは背びれに切れ込みがなく、しりびれは後ろに行くほど細くなる。 [出典: テーマ25]"
113
+ },
114
+ {
115
+ "answer_id": "SC08_017",
116
+ "answer": "水草にからみついて流されないようにするため。",
117
+ "question_hint": "メダカの卵に「付着毛」という毛がついている理由を説明させる問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "メダカの卵には「付着毛(ふちゃくもう)」があり、これによって水草などにしっかりとからみつくことができる。これは卵が水の流れでバラバラになったり、流されたりするのを防ぐため。 [出典: テーマ25]"
120
+ },
121
+ {
122
+ "answer_id": "SC08_018",
123
+ "answer": "卵黄(らんおう)",
124
+ "question_hint": "ふ化したばかりの子メダカがおなかに持っている栄養分を蓄えた袋の名称を問う問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "ふ化したばかりの子メダカのおなかには「卵黄(らんおう)」という栄養の入った袋があり、2〜3日はえさを食べずにこの栄養で生きる。そのため、ふ化直後は水槽の底の方でじっとしている。 [出典: テーマ25]"
127
+ },
128
+ {
129
+ "answer_id": "SC08_019",
130
+ "answer": "接眼レンズ → 対物レンズ",
131
+ "question_hint": "顕微鏡を組み立てる際、2種類のレンズを取り付ける正しい順番を答えさせる問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "顕微鏡を準備する際は、鏡筒の中にほこりが入るのを防ぐため、先に「接眼レンズ」を取り付け、次に「対物レンズ」を取り付ける。 [出典: テーマ26]"
134
+ },
135
+ {
136
+ "answer_id": "SC08_020",
137
+ "answer": "右上",
138
+ "question_hint": "顕微鏡の視野で、見たいものが「右上」に見えるとき、それを中央に持ってくるにはプレパラートをどの方向に動かせばよいか問��問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "顕微鏡の視野は上下左右が逆になっている。そのため、見たいものが「右上」にあるときは、プレパラートをそのまま「右上」に動かすと、レンズを通した像が中央にやってくる。 [出典: テーマ26]"
141
+ },
142
+ {
143
+ "answer_id": "SC08_021",
144
+ "answer": "暗くなる、狭くなる",
145
+ "question_hint": "顕微鏡の倍率を上げたとき、視野の「明るさ」と「見える範囲(広さ)」がどのように変化するか答えさせる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "顕微鏡の倍率を上げると、見える範囲(視野)は「狭く」なり、入ってくる光の量が減るため「暗く」なる。そのため、高倍率にする際は反射鏡やしぼりで光の量を調節する必要がある。 [出典: テーマ26]"
148
+ },
149
+ {
150
+ "answer_id": "SC08_022",
151
+ "answer": "ミジンコ、ゾウリムシ、アメーバ、ミドリムシ",
152
+ "question_hint": "代表的な「動物性プランクトン」を複数答えさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "ミジンコ(卵でふえる)、ゾウリムシ(繊毛で動く)、アメーバ(仮足で動く)などは動物性プランクトン。ミドリムシは葉緑体をもち光合成をするが、鞭毛で動き回るため、植物・動物両方の性質をもつ。 [出典: テーマ27]"
155
+ },
156
+ {
157
+ "answer_id": "SC08_023",
158
+ "answer": "アオミドロ、クンショウモ、ミカヅキモ、ケイソウ",
159
+ "question_hint": "代表的な「植物性プランクトン」を複数答えさせる問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "葉緑体をもち光合成を行う植物性プランクトンには、アオミドロ(糸状)、クンショウモ、ミカヅキモ、ケイソウなどがある。これらは分裂してふえるものが多い。 [出典: テーマ27]"
162
+ },
163
+ {
164
+ "answer_id": "SC08_024",
165
+ "answer": "変温動物で、気温が下がると体温が下がり活動できなくなるから。",
166
+ "question_hint": "カエルやヘビが土の中で「冬眠」をする理由を説明させる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "両生類(カエル)やハチュウ類(ヘビ)は「変温動物」である。冬の低い気温では体温も下がり、体が動かなくなるため、温度変化が少ない土の中などでじっとして冬を越す「冬眠」を行う。 [出典: テーマ28]"
169
+ },
170
+ {
171
+ "answer_id": "SC08_025",
172
+ "answer": "ツバメ、カッコウ、ホトトギス",
173
+ "question_hint": "春に南の国から渡ってきて、日本で子育てをする「夏鳥」の例を複数答えさせる問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "春に南から渡ってきて日本で産卵し、秋に南へ帰る鳥を「夏鳥」という。ツバメ、カッコウ、ホトトギスが代表。対して、秋に北から来て春に北へ帰るハクチョウやカモは「冬鳥」という。 [出典: テーマ28]"
176
+ },
177
+ {
178
+ "answer_id": "SC08_026",
179
+ "answer": "昆虫ではない:エ(クモ)、キ(ダンゴムシ)",
180
+ "question_hint": "複数の無セキツイ動物のリスト(アリ、バッタ、クモ、エビ、カマキリ、ダンゴムシ、ミジンコなど)から「昆虫ではないもの」を特定させる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "昆虫の定義は「あしが3対6本」であること。クモ(4対8本)はクモ類、ダンゴムシ(7対14本)やミジンコは甲殻類であり、昆虫ではない。 [出典: テーマ21問題演習/テーマ24]"
183
+ },
184
+ {
185
+ "answer_id": "SC08_027",
186
+ "answer": "10日",
187
+ "question_hint": "メダカの卵が産まれてからふ化するまでにかかる日数(水温25℃の場合)を問う問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "メダカの卵は水温によってふ化までの日数が変わる。目安として「水温×日数=250」という関係があり、25℃のときはおよそ10日でふ化する。 [出典: テーマ25]"
190
+ },
191
+ {
192
+ "answer_id": "SC08_028",
193
+ "answer": "繊毛(せんもう)",
194
+ "question_hint": "ゾウリムシが移動するために使っている、体の周りにある細かい毛の名称を問う問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "ゾウリムシは全身に生えた細かい「繊毛(せんもう)」を動かして、回転しながら水中を泳ぐ。一方、ミドリムシは長い「鞭毛(べんもう)」を使って移動する。 [出典: テーマ27]"
197
+ },
198
+ {
199
+ "answer_id": "SC08_029",
200
+ "answer": "卵:カマキリ、コオロギ。さなぎ:モンシロチョウ、アゲハ。",
201
+ "question_hint": "カマキリ、モンシロチョウ、アゲハ、コオロギのそれぞれの「冬越しのす��た」を答えさせる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "カマキリやコオロギは「卵」で冬を越す。モンシロチョウやアゲハは「さなぎ」で冬を越す。カブトムシは「幼虫」で冬を越し、テントウムシは「成虫」で冬を越す。 [出典: テーマ28]"
204
+ },
205
+ {
206
+ "answer_id": "SC08_030",
207
+ "answer": "400倍",
208
+ "question_hint": "接眼レンズ10倍、対物レンズ40倍を使ったときの、顕微鏡の視野の倍率を計算させる問題。",
209
+ "difficulty": "基本",
210
+ "source_context": "顕微鏡の倍率は「接眼レンズの倍率 × 対物レンズの倍率」で決まる。10倍 × 40倍 = 400倍となる。 [出典: テーマ26]"
211
+ },
212
+ {
213
+ "answer_id": "SC08_031",
214
+ "answer": "16",
215
+ "question_hint": "モンシロチョウの幼虫を異なる温度で飼育し、さなぎになるまでの日数を記録した表に基づき、欠落した数値を推定させる計算問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "【数値設定】式:(飼育温度 - 8) × 日数 = 200。 日数が25日のとき、(x - 8) × 25 = 200。 x - 8 = 8。 よって x = 16。 [出典: テーマ22入試で差がつくポイント]"
218
+ },
219
+ {
220
+ "answer_id": "SC08_032",
221
+ "answer": "① > ③ > ⑤ > ② > ④",
222
+ "question_hint": "複数のプランクトンのスケッチと観察倍率から、実際の大きさが「大きい順」に並べ替える応用問題。",
223
+ "difficulty": "応用",
224
+ "source_context": "【設定数値】①:倍率100、目盛り1.5個。②:倍率400、目盛り0.4個。③:倍率100、目盛り0.7個。④:倍率400、目盛り0.2個。⑤:倍率200、目盛り1.0個。 【計算ロジック】実際の大きさは「目盛り数 ÷ 倍率」に比例する。①は0.015、②は0.001、③は0.007、④は0.0005、⑤は0.005。よって ① > ③ > ⑤ > ② > ④。 [出典: テーマ27入試で差がつくポイント]"
225
+ },
226
+ {
227
+ "answer_id": "SC08_033",
228
+ "answer": "昼夜の長さ(光が当たっている時間)の変化。",
229
+ "question_hint": "渡り鳥が南へ帰る時期や、リスが冬眠に入る時期を判断するための「手がかり」となる自然現象を問う問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "気温や天候は日によって変化が激しく不安定だが、「昼と夜の長さ(日照時間)」は季節によって正確に、毎年同じように変化する。そのため、多くの生き物はこれを合図に冬越しの準備に入る。 [出典: テーマ28入試で差がつくポイント解説]"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC09.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC09_001",
4
+ "answer": "消化",
5
+ "question_hint": "食物を体に取り入れやすい小さな物質に分解するはたらきの用語定義を問う問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "口から取り入れた食物が、体内で吸収されやすい小さな物質に分解されることを【消化(しょうか)】という。また、消化された物質を体に取り入れるはたらきを「吸収」と呼ぶ。"
8
+ },
9
+ {
10
+ "answer_id": "SC09_002",
11
+ "answer": "消化酵素",
12
+ "question_hint": "唾液や胃液に含まれ、特定の物質を分解する触媒のはたらきをもつ物質の名称を問う問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "消化液に含まれる、食物を分解するはたらきのある物質を【消化酵素(しょうかこうそ)】という。唾液のアミラーゼや胃液のペプシンなどが代表的で、決まった物質にのみ作用し、自らは変化せずに反応を助ける「触媒」の性質をもつ。"
15
+ },
16
+ {
17
+ "answer_id": "SC09_003",
18
+ "answer": "アミラーゼ",
19
+ "question_hint": "唾液に含まれ、デンプンを麦芽糖に分解する消化酵素の名前を問う問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "唾液(だえき)に含まれる消化酵素を【アミラーゼ】という。これは、食物に含まれる「デンプン」を「糖(麦芽糖)」に分解するはたらきをもつ。"
22
+ },
23
+ {
24
+ "answer_id": "SC09_004",
25
+ "answer": "肝臓、胆のう",
26
+ "question_hint": "胆汁がつくられる場所と、蓄えられる場所をそれぞれ答えさせる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "胆汁(たんじゅう)は【肝臓(かんぞう)】でつくられ、【胆(たん)のう】という袋に一時的に蓄えられる。胆汁自体に消化酵素は含まれないが、脂肪の分解を助ける役割がある。"
29
+ },
30
+ {
31
+ "answer_id": "SC09_005",
32
+ "answer": "すい液",
33
+ "question_hint": "三大栄養素(炭水化物・タンパク質・脂肪)のすべてを消化するはたらきをもつ消化液を問う問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "すい臓から分泌される【すい液】は、炭水化物(デンプン)、タンパク質、脂肪の三大栄養素すべてを分解する強力な消化酵素を含んでいる。十二指腸に送られて作用する。"
36
+ },
37
+ {
38
+ "answer_id": "SC09_006",
39
+ "answer": "柔毛(じゅうもう)",
40
+ "question_hint": "小腸の内壁にある、表面積を大きくして養分を効率よく吸収するための突起の名称を問う問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "小腸の内壁にはひだがあり、その表面には【柔毛(じゅうもう)】と呼ばれる小さな突起が無数にある。これにより小腸内の表面積が非常に大きくなり、消化された養分を効率よく吸収することができる。"
43
+ },
44
+ {
45
+ "answer_id": "SC09_007",
46
+ "answer": "青紫色",
47
+ "question_hint": "デンプンにヨウ素液を加えたときの色変化を問う問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "ヨウ素液は「デンプン」があるとはたらき、元の茶褐色から【青紫色】に変化する。消化の実験では、唾液によってデンプンが分解されたかどうかを確かめるために使用される。"
50
+ },
51
+ {
52
+ "answer_id": "SC09_008",
53
+ "answer": "赤褐色の沈殿",
54
+ "question_hint": "糖の存在を確かめるベネジクト液の反応結果を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "ベネジクト液は、麦芽糖やブドウ糖などの「糖」がある状態で加熱すると、【赤褐色の沈殿】を生じる。唾液がデンプンを糖に変えたことを証明する実験で用いられる。"
57
+ },
58
+ {
59
+ "answer_id": "SC09_009",
60
+ "answer": "消化酵素が熱によって壊れてしまうから。",
61
+ "question_hint": "唾液を80℃以上に加熱したあとにデンプンと混ぜても分解が起こらない理由を説明させる問題。",
62
+ "difficulty": "応用",
63
+ "source_context": "消化酵素(アミラーゼ等)はタンパク質でできており、温度の影響を強く受ける。ヒトの体温に近い40℃前後で最もよくはたらくが、80℃などの高温になると【熱によって壊れて(変性して)しまう】ため、冷ましても元のようにははたらけなくなる。"
64
+ },
65
+ {
66
+ "answer_id": "SC09_010",
67
+ "answer": "卵巣、排卵",
68
+ "question_hint": "ヒトの卵子がつくられる場所と、それが放出される現象の名前を問う問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "卵子は【卵巣(らんそう)】でつくられる。成熟した卵子が卵巣から放出���れることを【排卵(はいらん)】という。通常、左右の卵巣から交互に1個ずつ行われる。"
71
+ },
72
+ {
73
+ "answer_id": "SC09_011",
74
+ "answer": "輸卵管(ゆらんかん)",
75
+ "question_hint": "卵子と精子が出会い、受精が行われる場所を問う問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "排卵された卵子は【輸卵管(ゆらんかん)】に取り込まれる。ここで精子と出会って「受精」が行われ、受精卵となる。"
78
+ },
79
+ {
80
+ "answer_id": "SC09_012",
81
+ "answer": "胎盤、へその緒",
82
+ "question_hint": "胎児が母親から栄養や酸素を受け取り、不要物を渡すための器官を2つ答えさせる問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "受精卵が子宮の内壁に付着(着床)すると、母体と胎児の血液の間で物質交換を行う【胎盤(たいばん)】がつくられる。胎児と胎盤は【へその緒】でつながっており、そこを通して酸素や栄養分、二酸化炭素や不要物のやりとりが行われる。"
85
+ },
86
+ {
87
+ "answer_id": "SC09_013",
88
+ "answer": "羊水(ようすい)",
89
+ "question_hint": "子宮内で胎児を衝撃から守っている液体の名称を問う問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "子宮内は【羊水(ようすい)】という液体で満たされている。胎児はこの中に浮かんでいることで、外部からの衝撃から守られ、体温も一定に保たれる。"
92
+ },
93
+ {
94
+ "answer_id": "SC09_014",
95
+ "answer": "38週",
96
+ "question_hint": "ヒトの胎児が受精してから誕生するまでのおおよその期間を問う問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "ヒトの子は、受精から誕生までおよそ【38週】間(約266日)を母親の体内で過ごす。"
99
+ },
100
+ {
101
+ "answer_id": "SC09_015",
102
+ "answer": "4つの部屋(2心房2心室)",
103
+ "question_hint": "ヒトの心臓の構造上の特徴を答えさせる問題。",
104
+ "difficulty": "基本",
105
+ "source_context": "ヒトの心臓は【4つの部屋(2心房2心室)】に分かれている。上側にある血液が戻ってくる「心房(しんぼう)」と、下側にある血液を送り出す「心室(しんしつ)」が左右に1つずつある。"
106
+ },
107
+ {
108
+ "answer_id": "SC09_016",
109
+ "answer": "肺循環",
110
+ "question_hint": "右心室から肺を通って左心房に戻る血液の循環経路の名前を問う問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "右心室から肺動脈を通って肺へ行き、二酸化炭素を捨てて酸素を受け取り、肺静脈を通って左心房へ戻る経路を【肺循環(はいじゅんかん)】という。"
113
+ },
114
+ {
115
+ "answer_id": "SC09_017",
116
+ "answer": "体循環",
117
+ "question_hint": "左心室から全身をめぐって右心房に戻る血液の循環経路の名前を問う問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "左心室から大動脈を通って全身の組織へ行き、酸素や栄養分を渡し、二酸化炭素や不要物を受け取って大静脈から右心房へ戻る経路を【体循環(たいじゅんかん)】という。"
120
+ },
121
+ {
122
+ "answer_id": "SC09_018",
123
+ "answer": "ヘモグロビン",
124
+ "question_hint": "赤血球に含まれ、酸素を運ぶ役割をもつ赤い色素の名称を問う問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "赤血球に含まれる【ヘモグロビン】という鉄を含む色素は、酸素の多い場所(肺)で酸素と結びつき、酸素の少ない場所(全身の組織)で酸素を放す性質がある。これにより全身へ酸素を運ぶ。"
127
+ },
128
+ {
129
+ "answer_id": "SC09_019",
130
+ "answer": "白血球、血小板",
131
+ "question_hint": "体内に侵入した細菌を退治する成分と、出血を止めるはたらきをもつ成分をそれぞれ答えさせる問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "血液には固形成分が含まれる。【白血球】は体内に侵入した細菌などの異物を攻撃して体を守る(免疫)。【血小板】は出血したときに血液を固めて止血するはたらきをもつ。"
134
+ },
135
+ {
136
+ "answer_id": "SC09_020",
137
+ "answer": "弁(べん)",
138
+ "question_hint": "心臓や静脈にあり、血液が逆流するのを防いでいるつくりの名称を問う問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "心臓内や静脈には、血液が一方向にだけ流れるように、逆流を防ぐ【弁(べん)】がついている。特に静脈は血液の圧力が低いため、逆流しやすい。"
141
+ },
142
+ {
143
+ "answer_id": "SC09_021",
144
+ "answer": "動脈血、静脈血",
145
+ "question_hint": "酸素を多く含む鮮やかな赤色の血液と、酸素が少なく暗い赤色の血液の名称をそれぞれ問う問題���",
146
+ "difficulty": "標準",
147
+ "source_context": "酸素を多く含み、鮮やかな赤色をした血液を【動脈血(どうみゃくけつ)】、酸素が少なく二酸化炭素を多く含み、黒ずんだ赤色をした血液を【静脈血(じょうみゃくけつ)】という。"
148
+ },
149
+ {
150
+ "answer_id": "SC09_022",
151
+ "answer": "肺動脈",
152
+ "question_hint": "名前に「動脈」とつくが、実際には静脈血(酸素が最も少ない血液)が流れている血管を答えさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "心臓から送り出される血管をすべて「動脈」と呼ぶ。右心室から肺へ向かう【肺動脈】は、全身から戻ってきたばかりの酸素が極めて少ない「静脈血」を運んでいる。"
155
+ },
156
+ {
157
+ "answer_id": "SC09_023",
158
+ "answer": "腎静脈(じんじょうみゃく)",
159
+ "question_hint": "全身をめぐる血液の中で、尿素などの不要物が最も少ない血液が流れている血管を問う問題。",
160
+ "difficulty": "応用",
161
+ "source_context": "腎臓(じんぞう)は血液から尿素などの不要物をこし取る器官である。そのため、腎臓から出て心臓へ戻る【腎静脈(じんじょうみゃく)】を流れる血液は、全身の中で最も不要物が少ないきれいな状態である。"
162
+ },
163
+ {
164
+ "answer_id": "SC09_024",
165
+ "answer": "尿素(にょうそ)",
166
+ "question_hint": "肝臓で、細胞から出た有害なアンモニアが何という物質に変えられるか答えさせる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "細胞の活動によって生じた有害なアンモニアは、肝臓へ運ばれ、害の少ない【尿素(にょうそ)】につくり変えられる。その後、腎臓でこし出されて尿として排出される。"
169
+ },
170
+ {
171
+ "answer_id": "SC09_025",
172
+ "answer": "肺胞(はいほう)",
173
+ "question_hint": "肺の気管支の先端にある無数の小さな袋の名称を問う問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "気管支の先には【肺胞(はいほう)】と呼ばれる小さな袋が無数にある。これにより表面積が非常に大きくなり、周囲を取り巻く毛細血管との間で、酸素と二酸化炭素の交換を効率よく行える。"
176
+ },
177
+ {
178
+ "answer_id": "SC09_026",
179
+ "answer": "横隔膜(おうかくまく)が下がり、肋骨(ろっこつ)が上がる。",
180
+ "question_hint": "ヒトが息を吸うときの、横隔膜と肋骨の動きをセットで答えさせる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "肺自体には筋肉がないため、自力では動けない。【横隔膜(おうかくまく)が下がり】、【肋骨(ろっこつ)が上がる】ことで、胸腔(肺が入っている空間)が広がり、気圧が下がることで空気が肺に吸い込まれる。"
183
+ },
184
+ {
185
+ "answer_id": "SC09_027",
186
+ "answer": "51秒",
187
+ "question_hint": "血液量4.8L、1回拍動80mL、毎分70回という数値設定から、血液が体を一周する時間を求める計算問題。",
188
+ "difficulty": "応用",
189
+ "source_context": "【設定数値】血液総量:4.8L(4800mL)、1回の拍動:80mL、1分間の拍動数:70回。 【計算ロジック】一周に必要な拍動回数=4800 ÷ 80 = 60回。 1分(60秒)で70回打つので、1回あたり 60/70 秒。 60回打つのにかかる時間=60 × (60 ÷ 70) = 51.4...秒。 四捨五入して51秒。"
190
+ },
191
+ {
192
+ "answer_id": "SC09_028",
193
+ "answer": "骨髄(こつずい)",
194
+ "question_hint": "骨の内部にあり、赤血球や白血球などの血液細胞がつくられる場所を問う問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "骨の内部にある【骨髄(こつずい)】では、赤血球、白血球、血小板などの血液成分が絶えず生産されている。"
197
+ },
198
+ {
199
+ "answer_id": "SC09_029",
200
+ "answer": "けん",
201
+ "question_hint": "筋肉と骨をつないでいる丈夫な組織の名称を問う問題。",
202
+ "difficulty": "基本",
203
+ "source_context": "筋肉の両端は丈夫な【けん】という組織になっており、これによって筋肉が骨に固定されている。アキレス腱などが有名。"
204
+ },
205
+ {
206
+ "answer_id": "SC09_030",
207
+ "answer": "虹彩(こうさい)",
208
+ "question_hint": "目のつくりで、瞳(ひとみ)の大きさを変えて目に入る光の量を調節する部分を問う問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "目の【虹彩(こうさい)】は、カメラのしぼりのように伸び縮みすることで瞳の大きさを変え、網膜に届く光の量を調節する。明るい場所では瞳は小さくなる。"
211
+ },
212
+ {
213
+ "answer_id": "SC09_031",
214
+ "answer": "厚くなる",
215
+ "question_hint": "近くの物を見るとき、目��レンズ(水晶体)の厚さはどう変化するか答えさせる問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "目のレンズ(水晶体)は、毛様体の筋肉のはたらきで厚さが調節される。遠くを見るときはレンズが薄くなり、近くを見るときはレンズが【厚くなる】ことでピントを合わせる。"
218
+ },
219
+ {
220
+ "answer_id": "SC09_032",
221
+ "answer": "聴神経(ちょうしんけい)、視神経",
222
+ "question_hint": "耳のうずまき管からの情報を伝える神経と、目の網膜からの情報を伝える神経の名前をそれぞれ答えさせる問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "音の振動が伝わったうずまき管からの刺激は【聴神経(ちょうしんけい)】で脳に送られる。光の像を結んだ網膜からの刺激は【視神経(ししんけい)】で脳に送られる。"
225
+ },
226
+ {
227
+ "answer_id": "SC09_033",
228
+ "answer": "232mL",
229
+ "question_hint": "1分間の呼吸5L、吸う息のO2濃度20.94%、吐く息16.30%という設定から、取り込まれた酸素量を求める計算問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "【設定数値】呼吸量:5000mL(5L)。吸う息の酸素:20.94%、吐く息の酸素:16.30%。 【計算ロジック】消費した割合=20.94 - 16.30 = 4.64%。 酸素量=5000 × (4.64 ÷ 100) = 232mL。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC10.json ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC10_001",
4
+ "answer": "約4000℃",
5
+ "question_hint": "太陽の表面にある「黒点」の温度を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "太陽の表面温度は約6000℃であるが、黒点は周囲より温度が約2000℃低いため、黒く見える。黒点の温度は約4000℃である。"
8
+ },
9
+ {
10
+ "answer_id": "SC10_002",
11
+ "answer": "約109倍",
12
+ "question_hint": "太陽の直径が地球の直径の何倍にあたるかを答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "太陽は水素やヘリウムでできた恒星であり、その直径は約140万kmである。これは地球の直径の約109倍に相当する。"
15
+ },
16
+ {
17
+ "answer_id": "SC10_003",
18
+ "answer": "西から東",
19
+ "question_hint": "地球の自転の向き(方角)を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "地球は地軸を回転軸として、1日に1回、西から東の向きに自転している。このため、太陽や星などの天体は東から昇り西へ沈む「日周運動」をしているように見える。"
22
+ },
23
+ {
24
+ "answer_id": "SC10_004",
25
+ "answer": "78.4度",
26
+ "question_hint": "北緯35度の地点における、夏至の日の太陽の南中高度を計算する問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "【計算ロジック】夏至の南中高度 = 90 - 緯度 + 23.4。地点は北緯35度なので、90 - 35 + 23.4 = 55 + 23.4 = 78.4度となる。"
29
+ },
30
+ {
31
+ "answer_id": "SC10_005",
32
+ "answer": "31.6度",
33
+ "question_hint": "北緯35度の地点における、冬至の日の太陽の南中高度を計算する問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "【計算ロジック】冬至の南中高度 = 90 - 緯度 - 23.4。地点は北緯35度なので、90 - 35 - 23.4 = 55 - 23.4 = 31.6度となる。"
36
+ },
37
+ {
38
+ "answer_id": "SC10_006",
39
+ "answer": "北緯20度",
40
+ "question_hint": "冬至の日の南中高度が46.6度である地点の緯度を逆算する問題。",
41
+ "difficulty": "応用",
42
+ "source_context": "【設定】北半球の冬至の南中高度公式「90 - 緯度 - 23.4」を使用する。46.6 = 90 - 緯度 - 23.4。46.6 = 66.6 - 緯度。緯度 = 66.6 - 46.6 = 20度。よって北緯20度。"
43
+ },
44
+ {
45
+ "answer_id": "SC10_007",
46
+ "answer": "南緯35度",
47
+ "question_hint": "太陽が最も南寄りから出て、真北を通る時の高度が78.4度である地点の緯度を求める問題。",
48
+ "difficulty": "応用",
49
+ "source_context": "【設定】「南寄りから出て真北を通る」のは南半球の夏至(北半球の冬至にあたる日)の動き。南半球の夏至の南中高度公式「90 - 緯度 + 23.4」を用いる。78.4 = 90 - 緯度 + 23.4。78.4 = 113.4 - 緯度。緯度 = 35度。よって南緯35度。"
50
+ },
51
+ {
52
+ "answer_id": "SC10_008",
53
+ "answer": "6時40分",
54
+ "question_hint": "透明半球の観察記録から、日の出の時刻を推定する計算問題。",
55
+ "difficulty": "応用",
56
+ "source_context": "【設定】午前9時の印(X)から10時の印(Y)までの長さが3cm(1時間=3cm)。日の出の位置(A)から9時の印(X)までの長さが7cmとする。【ロジック】9時から日の出までの時間は、7cm ÷ 3(cm/時) = 2と1/3時間 = 2時間20分前。9時00分 - 2時間20分 = 6時40分。"
57
+ },
58
+ {
59
+ "answer_id": "SC10_009",
60
+ "answer": "南西",
61
+ "question_hint": "夏至の日の、日の出の時刻における影の向きを答える問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "夏至の日の太陽は、最も「北東」寄りから昇る。影は太陽と反対側にできるため、日の出の瞬間の影は「南西」の方角に最も長くのびる。"
64
+ },
65
+ {
66
+ "answer_id": "SC10_010",
67
+ "answer": "11時49分",
68
+ "question_hint": "日の出と日の入りの時刻から、南中時刻を計算する問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "【設定数値】日の出が5時45分、日の入りが17時53分。【計算ロジック】南中時刻は日の出と日の入りのちょうど真ん中の時刻。全体の時間は17時53分 - 5時45分 = 12時間8分。その半分は6時間4分。日の出時刻に足すと、5時45分 + 6時間4分 = 11時49分。"
71
+ },
72
+ {
73
+ "answer_id": "SC10_011",
74
+ "answer": "20分",
75
+ "question_hint": "経度の違いによる南中時刻の差を計算する問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "【設定】日本標準時は東経135度(明石)。観測地点は東経140度(東京)。【ロジック】地球は15度で1時間(60分)自転する。経度1度あたりの差は4分。経度差は140 - 135 = 5度。5度 × 4分/度 = 20分。東にある地点ほど南中が早いため、東京は明石より20分早く南中する。"
78
+ },
79
+ {
80
+ "answer_id": "SC10_012",
81
+ "answer": "クレーター",
82
+ "question_hint": "月の表面にある、隕石の衝突でできたと考えられているくぼみの名称。",
83
+ "difficulty": "基本",
84
+ "source_context": "月には大気や水がなく、表面には隕石などが衝突してできた「クレーター」と呼ばれる無数のくぼみがある。火山活動ではなく、外部からの衝撃によるもの。"
85
+ },
86
+ {
87
+ "answer_id": "SC10_013",
88
+ "answer": "約27.3日",
89
+ "question_hint": "月の公転周期(および自転周期)の長さを答える問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "月が地球の周りを1周する公転周期は約27.3日である。また、月は常に同じ面を地球に向けているため、自転周期も公転周期と同じ約27.3日である。ただし、満ち欠けの周期(満月から次の満月まで)は地球も公転しているため約29.5日となる。"
92
+ },
93
+ {
94
+ "answer_id": "SC10_014",
95
+ "answer": "右側(西側)",
96
+ "question_hint": "新月から満月にかけて、月が満ちていく方向を答える問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "月の満ち欠けにおいて、月は常に「右側(西側)」から満ち始め、満月を過ぎると再び「右側(西側)」から欠けていく。"
99
+ },
100
+ {
101
+ "answer_id": "SC10_015",
102
+ "answer": "午後6時ごろ(夕方)",
103
+ "question_hint": "上弦の月が南中するおよその時刻を答える問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "上弦の月(右半分が明るい半月)は、昼の12時ごろに東から昇り、午後6時(18時)ごろに南中し、真夜中の0時ごろに西へ沈む。"
106
+ },
107
+ {
108
+ "answer_id": "SC10_016",
109
+ "answer": "午前6時ごろ(明け方)",
110
+ "question_hint": "下弦の月が南中するおよその時刻を答える問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "下弦の月(左半分が明るい半月)は、真夜中の0時ごろに東から昇り、午前6時ごろに南中し、昼の12時ごろに西へ沈む。"
113
+ },
114
+ {
115
+ "answer_id": "SC10_017",
116
+ "answer": "48分",
117
+ "question_hint": "月の出や南中の時刻が、前日と比べて毎日どれくらい遅くなるかを答える問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "月は1日に約13度公転している。地球の自転によるズレ(12度分)を修正するのにかかる時間は、約48分である。このため、月の南中時刻などは毎日約48分ずつ遅くなる。"
120
+ },
121
+ {
122
+ "answer_id": "SC10_018",
123
+ "answer": "左半分",
124
+ "question_hint": "地球から見た月が「上弦の月」のとき、月の北極点から見た地球の輝いている部分を答える問題。",
125
+ "difficulty": "応用",
126
+ "source_context": "地球から見て月が「右半分(上弦)」明るいとき、逆の立場(月)から地球を見ると、位置関係が逆転するため、地球は「左半分」が明るく見える。また、月から見た地球も満ち欠けをする。"
127
+ },
128
+ {
129
+ "answer_id": "SC10_019",
130
+ "answer": "新月",
131
+ "question_hint": "日食が起こる時の、地球から見た月の形を答える問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "日食は、太陽-月-地球が一直線上に並ぶ時に起こる。月が太陽を隠す現象であるため、地球から見た月の形は必ず「新月」である。"
134
+ },
135
+ {
136
+ "answer_id": "SC10_020",
137
+ "answer": "満月",
138
+ "question_hint": "月食が起こる時の、地球から見た月の形を答える問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "月食は、太陽-地球-月が一直線上に並び、月が地球の影(本影)に入る現象である。したがって、月食は必ず「満月」の時に起こる。"
141
+ },
142
+ {
143
+ "answer_id": "SC10_021",
144
+ "answer": "金環日食",
145
+ "question_hint": "月が太陽をすべて隠しきれず、太陽が輪のように見える現象の名称。",
146
+ "difficulty": "標準",
147
+ "source_context": "地球と月の距離が離れている(月が公転軌道の遠くにある)時に日食が起こると、月の見かけの大きさが太陽より小さくなり、太陽がはみ出して輪のように見える。これを金環日食という。"
148
+ },
149
+ {
150
+ "answer_id": "SC10_022",
151
+ "answer": "右側(西側)",
152
+ "question_hint": "日食のとき、太陽はどちら側から欠け始めるかを答える問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "日食の際、月は太陽の前を西から東へ通過するように動くため、太陽は「右側(西側)」から欠け始め、「右側(西側)」から現れる。"
155
+ },
156
+ {
157
+ "answer_id": "SC10_023",
158
+ "answer": "赤黒い色(赤銅色)",
159
+ "question_hint": "皆既月食の際、月はどのような色に見えるかを答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "皆既月食中、月は地球の影に完全に入るが、地球の大気でわずかに屈折した太陽の「赤い光」だけが月に届くため、真っ暗ではなく「赤黒い色(赤銅色)」に見える。"
162
+ },
163
+ {
164
+ "answer_id": "SC10_024",
165
+ "answer": "土星",
166
+ "question_hint": "太陽系の惑星の中で、密度が最も小さく、水(1.0g/cm³)よりも小さい惑星の名称。",
167
+ "difficulty": "標準",
168
+ "source_context": "土星は主に水素やヘリウムでできた巨大ガス惑星であり、その平均密度は約0.7g/cm³である。これは太陽系の惑星の中で最小で、もし巨大な水槽があれば水に浮く計算になる。"
169
+ },
170
+ {
171
+ "answer_id": "SC10_025",
172
+ "answer": "明けの明星",
173
+ "question_hint": "日の出直前の東の空に見える金星の呼び名。",
174
+ "difficulty": "基本",
175
+ "source_context": "金星は地球より内側を公転する内惑星である。明け方に東の空に見えるものを「明けの明星」、夕方に西の空に見えるものを「宵の明星」と呼ぶ。"
176
+ },
177
+ {
178
+ "answer_id": "SC10_026",
179
+ "answer": "木星",
180
+ "question_hint": "太陽系で最大の直径を持ち、地球の約11倍の大きさがある惑星の名称。",
181
+ "difficulty": "基本",
182
+ "source_context": "木星は太陽系最大の惑星であり、直径は地球の約11倍、質量は地球の約318倍に達する。主に水素とヘリウムで構成されている。"
183
+ },
184
+ {
185
+ "answer_id": "SC10_027",
186
+ "answer": "西の空(の低い位置)",
187
+ "question_hint": "夕方の午後6時ごろ、三日月が見える位置(方角・高度)を答える問題。",
188
+ "difficulty": "標準",
189
+ "source_context": "三日月は午前8時ごろに東から昇り、午後2時ごろに南中し、午後8時ごろに西へ沈む。したがって夕方の午後6時ごろには、西の空の低い位置に見える。"
190
+ },
191
+ {
192
+ "answer_id": "SC10_028",
193
+ "answer": "スピカ",
194
+ "question_hint": "おとめ座の1等星で、青白く光る星の名称。",
195
+ "difficulty": "標準",
196
+ "source_context": "春の大三角を構成する星の一つ。おとめ座の1等星で、表面温度が非常に高く青白く見えるのが特徴。もう一つのアルクトゥルスは橙色。"
197
+ },
198
+ {
199
+ "answer_id": "SC10_029",
200
+ "answer": "デネブ、アルタイル、ベガ",
201
+ "question_hint": "「夏の大三角」を構成する3つの1等星をすべて答える問題。",
202
+ "difficulty": "基本",
203
+ "source_context": "はくちょう座のデネブ、わし座のアルタイル(彦星)、こと座のベガ(織姫星)の3つを指す。これらはすべて白色の1等星である。"
204
+ },
205
+ {
206
+ "answer_id": "SC10_030",
207
+ "answer": "アンタレス",
208
+ "question_hint": "さそり座の1等星で、赤く光る星の名称。",
209
+ "difficulty": "基本",
210
+ "source_context": "夏の南の空、低い位置に見えるさそり座の心臓部分にあたる星。表面温度が約3000℃と低いため、赤く見える。名前は「火星の敵(アンチ・アレス)」に由来する。"
211
+ },
212
+ {
213
+ "answer_id": "SC10_031",
214
+ "answer": "シリウス",
215
+ "question_hint": "全天(太陽を除く)で最も明るく見える恒星の名称。",
216
+ "difficulty": "基本",
217
+ "source_context": "おおいぬ座の1等星で、冬の大三角の一つ。地球からの距離が約8.6光年と近いため、見かけ上の明るさが最も明るい恒星(-1.46等級)である。色は白色。"
218
+ },
219
+ {
220
+ "answer_id": "SC10_032",
221
+ "answer": "リゲル",
222
+ "question_hint": "オリオン座の右下の足元に位置し、青白く光る1等星の名称。",
223
+ "difficulty": "標準",
224
+ "source_context": "オリオン座には2つの1等星がある。左上の赤い星がベテルギウス、右下の青白い星がリゲルである。リゲルの方が表面温度が高い。"
225
+ },
226
+ {
227
+ "answer_id": "SC10_033",
228
+ "answer": "約15度",
229
+ "question_hint": "星が1時間あたりに日周運動で移動する角度を答える問題。",
230
+ "difficulty": "基本",
231
+ "source_context": "地球が24時間で360度自転しているため、星などの天体は 360 ÷ 24 = 15度 ずつ1時間に移動して見える。"
232
+ },
233
+ {
234
+ "answer_id": "SC10_034",
235
+ "answer": "約30度",
236
+ "question_hint": "星が1ヶ月後、同じ時刻に見たときに移動している角度を答える問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "地球が1年(12ヶ月)で太陽の周りを360度公転しているため、同じ時刻に観測する星の位置は 360 ÷ 12 = 30度 ずつ、1ヶ月ごとに西へずれて見える(年周運動)。"
239
+ }
240
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC11.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC11_001",
4
+ "answer": "膨張",
5
+ "question_hint": "上空へ行くほど気圧が低くなることで、上昇した空気に起こる変化を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "地表付近の空気はあたためられると上昇する。上空は気圧が低いため、上昇した空気は「膨張」する。膨張すると空気の温度(気温)が下がる性質があり、これが雲ができる第一歩となる。"
8
+ },
9
+ {
10
+ "answer_id": "SC11_002",
11
+ "answer": "露点",
12
+ "question_hint": "空気中の水蒸気が水滴になり始める時の温度の名称を答える問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "気温が下がると、空気がふくむことのできる水蒸気の最大量(飽和水蒸気量)が小さくなる。ふくみきれなくなった水蒸気が水滴となって現れ始める温度を「露点」という。"
15
+ },
16
+ {
17
+ "answer_id": "SC11_003",
18
+ "answer": "氷(の結晶)",
19
+ "question_hint": "雲を構成するもののうち、気温が0℃以下の場所で水滴が変化した状態を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "雲は、空気中の水蒸気が冷やされてできた細かい水滴の集まりである。気温が0℃以下の非常に高い場所では、水滴が凍って「氷の結晶」となり、これが雲をつくっている。"
22
+ },
23
+ {
24
+ "answer_id": "SC11_004",
25
+ "answer": "フェーン現象",
26
+ "question_hint": "湿った空気が山を越えて反対側に吹き降りる際、気温が上がる現象の名前を答える問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "湿った空気が山を越えるとき、風上側で雨を降らせて水分を失う。その後、乾燥した空気が山を越えてふもとに吹き降りる際、上昇したときよりも気温が大きく上がる現象を「フェーン現象」という。山を越える前よりも、ふもとの気温が高く乾燥するのが特徴。"
29
+ },
30
+ {
31
+ "answer_id": "SC11_005",
32
+ "answer": "巻雲(すじ雲)",
33
+ "question_hint": "非常に高い空にできる、刷毛で掃いたような白いすじ状の雲の名称を答える問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "最も高い空にできる雲(上層雲)のひとつで、形から「すじ雲」ともよばれる。氷の粒でできており、白く細いすじ状に見える。"
36
+ },
37
+ {
38
+ "answer_id": "SC11_006",
39
+ "answer": "積乱雲(入道雲)",
40
+ "question_hint": "強い上昇気流によって垂直方向に発達し、雷や強い雨をもたらす雲の名称。",
41
+ "difficulty": "標準",
42
+ "source_context": "垂直に大きく発達する雲で、夏によく見られる。「入道雲」ともよばれ、短時間に強い雨や雷、ひょうなどを降らせる原因となる。"
43
+ },
44
+ {
45
+ "answer_id": "SC11_007",
46
+ "answer": "偏西風",
47
+ "question_hint": "日本の上空で年間を通して吹いている、西寄りの強い風の名称を答える問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "地球の自転の影響により、日本付近(中緯度)の上空には、常に西から東へ向かって吹く「偏西風」という風がある。この風の影響で、日本の天気は西から東へ向かって変化する。"
50
+ },
51
+ {
52
+ "answer_id": "SC11_008",
53
+ "answer": "西から東",
54
+ "question_hint": "日本付近における低気圧や天気の変化が移動していく一般的な方向を答える問題。",
55
+ "difficulty": "基本",
56
+ "source_context": "日本の上空には偏西風が吹いているため、低気圧や高気圧、雲などは「西から東」へと移動する。そのため、天気予報では西の方角の天気の変化に注目することが多い。"
57
+ },
58
+ {
59
+ "answer_id": "SC11_009",
60
+ "answer": "太平洋高気圧(小笠原気団)",
61
+ "question_hint": "夏に日本の南東で勢力を強め、蒸し暑い晴天をもたらす気圧(気団)の名称。",
62
+ "difficulty": "基本",
63
+ "source_context": "夏の時期に日本の南東側で勢力が大きくなる高気圧。これにおおわれると、「南高北低」の気圧配置となり、南東の季節風が吹いて蒸し暑い日が続く。"
64
+ },
65
+ {
66
+ "answer_id": "SC11_010",
67
+ "answer": "寒冷前線",
68
+ "question_hint": "冷たい空気のかたまりが暖かい空気の下にもぐり込み、押し上げながら進む前線の名称。",
69
+ "difficulty": "標準",
70
+ "source_context": "寒気が暖気の下へもぐり込むことで形成される。前線付近では上昇気流が強く、積乱雲が発生しやすい。通過後は北寄りの風に変わり、気温が急激に下がる。"
71
+ },
72
+ {
73
+ "answer_id": "SC11_011",
74
+ "answer": "温暖前線",
75
+ "question_hint": "暖かい空気のかたまり���冷たい空気の上にはい上がりながら進む前線の名称。",
76
+ "difficulty": "標準",
77
+ "source_context": "暖気が寒気の上をゆっくりとはい上がることで形成される。乱層雲などの広範囲な雲ができ、前線の通過前には弱い雨が長時間降り続く。通過後は南寄りの風に変わり、気温が上がる。"
78
+ },
79
+ {
80
+ "answer_id": "SC11_012",
81
+ "answer": "乱層雲(雨雲)",
82
+ "question_hint": "温暖前線の接近に伴い、広い範囲にわたって長時間雨を降らせる雲の種類。",
83
+ "difficulty": "標準",
84
+ "source_context": "温暖前線の前方(寒気側)に広く広がる灰色の雲。厚みがあり、広い範囲におだやかな雨や雪を長時間降らせるため「雨雲」ともよばれる。"
85
+ },
86
+ {
87
+ "answer_id": "SC11_013",
88
+ "answer": "狭い範囲に、強い雨が、短い時間降る",
89
+ "question_hint": "寒冷前線の通過時に起こる雨の降り方の特徴を説明する問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "寒冷前線付近では積乱雲が発生するため、激しい雨が降る。温暖前線と比較すると、雨の降る範囲は「狭い」が、雨の勢いは「強く」、降る時間は「短い」のが特徴である。"
92
+ },
93
+ {
94
+ "answer_id": "SC11_014",
95
+ "answer": "停滞前線",
96
+ "question_hint": "暖気と寒気の勢力がほぼ同じで、ほとんど動かずに停滞する前線の名称。",
97
+ "difficulty": "標準",
98
+ "source_context": "暖かい空気と冷たい空気の勢力が均衡しているときにできる。前線が同じ場所に長く居座るため、長雨(梅雨や秋雨)の原因となる。"
99
+ },
100
+ {
101
+ "answer_id": "SC11_015",
102
+ "answer": "線状降水帯",
103
+ "question_hint": "積乱雲が次々と発生して列をなし、同じ場所で非常に強い雨が降り続く現象。",
104
+ "difficulty": "応用",
105
+ "source_context": "停滞前線に向かって暖かく湿った空気が流れ込むなどして、積乱雲が次々と発生し、線状に並ぶ現象。狭い範囲に数時間にわたって猛烈な雨を降らせ、洪水や土砂災害の原因となる。"
106
+ },
107
+ {
108
+ "answer_id": "SC11_016",
109
+ "answer": "移動性高気圧",
110
+ "question_hint": "春や秋に、低気圧と交互に日本付近を西から東へ通り過ぎる高気圧の名称。",
111
+ "difficulty": "標準",
112
+ "source_context": "偏西風にのって低気圧と交互に移動してくる。春によく見られ、この高気圧におおわれるとカラッとした晴天になるが、移動が速いため天気は数日周期で変化する。"
113
+ },
114
+ {
115
+ "answer_id": "SC11_017",
116
+ "answer": "三寒四温",
117
+ "question_hint": "春先に寒い日が3日ほど続き、その後に暖かい日が4日ほど続くような周期的な天気の変化。",
118
+ "difficulty": "標準",
119
+ "source_context": "春先に移動性高気圧と低気圧が交互に通過することで、気温が3〜4日周期で変動する現象。暖かい日と寒い日が交互に訪れることを表す言葉。"
120
+ },
121
+ {
122
+ "answer_id": "SC11_018",
123
+ "answer": "17.2m/s",
124
+ "question_hint": "熱帯低気圧が「台風」と呼ばれるようになるための最大風速の基準値を答える問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "熱帯の海上で発生した熱帯低気圧のうち、中心付近の最大風速が17.2m/s以上(風力8以上)に達したものを「台風」とよぶ。"
127
+ },
128
+ {
129
+ "answer_id": "SC11_019",
130
+ "answer": "シベリア気団",
131
+ "question_hint": "冬にユーラシア大陸で発達し、日本に寒冷で乾燥した空気をもたらす気団の名称。",
132
+ "difficulty": "基本",
133
+ "source_context": "冬にシベリア付近で勢力を強める冷たくて乾燥した気団。日本付近がこの気団の影響を受けると、特徴的な「西高東低」の気圧配置となり、北西の季節風が吹く。"
134
+ },
135
+ {
136
+ "answer_id": "SC11_020",
137
+ "answer": "西高東低",
138
+ "question_hint": "日本の冬に特徴的な、西側に高気圧、東側に低気圧が配置されるパターンの名称。",
139
+ "difficulty": "基本",
140
+ "source_context": "冬の日本付近で見られる気圧配置。大陸(西)にシベリア高気圧、海洋(東)に低気圧があり、等圧線が縦(南北)に細かく並ぶ。これにより強い北西の季節風が吹き、日本海側に雪を、太平洋側に乾燥した晴天をもたらす。"
141
+ },
142
+ {
143
+ "answer_id": "SC11_021",
144
+ "answer": "下降気流",
145
+ "question_hint": "高気圧の中心付近で起こっている空気の流れ(鉛直方向)を答える問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "高気圧の中心付近では上空から地上に向かって空気が流れ落ちる「下降気流」がある。下降する空気は温度が上がり、水滴(雲)が蒸発して消えやすくなるため、高気圧付近は晴れることが多い。"
148
+ },
149
+ {
150
+ "answer_id": "SC11_022",
151
+ "answer": "上昇気流",
152
+ "question_hint": "低気圧の中心付近で起こっている空気の流れ(鉛直方向)を答える問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "低気圧の中心付近では、周囲から集まった空気が上空へ吹き上がる「上昇気流」がある。上昇した空気は冷やされて水蒸気が水滴(雲)になるため、低気圧付近は天気が悪くなる。"
155
+ },
156
+ {
157
+ "answer_id": "SC11_023",
158
+ "answer": "時計(右)回りに吹き出している",
159
+ "question_hint": "北半球における、高気圧の地表付近の風の向きと流れ方を答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "北半球の高気圧では、下降気流によって地上に降りた空気が、中心から外側に向かって「時計回り(右回り)」に渦を巻きながら吹き出している。"
162
+ },
163
+ {
164
+ "answer_id": "SC11_024",
165
+ "answer": "海風",
166
+ "question_hint": "晴れた日の昼間に、海岸付近で海から陸に向かって吹く風の名称。",
167
+ "difficulty": "標準",
168
+ "source_context": "昼間は太陽によって地面(陸)が水面(海)よりも早くあたたまる。陸上の空気があたたまって上昇気流が生じ、陸側の気圧が低くなるため、相対的に気圧が高い海から陸に向かって風が吹く。これを「海風」という。"
169
+ },
170
+ {
171
+ "answer_id": "SC11_025",
172
+ "answer": "地面(地表)",
173
+ "question_hint": "太陽の光によって、空気よりも先にあたためられる対象を答える問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "太陽の光は空気(酸素や窒素など)を直接あたためることはほとんどない。光が「地面」にあたって地面の温度を上げ、その熱が接している空気に伝わることで気温が上がる。このため、最高気温は太陽が最も高く昇る正午よりも遅れて(午後2時頃に)観測される。"
176
+ },
177
+ {
178
+ "answer_id": "SC11_026",
179
+ "answer": "飽和水蒸気量",
180
+ "question_hint": "空気1m³がふくむことのできる水蒸気の最大量を何というか。",
181
+ "difficulty": "標準",
182
+ "source_context": "空気1m³の中にふくむことができる限界の水蒸気の量(重さ)。気温が高くなるほど、この量は多くなる。湿度を計算する際の基準となる数値。"
183
+ },
184
+ {
185
+ "answer_id": "SC11_027",
186
+ "answer": "下がる",
187
+ "question_hint": "晴れた日の午後、気温が上がっていく時に、空気中の水蒸気量が変わらないとすると湿度はどう変化するか。",
188
+ "difficulty": "標準",
189
+ "source_context": "気温が上がると、空気がふくむことのできる水蒸気の最大量(飽和水蒸気量)が増える。実際にふくんでいる水蒸気量が変わらなければ、最大量に対する割合である湿度は「下がる」ことになる。晴れた日の気温と湿度のグラフは上下逆の形になる。"
190
+ },
191
+ {
192
+ "answer_id": "SC11_028",
193
+ "answer": "日の出直前(明け方)",
194
+ "question_hint": "1日のうちで最も気温が低くなる一般的な時刻を答える問題。",
195
+ "difficulty": "基本",
196
+ "source_context": "夜間は地面が熱を放出し続け(放射冷却)、太陽が出ていないため温度が下がり続ける。そのため、1日の最低気温は、太陽が昇り始めて地面があたたまりだす直前の「日の出直前」に観測される。"
197
+ },
198
+ {
199
+ "answer_id": "SC11_029",
200
+ "answer": "水が蒸発するときに、まわりから熱をうばうから",
201
+ "question_hint": "乾湿計において、湿球温度計の値が乾球温度計よりも低くなる理由を答える問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "湿球温度計は、球部が水でぬらしたガーゼでおおわれている。ガーゼの水分が蒸発する際、まわりから熱(気化熱)をうばって逃げていくため、湿球の温度は乾球(気温)よりも低くなる。空気が乾燥しているほど蒸発がさかんになり、温度差が大きくなる。"
204
+ },
205
+ {
206
+ "answer_id": "SC11_030",
207
+ "answer": "百葉箱",
208
+ "question_hint": "気温や湿度を正確にはかるために、温度計などを入れて設置する木製の箱の名称。",
209
+ "difficulty": "基本",
210
+ "source_context": "正確な気象観測のための小屋。日光の影響を避けるために白く塗られ、風通しを良くするためのよろい戸がついている。中には乾湿計や自記温度計などが収められている。"
211
+ },
212
+ {
213
+ "answer_id": "SC11_031",
214
+ "answer": "晴れ",
215
+ "question_hint": "空全体の雲の割合(雲量)が「2〜8」の時の天気を答える問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "天気の決定は雲の量で行う。空全体を10としたとき、雲が0〜1なら「快晴」、2〜8なら「晴れ」、9〜10なら「くもり」と決まっている。"
218
+ },
219
+ {
220
+ "answer_id": "SC11_032",
221
+ "answer": "1.2〜1.5m",
222
+ "question_hint": "気象観測において、気温をはかるべき地面からの高さを答える問題。",
223
+ "difficulty": "基本",
224
+ "source_context": "気温は地面からの照り返し(熱)の影響を避けるため、地表から「1.2〜1.5m」の高さではかるのが標準とされている。百葉箱もこの高さに設置される。"
225
+ },
226
+ {
227
+ "answer_id": "SC11_033",
228
+ "answer": "37℃",
229
+ "question_hint": "標高0mで32℃の空気が2000mの山を越え、ふもとのB地点(0m)まで降りた時の気温を計算する問題。条件:1000mで雲が発生。気温変化率は、雲なし1℃/100m、雲あり0.5℃/100m、下山時1℃/100mとする。",
230
+ "difficulty": "応用",
231
+ "source_context": "【計算手順】\n1. 上昇(0m→1000m、雲なし):32℃ - (1℃ × 10) = 22℃。\n2. 上昇(1000m→2000m、雲あり):22℃ - (0.5℃ × 10) = 17℃(山頂)。\n3. 下降(2000m→0m、常に1℃変化):17℃ + (1℃ × 20) = 37℃。\n山を越えたB地点(0m)の気温は37℃となる。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/sci/SC12.json ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SC12_001",
4
+ "answer": "泥(粘土)",
5
+ "question_hint": "地層が堆積する際、最も遠くまで運ばれて堆積する粒の種類を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "流水によって運ばれた土砂は、重いものから順に堆積する。小石(れき)、砂、泥の順に沈み、最も軽くて小さい「泥」は、沈むまでの時間が長いため、沖合の遠くまで運ばれてから堆積する。"
8
+ },
9
+ {
10
+ "answer_id": "SC12_002",
11
+ "answer": "下から「小石、砂、泥」の順",
12
+ "question_hint": "1つの層(地層)の中で、粒がどのように積み重なっているかを説明する問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "水中に土砂が流れ込むと、重い粒ほど早く沈む。そのため、1つの堆積サイクルでできた層の中では、下から「小石(れき)、砂、泥」という、粒の大きい順に積み重なる構造が見られる。"
15
+ },
16
+ {
17
+ "answer_id": "SC12_003",
18
+ "answer": "沈降",
19
+ "question_hint": "海水面に対して土地が下がる現象の名称を答える問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "地殻変動などにより、海面に対して土地が上がることを「隆起」、下がることを「沈降」という。沈降が起こると海水面は相対的に上がり、リアス海岸などの複雑な地形が形成される原因となる。"
22
+ },
23
+ {
24
+ "answer_id": "SC12_004",
25
+ "answer": "リアス海岸",
26
+ "question_hint": "土地の沈降によって、複雑に入り組んだ海岸線ができた地形の名称。",
27
+ "difficulty": "標準",
28
+ "source_context": "山地が海に面した場所などで土地の沈降が起こると、谷の部分に海水が入り込み、ノコギリの刃のように複雑に入り組んだ海岸線ができる。これを「リアス海岸」とよぶ。"
29
+ },
30
+ {
31
+ "answer_id": "SC12_005",
32
+ "answer": "不整合",
33
+ "question_hint": "地層の重なりが連続しておらず、一度侵食された跡が見られる重なり方の名称。",
34
+ "difficulty": "標準",
35
+ "source_context": "地層が水中で連続して積もることを「整合」という。一方、土地が隆起して地上に出て侵食され、再び沈降して新しい地層が積もった場合、上下の層の関係は連続しなくなる。これを「不整合」といい、その境目を不整合面という。"
36
+ },
37
+ {
38
+ "answer_id": "SC12_006",
39
+ "answer": "示準化石",
40
+ "question_hint": "地層が堆積した「時代(地質年代)」を推定するのに役立つ化石の分類名。",
41
+ "difficulty": "基本",
42
+ "source_context": "特定の短い期間に広い範囲で栄えた生物の化石を「示準化石」という。代表例として、古生代の三葉虫、中生代のアンモナイト、新生代のビカリアなどがあり、これらが見つかることで地層の年代が判別できる。"
43
+ },
44
+ {
45
+ "answer_id": "SC12_007",
46
+ "answer": "アンモナイト、恐竜",
47
+ "question_hint": "中生代(約2.5億年前〜0.66億年前)を代表する示準化石を2つ答える問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "地質年代のうち「中生代」を判定する指標となる化石は、海にすんでいた「アンモナイト」と、陸上で繁栄した「恐竜」である。"
50
+ },
51
+ {
52
+ "answer_id": "SC12_008",
53
+ "answer": "暖かくて浅い、きれいな海",
54
+ "question_hint": "サンゴの化石が発見された地層から推測できる、当時の環境条件を答える問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "地層ができた当時の環境を推定できる化石を「示相化石」という。サンゴは現代でも「暖かくて浅い、きれいな海」に生息しているため、その化石が見つかれば、当時はそのような環境であったことがわかる。"
57
+ },
58
+ {
59
+ "answer_id": "SC12_009",
60
+ "answer": "石灰岩",
61
+ "question_hint": "サンゴやフズリナの死骸がもとでできた堆積岩で、うすい塩酸をかけると気体が発生する岩石名。",
62
+ "difficulty": "標準",
63
+ "source_context": "炭酸カルシウムを主成分とする生物の遺骸が積もってできた岩石を「石灰岩」という。特徴として、うすい塩酸をかけると化学反応を起こして「二酸化炭素」の泡を出す性質がある。"
64
+ },
65
+ {
66
+ "answer_id": "SC12_010",
67
+ "answer": "チャート",
68
+ "question_hint": "放散虫などの死骸からでき、非常に硬く、鉄くぎでひっかいても傷がつかない堆積岩の名称。",
69
+ "difficulty": "標準",
70
+ "source_context": "二酸化ケイ素を主成分とする微小生物の死骸からできた岩石を「チャート」という。堆積岩の中で最も硬く、火打ち石に使われることもある。石灰岩と違い、塩酸をかけても反応しない。"
71
+ },
72
+ {
73
+ "answer_id": "SC12_011",
74
+ "answer": "凝灰岩(ぎょうかいがん)",
75
+ "question_hint": "火山灰が押し固められてできた堆積岩の名称を答える問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "火山の噴火によって吹き出された火山灰が積もって固まった岩石を「凝灰岩」という。粒の形が「角ばっている」のが特徴で、この層(鍵層)が見つかることで、離れた場所の地層のつながりを調べることができる。"
78
+ },
79
+ {
80
+ "answer_id": "SC12_012",
81
+ "answer": "水蒸気",
82
+ "question_hint": "火山ガスの中に最も多くふくまれている成分を答える問題。",
83
+ "difficulty": "基本",
84
+ "source_context": "火山の噴火時に放出される「火山ガス」の成分の大部分(約9割以上)は「水蒸気」である。その他、二酸化炭素や二酸化硫黄などが少量ふくまれる。"
85
+ },
86
+ {
87
+ "answer_id": "SC12_013",
88
+ "answer": "火砕流(かさいりゅう)",
89
+ "question_hint": "高温の火山噴出物と火山ガスが一体となり、高速で斜面を流れ下る恐ろしい現象の名称。",
90
+ "difficulty": "標準",
91
+ "source_context": "大規模な噴火時に発生する、数百度の火山灰やガスが時速100km以上の猛スピードで流れる現象を「火砕流」という。非常に破壊力が大きく、火山の災害の中でも特に危険なものの一つ。"
92
+ },
93
+ {
94
+ "answer_id": "SC12_014",
95
+ "answer": "等粒状組織(とうりゅうじょうそしき)",
96
+ "question_hint": "深成岩に見られる、大きな結晶だけが隙間なく組み合わさったつくりの名称。",
97
+ "difficulty": "標準",
98
+ "source_context": "地下深くでマグマが「ゆっくり」冷えて固まると、鉱物の結晶が十分に成長する。その結果、同じような大きさの大きな結晶だけが組み合わさった「等粒状組織」の岩石(深成岩)ができる。"
99
+ },
100
+ {
101
+ "answer_id": "SC12_015",
102
+ "answer": "斑状組織(はんじょうそしき)",
103
+ "question_hint": "火山岩に見られる、大きな結晶(斑晶)を細かい粒(石基)が埋めているつくりの名称。",
104
+ "difficulty": "標準",
105
+ "source_context": "地表付近などでマグマが「急激に」冷えると、一部の大きな結晶(斑晶)のまわりに、結晶になれなかった細かい粒(石基)が広がる。このつくりを「斑状組織」といい、火山岩の特徴である。"
106
+ },
107
+ {
108
+ "answer_id": "SC12_016",
109
+ "answer": "安山岩(あんざんがん)",
110
+ "question_hint": "日本に最も多く見られる火山岩で、色は灰色、富士山のような形の火山をつくる岩石名。",
111
+ "difficulty": "標準",
112
+ "source_context": "日本の火山の岩石のうち約7割を占める。火山岩(斑状組織)の一種で、中程度の粘り気をもつマグマからできる。色は灰色であることが多い。"
113
+ },
114
+ {
115
+ "answer_id": "SC12_017",
116
+ "answer": "花崗岩(かこうがん)",
117
+ "question_hint": "深成岩の代表例で、石英・長石・黒雲母をふくみ、白っぽく見える岩石の名称。",
118
+ "difficulty": "標準",
119
+ "source_context": "地下深くでゆっくり固まった「深成岩」の代表。墓石や建築材としてもよく使われる。無色鉱物の石英や長石を多くふくむため、全体的に白っぽく見えるのが特徴。"
120
+ },
121
+ {
122
+ "answer_id": "SC12_018",
123
+ "answer": "海洋プレートが大陸プレートの下に沈み込むため",
124
+ "question_hint": "日本付近で巨大な地震(プレート境界型地震)が発生する原因を説明する問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "地球の表面をおおう「海洋プレート」は、年間に数cmずつ「大陸プレート」の下へ沈み込んでいる。このとき、大陸プレートの端が引きずり込まれてひずみがたまり、それが限界に達して跳ね上がるときに巨大な地震が起こる。"
127
+ },
128
+ {
129
+ "answer_id": "SC12_019",
130
+ "answer": "震源",
131
+ "question_hint": "地下で地震が発生した具体的な場所の名称を答える問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "地震の揺れが発生した地下の地点を「震源」という。また、震源の真上の地表の地点を「震央」とよんで区別する。"
134
+ },
135
+ {
136
+ "answer_id": "SC12_020",
137
+ "answer": "初期微動、主要動",
138
+ "question_hint": "地震の波のうち、P波による小さな揺れと、S波による大きな揺れの名称を順に答える問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "地震の波には速いP波と遅いS波がある。まずP波が到着して起こるガタガタという小さな揺れを「初期微動」、後からS波が届いて起こるユサユサという大きな揺れを「主要動」という。"
141
+ },
142
+ {
143
+ "answer_id": "SC12_021",
144
+ "answer": "初期微動継続時間",
145
+ "question_hint": "P波が届いてからS波が届くまでの、小さな揺れが続く時間の名称。",
146
+ "difficulty": "標準",
147
+ "source_context": "P波とS波の到着時刻の差である、初期微動が続いている時間を「初期微動継続時間」という。この長さは「震源からの距離」に比例するため、この時間をはかることで震源までの距離を推定できる。"
148
+ },
149
+ {
150
+ "answer_id": "SC12_022",
151
+ "answer": "10段階",
152
+ "question_hint": "日本の気象庁が定めている「震度」は、全部で何段階あるかを答える問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "震度は、ある場所での揺れの強さを表す。0、1、2、3、4、5弱、5強、6弱、6強、7の合計「10段階」で表される。震度5と6には「弱」と「強」があることに注意。"
155
+ },
156
+ {
157
+ "answer_id": "SC12_023",
158
+ "answer": "マグニチュード",
159
+ "question_hint": "地震そのものの規模(エネルギーの大きさ)を表す尺度の名称。",
160
+ "difficulty": "基本",
161
+ "source_context": "震度が各地の「揺れ」を表すのに対し、地震がもつ「エネルギー」そのものの大きさを表す数値を「マグニチュード」という。この値が1大きくなると、エネルギーは約32倍になる。"
162
+ },
163
+ {
164
+ "answer_id": "SC12_024",
165
+ "answer": "8km/s",
166
+ "question_hint": "地震の計算問題。震源から90kmの地点にP波が到着したのが8時12分22秒、195kmの地点が8時12分36秒のとき、P波の速さを求める問題(※ナレッジベースの別数値例参照)。",
167
+ "difficulty": "応用",
168
+ "source_context": "【計算手順】\n1. 2地点の距離の差:195 - 90 = 105km。\n2. 到着時刻の差:36 - 22 = 14秒。\n3. 速さ = 距離 ÷ 時間 = 105 ÷ 14 = 7.5km/s。\n(※別の箇所の設定ではP波8km/sの設定もあるため、問題文の数値に従って計算すること)"
169
+ },
170
+ {
171
+ "answer_id": "SC12_025",
172
+ "answer": "侵食、運搬、堆積",
173
+ "question_hint": "流れる水(流水)がもつ3つのはたらきをすべて答える問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "流水には、土地を削る「侵食作用」、土砂を運ぶ「運搬作用」、流れがゆるやかになった場所に土砂を積もらせる「堆積作用」の3つの主要なはたらきがある。"
176
+ },
177
+ {
178
+ "answer_id": "SC12_026",
179
+ "answer": "外側が速く、内側が遅い",
180
+ "question_hint": "曲がって流れる川において、流速の分布がどのようになっているかを説明する問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "川がカーブしている場所では、遠心力などの影響で「外側」の流れが速くなる。そのため、外側は侵食されて「がけ」になりやすく、逆に流れが遅い「内側」には土砂が積もって「川原」ができる。"
183
+ },
184
+ {
185
+ "answer_id": "SC12_027",
186
+ "answer": "V字谷(ぶいじだに)",
187
+ "question_hint": "川の上流で見られる、流れの速い水が川底を深く削ることでできた深い谷の名称。",
188
+ "difficulty": "基本",
189
+ "source_context": "川の上流は勾配が急で流れが非常に速いため、侵食作用が強くはたらく。左右の斜面が削られ、断面がVの字のようになった深い谷が形成される。"
190
+ },
191
+ {
192
+ "answer_id": "SC12_028",
193
+ "answer": "扇状地(せんじょうち)",
194
+ "question_hint": "川が山地から平地に出る所で、流れが急に遅くなって土砂が積もってできた地形。",
195
+ "difficulty": "基本",
196
+ "source_context": "山の間を流れてきた川が広い平野に出ると、流速が急激に落ちる。すると、運んでいた重い小石などが扇の形に堆積する。これを「扇状地」といい、水はけが良いのが特徴。"
197
+ },
198
+ {
199
+ "answer_id": "SC12_029",
200
+ "answer": "三角州(さんかくす)",
201
+ "question_hint": "川が海や湖に流れ込む河口付近で、細かい砂や泥が積もってできた平らな地形。",
202
+ "difficulty": "基本",
203
+ "source_context": "川の最も下流(河口)では流れがほとんど止まるため、細かい砂や泥が堆積して、ギリシャ文字のΔ(デルタ)のような形をした「三角州」ができる。"
204
+ },
205
+ {
206
+ "answer_id": "SC12_030",
207
+ "answer": "蛇行(だこう)",
208
+ "question_hint": "平地を流れる川が、クネクネと曲がって流れている様子の名称。",
209
+ "difficulty": "基本",
210
+ "source_context": "傾斜のゆるやかな平地では、川はわずかな地形の変化で曲がり始め���。曲がった外側が削られ内側に積もることを繰り返すうちに、川は大きくカーブするようになる。これを「蛇行」という。"
211
+ },
212
+ {
213
+ "answer_id": "SC12_031",
214
+ "answer": "三日月湖(みかづきこ)",
215
+ "question_hint": "川の蛇行が激しくなり、洪水などで新しい流路ができて取り残された古い川の跡の名称。",
216
+ "difficulty": "標準",
217
+ "source_context": "激しく蛇行した川が、大雨の際などにショートカットして直線的な新しい流れをつくることがある。取り残された古いカーブした水路は池のようになり、その形から「三日月湖」とよばれる。"
218
+ },
219
+ {
220
+ "answer_id": "SC12_032",
221
+ "answer": "風化(ふうか)",
222
+ "question_hint": "岩石が長い間、風や雨、太陽の光、温度変化などにさらされて、もろくなる現象の名称。",
223
+ "difficulty": "基本",
224
+ "source_context": "地表に露出した岩石は、雨水による溶解や温度変化によるひび割れなどで、長い時間をかけてボロボロになっていく。この現象を「風化」といい、侵食される前段階として重要である。"
225
+ },
226
+ {
227
+ "answer_id": "SC12_033",
228
+ "answer": "上流から下流へ行くほど「小さく、丸く」なる",
229
+ "question_hint": "川の石の「大きさ」と「形」が、上流から下流に向かってどのように変化するかを説明する問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "川の石は流される間に互いにぶつかったり削られたりする。上流では大きくて角ばっているが、下流に行くほど削られて「小さく」なり、角がとれて「丸み」を帯びた形になる。"
232
+ }
233
+ ]
V1.8.1/knowledge/v1.8.1/soc/SO01.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SO01_001",
4
+ "answer": "太平洋側の気候",
5
+ "question_hint": "日本の気候区分の特定。夏に雨が多く冬に乾燥する、日本の太平洋沿岸に見られる気候の名称を答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "日本の太平洋側の気候は、夏は南東の季節風の影響で降水量が多くむし暑いのが特徴。冬は北西の季節風が山脈にさえぎられるため、乾燥した晴天の日が多くなる。関東地方などでは「からっ風」と呼ばれる冷たく乾燥した風が吹く。"
8
+ },
9
+ {
10
+ "answer_id": "SO01_002",
11
+ "answer": "日本海側の気候",
12
+ "question_hint": "日本の気候区分の特定。冬に雪や雨が多く、夏は比較的雨が少ない気候区分を答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "日本海側の気候は、冬にシベリア方面から吹く北西の季節風が日本海上で水分を含み、日本の山地にぶつかることで多くの雪や雨を降らせる。夏は太平洋側と比べて雨が少なく、乾燥した晴天になりやすい。"
15
+ },
16
+ {
17
+ "answer_id": "SO01_003",
18
+ "answer": "中央高地の気候",
19
+ "question_hint": "日本の気候区分の特定。内陸部に位置し、昼夜や夏冬の気温差が大きい気候区分を答えさせる問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "中央高地の気候は内陸性気候とも呼ばれる。海から離れているため、夏と冬、あるいは昼と夜の気温差(年較差・日較差)が非常に大きい。1年を通して降水量は少なく、冬の冷え込みが厳しいのが特徴。"
22
+ },
23
+ {
24
+ "answer_id": "SO01_004",
25
+ "answer": "瀬戸内の気候",
26
+ "question_hint": "日本の気候区分の特定。山地に季節風を遮られるため、年間を通して降水量が少ない地域を答えさせる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "瀬戸内の気候は、北側の中国山地と南側の四国山地に季節風がさえぎられるため、年間を通して降水量が少なく温暖。水不足になりやすいため、香川県の讃岐平野などでは「ため池(満濃池など)」が多く作られている。"
29
+ },
30
+ {
31
+ "answer_id": "SO01_005",
32
+ "answer": "日本海流(黒潮)",
33
+ "question_hint": "日本近海の海流。太平洋側を北上する、世界最大級の暖流を答えさせる問題。",
34
+ "difficulty": "基本",
35
+ "source_context": "日本海流(黒潮)は、フィリピン沖から太平洋側を北上する暖流。色が黒っぽく見えることから黒潮と呼ばれる。日本の南部の温暖な気候に寄与しており、カツオやマグロなどの暖流系の魚を運んでくる。"
36
+ },
37
+ {
38
+ "answer_id": "SO01_006",
39
+ "answer": "千島海流(親潮)",
40
+ "question_hint": "日本近海の海流。北から太平洋側を南下する、プランクトンが豊富な寒流を答えさせる問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "千島海流(親潮)は、千島列島に沿って太平洋側を南下する寒流。プランクトンが豊富で魚を育てる力が強いことから親潮と呼ばれる。サケ、マス、ニシン、タラなどの寒流系の魚が豊富。"
43
+ },
44
+ {
45
+ "answer_id": "SO01_007",
46
+ "answer": "潮目(潮境)",
47
+ "question_hint": "海洋地形と漁場。暖流と寒流がぶつかる、絶好の漁場となる場所の名称を答えさせる問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "潮目(潮境)は、暖流(日本海流)と寒流(千島海流)がぶつかり合う海域を指す。特に東北地方の三陸沖が有名。両方の海流にすむ魚が集まり、上昇流によってプランクトンが豊富になるため、世界三大漁場の一つに数えられる。"
50
+ },
51
+ {
52
+ "answer_id": "SO01_008",
53
+ "answer": "やませ",
54
+ "question_hint": "気象現象と冷害。東北地方の太平洋側に初夏から夏に吹く、冷害の原因となる冷たい北東の風の名称を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "やませは、初夏から夏にかけて東北地方の太平洋側に吹く、冷たく湿った北東の風。オホーツク海高気圧から吹き出す。これが長引くと気温が上がらず日照不足になり、稲の成長が妨げられる「冷害」を引き起こす。"
57
+ },
58
+ {
59
+ "answer_id": "SO01_009",
60
+ "answer": "フェーン現象",
61
+ "question_hint": "気象現象。山を越えた乾燥した空気が、風下側の気温を急上昇させる現象を答えさせる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "フェーン現象は、湿った空気が高い山を越える際に雨を降らせ、乾燥した高温の空気が斜面を吹き降りることで風下側の気温が上昇する現象。日本の北陸地方などで夏に見られ、猛暑や火災の拡大の原因となる。"
64
+ },
65
+ {
66
+ "answer_id": "SO01_010",
67
+ "answer": "ヒートアイランド現象",
68
+ "question_hint": "都市の気象問題。建物や道路の舗装により、都市中心部の気温が周辺部より高くなる現象を答えさせる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "ヒートアイランド現象は、都市の中心部の気温が周辺よりも島状に高くなる現象。原因はアスファルトやコンクリートによる蓄熱、エアコンの室外機や自動車からの排熱、高層ビルによる風通しの悪化など。熱中症の増加やゲリラ豪雨の誘発が懸念されている。"
71
+ },
72
+ {
73
+ "answer_id": "SO01_011",
74
+ "answer": "飛騨山脈、木曽山脈、赤石山脈",
75
+ "question_hint": "日本アルプスの構成。「北・中央・南」アルプスに該当するそれぞれの山脈名を答えさせる問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "日本アルプスは3つの山脈の総称。北から順に、飛騨山脈(北アルプス)、木曽山脈(中央アルプス)、赤石山脈(南アルプス)と並ぶ。いずれも標高3000m級の高峰が連なる。"
78
+ },
79
+ {
80
+ "answer_id": "SO01_012",
81
+ "answer": "フォッサマグナ",
82
+ "question_hint": "地質学的地形。日本列島を東西に分ける大きな溝(大地溝帯)の名称を答えさせる問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "フォッサマグナはラテン語で「大きな溝」を意味する大地溝帯。ナウマンが発見。新潟県糸魚川市と静岡県静岡市を結ぶ「糸魚川・静岡構造線」がその西の縁(境界)となっている。これより東が東北日本、西が西南日本とされる。"
85
+ },
86
+ {
87
+ "answer_id": "SO01_013",
88
+ "answer": "カルデラ",
89
+ "question_hint": "火山地形。噴火によって火山の中心部が陥没してできた、大きなくぼ地の名称を答えさせる問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "カルデラは、大規模な噴火で地下のマグマが噴出した後、火山の中心部が重みで陥没してできた大きなくぼ地。熊本県の阿蘇山は世界最大級のカルデラを持ち、その内部には草原や集落、鉄道が広がっている。"
92
+ },
93
+ {
94
+ "answer_id": "SO01_014",
95
+ "answer": "信濃川",
96
+ "question_hint": "日本の河川。日本で最も長い川の名称を答えさせる問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "信濃川は、長野県から新潟県に流れる日本最長の河川(367km)。長野県側では「千曲川(ちくまがわ)」と呼ばれる。下流には日本有数の穀倉地帯である越後平野が広がる。"
99
+ },
100
+ {
101
+ "answer_id": "SO01_015",
102
+ "answer": "利根川",
103
+ "question_hint": "日本の河川。日本で流域面積が最も広い川の名称を答えさせる問題。",
104
+ "difficulty": "基本",
105
+ "source_context": "利根川は、関東地方を流れる河川で、流域面積が日本最大(1万6840km2)。その形状から「坂東太郎(ばんどうたろう)」の愛称がある。上流には多くのダムがあり、首都圏の重要な水源となっている。"
106
+ },
107
+ {
108
+ "answer_id": "SO01_016",
109
+ "answer": "扇状地",
110
+ "question_hint": "地形の用語。川が山地から平地に出るところに土砂が堆積してできた、扇形の地形を答えさせる問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "扇状地は、急流が山の間から平地へ出た際に、流れがゆるやかになって運んできた砂利や砂を堆積させて作る地形。水はけが良すぎるため水田には不向きで、果樹園(山梨県甲府盆地など)や畑として利用されることが多い。"
113
+ },
114
+ {
115
+ "answer_id": "SO01_017",
116
+ "answer": "三角州",
117
+ "question_hint": "地形の用語。川の河口付近に細かな砂や泥が堆積してできた、平坦な低地を答えさせる問題。",
118
+ "difficulty": "基本",
119
+ "source_context": "三角州(デルタ)は、川が海や湖に注ぐ河口付近で、流れが遅くなり運んできた細かい泥や砂が堆積してできる地形。平坦で水が得やすいため水田(大阪平野など)や住宅地に利用されるが、地盤が弱く洪水や高潮の被害を受けやすい。"
120
+ },
121
+ {
122
+ "answer_id": "SO01_018",
123
+ "answer": "リアス海岸",
124
+ "question_hint": "海岸地形。複雑に入り組んだ湾や岬が連続する海岸地形の名称を答えさせる問題。",
125
+ "difficulty": "基本",
126
+ "source_context": "リアス海岸は、山地が沈水したり、海面が上昇したりして谷の部分が入り江になった複雑な海岸線。岩手県の三陸海岸南部、福井県の若狭湾���三重県の志摩半島などが有名。波が穏やかなため養殖業が盛んだが、地震の際には津波が増幅されやすく危険を伴う。"
127
+ },
128
+ {
129
+ "answer_id": "SO01_019",
130
+ "answer": "大陸棚",
131
+ "question_hint": "海洋地形。海岸から緩やかに傾斜する、水深200m程度までの浅い海底の名称を答えさせる問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "大陸棚は、陸地から続く傾斜のゆるやかな浅い海底で、一般に水深200mまでの範囲を指す。太陽光が海底まで届きやすいためプランクトンが豊富に育ち、魚介類の好漁場となる。東シナ海などに広く分布する。"
134
+ },
135
+ {
136
+ "answer_id": "SO01_020",
137
+ "answer": "干拓",
138
+ "question_hint": "土地利用。浅い海や湖を堤防で囲い、内部の水を排水して陸地にする方法を答えさせる問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "干拓は、遠浅の海や湖の一部を堤防で仕切り、ポンプ等で水を抜き取って新たな陸地を作る工法。土砂を積み上げる「埋め立て」とは異なる。秋田県の八郎潟(大潟村)や岡山県の児島湾、長崎県の諫早湾などが代表例。主に農地に利用される。"
141
+ },
142
+ {
143
+ "answer_id": "SO01_021",
144
+ "answer": "8方位",
145
+ "question_hint": "地図の基本。北、東、南、西の4方位に、その中間を加えた方位の総称を答えさせる問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "方位は、基本の4方位(北・東・南・西)に加え、その中間の北東、南東、南西、北西を合わせた計8方位で表されることが多い。地図上では、特に指定がない限り上が北を示す。"
148
+ },
149
+ {
150
+ "answer_id": "SO01_022",
151
+ "answer": "10mおき",
152
+ "question_hint": "地図の読解。2万5000分の1の地形図において、主曲線(細い等高線)が何メートルおきに引かれているかを答えさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "2万5000分の1の地形図では、等高線のうち「主曲線(細い線)」は10mおきに引かれる。また「計曲線(太い線)」は主曲線5本ごとの50mおきに引かれる。"
155
+ },
156
+ {
157
+ "answer_id": "SO01_023",
158
+ "answer": "20mおき",
159
+ "question_hint": "地図の読解。5万分の1の地形図において、主曲線(細い等高線)が何メートルおきに引かれているかを答えさせる問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "5万分の1の地形図では、等高線のうち「主曲線(細い線)」は20mおきに引かれる。また「計曲線(太い線)」は100mおきに引かれる。2万5000分の1と比べて等高線の間隔が広いため、大まかな地形把握に適している。"
162
+ },
163
+ {
164
+ "answer_id": "SO01_024",
165
+ "answer": "500m",
166
+ "question_hint": "縮尺の計算。2万5000分の1の地図上で2cmの長さは、実際の距離では何メートルになるか計算させる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "【計算ロジック】実際の距離=地図上の長さ×縮尺の分母。2cm × 25,000 = 50,000cm。単位をメートルに直すと 50,000 ÷ 100 = 500m。"
169
+ },
170
+ {
171
+ "answer_id": "SO01_025",
172
+ "answer": "1km",
173
+ "question_hint": "縮尺の計算。5万分の1の地図上で2cmの長さは、実際の距離では何キロメートルになるか計算させる問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "【計算ロジック】実際の距離=地図上の長さ×縮尺の分母。2cm × 50,000 = 100,000cm。単位をキロメートルに直すと、100cm=1m、1000m=1kmなので、100,000cm = 1,000m = 1km。"
176
+ },
177
+ {
178
+ "answer_id": "SO01_026",
179
+ "answer": "4分の1",
180
+ "question_hint": "縮尺と面積の関係。同じ範囲の土地を、2万5000分の1の地図と5万分の1の地図で表した場合、5万分の1の地図の面積は2万5000分の1の面積の何倍になるか答えさせる問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "縮尺が2倍(分母が2倍)になると、縦の長さが1/2、横の長さが1/2になるため、面積は (1/2) × (1/2) = 1/4(4分の1)になる。計算ミスを防ぐため、1cm四方の正方形などを例に考えると理解しやすい。"
183
+ },
184
+ {
185
+ "answer_id": "SO01_027",
186
+ "answer": "市役所:◎、町村役場:○",
187
+ "question_hint": "地図記号の知識。市役所と町村役場の記号の使い分けを答えさせる問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "地図記号において、二重丸「◎」は市役所(および東京都の区役所)を指す。一方、一重の丸「○」は町村役場(および政令指定都市の区役所)を指す。混同しやすいため注意。"
190
+ },
191
+ {
192
+ "answer_id": "SO01_028",
193
+ "answer": "裁判所",
194
+ "question_hint": "地図記号の知識。天秤(てんびん)の形をデザイン化した地図記号が何を表すか答えさせる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "天秤の形を模した地図記号は「裁判所」を表す。公正な判断を下す象徴としての天秤が用いられている。他によく出る「警察署(×:警棒)」や「消防署(Y:さすまた)」との違いを把握すること。"
197
+ },
198
+ {
199
+ "answer_id": "SO01_029",
200
+ "answer": "正距方位図法",
201
+ "question_hint": "地図投影法の知識。中心からの方位と距離が正しく、大圏航路が直線で描かれる図法の名称を答えさせる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "正距方位図法は、地図の中心点からの距離と方位が正しく表される図法。中心を通る直線は二地点間の最短距離(大圏航路)を示すため、航空図として利用される。中心から離れるほど周辺の形や面積が大きく歪む欠点がある。"
204
+ },
205
+ {
206
+ "answer_id": "SO01_030",
207
+ "answer": "メルカトル図法",
208
+ "question_hint": "地図投影法の知識。緯線と経線が直角に交わり、等角航路が直線で描かれるため海図に使われる図法の名称を答えさせる問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "メルカトル図法は、緯線と経線が常に直角に交わる図法。任意の二点間を直線で結ぶと常に同じ角度で進める(等角航路)ため、海図として古くから利用されてきた。高緯度(北極・南極に近い方)ほど面積が拡大されてしまう欠点がある(例:グリーンランドが実際より大きく見える)。"
211
+ },
212
+ {
213
+ "answer_id": "SO01_031",
214
+ "answer": "本初子午線",
215
+ "question_hint": "地球の経度。イギリスの旧グリニッジ天文台を通る、経度0度の線の名称を答えさせる問題。",
216
+ "difficulty": "基本",
217
+ "source_context": "本初子午線は、経度0度の基準線。イギリスのロンドンにある旧グリニッジ天文台を通る。この線を境に東側を東経、西側を西経と呼ぶ。"
218
+ },
219
+ {
220
+ "answer_id": "SO01_032",
221
+ "answer": "排他的経済水域",
222
+ "question_hint": "日本の領域と海。沿岸から200海里までの、水産資源や地下資源の権利が認められる水域を答えさせる問題。",
223
+ "difficulty": "基本",
224
+ "source_context": "排他的経済水域(EEZ)は、領海のさらに外側に設定される。沿岸から200海里(約370km)までの範囲。この水域内の魚や石油、天然ガス、レアメタルなどの資源は、沿岸国が独占的に管理・利用する権利を持つ。"
225
+ },
226
+ {
227
+ "answer_id": "SO01_033",
228
+ "answer": "択捉島、南鳥島、沖ノ鳥島、与那国島",
229
+ "question_hint": "日本の国土。日本の東西南北の端にある島を順に答えさせる問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "日本の四端の島:【北端】択捉島(北方領土)、【南端】沖ノ鳥島(サンゴ礁の保全が重要)、【東端】南鳥島、【西端】与那国島(沖縄県)。これらを結んだ範囲が日本の領土となる。"
232
+ },
233
+ {
234
+ "answer_id": "SO01_034",
235
+ "answer": "北方領土",
236
+ "question_hint": "日本の領土問題。ロシアが占拠しており、日本が返還を求めている択捉島・国後島・色丹島・歯舞群島の総称を答えさせる問題。",
237
+ "difficulty": "基本",
238
+ "source_context": "北方領土は、北海道の北東に位置する択捉島、国後島、色丹島、歯舞群島の四島。第二次世界大戦末期にソ連(現ロシア)に占拠され、現在も返還交渉が続いている。日本固有の領土。"
239
+ },
240
+ {
241
+ "answer_id": "SO01_035",
242
+ "answer": "沖ノ鳥島",
243
+ "question_hint": "日本の領土と保全。満潮時に水没して排他的経済水域を失わないよう、護岸工事が行われている日本最南端の島を答えさせる問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "沖ノ鳥島は日本最南端の島。東京都小笠原村に属する。満潮時に二つの岩(北露岩・東露岩)がわずかに顔を出す程度であり、波で侵食されて沈まないよう、コンクリートの護岸やチタン製の網で守られている。ここを失うと広大な排他的経済水域が消滅するため、国家的に重要な島。"
246
+ },
247
+ {
248
+ "answer_id": "SO01_036",
249
+ "answer": "環太平洋造山帯",
250
+ "question_hint": "日本と世界の地殻。日本列島が含まれる、火山や地震が非常に多い世界的な造山帯の名前を答えさせる問題。",
251
+ "difficulty": "基本",
252
+ "source_context": "環太平洋造山帯は、太平洋をぐるりと囲むように分布する、新しく険しい山脈が連なる地帯。日本列島��アンデス山脈、ロッキー山脈などが含まれる。地殻変動が激しく、世界の火山や大地震の大部分がこの帯状の地域に集中している。"
253
+ },
254
+ {
255
+ "answer_id": "SO01_037",
256
+ "answer": "液状化現象",
257
+ "question_hint": "自然災害の用語。地震の震動により、水分を多く含んだ砂地がドロドロの液体状になり、建物が沈んだり水が噴き出したりする現象を答えさせる問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "液状化現象は、埋め立て地や古い河川の跡地など、地下水を含んだ緩い砂地盤で発生しやすい。地震で激しく揺さぶられると砂の粒子が浮き、地面が液体のように不安定になる。電柱の傾斜、マンホールの浮き上がり、建物の沈下などが起きる。"
260
+ },
261
+ {
262
+ "answer_id": "SO01_038",
263
+ "answer": "ハザードマップ",
264
+ "question_hint": "防災の知識。災害の発生予測や被害の範囲、避難場所などを示した地図の名称を答えさせる問題。",
265
+ "difficulty": "基本",
266
+ "source_context": "ハザードマップは、洪水、土砂崩れ、津波、噴火などの自然災害による被害が予測される区域を示した地図。自治体が作成・配布し、住民に事前の避難経路の確認や備えを促す。最近では「自然災害伝承碑」の記号が地図記号に追加された。"
267
+ },
268
+ {
269
+ "answer_id": "SO01_039",
270
+ "answer": "東日本大震災",
271
+ "question_hint": "自然災害の歴史。2011年3月11日に発生し、巨大な津波が東北地方の太平洋沿岸を襲った災害の名称を答えさせる問題。",
272
+ "difficulty": "基本",
273
+ "source_context": "東日本大震災は、三陸沖を震源とするマグニチュード9.0の巨大地震(東北地方太平洋沖地震)に端を発する。観測史上最大。巨大な津波がリアス海岸の湾奥などで増幅され、甚大な被害をもたらした。福島第一原子力発電所の事故も引き起こした。"
274
+ },
275
+ {
276
+ "answer_id": "SO01_040",
277
+ "answer": "ラムサール条約",
278
+ "question_hint": "環境と自然保護。特に水鳥の生息地として国際的に重要な湿地を保護するための条約名を答えさせる問題。",
279
+ "difficulty": "標準",
280
+ "source_context": "ラムサール条約は、1971年にイランのラムサールで採択された。正式名称は「特に水鳥の生息地として国際的に重要な湿地に関する条約」。日本では北海道の釧路湿原が最初に登録されたほか、滋賀県の琵琶湖なども登録されている。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/soc/SO02.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SO02_001",
4
+ "answer": "新潟県・北海道",
5
+ "question_hint": "【農業】米の収穫量。都道府県別の収穫量で第1位・2位を争う上位2つの都道府県名を答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "日本の米の生産量が多い上位2つの都道府県は新潟県と北海道である。東北地方や北陸地方は冬に雪が多く米しか作れない「水田単作地帯」となっており、「日本の米ぐら」と呼ばれている。"
8
+ },
9
+ {
10
+ "answer_id": "SO02_002",
11
+ "answer": "タイ",
12
+ "question_hint": "【農業】米の需給。1993年の大規模な冷害の際、日本が米を緊急輸入した代表的な国名を答えさせる問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "1993年に大規模な冷害が発生した際、国内の米が不足したため、タイなどから米が緊急輸入された。冷害は東北地方などで初夏に吹く冷たく湿った北東の風「やませ」などが原因で起こる。"
15
+ },
16
+ {
17
+ "answer_id": "SO02_003",
18
+ "answer": "生産調整(減反政策)",
19
+ "question_hint": "【農業】米の政策。消費量減少に伴う米あまりに対応するため、政府が転作などを進めた政策名を答えさせる問題。",
20
+ "difficulty": "標準",
21
+ "source_context": "食生活の変化で米の消費量が減り米が余るようになったため、政府は1970年頃から水田を休ませる「休耕」や他の作物を育てる「転作」を促す生産調整(減反政策)を行った。現在は廃止されている。"
22
+ },
23
+ {
24
+ "answer_id": "SO02_004",
25
+ "answer": "客土(きゃくど)",
26
+ "question_hint": "【農業】土地改良。北海道の石狩平野などで、農業に適さない泥炭地に他の土地の土を運び入れて改良した方法を答えさせる問題。",
27
+ "difficulty": "標準",
28
+ "source_context": "北海道の石狩平野には農業に向かない泥炭地が広がっていたが、他の場所から土を運び入れる「客土」という土地改良を行ったことで、日本有数の稲作地帯となった。"
29
+ },
30
+ {
31
+ "answer_id": "SO02_005",
32
+ "answer": "ぬるめ",
33
+ "question_hint": "【農業】稲作技術。川などの冷たい水を直接田に入れず、水路を巡らせて水温を上げてから入れる工夫の名称を答えさせる問題。",
34
+ "difficulty": "応用",
35
+ "source_context": "東北地方や中央高地など水温が低い地域では、冷たい水を直接田に入れず、水路を蛇行させたり溜めたりして日光で温めてから入れる「ぬるめ」という工夫が行われている。"
36
+ },
37
+ {
38
+ "answer_id": "SO02_006",
39
+ "answer": "近郊農業(きんこうのうぎょう)",
40
+ "question_hint": "【農業】農業形態。大都市の近くで、新鮮さが求められる野菜や花などを生産し出荷する農業の名称を答えさせる問題。",
41
+ "difficulty": "基本",
42
+ "source_context": "大都市の周辺で行われる農業を近郊農業という。千葉県、茨城県、埼玉県などが主な産地で、ほうれんそう、ねぎ、にんじん、大根など、輸送距離が短く鮮度が保てる利点を活かして出荷している。"
43
+ },
44
+ {
45
+ "answer_id": "SO02_007",
46
+ "answer": "促成栽培(そくせいさいびん)",
47
+ "question_hint": "【農業】栽培方法。宮崎平野や高知平野で、温暖な気候を活かしビニールハウス等で夏野菜を冬に出荷する工夫を答えさせる問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "宮崎平野(宮崎県)や高知平野(高知県)では、冬でも温暖な気候とビニールハウスを利用し、ピーマン、きゅうり、なすなどの夏野菜を旬より早く育てて出荷する促成栽培が盛んである。"
50
+ },
51
+ {
52
+ "answer_id": "SO02_008",
53
+ "answer": "抑制栽培(よくせいさいばい)",
54
+ "question_hint": "【農業】栽培方法。長野県の野辺山原や群馬県の嬬恋村で、涼しい高原の気候を活かし夏に野菜を出荷する工夫を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "長野県の野辺山原や群馬県の嬬恋村では、標高が高く夏でも涼しい気候を活かし、キャベツやレタスなどの高原野菜を他の産地より遅らせて夏に出荷する抑制栽培が盛んである。"
57
+ },
58
+ {
59
+ "answer_id": "SO02_009",
60
+ "answer": "コールドチェーン",
61
+ "question_hint": "【農業】流通。農産物を収穫後から消費地まで、低温に保ったまま輸送する仕組みを答えさせる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "産地から消費地まで保冷トラックなどで農産物を低温に保ち、新鮮さを維持して運ぶ仕組みをコールドチェーン(低温流通体系)という。これにより、遠隔地からも大都市へ新鮮な野菜を出荷できるようになった。"
64
+ },
65
+ {
66
+ "answer_id": "SO02_010",
67
+ "answer": "和歌山県",
68
+ "question_hint": "【農業】果物。みかん、かき、うめの生産量が日本第1位である都道府県名を答えさせる問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "和歌山県は、みかん、かき、うめの生産量でいずれも全国1位を誇る果樹栽培が盛んな県である。みかんの生産は、愛媛県や静岡県も上位に入る。"
71
+ },
72
+ {
73
+ "answer_id": "SO02_011",
74
+ "answer": "青森県",
75
+ "question_hint": "【農業】果物。涼しい気候を好み、日本の生産量の半分以上を占める「りんご」の主産地である都道府県名を答えさせる問題。",
76
+ "difficulty": "基本",
77
+ "source_context": "りんごは涼しい気候を好む果物で、青森県が日本一の生産量を誇る。第2位は長野県である。"
78
+ },
79
+ {
80
+ "answer_id": "SO02_012",
81
+ "answer": "山形県",
82
+ "question_hint": "【農業】果物。日本一の生産量を誇る「さくらんぼ(おうとう)」の主産地である都道府県名を答えさせる問題。",
83
+ "difficulty": "基本",
84
+ "source_context": "さくらんぼ(おうとう)の生産量は山形県が圧倒的に多く、全国の大部分を占めている。"
85
+ },
86
+ {
87
+ "answer_id": "SO02_013",
88
+ "answer": "山梨県",
89
+ "question_hint": "【農業】果物。甲府盆地の扇状地などを利用して栽培される「ぶどう」や「もも」の生産量が日本一の都道府県名を答えさせる問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "山梨県はぶどうとももの生産量が日本一である。甲府盆地などの水はけのよい扇状地を利用して栽培されている。"
92
+ },
93
+ {
94
+ "answer_id": "SO02_014",
95
+ "answer": "酪農(らくのう)",
96
+ "question_hint": "【農業】畜産。北海道の根釧台地などで盛んな、乳牛を飼育して生乳や乳製品を生産する農業形態を答えさせる問題。",
97
+ "difficulty": "基本",
98
+ "source_context": "乳牛を飼育して生乳を絞り、バターやチーズなどの乳製品を生産する畜産を酪農という。北海道の根釧台地や十勝平野、栃木県などで盛んである。"
99
+ },
100
+ {
101
+ "answer_id": "SO02_015",
102
+ "answer": "鹿児島県・宮崎県",
103
+ "question_hint": "【農業】畜産。シラス台地を利用して肉牛や豚、鶏(ブロイラー)の飼育が盛んな九州南部の2県を答えさせる問題。",
104
+ "difficulty": "標準",
105
+ "source_context": "九州南部の鹿児島県と宮崎県は、水持ちが悪く稲作に向かない「シラス台地」を利用して、肉牛、豚、ブロイラー(肉用若鶏)の飼育が非常に盛んである。"
106
+ },
107
+ {
108
+ "answer_id": "SO02_016",
109
+ "answer": "約25%",
110
+ "question_hint": "【農業】畜産の課題。日本の畜産業における「飼料(えさ)」の自給率の目安数値を答えさせる問題。",
111
+ "difficulty": "応用",
112
+ "source_context": "日本の畜産業は、とうもろこしなどの飼料(えさ)の多くを輸入に頼っており、飼料自給率は約25%と低い。"
113
+ },
114
+ {
115
+ "answer_id": "SO02_017",
116
+ "answer": "静岡県",
117
+ "question_hint": "【農業】工芸作物。牧ノ原台地などで栽培が盛んな、日本一の生産量を誇る「茶」の産地を答えさせる問題。",
118
+ "difficulty": "基本",
119
+ "source_context": "茶の生産量は静岡県が日本一である。鹿児島県がそれに次いで第2位となっている。"
120
+ },
121
+ {
122
+ "answer_id": "SO02_018",
123
+ "answer": "北海道:てんさい、沖縄県:さとうきび",
124
+ "question_hint": "【農業】工芸作物。砂糖の原料となる農産物について、北海道と沖縄県それぞれの主産品を組み合わせて答えさせる問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "砂糖の原料として、涼しい北海道では「てんさい(ビート)」が、暖かい沖縄県や鹿児島県(南西諸島)では「さとうきび」が栽培されている。"
127
+ },
128
+ {
129
+ "answer_id": "SO02_019",
130
+ "answer": "大陸棚(たいりくだな)",
131
+ "question_hint": "【水産業】海洋地形。水深200mまでの浅い海底で、プランクトンが豊富で好漁場となる地形の名称を答えさせる問題。",
132
+ "difficulty": "基本",
133
+ "source_context": "海岸から続く、水深約200mまでの浅くて平らな海底を大陸棚という。太陽光が届きやすくプランクトンが豊富なため、魚が集まる好漁場となる。"
134
+ },
135
+ {
136
+ "answer_id": "SO02_020",
137
+ "answer": "排他的経済水域(EEZ)",
138
+ "question_hint": "【水産業】海洋権益。沿岸から200海里以内の水域で、漁業資源や鉱産資源の権利が認められる範囲を答えさせる問題。",
139
+ "difficulty": "標準",
140
+ "source_context": "沿岸から200海里(約370km)以内の水域を排他的経済水域(EEZ)という。各国がこれを設定したことで、日本の遠洋漁業は大きな打撃を受けた。"
141
+ },
142
+ {
143
+ "answer_id": "SO02_021",
144
+ "answer": "栽培漁業(さいばいぎょぎょう)",
145
+ "question_hint": "【水産業】漁業形態。稚魚などをある程度の大きさまで育ててから放流し、成長後に漁獲する「育てる漁業」を答えさせる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "卵からかえした稚魚や稚貝をある程度の大きさまで育ててから自然の海へ放流し、成長したものを再び獲る漁業を栽培漁業という。えさ代がかからない利点がある。"
148
+ },
149
+ {
150
+ "answer_id": "SO02_022",
151
+ "answer": "1位 銚子港、2位 焼津港",
152
+ "question_hint": "【水産業】主要漁港。日本の水揚げ量ランキング上位1位と2位の漁港名を答えさせる問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "日本の水揚げ量上位の漁港は、第1位が千葉県の銚子港、第2位が静岡県の焼津港(遠洋漁業の拠点)である。"
155
+ },
156
+ {
157
+ "answer_id": "SO02_023",
158
+ "answer": "赤潮(あかしお)",
159
+ "question_hint": "【水産業】環境問題。生活排水などによる水の汚れでプランクトンが異常発生し、海面が赤褐色になる現象を答えさせる問題。",
160
+ "difficulty": "基本",
161
+ "source_context": "工場や家庭からの排水によってプランクトンが異常発生し、海面が赤褐色になる現象を赤潮という。瀬戸内海などで深刻な被害が出たことがある。"
162
+ },
163
+ {
164
+ "answer_id": "SO02_024",
165
+ "answer": "約40%",
166
+ "question_hint": "【林業】木材の自給率。近年の日本における木材自給率の目安数値を答えさせる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "日本の木材自給率は約40%である。安価な輸入材に押されていたが、近年は国産材の利用も少しずつ増えている。"
169
+ },
170
+ {
171
+ "answer_id": "SO02_025",
172
+ "answer": "木曽ひのき、秋田すぎ、青森ひば",
173
+ "question_hint": "【林業】三大美林。日本に自生する貴重な森林である「天然の三大美林」の3つを答えさせる問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "天然の三大美林は、長野県の木曽ひのき、秋田県の秋田すぎ、青森県の青森ひばを指す。"
176
+ },
177
+ {
178
+ "answer_id": "SO02_026",
179
+ "answer": "約38%",
180
+ "question_hint": "【農業】食料自給率。近年の日本におけるカロリーベースでの食料自給率の数値を答えさせる問題。",
181
+ "difficulty": "標準",
182
+ "source_context": "日本の食料自給率はカロリーベースで38%(2021年度)と、先進国の中でも非常に低い水準にある。"
183
+ },
184
+ {
185
+ "answer_id": "SO02_027",
186
+ "answer": "重化学工業",
187
+ "question_hint": "【工業】工業の種類。高度経済成長期以降、日本の工業の中心となった金属・機械・化学などの工業の総称を答えさせる問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "第二次世界大戦後の高度経済成長期(1950年代半ば〜70年代初め)に、日本の工業の中心は繊維などの軽工業から、機械、金属、化学などの重化学工業へと大きく変化した。"
190
+ },
191
+ {
192
+ "answer_id": "SO02_028",
193
+ "answer": "石油危機(オイル・ショック)",
194
+ "question_hint": "【工業】経済の転換点。1973年、中東戦争の影響で原油価格が高騰し、高度経済成長が止まる原因となった出来事を答えさせる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "1973年、第四次中東戦争をきっかけに原油価格が高騰した石油危機(オイル・ショック)により、多大なエネルギーを輸入に頼る日本経済は大きな打撃を受け、高度経済成長が終了した。"
197
+ },
198
+ {
199
+ "answer_id": "SO02_029",
200
+ "answer": "貿易摩擦(ぼうえきまさつ)",
201
+ "question_hint": "【工業】国際問題。1980年代に日本の輸出品が急増し、アメリカなど相手国の国内産業に悪影響を与えたことで生じた対立を答えさせる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "1980年代、日本の自動車や電気製品の輸出が急増したことで、アメリカやヨーロッパ諸国との間で貿易摩擦が起きた。対策として、日本企業は輸出自主規制や現地生産(海外工場建設)を行った。"
204
+ },
205
+ {
206
+ "answer_id": "SO02_030",
207
+ "answer": "産業の空洞化(さんぎょうのくうどうか)",
208
+ "question_hint": "【工業】国内の課���。円高や安い労働力を求めて工場が海外へ移転し、国内の製造業が衰退する現象を答えさせる問題。",
209
+ "difficulty": "標準",
210
+ "source_context": "安い人件費などを求めて日本の工場が中国や東南アジアなどの海外へ移転した結果、日本国内の製造業が衰退することを産業の空洞化という。"
211
+ },
212
+ {
213
+ "answer_id": "SO02_031",
214
+ "answer": "中京工業地帯(ちゅうきょうこうぎょうちたい)",
215
+ "question_hint": "【工業】工業地帯。製造品出荷額が日本最大で、自動車産業(豊田市など)が盛んな工業地帯を答えさせる問題。",
216
+ "difficulty": "基本",
217
+ "source_context": "中京工業地帯は愛知県・岐阜県・三重県に広がり、製造品出荷額が日本一である。豊田市の自動車工業など機械工業の割合が極めて高いのが特徴。"
218
+ },
219
+ {
220
+ "answer_id": "SO02_032",
221
+ "answer": "阪神工業地帯(はんしんこうぎょうちたい)",
222
+ "question_hint": "【工業】工業地帯。他の工業地帯に比べて中小工場が多く、金属工業の割合が高い大阪湾沿いの地帯を答えさせる問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "阪神工業地帯は、大阪府と兵庫県を中心に広がる。他の地帯に比べて中小工場の割合が高く、日用品の製造や金属工業が盛んである。"
225
+ },
226
+ {
227
+ "answer_id": "SO02_033",
228
+ "answer": "京浜工業地帯(けいひんこうぎょうちたい)",
229
+ "question_hint": "【工業】工業地帯。情報の中心地である東京を抱え、出版・印刷工業の割合が高い地帯を答えさせる問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "京浜工業地帯は東京都と神奈川県を中心に広がる。情報の中心地であるため、他の工業地帯にはない「出版・印刷工業」の発達が大きな特色である。"
232
+ },
233
+ {
234
+ "answer_id": "SO02_034",
235
+ "answer": "水島(みずしま)",
236
+ "question_hint": "【工業】工業地域。岡山県倉敷市にある、瀬戸内工業地域を代表する大規模な石油化学コンビナートが形成されている地区名を答えさせる問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "瀬戸内工業地域の中心的な拠点である岡山県倉敷市の水島地区には、大規模な石油化学コンビナートや製鉄所が形成されている。"
239
+ },
240
+ {
241
+ "answer_id": "SO02_035",
242
+ "answer": "エネルギー革命",
243
+ "question_hint": "【工業】資源。1960年代、日本の主要なエネルギー源が国内の石炭から輸入された石油へ変わったことを答えさせる問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "1960年代、取り扱いに便利な輸入石油が大量に利用されるようになり、エネルギーの主役が石炭から石油に代わったことをエネルギー革命という。"
246
+ },
247
+ {
248
+ "answer_id": "SO02_036",
249
+ "answer": "火力発電",
250
+ "question_hint": "【工業】エネルギー。石油、石炭、天然ガスを燃やして電気を作る、日本の発電量の約8割を占める発電方法を答えさせる問題。",
251
+ "difficulty": "基本",
252
+ "source_context": "日本のエネルギー別発電量の約80%は火力発電が占めている(2021年度)。燃料の輸入に便利な大きな港や、消費地である大都市の近くに多く立地している。"
253
+ },
254
+ {
255
+ "answer_id": "SO02_037",
256
+ "answer": "再生可能エネルギー",
257
+ "question_hint": "【工業】エネルギー。太陽光、風力、地熱など、一度使っても自然の力で補充され、二酸化炭素を排出しないエネルギーの総称を答えさせる問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "太陽光、風力、地熱、バイオマスなど、繰り返し利用可能な自然エネルギーを再生可能エネルギーという。二酸化炭素を排出しないクリーンなエネルギーとして注目されている。"
260
+ },
261
+ {
262
+ "answer_id": "SO02_038",
263
+ "answer": "中国",
264
+ "question_hint": "【貿易】相手国。輸出・輸入ともに現在日本の最大の貿易相手国となっている国名を答えさせる問題。",
265
+ "difficulty": "基本",
266
+ "source_context": "現在の日本の最大の貿易相手国は中国である。輸出では全体の約21.6%、輸入では約24.0%(2021年)を占めている。"
267
+ },
268
+ {
269
+ "answer_id": "SO02_039",
270
+ "answer": "加工貿易(かこうぼうえき)",
271
+ "question_hint": "【貿易】貿易形態。海外から原料を輸入し、国内で工業製品を作って輸出する、日本の伝統的な貿易の形態を答えさせる問題。",
272
+ "difficulty": "基本",
273
+ "source_context": "資源に乏しい日本が、原料や燃料を輸入し、製品に加工して輸出することで利益���上げる形態を加工貿易という。日本の経済発展を支えた特徴的な形である。"
274
+ },
275
+ {
276
+ "answer_id": "SO02_040",
277
+ "answer": "成田国際空港",
278
+ "question_hint": "【貿易】主要拠点。港を含めても日本の貿易額第1位で、IC(集積回路)や医薬品などの航空貨物を扱う拠点を答えさせる問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "成田国際空港は、日本最大の貿易額(輸出入合計)を誇る拠点である。扱われる品目は、軽量で高価な集積回路(IC)や医薬品、コンピュータなどの航空貨物が中心で、「成田漁港」と呼ばれるほど鮮魚の輸入も多い。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/soc/SO03.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SO03_001",
4
+ "answer": "太平洋、大西洋、インド洋",
5
+ "question_hint": "【世界地理】「世界の三大洋」の名前をすべて答えさせる問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "世界の海は、太平洋、大西洋、インド洋の3つに大きく分けられ、これらを世界の三大洋と呼ぶ。"
8
+ },
9
+ {
10
+ "answer_id": "SO03_002",
11
+ "answer": "ユーラシア、アフリカ、北アメリカ、南アメリカ、オーストラリア、南極",
12
+ "question_hint": "【世界地理】「世界の六大陸」の名前をすべて答えさせる問題。",
13
+ "difficulty": "基本",
14
+ "source_context": "世界には、ユーラシア大陸、アフリカ大陸、北アメリカ大陸、南アメリカ大陸、オーストラリア大陸、南極大陸の6つの大陸がある。"
15
+ },
16
+ {
17
+ "answer_id": "SO03_003",
18
+ "answer": "本初子午線(ほんしょしごせん)",
19
+ "question_hint": "【世界地理】経度0度の基準となる線の名称を答えさせる問題。",
20
+ "difficulty": "基本",
21
+ "source_context": "イギリスのロンドン(旧グリニッジ天文台)を通る0度の経線を本初子午線と呼ぶ。この線を基準に東を東経、西を西経とする。"
22
+ },
23
+ {
24
+ "answer_id": "SO03_004",
25
+ "answer": "赤道(せきどう)",
26
+ "question_hint": "【世界地理】緯度0度の基準となる線の名称を答えさせる問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "0度の緯線を赤道と呼ぶ。赤道を境に北を北緯、南を南緯とする。"
29
+ },
30
+ {
31
+ "answer_id": "SO03_005",
32
+ "answer": "ヒマラヤ山脈",
33
+ "question_hint": "【世界地理】アジア北部にあり、エベレストなど8000m級の高峰が連なる山脈を答えさせる問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "ヒマラヤ山脈は南アジアの北部に位置し、世界最高峰のエベレストなど8000m級の山々が集まっている。アルプス・ヒマラヤ造山帯に含まれる。"
36
+ },
37
+ {
38
+ "answer_id": "SO03_006",
39
+ "answer": "アンデス山脈",
40
+ "question_hint": "【世界地理】南アメリカ大陸の西側に南北に長く連なる山脈を答えさせる問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "南アメリカ大陸の西側に位置し、南北に走る険しい山脈をアンデス山脈と呼ぶ。環太平洋造山帯に含まれる。"
43
+ },
44
+ {
45
+ "answer_id": "SO03_007",
46
+ "answer": "ナイル川",
47
+ "question_hint": "【世界地理】アフリカ大陸北東部を流れ、地中海に注ぐ世界最長の河川名を答えさせる問題。",
48
+ "difficulty": "標準",
49
+ "source_context": "ナイル川はアフリカ大陸北東部を北に向かって流れ、地中海に注ぐ川である。"
50
+ },
51
+ {
52
+ "answer_id": "SO03_008",
53
+ "answer": "アマゾン川",
54
+ "question_hint": "【世界地理】南アメリカ大陸北部を流れ、世界最大の流域面積を持つ河川名を答えさせる問題。",
55
+ "difficulty": "標準",
56
+ "source_context": "アマゾン川は南アメリカ大陸北部を東に向かって流れ、大西洋に注ぐ。流域面積は世界最大である。"
57
+ },
58
+ {
59
+ "answer_id": "SO03_009",
60
+ "answer": "サハラ砂漠",
61
+ "question_hint": "【世界地理】アフリカ大陸北部に広がる世界最大の砂漠名を答えさせる問題。",
62
+ "difficulty": "標準",
63
+ "source_context": "アフリカ大陸の北部に位置する、世界最大の面積を持つ砂漠をサハラ砂漠と呼ぶ。乾燥帯の砂漠気候に属する。"
64
+ },
65
+ {
66
+ "answer_id": "SO03_010",
67
+ "answer": "熱帯雨林(ねったいうりん)気候",
68
+ "question_hint": "【世界地理】赤道付近に見られ、一年中高温多雨で密林が広がる気候区分を答えさせる問題。",
69
+ "difficulty": "基本",
70
+ "source_context": "熱帯のうち、赤道を中心に広がり一年中高温多雨でスコール(一時的な大雨)が降る気候を熱帯雨林気候という。"
71
+ },
72
+ {
73
+ "answer_id": "SO03_011",
74
+ "answer": "サバナ気候",
75
+ "question_hint": "【世界地理】熱帯に属し、雨季と乾季がはっきり分かれ、丈の長い草原が広がる気候区分を答えさせる問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "熱帯に属し、雨季と乾季がはっきり分かれている気候をサバナ気候という。"
78
+ },
79
+ {
80
+ "answer_id": "SO03_012",
81
+ "answer": "地中海性(ちちゅうかいせい)気候",
82
+ "question_hint": "【世界地理】温帯に属し、夏に乾燥し冬に雨が降る、地中海沿岸などに見られる気候区分を答えさせる問題。",
83
+ "difficulty": "標準",
84
+ "source_context": "温帯のうち、地中海沿岸などに見られ、夏は乾燥し冬に雨が降る特徴を持つのが地中海性気候である。オリーブやオレンジの栽培に適している。"
85
+ },
86
+ {
87
+ "answer_id": "SO03_013",
88
+ "answer": "西岸海洋性(せいがんかいようせい)気候",
89
+ "question_hint": "【世界地理】暖流と偏西風の影響で、高緯度のわりに冬でも温暖なヨーロッパ西部の気候区分を答えさせる問題。",
90
+ "difficulty": "標準",
91
+ "source_context": "ヨーロッパ西部などに見られ、1年を通して気温と降水量の差が小さい気候を西岸海洋性気候と呼ぶ。暖流の北大西洋海流と偏西風の影響を受けている。"
92
+ },
93
+ {
94
+ "answer_id": "SO03_014",
95
+ "answer": "ツンドラ気候",
96
+ "question_hint": "【世界地理】寒帯に属し、夏の間だけ地表の氷が解けてわずかに苔類が生育する気候区分を答えさせる問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "寒帯のうち、1年中寒さが厳しく、夏の間だけ地表の氷が解けて苔(こけ)類が生育する気候をツンドラ気候という。"
99
+ },
100
+ {
101
+ "answer_id": "SO03_015",
102
+ "answer": "高山(こうざん)気候",
103
+ "question_hint": "【世界地理】低緯度地帯の標高が高い地域で見られ、1年を通して気温が低く安定している気候区分を答えさせる問題。",
104
+ "difficulty": "応用",
105
+ "source_context": "標高が高い地域(温帯では2000m以上、熱帯では3000〜4000m以上)で見られる気候を高山気候という。低緯度でも標高により気温が低くなるのが特徴である。"
106
+ },
107
+ {
108
+ "answer_id": "SO03_016",
109
+ "answer": "経済特区(けいざいとっく)",
110
+ "question_hint": "【世界地理】中国の沿岸部に設けられた、外国企業や技術を受け入れるための特別な地域の名称を答えさせる問題。",
111
+ "difficulty": "標準",
112
+ "source_context": "中国は海岸沿いに外国企業を受け入れる「経済特区」を設けている。アモイ、スワトウ、シェンチェン(深圳)、チューハイ、ハイナン(海南)省の5か所が指定されている。"
113
+ },
114
+ {
115
+ "answer_id": "SO03_017",
116
+ "answer": "一人っ子政策",
117
+ "question_hint": "【世界地理】中国で人口の急増を抑えるために長年行われてきた人口抑制策の名称を答えさせる問題。",
118
+ "difficulty": "基本",
119
+ "source_context": "中国では急激な人口増加を抑えるために「一人っ子政策」を長年実施してきたが、近年廃止された。"
120
+ },
121
+ {
122
+ "answer_id": "SO03_018",
123
+ "answer": "ヒンドゥー教",
124
+ "question_hint": "【世界地理】インドの人口の多くが信仰している宗教の名称を答えさせる問題。",
125
+ "difficulty": "基本",
126
+ "source_context": "インドは人口が多く、国民の多くはヒンドゥー教を信仰している。"
127
+ },
128
+ {
129
+ "answer_id": "SO03_019",
130
+ "answer": "ポルトガル語",
131
+ "question_hint": "【世界地理】南アメリカ大陸最大の国であるブラジルの公用語を答えさせる問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "ブラジルは南アメリカ大陸で唯一ポルトガル語を公用語としている。明治時代以降、多くの日本人が移民として渡った歴史がある。"
134
+ },
135
+ {
136
+ "answer_id": "SO03_020",
137
+ "answer": "南半球(みなみはんきゅう)",
138
+ "question_hint": "【世界地理】オーストラリアが位置する半球名と、その結果生じる日本との季節の関係を答えさせる問題。",
139
+ "difficulty": "基本",
140
+ "source_context": "オーストラリアは南半球に位置するため、北半球にある日本とは季節が逆になる。"
141
+ },
142
+ {
143
+ "answer_id": "SO03_021",
144
+ "answer": "石炭、鉄鉱石、液化天然ガス(LNG)",
145
+ "question_hint": "【世界地理】日本がオーストラリアから大量に輸入している主要な資源を3つ答えさせる問題。",
146
+ "difficulty": "標準",
147
+ "source_context": "日本はオーストラリアから石炭、鉄鉱石、液化天然ガス(LNG)などの資源を多く輸入しており、貿易上の結びつきが非常に強い。"
148
+ },
149
+ {
150
+ "answer_id": "SO03_022",
151
+ "answer": "産業革命(さんぎょうかくめい)",
152
+ "question_hint": "【世界地理】18世紀後半にイギリスで始まった、機械工業への変革の名称を答えさせる問題。",
153
+ "difficulty": "基本",
154
+ "source_context": "18世紀後半に世界で最初に産業革命が起きたのはイギリスである。"
155
+ },
156
+ {
157
+ "answer_id": "SO03_023",
158
+ "answer": "フランス",
159
+ "question_hint": "【世界地理】EU最大の農業国であり、小麦やブドウ(ワイン)の生産が盛んな国名を答えさせる問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "フランスは小麦や果樹の生産量が多く、ヨー���ッパ最大の農業国である。航空産業も盛んである。"
162
+ },
163
+ {
164
+ "answer_id": "SO03_024",
165
+ "answer": "ドイツ",
166
+ "question_hint": "【世界地理】ルール地方を中心に重化学工業が発達した、ヨーロッパ最大の工業国名を答えさせる問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "ドイツはルール地方を中心に重化学工業が発達したヨーロッパ最大の工業国である。ライン川沿いに工業地帯が発達している。"
169
+ },
170
+ {
171
+ "answer_id": "SO03_025",
172
+ "answer": "ベルリンの壁(かべ)",
173
+ "question_hint": "【世界地理】冷戦の象徴であり、1989年に崩壊して東西ドイツ統合のきっかけとなった壁の名称を答えさせる問題。",
174
+ "difficulty": "基本",
175
+ "source_context": "ドイツは冷戦の影響で東西に分裂していたが、1989年にベルリンの壁が崩壊し、翌年に統一された。"
176
+ },
177
+ {
178
+ "answer_id": "SO03_026",
179
+ "answer": "北方領土(ほっぽうりょうど)",
180
+ "question_hint": "【世界地理】日本とロシア連邦との間で、返還をめぐる問題となっている4つの島々の総称を答えさせる問題。",
181
+ "difficulty": "基本",
182
+ "source_context": "日本はロシア連邦との間に、択捉島、国後島、色丹島、歯舞群島の返還を求める北方領土問題を抱えている。"
183
+ },
184
+ {
185
+ "answer_id": "SO03_027",
186
+ "answer": "大韓民国(韓国)",
187
+ "question_hint": "【世界地理】朝鮮半島の南側に位置し、北緯38度付近に軍事境界線を持つ国名を答えさせる問題。",
188
+ "difficulty": "基本",
189
+ "source_context": "大韓民国(韓国)は朝鮮半島の北緯38度より南側に位置する国で、北側の北朝鮮と接している。九州との距離が近い。"
190
+ },
191
+ {
192
+ "answer_id": "SO03_028",
193
+ "answer": "サウジアラビア",
194
+ "question_hint": "【世界地理】アラビア半島に位置し、日本が原油を最も多く輸入している国名を答えさせる問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "日本はサウジアラビアやアラブ首長国連邦など、西アジアの中東諸国から多くの石油を輸入している。国民の多くはイスラム教徒である。"
197
+ },
198
+ {
199
+ "answer_id": "SO03_029",
200
+ "answer": "仏教",
201
+ "question_hint": "【世界地理】東南アジアのタイで国民の多くが信仰している宗教の名称を答えさせる問題。",
202
+ "difficulty": "標準",
203
+ "source_context": "タイでは国民の多くが仏教を信仰している。植民地にならなかった歴史を持つ。"
204
+ },
205
+ {
206
+ "answer_id": "SO03_030",
207
+ "answer": "石油、天然ガス",
208
+ "question_hint": "【世界地理】東南アジアのインドネシアで多く産出され、日本も輸入している主要なエネルギー資源を2つ答えさせる問題。",
209
+ "difficulty": "応用",
210
+ "source_context": "インドネシアでは石油や天然ガスが多く産出され、輸出されている。"
211
+ },
212
+ {
213
+ "answer_id": "SO03_031",
214
+ "answer": "ウラル山脈",
215
+ "question_hint": "【世界地理】ロシアの西部にあり、ヨーロッパとアジアを分ける境界とされる山脈名を答えさせる問題。",
216
+ "difficulty": "応用",
217
+ "source_context": "ロシア西部に位置するウラル山脈は、伝統的にヨーロッパとアジアを分ける境界とされている。"
218
+ },
219
+ {
220
+ "answer_id": "SO03_032",
221
+ "answer": "ライン川",
222
+ "question_hint": "【世界地理】ヨーロッパを流れ、多くの国を通る「国際河川」で、沿岸に工業が発達している川の名前を答えさせる問題。",
223
+ "difficulty": "標準",
224
+ "source_context": "ライン川は多くの国を流れる国際河川であり、沿岸のドイツなどでは工業が発達している。"
225
+ },
226
+ {
227
+ "answer_id": "SO03_033",
228
+ "answer": "アジアNIES(ニーズ)",
229
+ "question_hint": "【世界地理】韓国、シンガポール、台湾、香港の、急速に工業化した国・地域の総称を答えさせる問題。",
230
+ "difficulty": "応用",
231
+ "source_context": "NIES(新興工業経済地域)のうち、韓国、シンガポール、台湾、香港などはアジアNIESと呼ばれ、急速な工業化を遂げた。"
232
+ },
233
+ {
234
+ "answer_id": "SO03_034",
235
+ "answer": "アモイ、スワトウ、シェンチェン(深圳)、チューハイ(珠海)、ハイナン(海南)省",
236
+ "question_hint": "【世界地理】中国の5つの経済特区の名前をすべて答えさせる問題。",
237
+ "difficulty": "応用",
238
+ "source_context": "中国の経済特区はアモイ、スワトウ、シェンチェン、チューハイ、ハイナン省の5か所である。"
239
+ },
240
+ {
241
+ "answer_id": "SO03_035",
242
+ "answer": "多文化社会(たぶんかしゃかい)",
243
+ "question_hint": "【世界地理】オーストラリアが白豪主義を廃止した後に目指している、多様な民族が共生する社会のあり方を答えさせる問題。",
244
+ "difficulty": "応用",
245
+ "source_context": "オーストラリアはかつてヨーロッパ系以外の移民を制限する白豪主義を採用していたが、現在はアジア系などの移民を多く受け入れ、多様な文化が混じり合う多文化社会を形成している。"
246
+ },
247
+ {
248
+ "answer_id": "SO03_036",
249
+ "answer": "アルプス・ヒマラヤ造山帯",
250
+ "question_hint": "【世界地理】ヨーロッパから東南アジアまで連なる、険しい山脈が連なる造山帯の名称を答えさせる問題。",
251
+ "difficulty": "標準",
252
+ "source_context": "ヨーロッパからアジアに連なり、アルプス山脈やヒマラヤ山脈を含む新期造山帯をアルプス・ヒマラヤ造山帯と呼ぶ。"
253
+ },
254
+ {
255
+ "answer_id": "SO03_037",
256
+ "answer": "環太平洋(かんたいへいよう)造山帯",
257
+ "question_hint": "【世界地理】太平洋を取り囲むように広がる、日本列島やアンデス山脈などを含む造山帯の名称を答えさせる問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "太平洋をとりまく日本列島、ロッキー山脈、アンデス山脈などを含む造山帯を環太平洋造山帯と呼ぶ。"
260
+ },
261
+ {
262
+ "answer_id": "SO03_038",
263
+ "answer": "日付変更線(ひづけへんこうせん)",
264
+ "question_hint": "【世界地理】太平洋上の経度180度付近に設けられた、日付の境目となる線の名称を答えさせる問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "太平洋上の経度180度の線にほぼ沿って、日付を調整するための日付変更線が設けられている。"
267
+ },
268
+ {
269
+ "answer_id": "SO03_039",
270
+ "answer": "イスラム教",
271
+ "question_hint": "【世界地理】西アジア(中東)の多くの国々や、インドネシアで広く信仰されている宗教の名称を答えさせる問題。",
272
+ "difficulty": "標準",
273
+ "source_context": "西アジア諸国やインドネシアなどでは、国民の多くがイスラム教を信仰している。"
274
+ },
275
+ {
276
+ "answer_id": "SO03_040",
277
+ "answer": "北緯20度〜46度、東経122度〜154度",
278
+ "question_hint": "【世界地理】地球儀上の座標で見た、日本の位置のおおまかな範囲を答えさせる問題。",
279
+ "difficulty": "基本",
280
+ "source_context": "日本はおよそ、北緯20度から46度、東経122度から154度の間に位置している。"
281
+ }
282
+ ]
V1.8.1/knowledge/v1.8.1/soc/SO04.json ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "answer_id": "SO04_001",
4
+ "answer": "岩宿遺跡",
5
+ "question_hint": "【歴史】旧石器時代の遺跡。群馬県で打製石器が発見され、日本に旧石器時代があったことを証明した遺跡名を答える問題。",
6
+ "difficulty": "基本",
7
+ "source_context": "群馬県にある遺跡。1949年に相沢忠洋が関東ローム層から打製石器(黒曜石の石槍など)を発見したことで、日本にも土器出現以前の旧石器時代が存在したことが科学的に証明された。それまでは日本に旧石器時代はないと考えられていた。"
8
+ },
9
+ {
10
+ "answer_id": "SO04_002",
11
+ "answer": "三内丸山遺跡",
12
+ "question_hint": "【歴史】縄文時代の遺跡。青森県で発見された大規模な集落跡で、定住生活の実態を示す遺跡名を答える問題。",
13
+ "difficulty": "標準",
14
+ "source_context": "青森県にある縄文時代前期〜中期の日本最大級の集落跡。大型の竪穴住居や掘立柱建物、膨大な量の土器や石器が出土した。クリの木の栽培や、遠隔地との交易を示すヒスイなども見つかっており、縄文人が高度な定住生活を送っていたことを示している。"
15
+ },
16
+ {
17
+ "answer_id": "SO04_003",
18
+ "answer": "アニミズム",
19
+ "question_hint": "【歴史】原始時代の信仰。自然界のあらゆるものに霊魂が宿っていると考える信仰の名称を答える問題。",
20
+ "difficulty": "応用",
21
+ "source_context": "縄文時代の人々が持っていた自然信仰。太陽、月、山、川、動物などの自然物や自然現象すべてに霊が宿っていると考える。豊穣や安産を祈るために作られた「土偶」や、魔除けとされる「石棒」もこの信仰に関連した道具と考えられている。"
22
+ },
23
+ {
24
+ "answer_id": "SO04_004",
25
+ "answer": "石包丁",
26
+ "question_hint": "【歴史】弥生時代の農具。稲の穂首を刈り取るために使われた、半月形の石器の名称を答える問題。",
27
+ "difficulty": "基本",
28
+ "source_context": "弥生時代に稲作が普及した際、収穫に使われた道具。半月形の石に2つの穴を開け、紐を通して指にかけ、稲の穂の部分だけを摘み取る「穂首刈り」に用いられた。鎌(鉄製)が普及する前の主流な収穫具である。"
29
+ },
30
+ {
31
+ "answer_id": "SO04_005",
32
+ "answer": "吉野ヶ里遺跡",
33
+ "question_hint": "【歴史】弥生時代の遺跡。佐賀県にある日本最大級の環濠集落跡の名称を答える問題。",
34
+ "difficulty": "標準",
35
+ "source_context": "佐賀県に位置する弥生時代の大集落跡。周囲を深い濠(ほり)や柵で囲んだ「環濠集落」の代表例。物見やぐらや高床倉庫、王の墓とされる墳丘墓が見つかっており、小国家(クニ)の成立や戦いの存在を裏付ける重要な遺跡である。"
36
+ },
37
+ {
38
+ "answer_id": "SO04_006",
39
+ "answer": "漢委奴国王",
40
+ "question_hint": "【歴史】金印の文字。57年に後漢の皇帝から奴国の王に授けられた金印に刻まれている5文字を答える問題。",
41
+ "difficulty": "標準",
42
+ "source_context": "中国の歴史書『後漢書』東夷伝に、57年に倭の奴国の王が後漢の光武帝に使いを送り、印綬を授かったと記されている。1784年に福岡県の志賀島で発見された金印には「漢委奴国王」と刻まれており、この記述を裏付けた。"
43
+ },
44
+ {
45
+ "answer_id": "SO04_007",
46
+ "answer": "卑弥呼",
47
+ "question_hint": "【歴史】邪馬台国の女王。3世紀に30余りの国を従え、魏に使いを送った女王の名を答える問題。",
48
+ "difficulty": "基本",
49
+ "source_context": "中国の歴史書『魏志』倭人伝に登場する邪馬台国の女王。まじないや占いで国を治めた(鬼道)。239年に魏に使いを送り、「親魏倭王」の称号と金印、銅鏡100枚を授かった。卑弥呼の死後、国は再び乱れたが「壱与(いよ)」が王となり収まった。"
50
+ },
51
+ {
52
+ "answer_id": "SO04_008",
53
+ "answer": "『漢書』地理志",
54
+ "question_hint": "【歴史】中国の歴史書。紀元前1世紀頃の倭(日本)が「100余りの国」に分かれていたと記された書物名を答える問題。",
55
+ "difficulty": "応用",
56
+ "source_context": "中国の歴史書の中で、日本(倭)について最も古く記されたもの。紀元前1世紀頃、倭人は百余りの国に分かれており、楽浪郡(現在の平壌付近)へ定期的に使者を送っていたことが記されている。"
57
+ },
58
+ {
59
+ "answer_id": "SO04_009",
60
+ "answer": "前方後円墳",
61
+ "question_hint": "【歴史】古墳の形式。円形と方形を組み合わせた、日本独特の巨大な古墳の形式を答える問題��",
62
+ "difficulty": "基本",
63
+ "source_context": "古墳時代の代表的な墳形。前部が方(四角)、後部が円(丸)の形をしている。鍵穴のような形が特徴。大和政権の勢力拡大とともに各地に広まった。代表例は大阪府堺市にある大仙(仁徳天皇陵)古墳。"
64
+ },
65
+ {
66
+ "answer_id": "SO04_010",
67
+ "answer": "埴輪",
68
+ "question_hint": "【歴史】古墳の副葬品。古墳の墳丘に並べられた、人物や動物をかたどった土製品の名称を答える問題。",
69
+ "difficulty": "標準",
70
+ "source_context": "古墳の頂上や周囲に並べられた素焼きの土製品。円筒埴輪のほか、家、馬、人物(兵士や巫女)をかたどった形象埴輪がある。死者の霊を守るためや、当時の生活様式を示す重要な史料となっている。縄文時代の「土偶」との混同に注意。"
71
+ },
72
+ {
73
+ "answer_id": "SO04_011",
74
+ "answer": "ワカタケル大王",
75
+ "question_hint": "【歴史】大和政権の王。埼玉県の稲荷山古墳出土の鉄剣に刻まれていた、雄略天皇とされる王の名称を答える問題。",
76
+ "difficulty": "標準",
77
+ "source_context": "埼玉県の稲荷山古墳出土の鉄剣や、熊本県の江田船山古墳出土の鉄刀の銘文に記されていた名。これは「雄略天皇」を指すとされ、5世紀後半には大和政権の支配が関東から九州まで及んでいたことを証明する重要な物証となった。"
78
+ },
79
+ {
80
+ "answer_id": "SO04_012",
81
+ "answer": "姓(かばね)",
82
+ "question_hint": "【歴史】大和政権の制度。氏(うじ)に対して、大王がその地位や職務に応じて与えた称号の名称を答える問題。",
83
+ "difficulty": "応用",
84
+ "source_context": "氏姓制度において、大王(天皇)が有力豪族の氏(うじ)に与えた家柄や地位を示す称号。代表的なものに、大臣(おおおみ)となる「臣(おみ)」、大連(おおむらじ)となる「連(むらじ)」のほか、君、直(あたえ)などがある。"
85
+ },
86
+ {
87
+ "answer_id": "SO04_013",
88
+ "answer": "渡来人",
89
+ "question_hint": "【歴史】朝鮮・中国からの移住者。4〜6世紀に大陸から移り住み、漢字や仏教、高度な技術を伝えた人々の総称を答える問題。",
90
+ "difficulty": "基本",
91
+ "source_context": "朝鮮半島や中国大陸から日本へ移住してきた人々。漢字(儒教)、仏教の公伝(百済の聖明王から)、養蚕、機織り、土木技術、須恵器(硬質で灰色の土器)の製作技術などを伝え、大和政権の発展に大きく貢献した。"
92
+ },
93
+ {
94
+ "answer_id": "SO04_014",
95
+ "answer": "冠位十二階",
96
+ "question_hint": "【歴史】聖徳太子の政策。家柄に関係なく、才能や功績のある人物を役人に登用するために定めた制度の名称を答える問題。",
97
+ "difficulty": "標準",
98
+ "source_context": "603年に聖徳太子が定めた役人の等級制度。徳・仁・礼・信・義・智をそれぞれ大小に分け12段階とした。それまでの氏族単位の世襲制を打破し、個人の能力や功績に応じて冠の色で位を示すことで、中央集権化を目指した。"
99
+ },
100
+ {
101
+ "answer_id": "SO04_015",
102
+ "answer": "小野妹子",
103
+ "question_hint": "【歴史】遣隋使。607年に聖徳太子によって隋へ派遣された、代表的な使者の名を答える問題。",
104
+ "difficulty": "基本",
105
+ "source_context": "第2回遣隋使として派遣された人物。隋の皇帝・煬帝(ようだい)に対し、「日出づる処の天子、書を日没する処の天子に致す」という、対等な立場を強調した国書を渡した。煬帝を怒らせたが、当時の中国の進んだ制度や仏教文化を吸収する大きな役割を果たした。"
106
+ },
107
+ {
108
+ "answer_id": "SO04_016",
109
+ "answer": "法隆寺",
110
+ "question_hint": "【歴史】飛鳥文化。聖徳太子が建立した、現存する世界最古の木造建築物を持つ寺院名を答える問題。",
111
+ "difficulty": "基本",
112
+ "source_context": "奈良県斑鳩(いかるが)にある寺。聖徳太子が建立。世界最古の木造建築である西院伽藍(五重塔・金堂など)があり、世界遺産に登録されている。飛鳥文化を代表する釈迦三尊像や玉虫厨子などが安置されている。"
113
+ },
114
+ {
115
+ "answer_id": "SO04_017",
116
+ "answer": "大化の改新",
117
+ "question_hint": "【歴史】飛鳥時代の政変。645年に中大兄皇子らが蘇我氏を倒し、始めた政治改革の名称を答える問題。",
118
+ "difficulty": "標準",
119
+ "source_context": "645年、中大兄皇子(後の天智天皇)と中臣鎌足(後の藤原鎌足)が、権力を振るっていた蘇我入鹿を暗殺(乙巳の変)し、蘇我��を滅ぼしたことから始まる改革。唐の律令制度を模範に、天皇中心の中央集権国家づくりを目指した。"
120
+ },
121
+ {
122
+ "answer_id": "SO04_018",
123
+ "answer": "班田収授法",
124
+ "question_hint": "【歴史】土地制度。大化の改新で示された、6歳以上の男女に口分田を与え、死ぬと返却させる制度の名称を答える問題。",
125
+ "difficulty": "標準",
126
+ "source_context": "大化の改新後の律令制における土地・人民支配の基本。戸籍を作成し、6歳以上の男女に一定の土地(口分田)を与え、耕作させる。その代わりに税(租)を徴収し、死後は国に土地を返す仕組み。公地公民の原則に基づいている。"
127
+ },
128
+ {
129
+ "answer_id": "SO04_019",
130
+ "answer": "白村江の戦い",
131
+ "question_hint": "【歴史】飛鳥時代の対外戦争。663年、日本が百済を助けるために朝鮮へ出兵し、唐・新羅の連合軍に敗れた戦いの名称を答える問題。",
132
+ "difficulty": "標準",
133
+ "source_context": "663年、滅亡した百済の復興を支援するため、中大兄皇子が朝鮮半島へ大軍を送ったが、唐と新羅の連合軍に大敗した。敗戦後、日本は唐の侵攻を恐れ、九州に防人(さきもり)を配置し、大宰府を守るための水城(みずき)や山城を築いた。"
134
+ },
135
+ {
136
+ "answer_id": "SO04_020",
137
+ "answer": "壬申の乱",
138
+ "question_hint": "【歴史】飛鳥時代の内乱。672年、天智天皇の死後に後継者をめぐって大海人皇子と大友皇子が争った内乱の名称を答える問題。",
139
+ "difficulty": "応用",
140
+ "source_context": "672年に起きた古代最大の内乱。天智天皇の弟・大海人皇子と、子・大友皇子が争い、大海人皇子が勝利して天武天皇として即位した。これにより天皇の権威が絶大なものとなり、律令国家の完成に向けた中央集権体制が加速した。"
141
+ },
142
+ {
143
+ "answer_id": "SO04_021",
144
+ "answer": "平城京",
145
+ "question_hint": "【歴史】奈良時代の都。710年に元明天皇が遷都した、唐の長安を模範とした碁盤の目の都の名称を答える問題。",
146
+ "difficulty": "基本",
147
+ "source_context": "710年に奈良に建設された都。唐の首都・長安をモデルにし、東西南北に大通りが通る「碁盤の目」状の計画都市。中心には平城宮があり、政治と仏教文化の拠点となった。和同開珎などの貨幣も流通し、シルクロードを経由した国際色豊かな天平文化が栄えた。"
148
+ },
149
+ {
150
+ "answer_id": "SO04_022",
151
+ "answer": "庸(よう)",
152
+ "question_hint": "【歴史】律令制の税。都での10日間の労働の代わりに、布を納める税の名称を答える問題。",
153
+ "difficulty": "標準",
154
+ "source_context": "律令時代の税制(租・庸・調)の一つ。本来は都へ行って年間10日間働く労働の義務(歳役)だが、その代わりに布(麻布など)を納めることができる。主に成人男性に課せられた負担。収穫した稲を納めるのは「租」、特産物を納めるのは「調」である。"
155
+ },
156
+ {
157
+ "answer_id": "SO04_023",
158
+ "answer": "聖武天皇",
159
+ "question_hint": "【歴史】奈良時代の天皇。鎮護国家の思想に基づき、東大寺の大仏建立や国分寺の建立を命じた天皇の名を答える問題。",
160
+ "difficulty": "標準",
161
+ "source_context": "奈良時代中期の天皇。疫病や社会不安を鎮めるため、仏教の力で国を安定させよう(鎮護国家)と考え、全国に国分寺・国分尼寺を建て、都には総国分寺として東大寺を建立し、巨大な大仏(盧舎那仏)を造立させた。正倉院にはこの天皇の遺愛品が納められている。"
162
+ },
163
+ {
164
+ "answer_id": "SO04_024",
165
+ "answer": "行基",
166
+ "question_hint": "【歴史】奈良時代の僧。民衆に仏教を広めながら橋や池を作り、聖武天皇の大仏建立を助けた僧の名を答える問題。",
167
+ "difficulty": "標準",
168
+ "source_context": "奈良時代の僧。当時は禁止されていた民衆への布教を行い、各地で橋や堤防、ため池などの社会事業を進めたため絶大な人気を得た。当初は朝廷に弾圧されたが、大仏建立の協力者として認められ、僧侶の最高位である「大僧正」に任じられた。"
169
+ },
170
+ {
171
+ "answer_id": "SO04_025",
172
+ "answer": "鑑真",
173
+ "question_hint": "【歴史】奈良時代の渡来僧。5度の失敗で失明しながらも来日し、日本の仏教に正しい戒律を伝えた僧の名を答える問題。",
174
+ "difficulty": "標準",
175
+ "source_context": "唐から来日した高僧。日本の僧に正しい戒律(僧としての規律)を授けるため、5回もの遭難・失敗を繰り返し、両目を失��しながらも6回目で来日を果たした。奈良に「唐招提寺」を建立し、日本の仏教の発展に尽力した。"
176
+ },
177
+ {
178
+ "answer_id": "SO04_026",
179
+ "answer": "墾田永年私財法",
180
+ "question_hint": "【歴史】土地制度の変遷。743年に発布された、新しく開墾した土地の永久私有を認める法律の名称を答える問題。",
181
+ "difficulty": "応用",
182
+ "source_context": "743年に制定された法律。それまでの「公地公民」の原則を崩し、自分で新しく耕した土地を永久に自分のものにして良いとした。これにより、有力な貴族や寺社が競って開墾を進め、私有地である「荘園」が拡大するきっかけとなった。これ以前には3代に限定した「三世一身法(723年)」があった。"
183
+ },
184
+ {
185
+ "answer_id": "SO04_027",
186
+ "answer": "貧窮問答歌",
187
+ "question_hint": "【歴史】奈良時代の文学。山上憶良が『万葉集』に記した、重税に苦しむ農民の様子を描いた歌の名称を答える問題。",
188
+ "difficulty": "応用",
189
+ "source_context": "『万葉集』に収録されている、山上憶良(やまのうえのおくら)が作った長歌。律令制下の厳しい税負担(租・庸・調や兵役)と貧困にあえぐ農民の生活をリアルに描写しており、華やかな都の裏側にある民衆の苦悩を伝える重要な史料となっている。"
190
+ },
191
+ {
192
+ "answer_id": "SO04_028",
193
+ "answer": "坂上田村麻呂",
194
+ "question_hint": "【歴史】平安時代の人物。桓武天皇に征夷大将軍に任命され、東北地方の蝦夷(アテルイ)を平定した人物を答える問題。",
195
+ "difficulty": "標準",
196
+ "source_context": "平安時代初期の武官。桓武天皇から「征夷大将軍」に任じられ、東北地方の蝦夷(えみし)の征伐に向かった。蝦夷の首長アテルイを降伏させ、胆沢城(いざわじょう)を築いて東北の支配を広げた。清水寺の建立に関わったことでも知られる。"
197
+ },
198
+ {
199
+ "answer_id": "SO04_029",
200
+ "answer": "空海",
201
+ "question_hint": "【歴史】平安時代の宗教。真言宗を開き、和歌山県の高野山に金剛峯寺を建てた僧の名を答える問題。",
202
+ "difficulty": "基本",
203
+ "source_context": "平安時代初期の僧(弘法大師)。遣唐使として入唐し、密教を学んで帰国。「真言宗」を開き、高野山に「金剛峯寺」を建立した。一方、同時期に活躍した最澄は「天台宗」を開き、比叡山に「延暦寺」を建てた。この2人は新しい仏教として貴族に支持された。"
204
+ },
205
+ {
206
+ "answer_id": "SO04_030",
207
+ "answer": "摂関政治",
208
+ "question_hint": "【歴史】平安時代の政治。藤原氏が天皇の摂政や関白となり、権力を握った政治の形態を答える問題。",
209
+ "difficulty": "基本",
210
+ "source_context": "藤原氏が、娘を天皇の后にしてその子を次の天皇に立てる「外戚関係」を築き、天皇が幼いときは「摂政」、成人後は「関白」として実権を握った体制。11世紀前半、藤原道長・頼通父子の時代に全盛期を迎えた。"
211
+ },
212
+ {
213
+ "answer_id": "SO04_031",
214
+ "answer": "藤原道長",
215
+ "question_hint": "【歴史】平安時代の人物。摂関政治の全盛期に「この世をばわが世とぞ思う望月の…」という和歌を詠んだ人物を答える問題。",
216
+ "difficulty": "標準",
217
+ "source_context": "摂関政治の絶頂期を築いた人物。4人の娘を次々と天皇の后(中宮)に入れ、3人の天皇の外祖父となった。栄華の極致において「この世をば わが世とぞ思う 望月の かけたることも なしと思えば」と詠み、自身の権力を満月に例えた。"
218
+ },
219
+ {
220
+ "answer_id": "SO04_032",
221
+ "answer": "菅原道真",
222
+ "question_hint": "【歴史】平安時代の人物。894年に、唐の衰退などを理由に遣唐使の中止を進言した人物の名を答える問題。",
223
+ "difficulty": "基本",
224
+ "source_context": "平安時代の学者・政治家。宇多天皇に重用されたが、藤原氏の策略により太宰府に左遷された(現在は学問の神様として天満宮に祀られる)。894年に遣唐使の派遣中止を提言し、これが認められたことで、日本独自の「国風文化」が発達する大きな契機となった。"
225
+ },
226
+ {
227
+ "answer_id": "SO04_033",
228
+ "answer": "かな文字(平仮名・片仮名)",
229
+ "question_hint": "【歴史】国風文化。漢字の形を崩して日本独自に作られた、読み書きのための文字を答える問題。",
230
+ "difficulty": "標準",
231
+ "source_context": "平安時代、遣唐使の廃止に伴い日本独自の生活に合った文化(国風文化)が発展する中で生まれた。漢字��崩して作られた平仮名や、漢字の一部を取って作られた片仮名により、心情を自由に表現できるようになり、『源氏物語』や『枕草子』などの女流文学が隆盛した。"
232
+ },
233
+ {
234
+ "answer_id": "SO04_034",
235
+ "answer": "寝殿造",
236
+ "question_hint": "【歴史】平安時代の建築。貴族の邸宅様式で、池や庭園を備えた日本独自の住宅形式を答える問題。",
237
+ "difficulty": "標準",
238
+ "source_context": "国風文化を代表する貴族の住宅様式。中心となる建物(寝殿)から左右に「対の屋」を伸ばし、渡殿(廊下)でつなぐ。南側には池や橋がある広い庭園を設け、自然との調和を重んじた。内部は障子や屏風、大和絵(日本風の絵画)で飾られた。"
239
+ },
240
+ {
241
+ "answer_id": "SO04_035",
242
+ "answer": "平等院鳳凰堂",
243
+ "question_hint": "【歴史】平安時代の建築。藤原頼通が極楽浄土を模して京都の宇治に建立した阿弥陀堂を答える問題。",
244
+ "difficulty": "標準",
245
+ "source_context": "平安時代後期、末法思想の流行により浄土信仰が広まる中、藤原頼通が宇治に建立した。鳳凰が羽を広げたような優美な姿が特徴で、屋根には鳳凰が置かれている。内部には阿弥陀如来像が安置され、当時の貴族が願った「死後の極楽往生」を具現化した代表的建築。"
246
+ },
247
+ {
248
+ "answer_id": "SO04_036",
249
+ "answer": "平将門の乱",
250
+ "question_hint": "【歴史】武士の台頭。10世紀中頃、関東で自らを「新皇」と称して反乱を起こした武士の反乱名を答える問題。",
251
+ "difficulty": "応用",
252
+ "source_context": "935年〜940年、関東(下総)を拠点とする平将門が起こした大規模な反乱。同時期に瀬戸内海で起きた「藤原純友の乱」と合わせて承平・天慶の乱と呼ばれる。朝廷が自力で鎮圧できず、地方武士の力を借りて解決したことは、武士が政治的・軍事的に重要な存在になる転換点となった。"
253
+ },
254
+ {
255
+ "answer_id": "SO04_037",
256
+ "answer": "院政",
257
+ "question_hint": "【歴史】平安時代後期の政治。天皇が位を譲って上皇となり、実権を握り続けた政治形態を答える問題。",
258
+ "difficulty": "標準",
259
+ "source_context": "1086年、白河天皇が幼少の堀河天皇に位を譲り、自身は「上皇(院)」となって政治の実権を握ったことから始まった。これにより藤原氏の摂関政治の力が弱まり、上皇は自身の軍事力として武士(北面の武士など)を登用したため、武士が中央へ進出するきっかけとなった。"
260
+ },
261
+ {
262
+ "answer_id": "SO04_038",
263
+ "answer": "平清盛",
264
+ "question_hint": "【歴史】平安時代末期の人物。武士として初めて太政大臣となり、日宋貿易などを進めた人物を答える問題。",
265
+ "difficulty": "標準",
266
+ "source_context": "保元の乱・平治の乱を勝ち抜いて権力を掌握。1167年に武士で初めて「太政大臣」に就任。大輪田泊(神戸港)を整備して「日宋貿易」を積極的に行い、宋銭を輸入して利益を上げた。娘を天皇の后にし、平氏一門で高位高官を独占したが、後に源氏に滅ぼされた。"
267
+ },
268
+ {
269
+ "answer_id": "SO04_039",
270
+ "answer": "不輸・不入の権",
271
+ "question_hint": "【歴史】荘園制度。荘園領主が獲得した、税を免除される権利と、役人の立ち入りを拒否する権利を答える問題。",
272
+ "difficulty": "応用",
273
+ "source_context": "平安時代の荘園拡大に伴い、有力な貴族や寺社が獲得した特権。国の税(租税)が免除されるのが「不輸の権」、国から派遣された役人(検非違使など)の立ち入りや調査を拒否できるのが「不入の権」。これにより荘園は国の支配から独立した私有地となり、律令制が崩壊していった。"
274
+ },
275
+ {
276
+ "answer_id": "SO04_040",
277
+ "answer": "壇ノ浦の戦い",
278
+ "question_hint": "【歴史】源平の争乱。1185年、山口県沖で源氏が平氏を滅ぼした最後の戦いの名称を答える問題。",
279
+ "difficulty": "応用",
280
+ "source_context": "1185年、山口県下関市の壇ノ浦で行われた源平合戦の最終決戦。源義経率いる源氏軍が平氏軍を破り、平氏一門は幼い安徳天皇とともに入水して滅亡した。これにより平安時代が終わり、鎌倉幕府設立へと向かう武士主導の時代が確定した。"
281
+ }
282
+ ]