tetris.cpp

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <windows.h>

enum { BLACK, DARK_BLUE, DARK_GREEN, DARK_SKY_BLUE, DARK_RED, DARK_VIOLET, DARK_YELLOW, GRAY, DARK_GRAY, BLUE, GREEN, SKY_BLUE, RED, VIOLET, YELLOW, WHITE};


#define BOARD_WIDTH 10

#define BOARD_HEIGHT 22

#define CLOCKWISE           0

#define COUNTER_CLOCKWISE   1

#define MAX_BLOCK_LIST      5

#define LATENCY             200

typedef struct _TBlock{

    int type;

    int len;

    int state;

    COORD vector[4];

}TBlock;


int start_x = 1, start_y = 2;

char board_buffer[BOARD_HEIGHT][BOARD_WIDTH];

char board[BOARD_HEIGHT][BOARD_WIDTH];

TBlock block_list[MAX_BLOCK_LIST];

int statitics[7];

unsigned int gScore = 0;

unsigned int gLines = 0;


unsigned int gSpeed = 1000;

unsigned int gMoveDelay = 100;

unsigned int gRotateDelay = 80;

unsigned int gSpaceDelay = 220;

clock_t gLatency = 0;

int tspin_weight = 1;

bool tspin_opt = true;

bool rotation_opt = CLOCKWISE;

//clock_t gMovedBlock = 0;


enum { BLANK, I_BLOCK, J_BLOCK, L_BLOCK, O_BLOCK, S_BLOCK, T_BLOCK, Z_BLOCK};


void setColor(int ForeColor, int BackColor)

{

    int color = ForeColor | (BackColor << 4);

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);

}

void gotoxy(int x, int y)

{

    COORD coord = {x, y};

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

void cursorToggle(BOOL _cursor)

{

CONSOLE_CURSOR_INFO curInfo;

curInfo.bVisible=_cursor;

curInfo.dwSize=1;

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);

}

void drawTile(int tile)

{

    static char fcolor_set[10] = {BLACK, RED, BLUE, WHITE, YELLOW, VIOLET, SKY_BLUE, GREEN };

    static char bcolor_set[10] = {BLACK, DARK_RED, DARK_BLUE, BLACK, DARK_YELLOW, DARK_VIOLET, BLACK, DARK_GREEN };

    setColor(fcolor_set[tile], bcolor_set[tile]);

    printf("■");

    setColor(GRAY, BLACK);

}

void drawScore(int x, int y){

    setColor(YELLOW,BLACK);

    gotoxy(x,y);

    printf("Score :%6d",gScore);

    gotoxy(x,y+2);

    printf("Lines :%6d",gLines);

}

void drawFrame()

{

    int x,y;

    setColor(WHITE,BLACK);

    for(y=0; y<BOARD_HEIGHT; y++){

        gotoxy(2*(start_x-1), y+start_y);

        printf("│");

        gotoxy(2*(start_x+BOARD_WIDTH), y+start_y);

        printf("│");

    }

    gotoxy(2*(start_x-1), y+start_y);

    printf("└");

    gotoxy(2*(start_x+BOARD_WIDTH), y+start_y);

    printf("┘");

    for(x=0; x<BOARD_WIDTH; x++){

        gotoxy(2*(start_x+x), start_y+BOARD_HEIGHT);

        printf("─");

    }

    setColor(WHITE, BLACK);

}

void drawInfo(){

    int x=44,y=6;

    gotoxy(x, y); printf("      T-spin : %s", tspin_opt?"possible":"impossible");

    gotoxy(x,y+1);printf("  rotatation : %s", rotation_opt?"conuter-clockwise":"clockwise");

    gotoxy(x,y+2);printf("       speed : %d", gSpeed);

    gotoxy(x,y+3);printf("     m-delay : %d", gMoveDelay);

    gotoxy(x,y+4);printf("     r-delay : %d", gRotateDelay);

    gotoxy(x,y+5);printf("     d-delay : %d", gSpaceDelay);

    gotoxy(x,y+6);printf("     latency : %d", LATENCY);

}

void drawDebug(char board[BOARD_HEIGHT][BOARD_WIDTH], int x_pos){

    int x,y;

    for(y=0; y<BOARD_HEIGHT; y++){

        gotoxy(2*(start_x+x)+x_pos+BOARD_WIDTH, start_y+y);

        for(x=0; x<BOARD_WIDTH; x++){

            if( board[y][x]!= BLANK )

                setColor(RED, BLACK);

            else

                setColor(GRAY, BLACK);

            printf("%02d", board[y][x]);

        }

    }

    setColor(GRAY, BLACK);

}

void drawBoard()

{

    int x,y;

    for(y=0; y<BOARD_HEIGHT; y++){

        for(x=0; x<BOARD_WIDTH; x++){

            if( board[y][x] != board_buffer[y][x] ){

                gotoxy(2*(start_x+x), start_y+y);

                drawTile(board_buffer[y][x]);

                board[y][x] = board_buffer[y][x];

            }

        }

    }

}


void drawBlock(TBlock *block)

{

    int x = block->vector[0].X, y = block->vector[0].Y;

    int i=0;

    gotoxy(2*(start_x+x),start_y+y);

    drawTile(block->type);

    for(i=1; i<block->len; i++){

        x = block->vector[0].X+block->vector[i].X;

        y = block->vector[0].Y+block->vector[i].Y;

        gotoxy(2*(start_x+x),start_y+y);

        drawTile(block->type);

    }

}


void eraseBlock(TBlock *block)

{

    int x = block->vector[0].X, y = block->vector[0].Y;

    int i=0;

    gotoxy(2*(start_x+x),start_y+y);

    drawTile(BLANK);

    for(i=1; i<block->len; i++){

        x = block->vector[0].X+block->vector[i].X;

        y = block->vector[0].Y+block->vector[i].Y;

        gotoxy(2*(start_x+x),start_y+y);

        drawTile(BLANK);

    }

}

void drawPreview(int n){


    TBlock block;

    int i=0;

    for(i=0; i<n; i++){

        eraseBlock(&block_list[i]);

        block_list[i].vector[0] = {BOARD_WIDTH+start_x+3, i*3};

        drawBlock(&block_list[i]);

    }

}

void makeBlock(int nBlock, TBlock *block)

{

    static COORD block_init[7][3] = {

        {   // I_BLOCK

            {-1,0},{1,0},{2,0},

        },

        {   // J_BLOCK

            {-1,0},{1,0},{1,1},

        },

        {   // L_BLOCK

            {-1,0},{1,0},{-1,1},

        },

        {   // O_BLOCK

            {1,0},{0,1},{1,1},

        },

        {   // S_BLOCK

            {1,0},{-1,1},{0,1},

        },

        {   // T_BLOCK

            {-1,0},{1,0},{0,1},

        },

        {   // Z_BLOCK

            {-1,0},{0,1},{1,1},

        },

    };

    int i=0;

    block->vector[0] = {2*(start_x+BOARD_WIDTH)+4, 7*3};

    block->len = 4;

    block->type = nBlock;

    for(i=0; i<3; i++){

        block->vector[i+1] = block_init[nBlock-1][i];

    }

}

void drawStatitic(void){


    static char fcolor_set[10] = {BLACK, RED, BLUE, WHITE, YELLOW, VIOLET, SKY_BLUE, GREEN };

    static char tetrinomix[7] = {'I','J','L','O','S','T','Z'};

    int i=1;

    for(i=0; i<7; i++){

        gotoxy(2*BOARD_WIDTH+6,17+i);

        setColor(fcolor_set[i+1],BLACK);

        printf("%c -%3d",tetrinomix[i],statitics[i]);

    }

}

void generate_block(TBlock *block)

