import numpy as np
import math
g = 9.81
N = 1000
tau = 20.0
dt = tau/float(N-1)

SHO

state[0] : 늘어난거리, 위치
state[1] : 속도

dv_dt 유도식

      F = -mg -kx (탄성력)
      F = ma      (뉴턴 제2법칙 가속도법칙)
      ma = -mg -kx
      a = -g -(kx/m)

x(늘어난 거리)를 이용해서 가속도를 구해주는 것

euler 함수에 들어갈 [속도, 가속도]를 구해준다

def SHO(state, time):
    dx_dt = state[1]
    dv_dt = -k/m * state[0] - g
    return np.array([dx_dt, dv_dt])

euler

1차 일반 미분 방정식의 해를 근사시켜준다…
결국 Yn+1을 Yn을 이용해서 구해준다는 이야기

[Xn + v dt, Vn + a dt] == [Xn+1, Vn+1]

def euler(y, t, dt, f):
    return y + f(y, t) * dt

k : 탄성계수

m : 질량

x0 : 초기위치

v0 : 초기속도

k = 3.5
m = 0.2
x0 = 0
v0 = 0

t = np.linspace(0.0, tau, N)
y = np.zeros((N, 2))

y[0, 0] = x0
y[0, 1] = v0
for i in range(N-1):
    y[i+1] = euler(y[i], t[i], dt, SHO)
xdata = [y[i, 0] for i in range(N)]
vdata = [y[i, 1] for i in range(N)]
from pylab import *

add plot position

subplot(2,1,1)
plot(t, xdata)
xlabel("time")
ylabel("position")
<matplotlib.text.Text at 0x22a3a2c0780>

add plot velocity

subplot(2,1,2)
plot(t, vdata)
xlabel("time")
ylabel("velocity")
show()




저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret
from random import random, seed
from math import sqrt

Monte Carlo Method

난수를 이용해 함수의 값을 확률적으로 계산하는 알고리즘
참고 url
몬테카를로 법을 이용해 pi의 근사값을 구해보자

  1. 반지름이 1인 원이 있다고 생각하자 ( $x^2 + y^2 = 1$ )
  2. 이제 그 원안에 점들을 찍는다.
    • 이때 난수가 사용된다. (점의 좌표 범위 : $ 0 \leq x \leq 1 , 0 \leq y \leq 1 $ )
    • random 함수의 값은 float으로 0~1 사이의 값이 리턴된다.
  3. 원의 넓이는 $\pi r^2$이고 정사각형의 넓이는 $4r^2$이다.
    따라서 원의 넓이를 정사각형의 넓이로 나누게 되면 $\frac{\pi}{4}$가 된다.

  4. 3번에서 구한 값에 4배를 해주면 원주율의 근사값이 나온다

#n은 점을 몇개 찍을것 인지를 지정해주는 변수 (n이 클수록 정확한 근사값을 얻을 수 있다.)
n = 10000
#inside, outside는 각각 원안에 원밖에 찍힌 점들을 저장해두는 list이다.
inside = []
outside = []
#n번 반복하면서 x, y에 random함수에서 나온 난수를 대입하고
#원안에 있는지 밖에 있는지 체크해서 넣어준다
for i in range(n):
    x = random()
    y = random()
    if sqrt(x*x + y*y) <= 1:
        inside.append([x, y])
    else:
        outside.append([x, y])
#원안에 찍힌 점들의 갯수 / 총 점의 갯수
pi = 4 * len(inside) / n
print('pi ≈ ', pi)
pi ≈  3.1436
#여기서부터는 찍힌 점을 그래프로 보여주는 코드이다. (읽을 필요 x)
import plotly.plotly as py
import plotly.graph_objs as go
inx, iny = zip(*inside)
outx, outy = zip(*outside)
inner_plot = go.Scatter (
    x = inx,
    y = iny,
    mode = 'markers',
    name = 'inCircle'
)

outter_plot = go.Scatter(
    x = outx,
    y = outy,
    mode = 'markers',
    name = 'outCircle'
)

data = [inner_plot, outter_plot]

