+ JavaScript の質問用スレッド vol.141 +
■ このスレッドは過去ログ倉庫に格納されています
JavaScript を自ら学ぶ人のための質問スレッドです。 次スレは>>950 が(本スレで改善案があれば考慮して)立ててください ■規則/推奨ルール 質問者は !slip:vvvvv を名前欄に、その後は「レス番」+!slip:vvvvv ・質問内容は具体的に。言葉だけでなく、出来る限り再現性を確認したサンプルコードの掲示。 ・質問テンプレートの利用推奨。 ・質問への「答え」から解離した議論はよそでやること。 ■禁止行為 ・丸投げ質問 ・迷惑スクリプトの質問 ・オレオレ用語の使用(一般的な用語を使用する事) ・煽り、批判等の他人を不快にさせる行為 ■質問テンプレート 【環境】OS, ブラウザをバージョンと共に記入してください。 【条件】期待する回答の条件を書いてください。 【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。 【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。 【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。 【サンプルコード】現象を再現可能な最小限のコードを書いてください。 1レスに収まらないならコード投稿サイトを利用してください。 http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/ ■回答者へ ・回答には多様性があります。他人の回答を尊重してください ・動作ブラウザや環境が限られる場合は、それを明記してください ・他人の回答を批判する代わりに、自分ならこう書くという例を示してください ・質問者がJavaScriptでなければ実現できないと勘違いしてるなら、その否定としてHTMLとCSSで実装しても良い ・他人の回答を見たくないのであれば、文句をつける代わりにNGにして見えないようにしてください。文句をつける=荒らしです ■前スレ + JavaScript の質問用スレッド vol.140 + https://mevius.5ch.net/test/read.cgi/hp/1558249632/ >>113 > 「関数を書きたくない」というなら、巨大な関数である jQuety()を定義しているコードに魅力を感じるのは jQueryを使うなら「関数を書かなくていい」じゃん 「関数を書きたくない」という要望を見事に満たしている。 そもそもプログラム書きたくないんですけどどうしたらいいですか? >>114 「メモリも食わない」の要件を満たしてないじゃん >>116 それは「すべてのものはメモリを食う」という結論で終わったろ? そもそも、>>102 は質問者なのか? 他人が悪のりしてるのか、質問者本人なのか分からん jQueryはscript要素を余計に書かないといけないので、面倒くさい そんな面倒くさがりの君にプレゼント Object(element).value = 'bar'; ライブラリ使うよりお手軽だよ! メソッド呼び出しは要件にないから知らないよ! そもそも、NullPointerExceptionはエラー検知として捉える向きもあるので、一概に悪いとはいえない(上で懸念されてるのはそういうことかと) ポリシーの違いを他人を批判する理由にするのは止めよう >>1 参照 無いときにエラーにしたくなくて、あるときに全ての要素を対象にしたければ DOM APIには複数要素取得する手段がいくつもあるんだから それでmapなんかで回せばいいだけじゃん >>112 どうだろう CSS はデザインの話で、コンテンツそのものの話とは区別されるんじゃないかと > 出力先はどういう性質かというのを記述 これなんてまさにそれ オブジェクトのプロパティに値をセットしたつもりが そもそもオブジェクトありませんでしたー でエラーが出なくて幸せになる具体的なシーンが思いつかない、というのもある 「『対象の性質を宣言』しようとしましたが、その対象は存在しませんでした」ってことでしょう? >>124 1. elements を取得します 2. elements.length を使って for ループして item(i) 等で個々の element を取得して処理します コレではダメ? >>127 NodeListは普通にfor(let elm of list)で回せる >>128 最近のブラウザは大丈夫なのかな 以前、調べたときには仕様はOKだったのに、iterableではない実装が結構あった Symbolで自前定義したけど >>120 > メモリ消費量が違う せやね。メモリが640KBしか無いような環境は問題になるだろうね。 ブラウザが動くのか知らんが > ・回答には多様性があります。他人の回答を尊重してください jsにも ?. が実装される草案は先送りになったのかな jQueryが消費するメモリ →大した消費量じゃない! 自前で関数ちょこっと書くのに消費するメモリ→ とんでもないメモリ消費! >>137 先送り?? tc39の制定プロセス知らないの?. その煽る気満々の内容で質問者に回答してやればいいのに、これだからマウント君は >>137 ES全体的に前みたいに大量の草案をガツガツ進める雰囲気じゃなくて 細かい仕様をより小規模なミーティングを頻繁にして少しづつ着実に落ち着いて進める感じになってる その上でオプショナルチェーンの進歩状況はやや鈍調 本来なら輸入構文で順調に行くはずだけど、 ついでにこれもセットで欲しい機能のオプショナルコールについて問題を抱えていたので あまり進捗してこなかったのが、直近のミーティングで前に進んだ もう一山か二山あるだろうけど、ゴールの明かりがちらりと見えた所 firefox x64 + Stylus + Greasemonkey とあるよく利用しているサイトが今一つ使いづらいので、 Stylusの自作スクリプトで必要以上の余計な広告を非表示にし、 非同期処理させて処理の高速化を図りました。 改めてそのサイトのソースを見たらsetTimeoutで特定の広告を少し時間差を置いて表示させ、 更に時間差を置いて記事部分を表示させるなんてことをやっていることが判明。 即時表示させる手段はないかと、StylusかGreasemonkeyでsetTimeoutの無効化とか、 そのスクリプト自体の上書きか無効化が出来ないか試行錯誤中。 どなたか、何かアドバイスなど頂ければ幸いです。 元あるものを改変するのではなく記事の内容を取得して表示するリーダーアプリを作ったほうが聡い >>133 そのまえに html コンテンツと gif / jpeg 読み込んだだけで溢れかねない 15.6MB でも足りないページは一杯ありそうだしね 都度で swap とか悪夢だろうが CF カードにキャッシュ置ければマシか …もともとがRuby房召喚のためだけの質問っぽいけど… >>112 > 出力先はどういう性質かというのを記述する。 element がらみの場合は DOM ツリーの適切な場所に適切な要素を記述し その要素にその性質を記述するものではないのかしらん まとめたければ DocumentFragment 使うとか、元質問に即して言えば事前に createElement すれば良いんでないかい ただ、元質問は「対象が存在しないときにスルー」って言ってるんだから「宣言型プログラミング」とやらは今回別に要らないでしょ コレクションのアイテム数を数え、アイテム数を越える分は処理しなければ良いだけ …ってのを >>111 のリンク先で書いてみたんだが… >>94 ?. は、NULL 許容(エルビス)演算子だろ。 横から見ると、エルビスプレスリーに見える Ruby では、関数名の最後の文字に、?, ! が使える ? は、真偽値を返すメソッド名に使う。 ! は、レシーバーの内容を変えるメソッド名に使う このルールがあるから、可読性が高い! その代わりに、エルビスが使えないから、&. を使う 俗称エルビス演算子は?.ではなく?: これだからクソ言語信者は。 ?.の一般的な名前は>>110 エルビス? かつて流行した vi クローンで nvi の祖先のこと? 最近、Ruby信者をいろんなスレで見かけるのは、Rubyが下火になっているからか 多言語の機能を取り込むのは良いことだが、機能に拘るのは偏食と変わらないな 文字列が入った配列(例として["aaa","aaa","bbb","bbb","ccc","ccc",…以下1000個ほど続くとする])があるとして、 この配列を「できるだけ似た文字列が並ばないように」並び替える方法ってどんなものが考えられますか? つまり["aaa","bbb","ccc","aaa","bbb","ccc",…] となるように並べ替えたいです 言い換えれば「できるだけ似てない文字列が隣合って並ぶように」バラけさせるアルゴリズムです レーベンシュタイン距離でというのも考えましたが「1つ前の文字列からもっとも遠い文字列を」短絡的に並べていくのでは、上記の例でいうと ["aaa","ccc","aaa","ccc","bbb","bbb",…] というふうに、もっとも遠い文字列を使い果たした後はむしろ近いものが並んでしまうのではないかと危惧してます もっと要件詰めなよ。仕事でそんな発注するんじゃないぞ。 ソートして半分に割って一個ずつ取り出し並べていけば良いんじゃね >>153 「似た文字列」を定義する事から始めては? 「似た文字」は文字の類似度を数値で返す関数がある という前提でいいだろ じゃあsortにその関数使ったコンパレータぶっ込んで終わり。 はい次。 >>153 レーベンシュタイン距離でいいんじゃないか? 1. 同一文字をまとめて、ユニークな文字列の値、出現回数をまとめた配列(or Map)を作る 2. 隣接要素のレーベンシュタイン距離がしきい値を越えるように並べ替える 3. 1周する 4. 各要素の出現回数を -1 5. 全要素が出現回数0なら終了。一部に出現回数0があったら、2.へ、それ以外は3.へ >>153 例えば100通りランダムに並び替える その中で10個距離が短いのを選んでそれぞれ10通りランダムに少量だけ並び替える その繰り返しでいい >>158 素朴な疑問なんだけど、Array#sortって隣接要素の判定条件を指定出来るの? 2つの要素が似た文字列だった場合に引き離す機能がないと実装出来ないと思うんだけど >>153 "aaa" "bbb" "ccc" だけなら、「setにしてdeleteしてランダムに選ぶ」を繰り返せば良くね >>153 const length = 100 const a = ["aaa", "bbb", "ccc"] let aryResults = [] aryResults.push(a[(Math.random()*3 | 0)]) // 2 ** 31 を下回ることが保証されているので | 0 で可 const l = length - 1 for (i = 0; i < l; i++) { console.log(aryResults[i]) let setTmp = new Set(a) setTmp.delete(aryResults[i]) const arrTmp = [...setTmp] aryResults.push(arrTmp[(Math.random()*2 | 0)]) } console.log(aryResults) …例がわるい 「文字列が入った配列」の種類はいくつよ 例えば範囲が、1〜100 なら、 1, 100, 2, 99 みたいに取っていくと、 最後には、50 近辺の数字ばかりが残るから、ダメ! 無数のアルゴリズム・シミュレーションを繰り返して、 合計距離が多くなるように、しないといけない // 出現回数は考慮しないものとする // 小文字アルファベット a-z から選ぶものとする const length = 100 const threshold = 10 let a = [] let place = [] let aryResults = [] for (let i = 0; i < 26; i++) { let strTmp = String.fromCharCode(0x61 + i) a.push(strTmp) place.push(-threshold) } for (let i = 0; i < length; i++) { let t = i - threshold let setTmp = new Set(a) for (j = 0; j < 26; j++) { if (place[j] > t) { setTmp.delete(a[j]) } } const arrTmp = [...setTmp] let x = (Math.random() * arrTmp.length | 0) place[x] = i aryResults.push(arrTmp[x]) } console.log(aryResults) >>153 うーん 定性的な部分をどうにかしないと書けないな 「似た文字列」 何をもって「似ている」と判断するか基準不明 「できるだけ似た文字列が並ばないように」 →どの範囲で許されるのか 高田馬場1丁目1番地、2番地… 高田馬場2丁目1番地、2番地… 高田馬場3丁目1番地、2番地… 高田馬場4丁目1番地、2番地… 高田馬場5丁目1番地、2番地… 西早稲田1丁目1番地、2番地… 西早稲田2丁目1番地、2番地… 西早稲田3丁目1番地、2番地… 西早稲田4丁目1番地、2番地… 西早稲田5丁目1番地、2番地… とかなら、まだ分かりやすいだろうけど(高田馬場m丁目と西早稲田n丁目の遠近は度外視として) >>165 その問題は>>159 で解決してるんじゃないか? 厳密には、先頭/末尾の繋ぎが未チェックという問題が残っているが… 2.のソート時に繋ぎを意識したsortにして、5.から2.へ行く前に直前要素と先頭要素を比較する処理を入れてやれば良さそうだ >>170 >>153 ではaaa,bbb,cccが何度も登場してる そもそも、重複がなかったら、この質問は成立しないわけで >>171 それなら >>164 のように完全ランダムにするか、 3つの順列をセットとして 3P3 = 3! = 6通りから、末尾の文字と異なる文字で始まるモノで並べて行くか 完全ランダムだと残り物にバラつきが出すぎる可能性はあるけど 3つの順列で心配なら a - b - a - c - b - c a - b - c - a - b - c a - b - c - b - a - c a - b - c - b - c - a (以下省略) とかいう組み合わせを事前に作っておいて並べて行けば良いんじゃね バラつき具合の判別方法は知らんけど… 難しく考えすぎ 期待値に達するまで適当に振り分続ければいいだけ あとはその振り分けアルゴリズムが完全なランダムより賢ければ賢いだけコストが減る それを十分な状態になるまで追求すればいいだけ >>173 振り分けアルゴリズムの質問にその回答はなかろうて 「ナップサック問題」でも「全検索」は解の1つ エレガントではないかも知れないが、不正解という評価は誤り https://postd.cc/programmer-competency-matrix/ いきなり「レーベンシュタイン距離」と書いたとしても、他の人に理解されるとは限らん… 元質問者の場合はそうではないようだが こういう時は発送を逆転させる つまり良い分配アルゴリズムではなく、悪い整頓アルゴリズムを考える それで思いつくものを現実的な妥協点として良いと思う そういう意味ではランダムは悪くない 最初ランダムで走査して固まってる部分があったら適当に入れ替えてほぐす その繰り返しはどうだろうか? >>171 配列を splice() すれば良かろう 人にケチ付けてる暇があったら改善案出せよ無能 >>175 > 「ナップサック問題」でも「全検索」は解の1つ 「全検索 アルゴリズム」でぐぐっても見つからないが、もしかして「全探索」といいたかったのか? 全探索は「全ての組み合わせを試す」というもので、1000個の要素なら、最大試行回数=1000*999*998*...*3*2*1回となる力業 > エレガントではないかも知れないが、不正解という評価は誤り >>173 は「失敗したらやり直す」なので「全探索」とは違う 「振り分けアルゴリズム」に欠陥があれば、永久に失敗するので無限ループとなるし、アルゴリズムの成功確率が低ければ、試行回数は全探索よりも高くなる可能性が高い アルゴリズムに欠陥がない場合の最大試行回数は「1〜∞回」で運要素の高い方法 >>180 >>170 は > Set 使えば登場回数ゼロはありえないだろ とケチをつけたが、>>159 の回答を咀嚼すれば「登場回数」がそういう意味ではないことが分かるはずなので、それを指摘しただけ > 人にケチ付けてる暇があったら改善案出せよ無能 これは>>170 にいいたい >>181 >>173 は失敗したらやり直すのとは違うでしょ 遺伝的アルゴリズムと言ったら大げさだけど、モンテカルロ法で円周率を求めるのと同じくこの手のアルゴリズムは運任せでも現実的には収束していくんだから この手のアルゴリズムで不運が重なって想定よりも遥かに時間がかかる事を想定するのは、計算中にマシンが突然クラッシュしたりビットアップセットを起こしたりするのを心配するようなもの 最善でなくても一定の期待値を越えれば良いというときには良いアルゴリズムだよ >>181 1000は無いだろ 選択肢3つなんだから、たとえば1002個あったと仮定して、 同じ選択肢が決して連続しないのは大前提だろ 「できるだけ似てない文字列が隣合って並ぶように」って言ってんだから ケチばっか付けた挙句完全に誤ったこと書いてんじゃねえよ無能 ランダムに(または、ルールで制限しつつ)シャッフルして、 許容回数実行して、最善のものを選ぶ 最良のアルゴリズムを考えなくて良いから、 これが簡単で現実的で、そこそこ良い結果も得られる 要約すると 「できるだけ似た文字列が並ばないように」並び替えるアルゴリズムは思いつかないので 「ランダムに」並び替えるアルゴリズムでごまかしましょう >>184 結局、「全検索」のアルゴリズムを説明出来てない オレオレ用語を使わず、一般的な用語を書け 重複しない整数からなる4個以上の数列がある 例 1,2,3,4 これを並び替えて、隣り合う数の差が2以上である 並びとして次のようなものが考えられる 例 3,1,4,2 この数列が大量(例1 000個)にあるとき 隣り合う数の差が2以上に並び替えるアルゴリズムを考えよ また、隣り合う数の差の合計が最大になるアルゴリズムを考えよ アルゴリズムは高速であればあるほどよい 参考 隣り合う数の差の合計 3,1,4,2,5 の場合 2+3+2+3=10 4,2,5,1,3 の場合 2+3+4+2=11 >>187 逆でしょ 何が効果的か根拠も自信もなくて抽象的で実装できるかもわからない理論よりも ランダム探索でそこそこの結果を得ればいいと割り切る方が誤魔化さずハッキリしてるでしょ 1000個もいらんかね? 100個でも総当たりするのは十分しんどいレベルになるな 9.3326215443944152681699238856267e+157 >>190 そこそこ結果でOKなんて誰が言ったんですか? 1文字目で分類して最も多いものから順に均等に振り分ける その振り分け範囲内で2文字について同じように振り分けなおす 短文字ではこれを繰り返すのが最もコストが少なく並び替えられる >>189 質問は文字列だぞ? 簡単に数値に置き換えられ無いだろ >>189 0,500,1,501…なら499001 500,0,999,1,998,2…なら499999 ちなみにランダムで1000回試行で350000、100000回試行で360000程度 最低限何らかのアルゴリズムは無いときつくね? うわ マウンターばっかり 屁理屈こねまくって重箱の隅をつつきまくって 1行もコードも何も具体的なモノ書かずに 良く上から目線で書き込めるもんだ >>153 における > 文字列が入った配列(例として["aaa","aaa","bbb","bbb","ccc","ccc",…以下1000個ほど続くとする]) の構成要素が、具体的に ["aaa,""bbb,", "ccc" ...] 以外何があるか回答がない 釣り確定だな >>198 どんな文字列が入ってきてもって意味だろ 答えられないからって釣り認定するなよ >>199 板違い そういうのは計算機科学の研究室でやれば良いし Web制作との関連性も皆無 このスレの質問者は、回答があってもガン無視する奴ばかり 回答に意見を返して、前向きに取り組もうとする質問者はいないのか? 「自ら学ぶ質問者」を見たい >>203 それ以前にまともな回答でてねーじゃん 呆れてどっか行ったんじゃね >>204 君のようなコミュニケーションを拒否する人は、質問者に向いてないと思うよ 皆が色んなアルゴリズムを比較しやすいように基盤を作ってみた https://playcode.io/371956?tabs=script.js,preview,console 条件として、ある文字列のある位置の文字を取り出したときに、 同じ位置に同じ文字がある文字列がどれだけ近いかを全ての文字列の全ての文字で見ることで 似た文字列がどれだけ近くに固まっていないかの値を求めるようにした つまりABCDのよこにBADCがあってもそれは限りなく無関係同士の文字列と評価されるので そこが気になる人は評価計算部を変えて欲しい それと各文字の出現頻度はだいたい均一と仮定している(Aが極端に多くてBが極端に少なかったりしない)ので、 そこも生成部に手を入れて変えて欲しい また、距離に対して比例して評価していてすぐ隣と、1つ開いている状態はあまり違わないと評価するのでそこも手の入れどころ とりあえず様々に実験して気がついたこととしては、 ・各文字の出現頻度、組み合わせ方に偏りがない ・文字種類数が少ない ときはそもそも、どのように並び替えても似た文字列が近くに来てしまう状況になる 例えば上の例であったような、ABCのように単純な文字列はまさにそうで、 何か組み合わせに特別な偏りが無い限り、一回ランダムにばらした状態でほぼ限界に近い 「まともな回答ない」で諦めるか、「質問の要件を追記して更なる回答を募ろう」と踏ん張るか、が判断の分かれ目 実際、要件をまともに書いた質問はほとんどない 要件をまとも書けるくらいの質問をする人ならば、 自力で解答を見つけることが出来る。 質問しようと文章でまとめてみたり、ggrks呼ばわりされないように検索してみたりしているうちに 解決方法が見つかることが稀によくある >>209 >質問しようと文章でまとめてみたり、 質問しようと文章以外の、例えば数式でまとめてみたりすることはあるのか? とつっこんでみたり 「AしたりBしたり」と書いてあるのを「AとBしかしない」と解釈するひとって… 結局、質問者が回答を煽って、魚を期待するスレなのか 定性的発言で申し訳ないが… …内容的には良くなったと思うよ… マウンターと暴言のオンパレードだった訳だしね ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる