Python/2.7 simple coding(+ c++)

WeChall Training: Programming 1, Flow Over Astronomy

qkqhxla1 2015. 1. 4. 19:43

Training: Programming 1


아주 일반적인 요청 빠르게 보내기 문제.


# -*- encoding: cp949 -*-
import urllib2
req = urllib2.Request('http://www.wechall.net/challenge/training/programming1/index.php?action=request')
req.add_header('cookie','쿠키')
message=urllib2.urlopen(req).read()
req = urllib2.Request('http://www.wechall.net/challenge/training/programming1/index.php?answer='+message)
req.add_header('cookie','쿠키')
print urllib2.urlopen(req).read()



Flow Over Astronomy


갑자기 빡세짐. 진수 변환을 잘 해서 보내면 된다.

Charset: bhkEsx#LPNW{j2g}Dt@G3p5]1BKXcM9QnYIJyOUATwo[elmCR8FHfirvqda_Su47VzZ06

Input Base: 46

Solution Base: 37

의 의미는 equation에서의 진수는 46진법이며, 숫자0=b,숫자1=h~~ 이런식으로 진행된다.(0부터 시작되는거 주의) 또 input base로 진법 변환을 잘 해서 계산 후 solution base로 진법 변환을 해야 한다.


# -*- encoding: cp949 -*-
import urllib2,re
req = urllib2.Request('http://www.wechall.net/challenge/anto/FlowOverAstronomy/index.php')
req.add_header('cookie','쿠키')
page = urllib2.urlopen(req).read()
in_base = int(re.findall('Input Base:\s+(\d+)<br/>',page)[0])
sol_base = int(re.findall('Solution Base:\s+(\d+)',page)[0])
if in_base > sol_base: #둘중 길이가 큰 진수까지 charset을 저장해둔다.
    charset = re.findall('Charset:\s+(.*?)<br/>',page)[0][:in_base]
else:
    charset = re.findall('Charset:\s+(.*?)<br/>',page)[0][:sol_base]
chardic = {}; numdic = {}
for i in range(len(charset)):
    chardic[charset[i]]=i #문자 관련된 사전.
    numdic[i]=charset[i] #숫자 관련된 사전(문자 관련된 사전과 반대 관계.)
equation = ''.join(re.findall('Equation</div>\s+<div class="box_c">(.*?)</div>',page)[0].split('<br/>'))
print chardic,'\n'
print numdic

var = []
gob = equation.split(' + ')[:-1][0].split(' * ')
for i in range(len(gob)):
    var.append(gob[i])
var.append(equation.split(' + ')[-1])

print var #식의 각각 값들을 var에 집어넣음. 마지막 +로 더한 진수 포함.
for i in range(len(var)): #전체 문자열 길이만큼 반복하면서 십진수로 변환함.
    num = 0
    for j in range(len(var[i]),0,-1):
        print var[i][j-1],
        ten = 1
        for k in range(len(var[i])-j):
            ten *= in_base
        ten *= chardic[var[i][j-1]]
        num += ten;
    var.append(num)
    print ''
var = var[len(var)/2:len(var)] #var배열에서 숫자 부분만 가져옴. 문자 부분은 숫자로 변환했기때문에 이제 필요없음.
sum = 1
for i in range(len(var)-1): #다 곱하고
    print var[i]
    sum *= var[i]
sum += var[len(var)-1] #마지막것만 더함. 식이 다 이런식.

answer = []
while 1: #다 곱해지고 더해진 값을 solution base로 변환.
    answer.append(numdic[int(sum%sol_base)])
    if sum < sol_base:
        break
    sum /= sol_base
print answer
answer = ''.join(answer)[::-1]
print answer

req = urllib2.Request('http://www.wechall.net/challenge/anto/FlowOverAstronomy/index.php?answer='+answer+'&action=Submit')
req.add_header('cookie','쿠키')
page = urllib2.urlopen(req).read()
print page