layout = {
    'xaxis' : {
        'range' : [0, 1],
        'zeroline' : False,
        },
    'yaxis' : {
        'range' : [0, 1]
        },
    'shapes' : [
        {
            'type' : 'circle',
            'xref' : 'x',
            'yref' : 'y',
            'x0' : -1,
            'y0' : -1,
            'x1' : 1,
            'y1' : 1,
            'line' : {
                'color': 'rgba(0, 0, 0, 1)',
                'width' : 3,
            },
        },
    ]
}



fig = {
    'data' : data,
    'layout' : layout,
}
py.iplot(fig, filename='MonteCarlo_PI')
저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

binary 관련 간단한 정리

정수표현

정수타입에서 대부분 최상위 비트(Most Siginificant Bit)가 음수인지 정수인지를 구분한다는 것은 알고있을 것 이다. 나도 그냥 그렇게만 알고 음수표현은 양수에서 최상위 비트만 반전되는줄 알고 있었다. (하지만 그게 아니다..)

그러다 학교에서 친구가 파이썬에서 ‘~’ 가 뭐냐고 물어봐서 not이라고 대답해 주다가 이상한 부분을 발견했다. 0b101 을 not연산을 하게 되면 -0b110이 나오는 이상한 일이 일어난거다.

5 : 0b0101
!5 : 0b1010
내 생각으로는 최상위 비트가 1이고 나머지가 정수라면 -2가 되야한다고 생각했지만 음의 정수는 그렇게 표현하지 않는다.


source code

0을 0b0000으로 두고 -1부터는 0b000에서 1을 뺀 0b1111이 되는 방식이였다. 별거 아니지만 왜 정수형에서 대부분 양수만 설명하고 음수가 어떻게 되는지는 설명 안되어있어서 정리해 두었다.


binary 뺄셈

우리는 일반적으로 뺄셈을 계산할 때 7 -2 = 5 라고 계산한다. 하지만 CPU는 단순한 일 즉 덧셈만 할 수 있다. 우리가 하는 곱셈 나눗셈 등등 많은 일들도 모두 cpu는 덧셈으로 동작시킨다. 그렇기 때문에 7 - 2를 7 + (-2)로 바꿔서 계산해야 한다. 덧셈으로 뺄셈을 하는 방법은 두 가지가 있다.

1의 보수(One’s Complement)

7 - 2 
7  = 0b0111
2  = 0b0010

1의 보수에서는 먼저 음수가 될 수를 반전(Bit flip)시킨다.

2  = 0b0010
!2 = 0b1101

그 후 7과 더해준다

7  = 0b0111
!2 = 0b1101
------------
올림수(Carry) 0b1 | 결과 0b0100

지금과 같이 올림수가 나왔을 경우 2^0자리에 다시 더해준다

0b0100
0b0001
--------
0b0101 = 5

1의 보수를 이용하여 덧셈을 이용하여 뺄셈을 하였다. 1의 보수는 not연산을 통해 구해진다. 그래서 파이썬 같은 프로그래밍 언어들의 not 연산자의 영문 설명을 보면 bit flip or complement라 적혀있다.


2의 보수(Two’s Complement)

1의 보수는 올림수가 발생할 경우 계산이 복잡해진다. 이런 복잡함을 완화하기 위해 2의 보수를 사용하기 시작했다. signed와 unsigned의(쉽게 얘기하자면 부호 구분을 하는지 안하는지) 구분없이 덧셈 뺄셈이 가능하고 CPU구현도 간단해서 요즘 사용되는 CPU대부분은 2의 보수를 사용한다.
2의 보수는 계산을 할때 음수로 만들 수를 1의 보수(not연산)로 만든다음 1을 더해준다.

7  = 0b0111
!2 = 0b1101
!2 + 1 = 0b1110 = -2 in binary

0b0111
0b1110
-------
0b0101 = 5 (올림수는 버린다)

2의 보수를 만들게 되면 위에서 알아본 2진수로 음수를 표현하는 방식 그대로가 된다.


‘!’연산자와 ‘~’연산자 차이점

‘!’ 와 ‘~’ 모두 찾아보면 not operation을 수행한다고 나와있다.
하지만 둘에는 큰 차이점이 있는데 비트연산을 할 때는 ‘~’논리연산을 할 때는 ‘!’을 쓴다. 어떤 차이점이냐면.. 0b0111 이런 비트에 관한 연산을 할 때는 ‘~’을 쓰고 true false 와 같은 논리적인 것들에 대한 연산을 할 때에는 ‘!’연산자를 쓴다.
bitwise operator and logical operator

도움을 주신 이경문 멘토님 감사합니다

저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

이번 교내대회인 모바일 콘텐츠개발대회를 하게 되면서 처음으로 앱을 만들기 시작했다. 기존에는 c++이용해서 소켓을 한 두번 했을까 말까고 웹서버 그리고 통신쪽을 잘 안했는데 어쩔 수 없이 백앤드를 맡았다. 기존에 써봤던 PHP를 이용해 볼까도 생각했고 요즘 핫한 Node.js 그리고 학교에서 많이쓰는 Django Flask도 몇번 생각을 해봤었는데 영... 마음에 들지 않았었다. (C++이나 Rust로 해볼까 생각해보기도..... 결국 미친짓이라 판단하고 넘어갔었다)

그 와중 결국 찾은게 Go 언어의 Martini라는 framework였다. 다른 프레임 워크들에 비해 직관적인 구현과 필요 한건 다 있는 Middle ware들 그리고 Go 언어의 쉬운 문법들이다. 6월달부터 약 한달간 서버를 개발 했는데 나름 괜찮은것 같아서 쭉 사용하고 있다.


프로젝트를 진행하면서 내가 느낀 Go언어의 장점들이다.


1. 언어가 쉽다.

사실 C++을 기존에 해서 그런거 일수도 있는데 일단 언어가 간결하다. 필요한 것만 딱 들어간 기분이다. 전체적으로 느낌은 C언어 같은 느낌인데 클래스를 사용 가능한 느낌. 상속같은것도 생각 해줄 필요가 없고 interface를 만들어 준후 메서드만 구현 해주면 클래스(struct)간 의존성이 굳이 상속 없이도 코드를 쉽게 작성할 수 있구나 라는걸 느끼기도 했다. 또한 포인터가 없고 레퍼런스도 이중으로는 안되게 해놔서 복잡함이 한결 덜어졌다.


2. 생산성이 높다.

사실 파이썬이 생산성이 높다고 해서 쓰고 싶다는 생각은 전혀 든 적이 없었다. 오히려 시간이 좀 걸리더라고 C++을 이용하는게 훨씬 좋다고 생각 해왔고 소스 코드 관리도 생산성이 높은 언어보다는 더좋다고 생각했었다. 근데 사람들이 왜 파이썬을 쓰는지 조금은 이해가 갈것 같은 기분이 들긴 했다. 개발이 좀 즐거워 진달까? 생각하는 대로 코드를 바로 짤 수 있어서 좋았다. 최근 소스 코드가 600줄이 좀 넘어가기 시작했는데 경험상 C++로 이정도 양의 코드를 짜려면 아마 두 배는 걸렸을 것 같다.


3. 라이브러리 추가

아마 라이브러리 관리면에서는 가장 Modern한 언어가 아닐까 생각이 든다. 기본 라이브러리 안에 대부분 필요한게 다 들어있고 필요한 것이 있으면 go get Link 해서 라이브러리를 다운로드 받은 후 바로 로드해 주면 된다. 의존성 문제도 없다. 프로젝트 하면서 가장 편했던 점이 아닐까 생각이 든다. 그리고 필요한 것들은 역시 거의 다 있다. 구글의 힘이 느껴지는 부분이였다.


아쉽게도 이번 프로젝트에는 Go Lang의 가장 큰 장점인 Concurrency부분은 사용해 본적이 없다.. 이부분은 추후에 다시 Concurreny만 따로 글을 올려야지


장점이 있으면 항상 단점들도 있다.


