JavaScriptを勉強している初心者です。
自分のスキルでは限界なのでどなたかご教授いただけないでしょうか。
###前提・実現したいこと
配列:10×10マス があり、下記の「◎」箇所にフラグが立ったら
次にその周囲、その次はそれのまた周囲…といったプログラムを作りたいのですが、
どのように書けば効率がよい(コードの簡潔さ・パフォーマンス)のか皆目見当がつきません・・・
何かアルゴリズムや効率の良い書き方をご存知の方、
どうかお知恵を貸してください。
よろしくお願いいたします。
###図解
◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◎◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ↓↓↓↓ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◎◎◎◯◯◯◯◯ ◯◯◎◯◎◯◯◯◯◯ ◯◯◎◎◎◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ↓↓↓↓ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◎◎◎◎◎◯◯◯◯ ◯◎◯◯◯◎◯◯◯◯ ◯◎◯◯◯◎◯◯◯◯ ◯◎◯◯◯◎◯◯◯◯ ◯◎◎◎◎◎◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯ ◯◯◯◯◯◯◯◯◯◯
###コード
下準備までで挫折してしまいました。
ここからどのようにして効率良く基準フラグの周囲、そのまた周囲を求めていけば良いのかがわかりません。。。
https://codepen.io/bakemon-gogogo/pen/zEvObR
html
1 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5<meta charset="utf-8"> 6<style> 7body { 8 text-align: center; 9 cursor: pointer; 10} 11div { 12 margin: 50px auto; 13 font-size: 30px; 14 letter-spacing: .5em; 15 user-select: none; 16} 17</style> 18<script> 19 20var map = []; 21var col = 10; // マップ:列 22var row = 10; // マップ:行 23var set = { 24 col: 5, // 基準フラグの位置:6列目 25 row: 3 // 基準フラグの位置:4行目 26}; 27var count = 0; 28var wrap; 29 30// 初期化 31function init () { 32 33 // HTML出力枠 生成 34 wrap = document.createElement('div'); 35 document.body.appendChild(wrap); 36 37 // 配列のマップ生成(縦×横:10マス) 38 for (var i=0; i<col; ++i) { 39 map[i] = []; 40 for (var j=0; j<row; ++j) { 41 map[i][j] = '◯'; 42 } 43 } 44 45 test(count); 46 47 // クリックイベント 48 window.addEventListener('click', function() { 49 count = check('◎') ? (count + 1) : 0; 50 test(count); 51 }); 52 53} 54 55// 基準フラグの周囲を調査 56function test (size) { 57 58 // 縦横最小・最大範囲4点を求める 59 var rect = { 60 xmin: set.row - size, 61 xmax: set.row + size, 62 ymin: set.col - size, 63 ymax: set.col + size 64 }; 65 66 // マップ全体から基準フラグの周囲を走査 67 for (var i=0; i<col; ++i) { 68 for (var j=0; j<row; ++j) { 69 70 // 該当するマス目にフラグ付与 71 map[i][j] = ((j == rect.xmin || j == rect.xmax) && (rect.ymin <= i && i <= rect.ymax)) || ((i == rect.ymin || i == rect.ymax) && (rect.xmin <= j && j <= rect.xmax)) ? '◎' : '◯'; 72 73 } 74 } 75 76 draw(); 77 78} 79 80// マップ全体からフラグを検索 81function check (string) { 82 83 for(var i in map){ 84 for(var j in map[i]){ 85 if (map[i][j] == string) { 86 return true; 87 break; 88 } 89 } 90 } 91 return false; 92 93} 94 95// HTMLに描画 96function draw () { 97 98 var html = ''; 99 100 for (var i=0, l=map.length; i<l; ++i) { 101 for (var j=0, m=map[i].length; j<m; ++j) { 102 html += map[i][j]; 103 } 104 html += '<br>'; 105 } 106 107 wrap.innerHTML = html; 108 109} 110 111document.addEventListener('DOMContentLoaded', init); 112 113</script> 114</head><body></body></html> 115 116
ご自身で書かれたコードを質問文に追記されたほうが回答を得られやすいと思います。
補足願います。『どのように書けば効率がよいのか』←この場合の効率とは、計算量と考えてよいですか? また、どの程度の効率のコードをお求めなのか不明ですので、効率がよくないコードの例をご提示いただけますか?
言葉足らずで申し訳ありません。『どのように書けば効率がよいのか』というのは議題のような場合、方程式なるものがあるのかなと思い、「効率的なコード=アルゴリズム」と記載いたしました。コード例を掲載できればよいのですが、どのように求めるのかも皆目検討がつかない状況でして・・・。
丸投げですね。。。高々25の項の調査なので、べた書きでも良いです。まず、それが書けてからかと。
@te2ji さん
すみません。。自分なりにもう少し考えてコード書いてみます。
ちなみにですが、今のままだと「何を調査するのか?」「配列はどのようなフォーマットか?」等の仕様が明確でないので、コードの提示をすることは出来ません。そのあたりも考慮したご自身のコードがあれば、回答がつきやすいかと。
@te2ji さん すみません。自分なりに途中まで書いたコードですが…掲載いたしました。https://codepen.io/bakemon-gogogo/pen/zEvObR