{

    static TBlock buf[MAX_BLOCK_LIST];

    memcpy(buf,block_list,sizeof(TBlock)*MAX_BLOCK_LIST);

    *block = block_list[0];

    eraseBlock(block);

    block->vector[0] = {4, 2};

    statitics[block->type-1]++;

    memcpy(block_list,buf+1,sizeof(TBlock)*(MAX_BLOCK_LIST-1));

    makeBlock(rand()%7+1, &block_list[MAX_BLOCK_LIST-1]);

    drawStatitic();

}

void moveDown(int y, int n){

    memcpy( board_buffer[y+n], board_buffer[y], sizeof(char)*10 );

    memset( board_buffer[y], 0, sizeof(char)*10 );

}

void destoryLine(){

    static int line[4];

    int x,y;

    int score;

    static int n=0,i=0;

    bool flag = true;

    for(i=0; i<n; i++){

        gotoxy(2*(BOARD_WIDTH+start_x)+4,line[i]+start_y);

        printf(" ");

    }

    n=0;

    for(y=BOARD_HEIGHT-1; y>=0; y--){

        flag = true;

        for(x=0; x<BOARD_WIDTH; x++){

            if(board[y][x] == BLANK){

                flag = false;

                break;

            }

        }

        if(flag)

            line[n++] = y;

    }

    for(i=0; i<n; i++){

        gotoxy(2*(BOARD_WIDTH+start_x)+4,line[i]+start_y);

        printf("<");

    }

    for(i=n-1; i>=0; i--){

        for(y=line[i]; y>0; y--){

            moveDown(y-1,1);

        }

    }

    if(n){

        gLines += n;

        score = 100*n*tspin_weight+(n==4?600:0);

        gScore += score;

        drawScore(2*BOARD_WIDTH+18,18);

        setColor(RED,BLACK);

        gotoxy(2*BOARD_WIDTH+22,19); printf("(+%4d)",score);

    }

    tspin_weight = 1;

}


bool isCrash(TBlock block){

    int i=0;

    int x,y;

    x = block.vector[0].X;

    y = block.vector[0].Y;


    if( board_buffer[y][x] != BLANK ){

        gotoxy(45,1);printf("point :%2d,%2d",x,y);

        return true;

    }

    if( x<0 || x>=BOARD_WIDTH || y<0 || y>=BOARD_HEIGHT ){

        gotoxy(45,1);printf("point :%2d,%2d",x,y);

        return true;

    }

    for( i=1; i<block.len; i++){

        x = block.vector[0].X;

        y = block.vector[0].Y;

        x += block.vector[i].X;

        y += block.vector[i].Y;

        if( board_buffer[y][x] != BLANK ){

            gotoxy(45,1);printf("point :%2d,%2d",x,y);

            return true;

        }

        if( x<0 || x>=BOARD_WIDTH || y<0 || y>=BOARD_HEIGHT ){

            gotoxy(45,1);printf("point :%2d,%2d",x,y);

            return true;

        }

    }

    return false;

}

bool checkCrash(TBlock block, int dir){

    switch(dir){

    case VK_RIGHT:

        block.vector[0].X++;

        break;

    case VK_LEFT:

        block.vector[0].X--;

        break;

    case VK_DOWN:

        block.vector[0].Y++;

        break;

    }

    return isCrash(block);

}

int rotate(TBlock *block){

    static COORD block_rotate[7][4][3] = {

        {   // I_BLOCK

            {{-1,0},{1,0},{2,0}},

            {{0,-1},{0,1},{0,2}},

            {{-2,0},{-1,0},{1,0}},

            {{0,-2},{0,-1},{0,1}}

        },

        {   // J_BLOCK

            {{-1,0},{1,0},{1,1}},

            {{0,-1},{-1,1},{0,1}},

            {{-1,-1},{-1,0},{1,0}},

            {{0,-1},{1,-1},{0,1}}

        },

        {   // L_BLOCK

            {{-1,0},{1,0},{-1,1}},

            {{-1,-1},{0,-1},{0,1}},

            {{-1,0},{1,0},{1,-1}},

            {{0,-1},{0,1},{1,1}}

        },

        {   // O_BLOCK

            {{1,0},{0,1},{1,1}},

            {{1,0},{0,1},{1,1}},

            {{1,0},{0,1},{1,1}},

            {{1,0},{0,1},{1,1}}

        },

        {   // S_BLOCK

            {{1,0},{-1,1},{0,1}},

            {{-1,-1},{-1,0},{0,1}},

            {{1,0},{-1,1},{0,1}},

            {{-1,-1},{-1,0},{0,1}}

        },

        {   // T_BLOCK

            {{-1,0},{1,0},{0,1}},

            {{0,-1},{-1,0},{0,1}},

            {{0,-1},{-1,0},{1,0}},

            {{0,-1},{1,0},{0,1}}

        },

        {   // Z_BLOCK

            {{-1,0},{0,1},{1,1}},

            {{1,-1},{1,0},{0,1}},

            {{-1,0},{0,1},{1,1}},

            {{1,-1},{1,0},{0,1}}

        },

    };

    static int a = 0;

    TBlock blockBuf = *block;


    int state = (block->state+1)%4;

    int type = blockBuf.type;

    int i=0;

    for(i=1; i<blockBuf.len; i++){

        blockBuf.vector[i] = block_rotate[type-1][state][i-1];

    }

    if(!isCrash(blockBuf)){

        blockBuf.state = state;

        *block = blockBuf;

        gotoxy(27,0); printf("rotate : success");

        return 1;

    }

    else{

        blockBuf.state = state;

        gotoxy(27,0); printf("rotate : fail   ");


        if( type == T_BLOCK && checkCrash(blockBuf, VK_DOWN)){

            if( rotation_opt == CLOCKWISE && state == 3 ){

                blockBuf.vector[0].X--;

                blockBuf.vector[0].Y += 2;

            }

            else if( rotation_opt == CLOCKWISE && state == 2){

                blockBuf.vector[0].X--;

                blockBuf.vector[0].Y++;

            }

            else if( rotation_opt == COUNTER_CLOCKWISE && state == 1){

                blockBuf.vector[0].X++;

                blockBuf.vector[0].Y += 2;

            }

            else if( rotation_opt == COUNTER_CLOCKWISE && state == 2){

                blockBuf.vector[0].X++;

                blockBuf.vector[0].Y++;

            }

            if(!isCrash(blockBuf)){

                blockBuf.state = state;

                *block = blockBuf;

                setColor(RED,BLACK);

                gotoxy(25,0); printf("rotate : T-spin");

                tspin_weight = 3;

                setColor(GRAY,BLACK);

                return 1;

            }

        }


    }

    gotoxy(27,1); printf(" state : %d,%2d", state,a++);

    gLatency = LATENCY;

    return 0;

}

int key_handler(){

    static char *cKey[2]={"down","up  "};

    SHORT key;

    int nKey;

    static int vkey[] = {VK_ESCAPE,VK_SPACE,VK_LEFT,VK_RIGHT,VK_DOWN,VK_UP};

    for(nKey=0; nKey<6; nKey++){

        key = GetAsyncKeyState(vkey[nKey]);

        gotoxy(60,0); printf("key : %s",cKey  [(key&0x8000)>0?0:1]);

        if( 0x8000 & key ){

            return vkey[nKey];

        }

    }

    return 0;

}


int key_wait(){

    static clock_t moveCooldown = 0;

    static clock_t spaceCooldown = 0;

    static clock_t rotateCooldown = 0;

    static clock_t begin = clock();

    static clock_t end = clock();

    static clock_t latency = 0;

    int key = 0;

    gotoxy(45,2); printf("begin :%5d", begin);

    gotoxy(45,3); printf("  end :%5d", end);

    while( (end-begin) < gSpeed+gLatency ){

        end = clock();

        gotoxy(60,2); printf("time :%5d", (int)end);

        gotoxy(60,3); printf("tick :%5d ", (int)(end-begin));

        if( clock() - moveCooldown > gMoveDelay ){

            key = key_handler();

            moveCooldown = clock();

        }

        if( key == VK_UP ){

            if( clock() - rotateCooldown < gRotateDelay ){

                key = 0;

            }

            else{

                rotateCooldown = clock();

            }

        }

        if( key == VK_SPACE ){

            begin = clock();

            end = clock();

            if( clock() - spaceCooldown < gSpaceDelay ){

                key = 0;

            }

            else{

                spaceCooldown = clock();

            }

        }

        if(key!=0){

            gLatency = 0;

            return key;

        }

    }

    begin = clock();

    end = clock();

    gLatency = 0;

    return VK_DOWN;

}

void solid(TBlock block){

    int x = block.vector[0].X, y = block.vector[0].Y;

    int i=0;

    int type = block.type;

    board_buffer[y][x] = type;

    for(i=1; i < block.len; i++){

        x = block.vector[0].X+block.vector[i].X;

        y = block.vector[0].Y+block.vector[i].Y;

        board_buffer[y][x] = type;

    }

}

void initBlockList(){

    int i=0;

    for(i=0; i<MAX_BLOCK_LIST; i++){

        makeBlock(rand()%7+1, &block_list[i]);

        block_list[i].vector[0] = {BOARD_WIDTH+start_x+3, i*3};

    }

}

void drawGhost(TBlock block){

    static TBlock ghost;

    ghost = block;

    while(!isCrash(ghost)){

        ghost.vector[0].Y++;

    }

    ghost.vector[0].Y--;

    int x = ghost.vector[0].X, y = ghost.vector[0].Y;

    int i=0;

    gotoxy(2*(start_x+x),start_y+y);

    setColor(GRAY, BLACK);

    printf("■");

    for(i=1; i<block.len; i++){

        x = ghost.vector[0].X+ghost.vector[i].X;

        y = ghost.vector[0].Y+ghost.vector[i].Y;

        gotoxy(2*(start_x+x),start_y+y);

        printf("■");

    }

}

void eraseGhost(TBlock block){

    static TBlock ghost;

    ghost = block;

    while(!isCrash(ghost)){

        ghost.vector[0].Y++;

    }

    ghost.vector[0].Y--;

    int x = ghost.vector[0].X, y = ghost.vector[0].Y;

    int i=0;

    gotoxy(2*(start_x+x),start_y+y);

    setColor(GRAY, BLACK);

    printf("  ");

    for(i=1; i<block.len; i++){

        x = ghost.vector[0].X+ghost.vector[i].X;

        y = ghost.vector[0].Y+ghost.vector[i].Y;

        gotoxy(2*(start_x+x),start_y+y);

        printf("  ");

    }

}

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

{

    int x, y;

    srand(time(NULL));

    drawFrame();

    drawInfo();

    initBlockList();

    cursorToggle(false);

    for(y=0; y<20; y++){

        for(x=0; x<10; x++){

            board_buffer[y][x]=BLANK;

            board[y][x]=BLANK;

        }

    }


    TBlock curBlock;

    SHORT key;

    drawScore(2*BOARD_WIDTH+18,18);

    drawPreview(5);

    generate_block(&curBlock);

    drawGhost(curBlock);

    drawBlock(&curBlock);

    while(1){


        if(isCrash(curBlock)){

            break;

        }

//        drawDebug(board,-5);

//        drawDebug(board_buffer,16);

        if((key = key_wait())){

            gotoxy(60,1); printf("key : 0x%X",key);

            if( checkCrash(curBlock, key) ){

                if( key == VK_DOWN ){

//                    if(clock()-gMovedBlock < 900) continue;

                    solid(curBlock);

                    drawBlock(&curBlock);

                    drawBoard();

                    destoryLine();

                    drawBoard();

                    drawPreview(5);

                    generate_block(&curBlock);

                    drawGhost(curBlock);

                }

                gotoxy(45,0); printf("crash  ");

                continue;

            }

            else{

                gotoxy(45,0); printf("movable");

            }

            switch(key){

            case VK_UP:

                eraseBlock(&curBlock);

                eraseGhost(curBlock);

                rotate(&curBlock);

//                gMovedBlock = clock();

                break;

            case VK_RIGHT:

                eraseBlock(&curBlock);

                eraseGhost(curBlock);

                curBlock.vector[0].X++;

//                gMovedBlock = clock();

                break;

            case VK_LEFT:

                eraseBlock(&curBlock);

                eraseGhost(curBlock);

                curBlock.vector[0].X--;

//                gMovedBlock = clock();

                break;

            case VK_DOWN:

                eraseBlock(&curBlock);

                eraseGhost(curBlock);

                curBlock.vector[0].Y++;

//                gMovedBlock = clock();

                break;

            case VK_SPACE:

                eraseBlock(&curBlock);

                while(!checkCrash(curBlock,VK_DOWN)){

                    curBlock.vector[0].Y++;

                }

                eraseGhost(curBlock);

                solid(curBlock);

                drawBlock(&curBlock);

                drawBoard();

                destoryLine();

                drawPreview(5);

                generate_block(&curBlock);

                break;

            }

            drawBoard();

            drawGhost(curBlock);

            drawBlock(&curBlock);

        }

    }


    gotoxy(30,1);

    setColor(YELLOW,BLACK);

    printf(" - game over - ");

    gotoxy(0,21);

    setColor(GRAY,BLACK);

    system("pause>nul");

}



Posted by Нуеоп
2012. 5. 21. 11:55

import re


line = raw_input()

token = re.split('\s*', line)



'python' 카테고리의 다른 글

기본 자료형  (0) 2012.05.25
파이썬 개발 환경 구성  (0) 2012.05.23
python ascii character to int, int to ascii character  (0) 2012.05.20
python hex string to int  (0) 2012.05.20
한글 인코딩 문제  (0) 2012.05.19
Posted by Нуеоп

print ord('a')

>>> 97


print chr(97)

>>> 'a'



'python' 카테고리의 다른 글

파이썬 개발 환경 구성  (0) 2012.05.23
토큰 분리  (0) 2012.05.21
python hex string to int  (0) 2012.05.20
한글 인코딩 문제  (0) 2012.05.19
List 사용시 복사 및 [:] 사용팁  (0) 2012.05.14
Posted by Нуеоп
2012. 5. 20. 11:17

h = "A034BFC3"

n = int(h, 16)



'python' 카테고리의 다른 글

토큰 분리  (0) 2012.05.21
python ascii character to int, int to ascii character  (0) 2012.05.20
한글 인코딩 문제  (0) 2012.05.19
List 사용시 복사 및 [:] 사용팁  (0) 2012.05.14
객체 출력, toString()  (0) 2012.05.14
Posted by Нуеоп
2012. 5. 19. 20:40
Posted by Нуеоп

>>> L1 = [ 1, 2, 3, 4 ]

>>> L2 = L1

>>> L2 [0] = 9

>>> print L1

[ 9, 2, 3, 4 ]

>>> print L2

[ 9, 2, 3, 4 ]

둘다 바뀐다.



>>> L1 = [ 1, 2, 3, 4 ]

>>> L2 = L1[:]

>>> L2 [0] = 9

>>> print L1

[ 1, 2, 3, 4 ]

>>> print L2

[ 9, 2, 3, 4 ]

L1와 L2는 서로 다르다.



print L1[:]

이렇게 할 경우 L1의 처음부터 마지막까지 모든 원소를 리스트로 만든다.

이때 만들어진 리스트는 L1과 별도의 메모리를 차지한다.

'python' 카테고리의 다른 글

python hex string to int  (0) 2012.05.20
한글 인코딩 문제  (0) 2012.05.19
객체 출력, toString()  (0) 2012.05.14
빠른 소인수 분해 (Very Large Number Prime Factorization)  (0) 2012.02.19
빠른 소인수 분해  (0) 2012.02.19
Posted by Нуеоп
2012. 5. 14. 00:57

__str__ 를 이용한다.

class Person(object):

        name = ''

        age = 0

        def __init__(self, name='', age=0):

                self.name = name

                self.age = age

        def __str__(self):

                return 'name = %s, age = %d'%(self.name, self.age)



>>> k = Person( 'kim', '22' )

>>> print k

name = kim, age = 22


'python' 카테고리의 다른 글

한글 인코딩 문제  (0) 2012.05.19
List 사용시 복사 및 [:] 사용팁  (0) 2012.05.14
빠른 소인수 분해 (Very Large Number Prime Factorization)  (0) 2012.02.19
빠른 소인수 분해  (0) 2012.02.19
라빈 밀러 소수판별  (0) 2012.02.19
Posted by Нуеоп


cd <myproject>


새 프로젝트 생성

c:\myproject> play new <project name>


서버 시작

c:\myproject> play run


이클립스 프로젝트화

c:\myproject> play eclipsify


프로젝트 초기화

c:\myproject> play clean



'미공개' 카테고리의 다른 글

mongodb-criticism  (0) 2012.05.02
Posted by Нуеоп
2012. 5. 2. 13:22

http://knight76.tistory.com/entry/Mongo-DB

http://bcho.tistory.com/624

http://www.bloter.net/archives/103400

http://dev.paran.com/2011/06/29/what-is-cassandra-dbms/

http://news.ycombinator.com/item?id=3202081

'미공개' 카테고리의 다른 글

[play framework] 기본적인 명령어  (0) 2012.05.02
Posted by Нуеоп

int **make2dArray(int width, int height) {

  int **arr;

  int i;


  arr = (int **) malloc(sizeof(int *) * height);

  for (i = 0; i < height; i++) {

    arr[i] = (int *) malloc(sizeof(int) * width);

  }

  return arr;

}



void free2dArray(int **arr, int height) {

  int i;

  for (i = 0; i < height; i++) {

    free(arr[i]);

  }

  free(arr);

}


void print2dArray(int **arr, int w, int h) {

  int x, y;

  for (y = 0; y < h; y++) {

    for (x = 0; x < w; x++) {

      printf("%3d", arr[y][x]);

    }

    printf("\n");

  }

  printf("\n\n");

}


void init2dArray(int **arr, int w, int h, int a) {

  int x, y;

  for (y = 0; y < h; y++) {

    for (x = 0; x < w; x++) {

      arr[y][x] = a;

    }

  }

}

'c/c++' 카테고리의 다른 글

fflush  (0) 2012.05.31
STL - vector  (0) 2012.05.31
[c언어] sin그래프 그리기  (0) 2011.11.09
[c언어] strtok 사용법 및 쓰레드에서 사용시 유의사항  (0) 2011.11.02
[c언어] 변수 초기화  (0) 2011.11.02
Posted by Нуеоп
'''
    Factor1
'''
def factor1(n):
    if n == 1: return [1]
    i = 2
    limit = n**0.5
    while i <= limit:
        if n % i == 0:
            ret = factor1(n/i)
            ret.append(i)
            return ret
        i += 1

    return [n]

'''
    Factor2 - Improved Factor1
'''
def factor2(n):
##    yield 1
    i = 2
    limit = n**0.5
    while i <= limit:
        if n % i == 0:
            yield i
            n = n / i
            limit = n**0.5
        else:
            i += 1
    if n > 1:
        yield n

'''
    Factor3 - Pollard Rho Prime Factorization
'''
import random
from Queue import Queue
def gcd(a,b):
    while b:
        a,b=b,a%b
    return a

def rabin_miller(p):
if(p<2):
return False
if(p!=2 and p%2==0):
return False
s=p-1
while(s%2==0):
s>>=1
for i in xrange(10):
a=random.randrange(p-1)+1
temp=s
mod=pow(a,temp,p)
while(temp!=p-1 and mod!=1 and mod!=p-1):
mod=(mod*mod)%p
temp=temp*2
if(mod!=p-1 and temp%2==0):
return False
return True
def brent(n):
    if(n%2==0):
        return 2;
    x,c,m=random.randrange(0,n),random.randrange(1,n),random.randrange(1,n)
    y,r,q=x,1,1
    g,ys=0,0
    while(True):
        x=y
        for i in range(r):
            y,k=(y*y+c)%n,0
        while(True):
            ys=y
            for i in range(min(m,r-k)):
                y,q=(y*y+c)%n,q*abs(x-y)%n
            g,k=gcd(q,n),k+m
            if(k>= r or g>1):break
        r=2*r
        if(g>1):break
    if(g==n):
        while(True):
            ys,g=(x*x+c)%n,gcd(abs(x-ys),n)
            if(g>1):break
    return g

def pollard(n):
        if(n%2==0):
            return 2;
        x=random.randrange(2,1000000)
        c=random.randrange(2,1000000)
        y=x
        d=1
        while(d==1):
            x=(x*x+c)%n
            y=(y*y+c)%n
            y=(y*y+c)%n
            d=gcd(x-y,n)
            if(d==n):
                break;
        return d;
def factor3(n):
    if n==1: 
        return [1] 
    Q_1=Queue()
    Q_2=[]
    Q_1.put(n)
    while(not Q_1.empty()):
        l=Q_1.get()
        if(rabin_miller(l)):
            Q_2.append(l)
            continue
        d=pollard(l)
        if(d==l):Q_1.put(l)
        else:
            Q_1.put(d)
            Q_1.put(l/d)
    return Q_2
    

if  __name__ == "__main__":
    import time
    print 'factor1'
    start = time.time()
    print factor1(200000000000000000000000000009)
    print 'time : ', time.time() - start
    print '------------------------'

    print 'factor2'
    start = time.time()
    print [i for i in factor2(200000000000000000000000000009)]
    print 'time : ', time.time() - start
    print '------------------------'

    print 'factor3'
    start = time.time()
    print factor3(200000000000000000000000000009)
    print 'time : ', time.time() - start
    print '------------------------'


설명

Factor2는 Factor1을 개선한 버전
Factor3은 새로운 방식


실행 결과

factor1
[13430577524641L, 2094523, 89, 47, 47, 43, 29, 29]
time :  6.97499990463
------------------------
factor2
[29, 29, 43, 47, 47, 89, 2094523, 13430577524641L]
time :  4.16300010681
------------------------
factor3
[47L, 47L, 29L, 29L, 43L, 89L, 2094523L, 13430577524641L]
time :  0.0350000858307

'python' 카테고리의 다른 글

List 사용시 복사 및 [:] 사용팁  (0) 2012.05.14
객체 출력, toString()  (0) 2012.05.14
빠른 소인수 분해  (0) 2012.02.19
라빈 밀러 소수판별  (0) 2012.02.19
소인수 분해  (0) 2012.02.19
Posted by Нуеоп
2012. 2. 19. 02:51
1.
def highest_prime_factor(n):
   if isprime(n):
      return n
   for x in xrange(2,int(n ** 0.5) + 1):
      if not n % x:
         return highest_prime_factor(n/x)

def isprime(n):
   for x in xrange(2,int(n ** 0.5) + 1):
      if not n % x:
         return False
   return True

if  __name__ == "__main__":
   import time
   start = time.time()
   print highest_prime_factor(1238162376372637826)
   print time.time() - start

2.
def factor(n):
        if n == 1: return [1]
        i = 2
        limit = n**0.5
        while i <= limit:
                if n % i == 0:
                        ret = factor(n/i)
                        ret.append(i)
                        return ret
                i += 1

        return [n]

