89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
import time
|
|
|
|
import requests
|
|
|
|
import config
|
|
|
|
verdicts = {4: '+', 2: '-', 3: '=='}
|
|
last_time = time.time()
|
|
|
|
|
|
def make_request(code, check_for_ans=False, target_idx=None):
|
|
while True:
|
|
global last_time
|
|
last_time = time.time()
|
|
time.sleep(20.1 - time.time() + last_time) # timeout to bypass cloudflare filters
|
|
request = requests.post('https://api.sort-me.org/submit', headers=config.HEADERS,
|
|
json={"task_id": config.TASK_ID, "lang": "python", "code": code, "contest_id": config.CONTEST_ID})
|
|
if request.status_code == 201:
|
|
solution_id = request.json()['id']
|
|
break
|
|
|
|
while True:
|
|
response = requests.get('https://api.sort-me.org/getSubmissionInfo', headers=config.HEADERS,
|
|
params={'id': solution_id})
|
|
if response.status_code == 200:
|
|
try:
|
|
if check_for_ans:
|
|
return response.json()['subtasks'][0]['failed_tests'][0]['n'] == target_idx + 1
|
|
|
|
return response.json()['subtasks'][0]['failed_tests'][0]['verdict']
|
|
except Exception:
|
|
time.sleep(2)
|
|
|
|
|
|
class Executor:
|
|
def __init__(self):
|
|
self.answers = []
|
|
|
|
def generate_ifs_(self, additional_element):
|
|
code = ''
|
|
for ans in self.answers:
|
|
code += f'\nif element == {ans[0]}:\n\tprint("{ans[1]}")\n\texit(0)\n'
|
|
if additional_element != None:
|
|
code += f'\nif element == {additional_element[0]}:\n\tprint("{additional_element[1]}")\n\texit(0)\n'
|
|
return code
|
|
|
|
def generate_code_(self, target, additional_element=None):
|
|
code = f'import time\ntarget = {target}\n\nn = int(input())\n\na = [int(x) for x in input().strip().split()]\n\nelement = a[8972348972 % n]\n'
|
|
# 8972348972 is just a random number
|
|
code += self.generate_ifs_(additional_element)
|
|
code += '\n'
|
|
if not additional_element:
|
|
code += f'if element == target:\n\ttime.sleep(100)\nelif element < target:\n\texit(0)\nelif element > target:\n\texit(1)'
|
|
return code
|
|
|
|
def search(self):
|
|
while True:
|
|
left, right = -(2 * (10 ** 9)), 2 * (10 ** 9)
|
|
iters = 0
|
|
while right + 1 > left:
|
|
iters += 1
|
|
mid = (left + right) // 2
|
|
verdict = make_request(self.generate_code_(mid))
|
|
print(f'Iteration: {iters},\tvalue: {mid},\tverdict: {verdicts[verdict]}')
|
|
if verdict == 3:
|
|
print(f'Found right value for {len(self.answers) + 1}')
|
|
is_yes = make_request(self.generate_code_(mid, additional_element=[mid, 'YES']),
|
|
target_idx=len(self.answers) + 1, check_for_ans=True)
|
|
if is_yes:
|
|
self.answers.append([mid, 'YES'])
|
|
print('Answer is: YES')
|
|
else:
|
|
self.answers.append([mid, 'NO'])
|
|
print('Answer is: NO')
|
|
print(f'Answers: {self.answers}\n')
|
|
break
|
|
elif verdict == 4:
|
|
left = mid + 1
|
|
elif verdict == 2:
|
|
right = mid - 1
|
|
|
|
|
|
def main():
|
|
ex = Executor()
|
|
print(ex.search())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|