1. 에러처리의 불편함

Go언어는 에러를 매번 함수마다 리턴해서 if문으로 비교해야 한다. try catch문이 매우 그리워지는 순간이다. 프로그램을 종료해야할 수준의 에러가 아니라면 check_err같은 함수를 하나 만들어서 사용하는게 편하다.


2. 소스코드 관리

Go언어는 struct와 메서드를 따로 정의해야 한다. 그래서 한 파일에 struct와 method를 많이 정의해야 한다면 소스코드가 불어나서 나중에는 좀 보기 힘들어 지는 것 같다.(경험 부족이라 그런 것 일 수도 있다.)



+ 견습프로그래머로써 실력향상 방법

BOB에서도 느끼고 이번 모콘을 하면서도 느꼇지만 견습 프로그래머로써 실력 향상하는 방법은 책을 많이 읽는 것도 좋고 연습용으로 코드를 짜는 것도 좋지만 가장 좋은건 어디 내놓을 수 있을 만한 수준의 제품 코드를 작성해 보는 것 같다. (물론 지금 코드도 어디 내놓으라고 하면 매우 부끄럽지만..)

제품을 만들 때면 여러가지를 생각해 보게 된다. 그게 보안적으로가 되었든 사용자 경험이던 코드 관리 등등 다양한 부분에서 고민을 해야하고 그걸 코드로 표현해야 한다. 사실 막상 개발에 들어가면 어려운 코드 보다는 그냥 잘 알고 있는 if문 혹은 함수, 라이브러리 가져다 쓰기 그정도 선에서 끝난다. 하지만 점점 늘어나는 소스코드 줄 수를 보면 유지보수에 대해 생각해보게 되고 재사용 그리고 프로그램의 구조에 대해서 한 번 쯤 생각해 보게 된다. 또 그 과정에서 만나는 야생의 오류들은 검색능력과 다양한 지식을 쌓을수 있게 도와준다. 아마 나보다 프로그래밍을 늦게 시작 한 후배들이 프로그래밍 느는법을 가르쳐 달라고 하면 어디 내놓을만한 제품을 만들어 보라고 얘기해 줄것 같다


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글  3개가 달렸습니다.
  1. 크 1따봉남기고 갑니다
  2. 2 따봉 ㅇㅈㅇㅈ
  3. 1. 에러처리의 불편함

    Go언어는 에러를 매번 함수마다 리턴해서 if문으로 비교해야 한다. try catch문이 매우 그리워지는 순간이다. 프로그램을 종료해야할 수준의 에러가 아니라면 check_err같은 함수를 하나 만들어서 사용하는게 편하다.

    --> 본인은 이미 이 문제 때문에 Go가 "이론증명"을 위한 언어라고 느낄정도로 피해를 봤습니다..
    물론 try catch 같은건 panic-> recover()를 이용하여 해결할 수 있다쳐도, 원 문제점을 파악하지 못하는 상황이 발생했을땐 진짜 어떻게 trace해야할지 답이 안나오기도 하져.. 실제로 저같은 경우엔 Goroutine이 꼬여서 처음엔 잘 되다가 몇시간 뒤에 갑작스럽게 데드락이 걸려버리는 현상이 발생해서 원인 파악만 1주일이 걸렸던거 같네요.. 공개적으로 perf 체크툴을 통해 leak이 발생하거나 문제가 있는걸 보여준다해도 사용방법도 은근 난감하기때문에... ㄱ-
secret

