指定されたサーバにアクセスすると問題が表示されそれを答えていくというもの。
以下のようにサーバへアクセスするとランダムに問題文が表示されます。
nc calculateit.quals.seccon.jp 45105 1/224345516-1721549/6 = 86 No good.
適当に答えを入れても正解しません。しばらくすると以下のようなヒントが出されてボーリングのスコアだと分かります。
Hint1: 四則演算ではありません / It is not a four arithmetic operations. Hint2: 計算例 81 9- 16 6- 4/ 15 X 3- 72 45 = 82 Hint3: G- G- G- G- G- G- G- G- G- G- = 0 Hint4: X X X X X X X X X XXX = 300
いくつか手動で解こうとしますが制限時間があり自動で計算するプログラムにする必要があります。かつ、下記のように何回も問題が出てきます。
root@bt:~/Desktop/download/crypt100# python calc5.py ['6', '1', '6', '/', '2', '4', '3', '1', '5', '3', '1', '-', '4', '/', '4', '5', 'X', '2', '3'] 81 616/2431531-4/45X23 ['7', '2', '4', '3', '6', '-', '8', '1', '7', '-', '8', '/', '4', '/', '5', '-', '6', '2', '1', '6'] 87 72436-817-8/4/5-6216 ['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '4', '/', 'G'] 264 XXXXXXXXX4/G ['G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', '1', '2'] 3 G-G-G-G-G-G-G-G-G-12 ['G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', '5'] 105
かつ、100問近く解いて最後に「最高点は?」というような質問があり最終的には下記のような回答が得られます。
(適当に書いたスクリプトなので答えの出力が微妙ですが。。。)
['G', 'o', 'o', 'd', '!', '!', '\n', 'F', 'L', 'A', 'G', ':', ' ', 'B', 'o', 'w', 'l', 'i', 'n', 'g', ' ', 'i', 's', ' ', 'v', 'e', 'r', 'y', ' ', 'f', 'u', 'n', '!', '!', '\n']
Flagは Bowling is very fun!! でした。
適当にかつ必要な部分だけのスクリプトですが下記にさらしておきます。
import socket
def solve(data):
bangou1 = 0
bangou2 = 0
score = 0
char_list=list(data)
print char_list
i = len(char_list)
n=1
m=i
for y in char_list:
if(y =='-' or y == 'G'):
char_list[bangou1]='0'
bangou1=bangou1+1
X_list=char_list
X_count=0
for x in X_list:
if(x == 'X'):
X_count=X_count+1
X_count=X_count+1
if(char_list[i-2] == '/'):
if(char_list[i-1] == 'X'):
char_list[i-1] == '10'
m = i-1
if(char_list[i-3] == 'X'):
if(char_list[i-2] == 'X'):
char_list[i-2] == '10'
if(char_list[i-1] == 'X'):
char_list[i-1] == '10'
if(char_list[i-1] == '/'):
char_list[i-2] == '10'
char_list[i-1] == '0'
if(X_count>20):
m = i-2
for x in char_list:
if(x == '/'):
if(char_list[bangou2+1] == 'X'):
score = score + 10 - int(char_list[bangou2-1]) + 10
else:
score = score + 10 - int(char_list[bangou2-1]) + int(char_list[bangou2+1])
elif(x =='X'):
if(char_list[bangou2+1] == 'X' and char_list[bangou2+2] != 'X'):
score = score + 10 + int(char_list[bangou2+2]) + 10
elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] != 'X'):
score = score + 10 + 10 + int(char_list[bangou2+2])
elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] == 'X'):
score = score + 10 + 10 + 10
elif(char_list[bangou2+2] == '/'):
score = score + 10 + 10
else:
score = score + 10 + int(char_list[bangou2+2]) + int(char_list[bangou2+1])
else:
score = score + int(x)
bangou2 = bangou2 + 1
if (n==m):
break
n=n+1
score = str(score) + "\r\n"
return score
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('calculateit.quals.seccon.jp', 45105))
total_score =0
hi_score=0
low_score=500
p_count=0
while True:
p_count = p_count+1
q = s.recv(1024)
q = q.replace(' =', '').rstrip()
if 'total' in q:
total_score = str(total_score) + "\r\n"
s.send(total_score)
q = s.recv(1024)
if 'hi' in q:
hi_score = str(hi_score) + "\r\n"
s.send(hi_score)
q = s.recv(1024)
a = solve(q)
total_score=total_score+int(a)
if(int(a)>hi_score):
hi_score=int(a)
if(int(a)
0 件のコメント:
コメントを投稿