2-1.
def factor(n):
    yield 1
    i = 2
    limit = n**0.5
    while i <= limit:
        if n % i == 0:
            yield i
            n = n / i
            limit = n**0.5
        else:
            i += 1
    if n > 1:
        yield n

3.
import random
from Queue import Queue
def gcd(a,b):
    while b:
        a,b=b,a%b
    return a

def rabin_miller(p):
if(p<2):
return False
if(p!=2 and p%2==0):
return False
s=p-1
while(s%2==0):
s>>=1
for i in xrange(10):
a=random.randrange(p-1)+1
temp=s
mod=pow(a,temp,p)
while(temp!=p-1 and mod!=1 and mod!=p-1):
mod=(mod*mod)%p
temp=temp*2
if(mod!=p-1 and temp%2==0):
return False
return True
def brent(n):
    if(n%2==0):
        return 2;
    x,c,m=random.randrange(0,n),random.randrange(1,n),random.randrange(1,n)
    y,r,q=x,1,1
    g,ys=0,0
    while(True):
        x=y
        for i in range(r):
            y,k=(y*y+c)%n,0
        while(True):
            ys=y
            for i in range(min(m,r-k)):
                y,q=(y*y+c)%n,q*abs(x-y)%n
            g,k=gcd(q,n),k+m
            if(k>= r or g>1):break
        r=2*r
        if(g>1):break
    if(g==n):
        while(True):
            ys,g=(x*x+c)%n,gcd(abs(x-ys),n)
            if(g>1):break
    return g

def pollard(n):
        if(n%2==0):
            return 2;
        x=random.randrange(2,1000000)
        c=random.randrange(2,1000000)
        y=x
        d=1
        while(d==1):
            x=(x*x+c)%n
            y=(y*y+c)%n
            y=(y*y+c)%n
            d=gcd(x-y,n)
            if(d==n):
                break;
        return d;
def factor(n):
    #if(rabin_miller(n)):
     #   print n
      #  return
    #d=pollard(n)
    #if(d!=n):
     #   factor(d)
      #  factor(n/d)
    #else:
     #   factor(n)

    Q_1=Queue()
    Q_2=[]
    Q_1.put(n)
    while(not Q_1.empty()):
        l=Q_1.get()
        if(rabin_miller(l)):
            Q_2.append(l)
            continue
        d=pollard(l)
        if(d==l):Q_1.put(l)
        else:
            Q_1.put(d)
            Q_1.put(l/d)
    return Q_2
    
    

if __name__ == "__main__":
    while(True):
        n=input();
        L=factor(n)
        L.sort()
        i=0
        while(i<len(L)):
            cnt=L.count(L[i])
            print L[i],'^',cnt
            i+=cnt 





Update : factor2()가 가장 빠르다.

def factor1(n):
    if n == 1: return [1]
    i = 2
    limit = n**0.5
    while i <= limit:
        if n % i == 0:
            ret = factor1(n/i)
            ret.append(i)
            return ret
        i += 1

    return [n]


def factor2(n):
##    yield 1
    i = 2
    limit = n**0.5
    while i <= limit:
        if n % i == 0:
            yield i
            n = n / i
            limit = n**0.5
        else:
            i += 1
    if n > 1:
        yield n


if  __name__ == "__main__":
    import time
    print 'factor1'
    start = time.time()
    print factor1(200000000000000000000000000009)
    print time.time() - start

    print 'factor2'
    start = time.time()
    print [i for i in factor2(200000000000000000000000000009)]
    print time.time() - start



출처 : http://stackoverflow.com/questions/2403578/fastest-calculation-of-largest-prime-factor-of-512-bit-number-in-python 

'python' 카테고리의 다른 글

객체 출력, toString()  (0) 2012.05.14
빠른 소인수 분해 (Very Large Number Prime Factorization)  (0) 2012.02.19
라빈 밀러 소수판별  (0) 2012.02.19
소인수 분해  (0) 2012.02.19
긴 문자열을 숫자로 바꾸는 코드  (0) 2012.02.19
Posted by Нуеоп
2012. 2. 19. 02:21
def primes(n):
    if n < 2:
        return []

    nums = range(2,int(n))
    p = []

    while nums:
        new_prime = nums[0]
        p.append(new_prime)

        for i in nums[1:]:
            if i % new_prime == 0:
                nums.remove(i)
        nums.remove(nums[0])

    return p

def power_mod(a, b, n):
    if b < 0:
        return 0
    elif b == 0:
        return 1
    elif b % 2 == 0:
        return power_mod(a*a, b/2, n) % n
    else:
        return (a * power_mod(a,b-1,n)) % n
    
def rabin_miller(n, tries = 7):
    if n == 2:
        return True
    
    if n % 2 == 0 or n < 2:
        return False
    
    p = primes(tries**2)

    # necessary because of the test below
    if n in p:
        return True
    
    s = n - 1
    r = 0
    while s % 2 == 0:
        r = r+1
        s = s/2
    for i in range(tries):
        a = p[i]
        
        if power_mod(a,s,n) == 1:
            continue
        else:
            for j in range(0,r):
                if power_mod(a,(2**j)*s, n) == n - 1:
                    break
            else:
                return False
            continue
    return True
Posted by Нуеоп
2012. 2. 19. 02:21
def factorize(n):
    def isPrime(n):
        return not [x for x in xrange(2,int(math.sqrt(n)))
                    if n%x == 0]
    primes = []
    candidates = xrange(2,n+1)
    candidate = 2
    while not primes and candidate in candidates:
        if n%candidate == 0 and isPrime(candidate):
            primes = primes + [candidate] + factorize(n/candidate)
        candidate += 1            
    return primes

'python' 카테고리의 다른 글

