- ベストアンサー
40文字記述式パターンマッチング問題
- 入力された文章が一致した場合には40点表示されます。
- 入力された文章のキーワードが一致するごとに8点加算されます。
- 入力された文章はテーブルに1文字ずつリアルタイムで表示されます。また、合計得点と文字数もカウント表示されます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
<!DOCTYPE html> <meta charset="UTF-8"> <title></title> <style> li table { width:50%;} button:not(.a)~span {display:none;} td{height:2em;} </style> <body> <h1>40文字記述式問題</h1> <hr> <ul> <li> <h2>問題.1</h2> <p class="mondaibun">問題文</p> <table border="1"> <caption>40字</caption> <tbody> </table> <p> <input class="answ"> <button>決定</button> <span>/<label>採点</label>:<input type="number" class="saiten"></span> <p> <button>答え</button><br> <span class="answ0"> 行政指導に該当し、文部科学大臣に対し、当該勧告の中止その他必要な措置をとるよう求める手段。 </span> <p> <button>解説</button><br> <span>適当な解説</span> <datalist class="answ1"> <option value="8">行政指導 <option value="8">文部科学書 <option value="8">中止等を求めることができる </datalist> <li> <h2>問題.2</h2> <p class="mondaibun">問題文</p> <table border="1"> <caption>40字</caption> <tbody> </table> <p> <input class="answ"> <button>決定</button> <span>/<label>採点</label>:<input type="number" class="saiten"></span> <p> <button>答え</button><br> <span class="answ0"> 行政指導に該当し、文部科学大臣に対し、当該勧告の中止その他必要な措置をとるよう求める手段。 </span> <p> <button>解説</button><br> <span>適当な解説</span> <datalist class="answ1"> <option value="8">行政指導 <option value="8">文部科学書 <option value="8">中止等を求めることができる </datalist> </ul> <script> const split = (array, n) => array.reduce((a, c, i) => i % n == 0 ? [...a, [c]] : [...a.slice(0, -1), [...a[a.length - 1], c]], []) const ary2tbody=(a,b=document.createElement('tbody'))=>a.reduce((b,a)=>(a.reduce((c,d)=>(c.insertCell().append(d),c),b.insertRow()),b),b); document.addEventListener ('input',({target:e})=>{ if(e.matches('.answ')) { let tb=e.closest('li').querySelector('tbody'); let a = split([...e.value, ...[...Array(40)].map(a=>a==null?'':a)].slice(0,40),15); [...tb.childNodes].forEach (e=>e.remove()); ary2tbody (a,tb); } }); document.addEventListener('click',({target:e})=>{ if('BUTTON'==e.tagName) { e.classList.toggle('a'); if ('決定'==e.textContent) check (e.closest ('li')); } }); function check (li) { let [a,b,c,d] = li.querySelectorAll('.answ, .answ0, .answ1, .saiten'); let e = (a.value.trim() == c.textContent.trim()) * 40; b.value = [...d.options].reduce ((x,y)=>x+(-1<a.value.indexOf(y.textContent.trim()))*+y.value, e); } </script>
その他の回答 (5)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>40文字記述式パターンマッチング問題の質問の件はこれで完成としていいのですか? あ~ごめんなさい。 それは、先の回答者さんに失礼なので、彼の回答は彼の回答で、 質問者さん自身が意味を吸収するべきと思います。 私が勝手に彼の回答を書き換えるのは、ちょっと筋は違う問題になります。 プログラムのソースも「質問と答え」と同じ用に、 100人いれば100通りあるものですからね。 ただ、貴方の事は、ちゃんと覚えてますから、心配せず~ ちょっと、忙しくて、参加できずにごめんね~
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>僕のことをまた忘れていないですか? >失恋したショックからまだ立ち直っていません。 >助けてください。よろしくお願いします。 覚えてますよ~でも~ 「失恋のショック」は助けられませ~ん(笑) 最近JavaScriptじゃなくてJavaやり始めたので、 ちょっと、楽しくて^^あはは んま、フロントの形成部分は結局JavaScriptなんですけどね。 覚えてますよ~だっ! 捨てセリフに「おぼえとけよ~」は禁止でお願いね(意味不明)
補足
40文字記述式パターンマッチング問題の質問の件はこれで完成としていいのですか?お暇なときでいいので協力してください。AsarKingChangさんが書いたソースコードを見て勉強したいです。よろしくお願いします。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>文字をタイプライターのように1文字ずつテーブルに表示させられないですか? これは簡単ですよ。 ついでに、文字の前後を<TD> + 文字 + </TD> でくくるなどすれば、 レイアウトも勝手に揃います。むしろTABLEをやめて フロート表示にになってる他のタグの方がいいかもですが。 例えばULタグ+{LI+文字}のループを横表示など。。
お礼
AsarKingChangさんへ 僕のことをまた忘れていないですか?失恋したショックからまだ立ち直っていません。助けてください。よろしくお願いします。
補足
フロート表示いいですね。フロート表示で進めてください AとB案の両方見ててみたいです。 よろしくお願いします。 A案 >ついでに、文字の前後を<TD> + 文字 + </TD> でくくるなどすれば、 レイアウトも勝手に揃います。 B案 >例えばULタグ+{LI+文字}のループを横表示
- AsarKingChang
- ベストアンサー率46% (3467/7474)
完成形のイメージが遠い~ 1文字とかってのは、ループで回せば簡単に出来るのですけど。 どういう問題文とどういう入力方法でやるのかな~と^^ ただ、おそらく、簡単じゃないかって気はしてますが。
補足
文字をタイプライターのように1文字ずつテーブルに表示させられないですか? サンプルコード ----------------------http://javascript123.seesaa.net/article/111409276.html? https://sonoshou.hatenablog.jp/entry/20110729/1311968271 --------------------------- それをあらかじめ記述しておいた配列と照合してキーワードと比較できないですか? const qa = [ {q:"私立の大学であるA大学は、その設備、授業その他の事項について、法令の規定に違反しているとして、学校教育法15条1項に基づき、文部科学大臣から必要な措置をとるべき旨の書面による勧告を受けた。しかしA大学は、指摘のような法令違反はないとの立場で、勧告に不服をもっている。この文部科学大臣の勧告は、行政手続法の定義に照らして何に該当するか。また、それを前提に同法に基づき、誰に対して、どのような手段をとることができるか。40字程度で記述しなさい。",,kaitou:"行政指導に該当し、文部科学大臣に対して、当該勧告の中止等を求めることができる。(39字)"keyword1:行政指導 keyword2:文部科学書 keyoword3:中止等を求めることができる}, let arraySplit = kaitou.split(''); ["行政指導","に","該","当","し、","文部科学大臣","に","対して","当該勧告の中止等を求めることができる"]
- AsarKingChang
- ベストアンサー率46% (3467/7474)
ほったらかしで、すまん~ で~何がしたいんだっけ(質問読む気力がすら脱力中) ただね~ それって、そもそも完全一致するなら、元々カンニングな気がするし 例えばですが。。。 「育毛予防、脱毛促進」と「脱毛予防、育毛促進」って 計算したら点数同じじゃないかな? 「育毛+脱毛+予防+促進」順番が変わっただけの事。 って感じで、人間的なニュアンスを持ち込むと、 プログラムって結構崩壊することが^^ そこが痛いので、デジタルで、 「これにしか答えがならない!」ってケースで 一番プログラム言語って威力を発揮するんですよね~。
補足
これは行政書士の記述式でだされる問題です。 1.入力した文章が全部一致すれば40点の配当がもらえます。 2.部分点だとキーワードに一致した部分だけ1つにつき8点の配当がもらえます。 3.ひとつも一致しなければ0点です。 -------------------------- 操作手順 1.インプットした文章をテーブルのマス目に一つづつ表示させたいです。 2.記入した文章が全文一致していれば40点満点としたいです。 3.キーワードが一致しれいれば一つのキーワードにつき8点をつけたいです。 4.答えと解説のボタンを表示非表示で切り替えたいです。 他に補足情報が必要であれば教えて下さい。 お暇なときでいいのでよろしくお願いします。
お礼
さっそくの返信ありがとうございました。理想に近いイメージに仕上がっていると思います。 今、フロート表示で進めていますので見守っていてください。ありがとうございました。