Go에는 database를 편하게 사용 할 수 있는 Gorp라는 라이브러리가 존재한다. (https://github.com/go-gorp/gorp)

일단 여러가지 디비를 지원하고 기본적으로 go에 포함되어있는 sql라이브러리 보다 훨씬 편하다.

제일 좋은점은 struct를 만들어 두고 addtable하면 자동으로 테이블도 만들어주고 디비랑 맵핑해준다.

그런데 막상 이용해보면


Panics if any interface in the list has not been registered with AddTable

라고 뜨면서 화나게 만든다...


국내에는 Go lang을 질문해서 대답해 줄만한 곳이 없어서 stackoverflow에 질문했더니 역시나 바로 달아주신다.

Go 에서는 대문자로 변수를 선언 하면 Export 소문자로 변수를 선언하면 unexport상태가 된다.

아래 코드를 보면 더 이해가 쉬울꺼다.



reflect오류는 변수가 unexported되면서 생기는 문제인데 내 코드상에서 문제는 satus를 소문자로 선언하면서 발생한 문제

status를 Status로 변경해 주자 잘 돌아갔다.

언어는 부딪히면서 배우는것 같다. 시간나면 go도 제대로 배워야지..


신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

최근 Go를 이용해 프로그래밍을 해보면서 신기한 경험을 많이하고 있다.

db를 초기화 해주는 init함수를 만들어 놓고 사용하는 코드를 집어넣지도 않았는데
db가 초기화가 되어있다. 그리고 다른 것 또한 잘돌아간다. main에다 init함수 호출하는
코드를 넣었더니 오류가 난다.


이게 무슨일이지 하고 검색해보니 func init()같은 함수를 만들게 될 경우 main함수 호출 이전에 같은 패키지 안에 있는 init함수들을 호출해준다.



위에처럼 package level의 변수들 같은 경우 선언과 함께 초기화 된다.

(단 자신이 초기화 하기위해 사용하는 변수들이 초기화 된 이후 초기화 된다.)

변수들을 dependency analysis를 통해 패키지 레벨 변수들은 아직 초기화가 안된 상황에서 초기화를 준비한다. 그리고 다른 변수에 dependency가 없는 것들을 먼저 초기화 해주고
그 다음 dependency가 있는 변수가 모두 초기화가 된 상황 이라면 dependency가 있는
변수를 초기화 한다. 위 소스는 d-b-c-a순서로 초기화를 한다.


이 이외에도 함수에 변수가 reference되어 있을 경우

static method에 대해 reference 되어있을경우도

이런 dependency check는 패키지 단위로 실행이 된다.


더 자세한건 http://golang.org/ref/spec#Package_initialization 여기 링크를 보면 된다


저작자 표시 비영리 변경 금지
신고

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

rust를 처음 시작하는데 cargo라는 처음 접하는 개념이 있었다.(물론 프로그래밍을 한지 얼마 안되서 그러는 거일수도)

c++을 사용하면서 vs를 이용해 c++ 프로젝트를 관리해왔었는데 rust 같은 경우는 cargo를 이용해 컴파일과 프로젝트를 관리 할 수 도 있다.

그럼 기존 방식에 비해 carog를 이요한 프로젝트 관리가 얼마나 좋은지 한번 알아보자


http://doc.crates.io/guide.html  <- cargo에 대한 가이드 이다. 일단 이거 기준으로 정리를..


Cargo는 기본적으로 4가지의 일을 한다

1. 프로젝트의 정보들을 두 개의 메타데이터 파일로 볼 수 있다.

2. 프로젝트 의존성을 가져오고 빌드한다.

3. 프로젝트가 올바르게 빌드 될 수 있도록 rustc혹은 다른 컴파일러의 인자를 맞춰 실행시켜준다.

4. 규칙에 대해 설명해주고 작업공간을 만들어 Rust project를 더 쉽게 할 수 있도록 해준다

    (Introduces conventions, making working with Rust projects easier. 원문은 이건데 해석이 맞는지는 모르겠다)


뭐 이론적인 설명은 여기까지로 하고

실제로 카고를 써보겠다


먼저 프로젝트를 만들어보자

커멘드 상에서 cargo new 프로젝트명 --bin 을 치게 되면 프로젝트가 만들어진다


[프로젝트가 만들어진 모습]

IDE의 프로젝트 네비게이터를 통해 보면 cargo를 이용해서 만들어진 프로젝트의 구조는 다음과 같다.

.
├── Cargo.toml
└── src
       └── main.rs

여기서 Cargo.toml은 메니페스트로써 프로젝트를 컴파일 하기 위한 모든 메타데이터들을 포함하고 있다.

그리고 src/main.rs 는 소스파일이다.


[hello world!]

다음과 같이 간단한 hello world!를 작성하고


cargo build 명령어를 쳐주게 되면 알아서 컴파일 해 준다.


[build rust project with cargo]




그럼 간단한 빌드를 해봤으니 의존성(dependency)를 추가해 보자.


[dependency]

Cargo.toml 에 dependencies time그리고 버전명을 써준후 저장하고

빌드를 하게 되면 의존성에 필요한 것들을 다운로드 한다.

막 다운 받고 잘 되겠거니 했더니 오류가 난다 =_=

64bit gcc가 없다길래 cygwin을 이용해서 컴파일 해봤다



아주 자알 된다.

아마 64bit gcc의 환경변수를 안잡아놔서 그런듯 싶다.

더 많은 모듈들을 보고 싶다면 https://crates.io/ 이사이트에 들어가서 쭈욱 보면된다.


[위 처럼 생겼다]

openssl 도 있고 regex도 있고 있을만한건 거의 다 있는 것 같다.


cargo를 쓰게되면 다른사람의 프로젝트도 쉽게 컴파일 할 수 있다.


간단하게 git에서 rust project를 하나 받고 컴파일 하면 의존성 문제없이 잘 컴파일 된다.

(이거 한줄 쓰려고 처음으로 깃헙도 가입했다.)


프로젝트에서 라이브러리를 추가 하는 것도 간단하다

Cargo.toml에서 다음과 같이 dependencies.라이브러리이름

그리고 깃 저장소 주소를 쓰면 된다.





이외에도 Cargo.lock을 이용해 라이브러리의 버전관리도 가능하다고 한다.

(git을 잘 써보지 않아 테스트는 직접 못해보겠다..)


아 그리고 cargo를 사용할 떄 유의해야할 점들이 몇가지 있다.

1. Cargo.toml 과 Cargo.lock은 프로젝트 최상위 폴더에 있어야 한다.

2. 소스코드는 src폴더안에 있어야 한다.

3. External tests go in the tests directory. (외부 테스트는 tests디렉토리에 있어야 한다??? 해석 불가 ㅠㅠ)

4. 기본 실행 파일은 src/main.rs 다

5. 기본 라이브러리 파일은 src/lib.rs다


뒷부분은 git을 이용하는 부분이 있는 것 같아서 혹시 사용해 보게 된다면 따로 추가해야겠다.


사실 파이썬을 별로 안좋아 하는 이유중 하나가 라이브러리를 추가하기가 어렵다는 점 이였는데

rust는 cargo를 이용해서 매우 간단하게 추가할 수 있어서 굉장히 마음에 든다.

익숙해지면 프로젝트 버전 관리나 의존성은 매우 잘 해결 될 것같다.

저작자 표시 비영리 동일 조건 변경 허락
신고

'공부 > 프로그래밍' 카테고리의 다른 글

Go variable export unexport & Gorp reflect panic  (0) 2015.07.10
Golang 변수 초기화 + func init  (0) 2015.06.15
Rust - cargo를 이용한 rust 프로젝트 관리 (Cargo 사용법)  (0) 2015.02.21
Turtle  (0) 2014.06.24
이진탐색  (0) 2014.05.20
dll injector 관련 자료  (0) 2014.05.19

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

Turtle

공부/프로그래밍 2014.06.24 14:31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <string>
 
using namespace std;
 
class Turtle{
public:
    int stat;
    int x;
    int y;
 
    Turtle();
    int stat_re(int );
    int move(int );
};
 
Turtle::Turtle(){
    x = 0;
    y = 0;
    stat = 1;
}
 
int Turtle::stat_re(int Case)
{
    stat += Case;
    if (stat < 1)
        stat = 4;
    else if (stat > 4)
        stat = 1;
    return 0;
}
 
int Turtle::move(int fb)
{
    switch (stat)
    {
    case 1 :
        y += fb;
        break;
    case 2 :
        x += fb;
        break;
    case 3 :
        y -= fb;
        break;
    case 4 : 
        x -= fb;
        break;
    }
    return 0;
}
 
int check(char c, Turtle &T)
{
    if (c == 'F')
        T.move(1);
    else if (c == 'B')
        T.move(-1);
    else if (c == 'R')
        T.stat_re(1);
    else if (c == 'L')
        T.stat_re(-1);
 
    return 0;
}
 
int update(int &x, int &y, Turtle &T)
{
    if (abs(T.x) > abs(x))
        x = T.x;
    if (abs(T.y) > abs(y))
        y = T.y;
 
    return 0;
}
 
 
int main(int argc, int * argv[])
{
    Turtle T = Turtle();
    string move;
    int l_x = 0, l_y = 0;
    
    cin >> move;
 
    int ml = move.length();
 
    for (int i = 0; i < ml; i++)
    {
        check(move.at(i), T);
        update(l_x, l_y, T);
    }
 
    cout << l_x*l_y << endl;
 
}


소스를 깔끔하게 짜는법을 생각해봐야할듯

2nd Week - 2011 ACM-ICPC Asia Regional - Daejeon - Problem L.pdf


저작자 표시 비영리 동일 조건 변경 허락
신고

'공부 > 프로그래밍' 카테고리의 다른 글

Golang 변수 초기화 + func init  (0) 2015.06.15
Rust - cargo를 이용한 rust 프로젝트 관리 (Cargo 사용법)  (0) 2015.02.21
Turtle  (0) 2014.06.24
이진탐색  (0) 2014.05.20
dll injector 관련 자료  (0) 2014.05.19
folder access api  (0) 2014.05.14

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#define MAX_SIZE 10
 
int main()
{
    int num[MAX_SIZE] = {5,8,13,4,2,21,31,1,44,7};
    int i,j, cmp,first=0,last=MAX_SIZE-1,tmp,half;
 
    for(i=0;i<MAX_SIZE;i++)
    {
        for(j=0;j<MAX_SIZE-1;j++)
        {
            if(num[j]>num[j+1])
            {
                tmp = num[j];
                num[j]= num[j+1];
                num[j+1] = tmp;
            }
        }
    }
 
    for(i=0;i<MAX_SIZE;i++)
        printf("%d ",num[i]);
    printf("\n");
 
    half = (first+last)/2;
    do{
        printf("input : ");
        scanf("%d",&cmp);
        do{
 
        
            if(num[half]==cmp)
            {
                printf("find! at %d \n",half);
                break;
            }
 
            if(num[half]<cmp)    
                first = half+1;
            else if(num[half]>cmp)
                last = half;
 
            half = (last+first)/2;
        }while(last>first);
 
        if(last<=first)
            printf("Can't find\n");
 
        first = 0;
        last = MAX_SIZE-1;
 
    }while(1);
 
 
 
    return 0;
 
    
}
 


저작자 표시 비영리 동일 조건 변경 허락
신고

'공부 > 프로그래밍' 카테고리의 다른 글

Rust - cargo를 이용한 rust 프로젝트 관리 (Cargo 사용법)  (0) 2015.02.21
Turtle  (0) 2014.06.24
이진탐색  (0) 2014.05.20
dll injector 관련 자료  (0) 2014.05.19
folder access api  (0) 2014.05.14
php login form Eg  (0) 2014.05.12

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret

http://www.mpgh.net/forum/showthread.php?t=332194


http://lapislazull.tistory.com/entry/Code-injection-1-Basic


http://damiproductions.darkbb.com/t494-c-dll-injection-tutorial


저작자 표시 비영리 동일 조건 변경 허락
신고

'공부 > 프로그래밍' 카테고리의 다른 글

Rust - cargo를 이용한 rust 프로젝트 관리 (Cargo 사용법)  (0) 2015.02.21
Turtle  (0) 2014.06.24
이진탐색  (0) 2014.05.20
dll injector 관련 자료  (0) 2014.05.19
folder access api  (0) 2014.05.14
php login form Eg  (0) 2014.05.12

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

받은 트랙백이 없고 , 댓글이 없습니다.
secret