Python/2.7 simple coding(+ c++)

hack this site Programming missions : Unscramble the words

qkqhxla1 2014. 11. 15. 21:07

외국워게임 https://www.hackthissite.org 의 프로그래밍 문제이다.


우연찮게도 enigmagroup.org가 막혀서 이리로 와서 프로그래밍 1번을 풀어봤는데 이게 enigmagroup


에서 마지막으로 풀었던 프로그래밍 6번과 비슷한 문제이다. 들어가보면 단어가 섞여져 있고


사전파일을 하나 준다.


wordlist.txt


여기서 찾아서 알맞는 단어로 만든다음 word1,word2~이런형식으로 보내면 된다. 


외국서버라 그런지 응답시간이 느리다. 그래서 30초나 준 듯 싶다.


enigmagroup 6번을 더럽게 문자열을 가져오는것과 달리 이번부터는 정규식을 써서 가져왔다.


까먹었던 건데 파일열때는


f = open('wordlist.txt','r')

for line in f:

    print line


요런식으로.. 또 re 모들을 쓸때에는


import re

str = """<tr> <td>List of scrambled words:   </td> <td><li>elkwra</li></td> </tr>
<tr> <td></td><td><li>nocine</li></td> </tr>
<tr> <td></td><td><li>roandg</li></td> </tr>
<tr> <td></td><td><li>preslay</li></td> </tr>
<tr> <td></td><td><li>htaetdbu</li></td> </tr>
<tr> <td></td><td><li>ecroc1s</li></td> </tr>
<tr> <td></td><td><li>niergda</li></td> </tr>
<tr> <td></td><td><li>opdlihsn</li></td> </tr>
<tr> <td></td><td><li>odnlno</li></td> </tr>
<tr> <td></td><td><li>spnshia</li></td> </tr>
"""

print re.findall('<td><li>[0-9]*[a-z]*[0-9]*[a-z]*[0-9]*[a-z]*</li></td>',str),'\n' #내가 가져올 범위를 ()로 안 감싸줄 경우. 해당 부분이 모두 저장된다.

print re.findall('<td><li>([0-9]*[a-z]*[0-9]*[a-z]*[0-9]*[a-z]*)</li></td>',str) #내가 가져올 범위를 ()로 감싸줄 경우. 원하는 부분만 가져와진다.




잊어버리지 않게 적어놔야지.


# -*- coding: euc-kr -*-
import sys,urllib2,re

req = urllib2.Request('https://www.hackthissite.org/missions/prog/1/')
req.add_header('cookie','PHPSESSID=내 쿠키')
page = urllib2.urlopen(req).read()

web_word = re.findall('<td><li>([0-9]*[a-z]*[0-9]*[a-z]*[0-9]*[a-z]*)</li></td>',page) #요런식으로 정규식을 만들었다.
print web_word

f = open('wordlist.txt','r') 
wordlist = []
for line in f:
    wordlist.append(line.rstrip())
 
dic = [{} for i in range(0,len(wordlist))] #각각의 사전파일의 단어들에 대해서 문자 갯수 사전을 만듬.
for i in range(0,len(wordlist)):
    count = [0 for j in range(0,80)] 
    for j in range(0,len(wordlist[i])): 
        count[ord(wordlist[i][j])-48] += 1
    for j in range(0,80):
        dic[i][chr(j+48)]=count[j]
 
web_dic = [{} for i in range(0,len(web_word))] #웹에서 가져온 각각의 단어들에 대해서 문자 갯수 사전을 만듬.
for i in range(0,len(web_word)):
    count = [0 for j in range(0,80)] 
    for j in range(0,len(web_word[i])): 
        count[ord(web_word[i][j])-48] += 1
    for j in range(0,80):
        web_dic[i][chr(j+48)]=count[j]
 
answer = []
for i in range(0,len(web_word)): 
    for j in range(0,len(wordlist)): 
        for k in range(0,80): 
            if web_dic[i][chr(k+48)]!=dic[j][chr(k+48)]: 
                break
            elif k==79: 
                answer.append(wordlist[j])

solve = ''
for i in range(0,len(answer)): 
    solve += answer[i]
    if i==len(answer)-1:
        break
    solve += ','
print solve,'\n'

req = urllib2.Request('https://www.hackthissite.org/missions/prog/1/index.php','solution='+solve)
req.add_header('cookie','PHPSESSID=내 쿠키값')
req.add_header('referer','https://www.hackthissite.org/missions/prog/1/')
print urllib2.urlopen(req).read()