0)
배치도의 배치번호에 일일이 for 문 대입하던 문제를

보기 편하게, 좀 더 적은 코드로
줄일수 있지 않을까..라는 생각에서 시작된 내용입니다.

(코믹월드의 배치도를 수정하기를 몇년간(응?) 하다가.. = =..)

..

1)

<DIV id=output130609_1></DIV>
<SCRIPT>

(function() {

 function len2(v) {
  var ov = '' + v;

  if (ov.length < 2) ov = '0' + ov;

  return ov;
 }

 function listMaker(charv, lstring) {
  var last = 0,
      posting = 0,
      dGet = /[-\d]+/,
      eGet = /[^-\d]+/,
      ov = [],
      oo, i, j, dv, ev, dp, ep;

  while (dGet.test(lstring) || eGet.test(lstring)) {

   dv = dGet.exec(lstring);
   ev = eGet.exec(lstring);

//   if (dv) dp = dv.lastIndex - dv[0].length;
//   else dp = ev.lastIndex + 1;
//   if (ev) ep = ev.lastIndex - ev[0].length;
//   else ep = dv.lastIndex + 1;
   if (dv) dp = lstring.indexOf(dv[0]);
   else dp = lstring.indexOf(ev[0]) + ev[0].length + 1;
   if (ev) ep = lstring.indexOf(ev[0]);
   else ep = lstring.indexOf(dv[0]) + dv[0].length + 1;

   if (dp < ep) {
    oo = dv[0];
    if (posting) {
     if ((last - oo) <= 0) {
      for (i = last + 1, j = 50;
      (i - oo) <= 0; i++) {
       ov.push(charv + (charv.length > 3 ? i : len2(i)));
       last = i;

       if (--j < 0) break;
      }
     } else {
      for (i = last - 1, j = 50;
      (i - oo) >= 0; i--) {
       ov.push(charv + (charv.length > 3 ? i : len2(i)));
       last = i;

       if (--j < 0) break;
      }
     }

     posting = 0;
    } else {
     ov.push(charv + (charv.length > 3 ? (oo) : len2(oo)));
     last = parseInt(oo);
    }

//    lstring = lstring.substring(dv.lastIndex, lstring.length);
    lstring = lstring.substring(lstring.indexOf(dv[0])+dv[0].length, lstring.length);
   } else {
    oo = ev[0];

    if (oo == '..') posting = 1;
    else posting = 0;

//    lstring = lstring.substring(ev.lastIndex, lstring.length);
    lstring = lstring.substring(lstring.indexOf(ev[0])+ev[0].length, lstring.length);
   }
  }
  return ov;
 }

 // document.write(listMaker('D', '17..15,14-1,14..1'));
 document.getElementById('output130609_1').innerHTML = listMaker('D', '17..15,14-1,14..1');

})();

</SCRIPT>



-- 새 창에 샘플 보여주기.. --

..

2)



..

3)
함수정의는

한 블럭에 대표기호가 있고 (요것도 묶을 수 있었지만, .. 일단 묶지 않았습니다..)
대표기호 뒤로 부스번호가 따라붙는다..입니다.

부스번호가 한두개가 아니라서
".." 이라는, 알아서 연결하라는 기호도 사용했구요..

..

4) 
접근 방식은

"-" 포함한 숫자(?)와 (배치도블럭 내 배치번호) -- dGet
그렇지 않는 문자를 구별하는 겁니다. (배치번호간 구분용..) -- eGet

연결된 번호는 ".." 으로 하고, --  posting=1
나머지는 모두 번호분리..로 처리한거죠. -- else posting=0

번호가 정순이든 역순이든 일단 받을 수 있게 처리를 했습니다. -- if ((last-oo)<=0)  

처리한 문장(?)들은 다음 문장을 처리하기 위해(?), 잘라주고 
  -- lstring = lstring.substring(lstring.indexOf(dv[0])+dv[0].length, lstring.length) 
  -- lstring = lstring.substring(lstring.indexOf(ev[0])+ev[0].length, lstring.length)

그렇게 다음번으로 넘어갑니다.

..

last 가 for 문 안에 있는 것은..
표시한 번호와 연동하겠다..라는 뜻으로 보시면 됩니다.

.. 혹시나..싶은 overflow 를 방지하기 위해
부스번호 처리하는 루프에 j 를 넣어, 체크하도록 했습니다. -- if (--j < 0) break;

..

처리할 번호가 없다면 -- while (dGet.test(lstring) || eGet.test(lstring))
루프 종료하고,

받은 부스 번호들을 array 로 출력하여
표시한 결과입니다.

..

5)
변수중에 dGet 이나 eGet 같은 공통값은 밖으로 빼는게 맞겠지만..
.. 뭐, 그런 사소한(?) 건 일단 접어두고.. (대형프로젝트가 아니라서요.. 메모리 누수가 사소한이라니 = =..)

..

곰곰히 생각해보니, dGet 과 eGet 을 하나로 통일시킬 수도 있었네요.
그렇게 하면 if 를 덜 사용할 수도 있으니까요.

/([-\d]*)([^-\d]*)/

이렇게 하면 $1 의 값이 있느냐 없느냐로 구별 할 수 있겠죠..? ( 이제서야 생각났다는 것이 좀 아쉽습니다. )
( /([-\d]+)([^-\d]+)/ 의 경우에는, 찾을 수 없을 버그가 있어서 내용은 바꿨습니다.. )

..

또 하나,
for 문에 (i-oo)>=0 이나 (i-oo)<=0 부분에 대해 
"=" 을 쓰지않을 수 있는 부분인데,

그렇게되면 " posting = 0 " 아래쪽에 있는 " } else { .. } " 가 " .. " 으로 바뀔 수 있겠죠.
거기에 따라서 for 문 내에 있는 last=i 도 생략할 수 있을거구요..

.. 제3자..는 아니지만,
이렇게 나중에 볼 때 생각나는 방법론이 하나하나 새롭기만하군요 ㅜ.ㅜ..

..

6) 덧..

chrome 과 firefox 에서 regexp.lastIndex 사용 안된다는 걸 매번 깜빡 하네요..
string.indexOf(regexp[0])+regexp[0].length 로 바꿨습니다. ㅜ.ㅜ..  

..


..

wantHate killofki@.








Posted by killofki
,