빠른 소인수 분해  (0) 2012.02.19
라빈 밀러 소수판별  (0) 2012.02.19
긴 문자열을 숫자로 바꾸는 코드  (0) 2012.02.19
[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
Posted by Нуеоп
s = raw_input()
x = 0
digit = 1

if len(s) > 10:
    while len(s) >  10 :
        x = x+ long(s[len(s)- 10 :len(s)])*digit
        s = s[0:- 10 ]
        digit = digit*(10** 10 )
    x = x + long(s)*digit
else:
    x = long(s)
print x

'python' 카테고리의 다른 글

라빈 밀러 소수판별  (0) 2012.02.19
소인수 분해  (0) 2012.02.19
[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 복소수 complex 사용법  (0) 2011.11.04
Posted by Нуеоп



Posted by Нуеоп
2011. 11. 22. 00:59
node.js
$ cd ~
$ apt-get update
$ apt-get install g++ curl libssl-dev apache2-utils
$ apt-get install git-core
$ git clone git://github.com/ry/node.git
$ cd node
$ git fetch --all
$ ./configure
$ make
$ make install


$ vim hello_node.js
 

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.js\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');

$ node hello_node.js


Posted by Нуеоп
Class SampleC():
    def __init__(self):
        pass

sample = SampleC()

>>> dir(sample)  # 인스턴스 객체의 속성 + 클래스 객체의 속성
>>> dir(SampleC) # 인스턴스 객체의 속성 + 클래스 객체의 속성 + 슈퍼클래스의 속성

>>> dir([])
>>> dir({})
>>> dir((,))

__repr__
__str__
__add__
__getitem__
__getattr__
__len__
__doc__
__name__
__dict__
__new__
__hash__
__delattr__
__setattr__
__class__
__name__
__call__
__nonzero__
__cmp__
__lt__
__le__
__gt__
__ge__
__eq__
__ne__
__delitem__
__contains__
__iter__
__add__
__sub__
__mul__
__div__
__truediv__
__floordiv__
__mod__
__divmod__
__pow__
__lshift__
__rshift__
__and__
__xor__
__or__
__radd__
__rsub__
__rdiv__
__rmul__
...
__iadd__
__isub__
__imul__
__idiv__
__itruediv__
__ifloordiv__
__imod__
__ipow__
__ilshift__
__irshift__
__iand__
__ixor__
__ior__
__neg__
__pos__
__abs__
__invert__
__complex__
__int__
__long__
__float__
__oct__
__hex__

Data model (Attribute)
http://docs.python.org/reference/datamodel.html
Built-in Functions
http://docs.python.org/library/functions.html
Built-in Types
http://docs.python.org/library/stdtypes.html  
 


'python' 카테고리의 다른 글

소인수 분해  (0) 2012.02.19
긴 문자열을 숫자로 바꾸는 코드  (0) 2012.02.19
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 복소수 complex 사용법  (0) 2011.11.04
[python] 삼항연산자 만들기  (1) 2011.11.02
Posted by Нуеоп

sin 그래프 그리기



#include<stdio.h>
#include<math.h>

#define WIDTH 19
#define HEIGHT 100
#define PI (3.141592)


int isEqual(double d1, double d2, double e);

int main(int argc, char *argv[])
{
    double x=0.0;
    double y=0.0;
    int col=0,row=0;
    printf("%-*d%1d%*d\n",WIDTH,-1,0,WIDTH,1);
    for(row=0;row<WIDTH*2+1;row++) printf("-");
    printf("\n");
    for(col=0;col<HEIGHT;col++)
    {
        y=sin(2*PI*x);
        for(row=0;row<WIDTH*2+1;row++)
        {
            if(isEqual((double)row,(y+1.0)*(double)WIDTH,0.5))
                printf("*");
            else if(row == WIDTH)
                printf("|");
            else
                printf(" ");
        }
        x += 0.05;
        printf("\n");
    }
}

int isEqual(double d1, double d2, double e)
{
    if( (d1-d2>0.0?d1-d2:d2-d1)<e )
        return 1;
    return 0;
}
결과



-1                 0                  1
---------------------------------------
                   *                   
                   |     *             
                   |          *        
                   |              *    
                   |                 * 
                   |                  *
                   |                 * 
                   |              *    
                   |          *        
                   |     *             
                   *                   
             *     |                   
        *          |                   
    *              |                   
 *                 |                   
*                  |                   
 *                 |                   
    *              |                   
        *          |                   
             *     |                   
                   *                   
                   |     *             
                   |          *        
                   |              *    
                   |                 * 
                   |                  *
                   |                 * 
                   |              *    
                   |          *        
                   |     *             
                   *                   
             *     |                   
        *          |                   
    *              |                   
 *                 |                   
*                  |                   
 *                 |                   
    *              |                   
        *          |                   
             *     |                   
                   *                   
                   |     *             
                   |          *        
                   |              *    
                   |                 * 
                   |                  *
                   |                 * 
                   |              *    
                   |          *        
                   |     *             
                   *                   
             *     |                   
        *          |                   
    *              |                   
 *                 |                   
*                  |                   
 *                 |                   
    *              |                   
        *          |                   
             *     |                   
                   *                   
                   |     *             
                   |          *        
                   |              *    
                   |                 * 
                   |                  *
                   |                 * 
                   |              *    
                   |          *        
                   |     *             
                   *                   
             *     |                   
        *          |                   
    *              |                   
 *                 |                   
*                  |                   
 *                 |                   
    *              |                   
        *          |                   
             *     |                   
                   *                   
                   |     *             
                   |          *        
                   |              *    
                   |                 * 
                   |                  *
                   |                 * 
                   |              *    
                   |          *        
                   |     *             
                   *                   
             *     |                   
        *          |                   
    *              |                   
 *                 |                   
*                  |                   
 *                 |                   
    *              |                   
        *          |                   
             *     |                   
 

Posted by Нуеоп


import struct, random

#Function to write a bmp file.  It takes a dictionary (d) of
#header values and the pixel data (bytes) and writes them
#to a file.  This function is called at the bottom of the code.
def bmp_write(d,byte):
    mn1 = struct.pack('<B',d['mn1'])
    mn2 = struct.pack('<B',d['mn2'])
    filesize = struct.pack('<L',d['filesize'])
    undef1 = struct.pack('<H',d['undef1'])
    undef2 = struct.pack('<H',d['undef2'])
    offset = struct.pack('<L',d['offset'])
    headerlength = struct.pack('<L',d['headerlength'])
    width = struct.pack('<L',d['width'])
    height = struct.pack('<L',d['height'])
    colorplanes = struct.pack('<H',d['colorplanes'])
    colordepth = struct.pack('<H',d['colordepth'])
    compression = struct.pack('<L',d['compression'])
    imagesize = struct.pack('<L',d['imagesize'])
    res_hor = struct.pack('<L',d['res_hor'])
    res_vert = struct.pack('<L',d['res_vert'])
    palette = struct.pack('<L',d['palette'])
    importantcolors = struct.pack('<L',d['importantcolors'])
    #create the outfile
    outfile = open('bitmap_image.bmp','wb')
    #write the header + the bytes
    outfile.write(mn1+mn2+filesize+undef1+undef2+offset+headerlength+width+height+\
                  colorplanes+colordepth+compression+imagesize+res_hor+res_vert+\
                  palette+importantcolors+byte)
    outfile.close()

###################################    
def main():
    #Here is a minimal dictionary with header values.
    #Of importance is the offset, headerlength, width,
    #height and colordepth.
    #Edit the width and height to your liking.
    #These header values are described in the bmp format spec.
    #You can find it on the internet. This is for a Windows
    #Version 3 DIB header.
    width = 2048
    height = 2048
    d = {
        'mn1':66,
        'mn2':77,
        'filesize':width*height+54,
        'undef1':0,
        'undef2':0,
        'offset':54,
        'headerlength':40,
        'width':width,
        'height':height,
        'colorplanes':0,
        'colordepth':24,
        'compression':0,
        'imagesize':width*height,
        'res_hor':0,
        'res_vert':0,
        'palette':0,
        'importantcolors':0
        }
   
    #Function to generate a random number between 0 and 255
    def rand_color():
        x = random.randint(0,255)
        return x

    #Build the byte array.  This code takes the height
    #and width values from the dictionary above and
    #generates the pixels row by row.  The row_mod and padding
    #stuff is necessary to ensure that the byte count for each
    #row is divisible by 4.  This is part of the specification.
    byte = bytes()
    for row in range(d['height']-1,-1,-1):# (BMPs are L to R from the bottom L row)
        for column in range(d['width']):
            b = rand_color()
            g = rand_color()
            r = rand_color()
            pixel = struct.pack('<BBB',b,g,r)
            byte = byte + pixel
        row_mod = (d['width']*d['colordepth']/8) % 4
        if row_mod == 0:
            padding = 0
        else:
            padding = (4 - row_mod)
        padbytes = bytes()
        for i in range(padding):
            x = struct.pack('<B',0)
            padbytes = padbytes + x
        byte = byte + padbytes
      
    #call the bmp_write function with the
    #dictionary of header values and the
    #bytes created above.
    bmp_write(d,byte)

if __name__ == '__main__':
    main()



참고자료
http://docs.python.org/library/struct.html
http://pseentertainmentcorp.com/smf/index.php?topic=2034.0
http://en.wikipedia.org/wiki/BMP_file_format


'python' 카테고리의 다른 글

긴 문자열을 숫자로 바꾸는 코드  (0) 2012.02.19
[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 복소수 complex 사용법  (0) 2011.11.04
[python] 삼항연산자 만들기  (1) 2011.11.02
[python] 집합 Sets  (0) 2011.11.02
Posted by Нуеоп

x1 = 3 + 4j
x2 = 2 - 5j

print x1*x2, x1+x2
(26-7j) (5-1j)

x = 4
y = 6
z = complex(4, 6)
print z
(4+6j)

w = z.conjugate()    # z의 켤레 복소수
print w
(4-6j) 

print (z.real , z.imag)
(4.0, 6.0) 

'python' 카테고리의 다른 글

[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 삼항연산자 만들기  (1) 2011.11.02
[python] 집합 Sets  (0) 2011.11.02
[python] 리스트 List  (0) 2011.11.02
Posted by Нуеоп

c 언어에서
a>b ? x : y
의 경우를 python에서 여러가지 방법으로 표현할 수 있다.

방법1.
x if a>b else y

방법2.
(lambda:y, lambda:x)[a>b]()

방법3.
{True:x, False:y}[a>b]

방법4.
(a>b) and x or y

방법5.
((a>b) and [x] or [y])[0]


참고 자료
http://en.wikipedia.org/wiki/Ternary_operation
http://www.python.org/dev/peps/pep-0308/
http://docs.python.org/reference/expressions.html#conditional-expressions

'python' 카테고리의 다른 글

[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 복소수 complex 사용법  (0) 2011.11.04
[python] 집합 Sets  (0) 2011.11.02
[python] 리스트 List  (0) 2011.11.02
Posted by Нуеоп
2011. 11. 2. 19:00
S1 = set( L1 )
S2 = set( L2 )

맴버쉽 테스트
item in S1

차집합
S1 - S2

합집합
S1 | S2

교집합
S1 & S2

elements in S1 or S2 but not both
S1 ^ S2
 

'python' 카테고리의 다른 글

[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 복소수 complex 사용법  (0) 2011.11.04
[python] 삼항연산자 만들기  (1) 2011.11.02
[python] 리스트 List  (0) 2011.11.02
Posted by Нуеоп
2011. 11. 2. 18:50

L = []

리스트 원소 개수
len( L )

리스트 원소 추가, 삭제
L.append( item )    # L[ len(L) : ] = item 과 같다. 리스트 맨 끝에 item을 추가
L.pop()             # 리스트의 마지막 원소가 리턴되고, 해당 원소는 리스트에서 제거됨
L.pop(i)            # 리스트의 i번째 원소가 리턴되고, 해당 원소는 리스트에서 제거됨
                    # 만약 i가 리스트의 원소의 개수보다 큰 값인 경우 IndexError 예외 발생


L.remove( item )   # 리스트에서 item을 제거, 여러개면, 젤 먼저 나오는 item만 제거, 없는 경우 ValueError 예외 발생
L.insert( i, item )# 리스트의 i번째에 item을 추가, L.insert(len(L),item)은 L.append(item)과 같다
                   # 만약 i가 리스트의 원소의 갯수보다 큰 경우, 가장 마지막에 추가한다.

del L[st:ed]       # 리스트의 st~ed원소를 제거

L.extend( L2 )

리스트 정보
L.index( item )      # 리스트에서 item이 있는 위치를 리턴, 없으면 ValueError 예외 발생
L.count( item )      # 리스트에서 item의 개수를 리턴

리스트 순서 변경
L.sort()
L.reverse()

리스트를 이용한 자료구조
L.append( item )과 L.pop() 을 사용하면 Stack
L.append( item )과 L.pop(0) 을 사용하면 Queue

리스트 내장 List Comprehensions

vec = [2, 4, 6]
[3*x for x in vec]
[3*x for x in vec if x > 3]
[3*x for x in vec if x < 2]
[[x,x**2] for x in vec]
[x, x**2 for x in vec]  # error - parens required for tuples
[(x, x**2) for x in vec]
 
vec1 = [2, 4, 6]
vec2 = [4, 3, -9]
[x*y for x in vec1 for y in vec2]
[x+y for x in vec1 for y in vec2]
[vec1[i]*vec2[i] for i in range(len(vec1))]


참고자료
http://docs.python.org/tutorial/datastructures.html

 


'python' 카테고리의 다른 글

[python] (가명) 속성 및 연산자 메쏘드  (0) 2011.11.12
[python] 비트맵 bitmap 쓰기  (0) 2011.11.04
[python] 복소수 complex 사용법  (0) 2011.11.04
[python] 삼항연산자 만들기  (1) 2011.11.02
[python] 집합 Sets  (0) 2011.11.02
Posted by Нуеоп
문자열을 특정 기준으로 분리하는 함수이다.
가령
char text[] = "The quick brown fox jumps over the lazy dog."; 라는 문자열을 단어로 분리하고 싶은 경우,
' ' 공백 문자를 기준으로 토큰 분리하면 된다.
"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."

char text[] = "The quick brown fox jumps over the lazy dog."; char seps[] = " "; // 이곳에 분리의 기준이 되는 문자를 나열하면 된다. char *p; if( (p = strtok( text, seps )) != NULL ){ printf("%s\n", p); while( (p = strtok( NULL, seps) != NULL){ printf("%s\n", p); } }

여기서 처음 strtok()를 사용할때, 첫번째 인자로, 분리의 대상이 되는 문자열을 파라미터로 넘겼다.
하지만, 이후 strtok()에서는, NULL을 넘기면서, 분리의 대상이 되는 문자열을 넘기지 않았다.
strtok() 함수 내부에서, 처음 넘긴 문자열을 가리키는 포인터를 보관하고 있다는 뜻이다.
따라서, strtok()로 모두 분리가 완료 되기 전에, 다른 문자열을 분리할 수 없다.

쓰레드를 이용해서 동시에 작업하는 경우, 이 내부 변수가 문제가 될 수 있다. 각 쓰레드별로 이런 내부변수를 개별적으로 가지고 있어야 할것이다. 윈도우 환경에서, CreateThread()로 쓰레드를 생성할 경우, 이런 내부 변수를 두고 사용하는 함수에서 문제가 된다. _beginthreadex()로 쓰레드를 생성해야 하는 이유중 하나다.

_beginthreadex()는 내부적으로 CreateThread()를 호출하여 쓰레드를 생성한다. 하지만, 그전에 struct _tiddata 구조체를 통해, 이런 내부 변수를 저장하는 별도의 공간을 마련한 후 쓰레드를 생성한다.

쓰레드가 종료되면, _tiddata 구조체 블록을 해제해야 한다. CreateThread()로 쓰레드 생성한 경우, 대부분 _tiddata 블록이 잘 관리가 되지만, 비정상적인 쓰레드 종료시 _tiddata 블록이 해제 되지 않으면, 메모리 누수가 된다. 


Posted by Нуеоп
2011. 11. 2. 12:47
기본적으로 변수의 종류에는 static 과 auto 가 있다.
static라고 명시 하지 않으면, 모든 지역변수는 auto 이다.
auto는 변수가 선언됨과 동시에 자동으로 할당되고, 해당 지역이 끝나면 자동으로 해제된다.
static는 한번 할당되면, 해당 프로그램이 종료되기 전까지 해제되지 않고 스택영역에 남는다.

auto 변수는 자동으로 초기화 되지 않는다. 따라서 초기화 하지 않고 사용할 경우, auto 변수에는 의도하지 않는 의미 없는 값이 들어있다. 쓰레기 값이라고도 부른다. 디버깅 환경에서는 초기화 하지 않는 변수에 특별한 값으로 초기화 하기도 한다. 이 값을 보고, 어떤 변수가 어디에 할당되었는지 알수 있다. 이런 특별한 경우를 제외하면, 쓰레기 값이 들어있기 때문에(이전 메모리에 있던 값) 초기화 하지 않은 변수를 사용할땐 조심해야 한다.

static 로 선언된 변수와, 전역변수는 명시적으로 초기화 하지 않아도 자동으로 초기화 된다.
우선 정수는 0, 실수는 0.0 이 기본 초기화 값이다.
문자열은 '\0', 포인터는 NULL으로 초기화 된다.
구조체의 경우, 구조체 멤버가 각각 위의 기본 초기화 값으로 초기화된다.
배열의 경우, 일부분만 초기화 되면, 초기화 하지 않은 나머지 부분이 모두 기본 초기화 값으로 초기화 된다.

int num;             // num이 전역변수인 경우 0으로 자동으로 초기화 된다.
double real;         // real이 전역변수인 경우 0.0으로 자동으로 초기화 된다.
char *ptr            // ptr역시 NULL로 자동으로 초기화 된다.
struct {
    int a;
    double b;
    char *c;
} A;                 // A.a는 0, A.b는 0.0, A.c는 NULL로 초기화 된다.




int arr[10] = { 7, 8 };
int arr2[10] = { [3] = 7, [4] = 8 };


이경우 arr이 전역배열이나 static형 배열이 아니어도, 나머지 arr[2] ~ arr[9]는 int의 기본 초기화 변수인 0으로 초기화 된다. arr2의 경우 arr2[3], arr2[4]는 각각 7,8로 초기화 되고, 나머지 arr2[0]~arr2[2], arr2[5]~arr2[9]는 0으로 초기화 된다.


int arr[10] = {0};
int arr[10] = {0,};

간혹 int arr[10]을 0으로 초기화 하기 위해, int arr[10] = {0,}; 라고 0뒤에 , 콤마를 써주는 경우를 자주 볼수 있는데, 반드시 필요한 것은 아니다. 위의 두가지 배열은 정확히 똑같다.

 
Posted by Нуеоп
sizeof

sizeof 연산자는 피연산자를 저장하는데 필요한 메모리 바이트수를 리턴한다.
return과 마찬가지로 함수가 아니고 연산자이므로, 괄호가 필요하진 않다. 

int age = 16;
printf("%u\n", sizeof(age) );
printf("%u\n", sizeof age );



결과는 모두 같다. 하지만 sizeof의 피연산자로 타입이 오는 경우, 괄호는 꼭 써줘야 한다.

printf("%u\n", sizeof(int) );
printf("%u\n", sizeof int ); // 에러!!



sizeof 연산이후 나오는 결과값은 unsigned int형이다.

char x;
printf("%u\n", sizeof( sizeof x ));    // unsigned int의 크기인 4가 출력됨




literal constant

5, 7 등의 정수는 기본적으로 signed int 형으로 취급한다.
3.4, 5.0, 9. 등은 기본적으로 double 형으로 취급한다.
1.2f, 20f 등 f를 명시한 상수는 float 형으로 취급한다.
'a', 'b' 등은 기본적으로 signed int 형으로 취급한다.
char 형도 수식에선 각각을 int 형으로 취급하여 계산한다.
float 형과 double형이 섞인 수식은 double 형으로 취급한다.
float 형 끼리의 수식은 double 형으로 취급하는 시스템도 있다.
최근 표준에선, double로 취급하지 않고 float로 계산한다.

char c = 'a';
printf("%u\n", sizeof(c));    // c는 char형이므로 1이 출력된다.
printf("%u\n", sizeof('a'));  // 하지만 'a'는 int형으로 취급하여 4가 출력된다.
printf("%u\n", sizeof(c+c));  // char형끼리의 연산은 int형으로 취급하여 계산한다.
                              // 따라서 4가 출력된다.




 
Posted by Нуеоп

문제
_beginthreadex() 사용중 _CrtIsValidHeapPointer() 과련 문제 발생

해결방법
[Properties] -> [Linker] -> [Input] -> [Additional Dependencies]
nochkclr.obj는 제거, msvcrt.lib는 추가

[Properties] -> [Linker] -> [Input] -> [Force Symbol References]
__DllMainCRTStartup@12 추가

[Properties] -> [Linker] -> [Command Line] -> [Additional options]
/NOENTRY 추가

관련 검색어
Managed Extensions for C++ DLL

'windows' 카테고리의 다른 글

컴파일 옵션 종류  (0) 2011.10.31
코어수 알아내기  (0) 2011.10.31
Posted by Нуеоп

<math.h>의 sqrt()함수를 이용하지 않고, 간단하게 for문 몇번 돌리는 것으로 제곱근을 구할 수 있다.
뉴튼-랩슨법을 이용해서 빠르게 제곱근을 계산할 수 있다.



double mysqrt(unsigned int number)
{
    unsigned int NUM_REPEAT = 16;
    unsigned int k;
    double res;
    double tmp = (double)number;
    for(k=0,res=tmp;k<NUM_REPEAT;k++)
    {
        if(res<1.0)
            break;
        res = (res*res+tmp)/(2.0*res);
    }
    return res;
}


여기서 NUM_REPEAT는 for문의 반복 횟수를 의미하는데, 크면 클 수록 정확한 값을 구한다. 16~20정도면 상당히 정확한 값을 구할 수 있다. 10진법 소수점 단위로 비교하면서 구하는것보단 훨씬 빠르게 구하지만, <math.h>의 sqrt()함수보다 빠르진 않다.

뉴튼-랩슨법의 자세한 원리는 인터넷에서 찾아보면 된다. 원리만 알면 매우 쉽다.
Posted by Нуеоп

c언어에서 2차원배열을 만드는 방법은 다음과 같다.

int arr[6][8];
그러면 가로 8, 세로 6의 2차원 배열이 생성된다. 하지만 가로의 크기와 세로의 크기를 컴파일 이전 시간에 미리 정해줘야 한다. 사용자로부터 입력받은 가로와 세로의 크기로, 혹은 실행시간 도중에 정한 크기로 2차원 배열을 만들기 위해선 다른 방법을 사용해야한다.

int height = 6, width = 8;
int arr[ height ][ width ];    // 이런식으로 배열을 만들수 없다.
malloc()로 동적으로 할당 받아야 한다.
1차원 배열을 동적으로 할당 받는 방법은 다음과 같다.

int width = 8;
int *arr;
arr = (int *) malloc ( sizeof(int) * width );
동적으로 할당받은 메모리도, 배열처럼 접근이 가능하다.
arr[0], arr[1], ... arr[7]

2차원 배열을 할당받는 방법은, malloc()를 여러번 호출하는 것이다.

int height = 6, width = 8;
int **arr;
arr = (int**) malloc ( sizeof(int*) * height );
for(int i=0; i<height; i++){
    arr[i] = (int*) malloc ( sizeof(int) * width );
}




할당받은 2차원배열을 다 사용하고 나서, 해제해줘야 한다.
for문을 이용해서 여러번 malloc()로 메모리 공간을 할당 받았기 때문에, 해제할때도, for을 이용해서 여러번 해제해야 한다.
위 그림에서 세로의 크기만큼 malloc()를 호출하고, 또 그전에 한번 malloc()를 호출했다. 따라서, (height + 1)번 해제해야 한다.

for(int i=0; i<height; i++){
    free(arr[i]);
}
free(arr);

2차원 배열 할당과 해제가 번거롭다. 조금 방법을 달리 하면, 한번에 해제할 수 있는 구조로 2차원 배열을 만들 수 있다.


int height=8,width=6;
int **arr;
arr = (int **) malloc ( sizeof(int *) * height);
arr[0] = (int *) malloc ( sizeof(int) * width*height );
for( int i=1; i<height; i++){
    arr[i] = arr[ i-1 ] + width;
}
malloc()를 딱 두번만 사용했다. 두번째 malloc()에서, 배열의 크기를 width*height 로 한번에 크게 할당받았다.
그리고 이후에 for문을 통해 연결만 해주었다.

해제하는 방법도 간단하다.

free(arr[0]);
free(arr);


Posted by Нуеоп
이전버튼 1 2 3 4 5 이전버튼