전산학과에는 2학년을 대상으로 열리는 CS202 Problem Solving 라는 과목이 있다.
 나도 학교 다닐 때, 학과 동기 친구들과 같이 수업을 들었었다.

 이 과목은... 숙제 -> 강의 -> 숙제 -> 강의 -> 숙제 -> 강의 무한 러쉬가 있다.
 숙제로 나오는 문제는 주로 IOIACM ICPC에 출제 되는 문제와 유사하다.

 마지막에는 프로젝트가 있는데
 보드게임 같은걸 하나 정해서 조별로 AI 대결을 한다.

 쓰다보니 서론이 너무 길어졌는데..
 학과 동기였던 기곤이가 이 과목 CS202 PS 조교를 하면서.. 
 기말 프로젝트로 테트리스를 했다고 한다.

 자세한 내용은 기곤이가 쓴 글에 있다.



 나도 퇴근 후 저녁시간에 잠깐 짬을 내어서 간단한 AI를 만들어 보고,
 옆에 테트리스를 잘하시는 분이랑 대결을 주선했다.







아직 Hold 기능도 구현이 안되어 있고...
디버깅을 많이 못 해봐서 튜닝이 덜 된 상태이다.

놓을 곳이 마땅치 않으면. 자폭하는 현상이 발생하고 있고,
콤보도 쓰리콤 정도에 최적화 되어 있어서 잘 못하고 있다.


아직까진 사람도 잘 못 이기고 있음. ㅠㅠ( 잘하는 사람이긴 하지만;ㅋ )
조만간 Hold 구현해서 다시 붙어볼 생각ㅋ


'내 생산물' 카테고리의 다른 글

[AI] 테트리스 AI v0.5  (2) 2010/08/28
F#, Project Euler - Problem #4 (2)  (0) 2009/05/22
F#, Project Euler - Problem #12  (0) 2009/05/12
F#, Project Euler - Problem #20  (0) 2009/05/12
F#, Project Euler - Problem #5  (0) 2009/05/11
F#, Project Euler - Problem #4  (2) 2009/05/11
F#, Project Euler - Problem #3  (0) 2009/05/10
Posted by U_Seung

 C++ 표준 문서 N2798의 14.3.1의 4번째 항목을 보면. 위와 같은 내용이 있다.
 ( 더 최신 문서인 N3092 에는 위 항목이 빠져 있음. )

 해석을 해서 옮기고 싶지만..
 괜히 혼란만 가중 시킬것 같아서.. 패스하고..

  아무튼 자세히 보면.. 정말 해괴망측한 부분이 있는데
  그 부분을 조금 더 살펴 보자면... 아래와 같은 코드가 있다고 했을 때

    1 template<typename T>

    2 struct X

    3 {

    4     static void f(const T& t)

    5     {

    6         t.a = 100;

    7     }

    8 };

 
 함수 f()는 const로 받은 변수의 값을 변경하고 있다.
 얼핏 보아도 이상한 코드다.
 (  아직 template가 instantiation이 되지 않아서 이 부분만 가지고는 컴파일 에러가 나지 않는다.)


 코드를 조금 더 작성해 보면..

    9 struct S

   10 {

   11     int a;

   12 };

   13 

   14 int main(int argc, char* argv[])

   15 {

   16     S s;

   17     X<S>::f(s);

   18 


이제 아마 Line 17에서 readonly인 a에 값을 넣으려고 했다고 해서 컴파일 에러가 날 것이다.
근데 C++0x 부터는 이를 회피할 수 있는 아주 간단한 방법이 생겼다.
단순히 ' & ' 하나만 추가 하면 된다.


   16     S s;

   17     X<S&>::f(s);

   18 

   19     cout << s.a << endl;


 이제 함수 f()는 
 void X::f(S& t) 와 같이 파라미터의 타입이 정해지고, const 속성을 날려버리게 된다. 우왕ㅋ굳ㅋ
 ( 물론, 이렇게 만들어서 const 속성을 없애서 쓰자는 이야기는 절대 아님...)



 C++의 복잡도는.. 날이 갈 수록 올라가고 있다.


끝으로 Quiz..
각각 파라미터 타입은 어떻게 될까요? ( Line 11 ~ Line 29 )
참고로 gcc 4.5.0과 VS2010 에서 둘다 돌려봤는데. 같게 나왔습니다.

    1 template<typename T>

    2 struct R

    3 {

    4     static void A(T&){}

    5     static void B(const T&){}

    6     static void C(T&&){}

    7     static void D(const T&&){}

    8 };

    9 

   10 {

   11     R<int&>::A(?)

   12     R<int&>::B(?)

   13     R<int&>::C(?)

   14     R<int&>::D(?)

   15 

   16     R<const int&>::A(?)

   17     R<const int&>::B(?)

   18     R<const int&>::C(?)

   19     R<const int&>::D(?)

   20 

   21     R<int&&>::A(?)

   22     R<int&&>::B(?)

   23     R<int&&>::C(?)

   24     R<int&&>::D(?)

   25 

   26     R<const int&&>::A(?)

   27     R<const int&&>::B(?)

   28     R<const int&&>::C(?)

   29     R<const int&&>::D(?)

   30 }



Posted by U_Seung

{Quiz}. 다음 중 l-value는 몇 개일까요? (line 12 ~ line 29 중에서.. )


    1 int* pa = &a;

    2 const int* pb = &a;

    3 

    4 int fa() { return 1; }

    5 const int fb() { return 2; }

    6 

    7 int& fra() { return a; }

    8 const int& frb() { return b; }

    9 

   10 void main_rvalue()

   11 {

   12     RVALUE_CHECKER(1);

   13     RVALUE_CHECKER(int(1));

   14     RVALUE_CHECKER(new int(1));

   15     RVALUE_CHECKER(*(new int(1)));

   16 

   17     RVALUE_CHECKER(++a);

   18     RVALUE_CHECKER(a++);

   19     RVALUE_CHECKER(a + 1);

   20 

   21     RVALUE_CHECKER(++*pa);

   22     RVALUE_CHECKER(*pa++);

   23     RVALUE_CHECKER(*pa + 1);

   24 

   25     RVALUE_CHECKER(fa());

   26     RVALUE_CHECKER(fb());

   27 

   28     RVALUE_CHECKER(fra());

   29     RVALUE_CHECKER(frb());

   30 }



참고로...
#1.  l-value, r-value 구분은 expression에 대한 구분임 (type 이라던지 하는 건 관계가 없음.)
#2.  ++a (line 17) 은 l-value 이지만, a++ (line 18)은 rvalue임.


Posted by U_Seung