Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for Reverse Engineer by Kurush
import copy
moves = []
int_pairs = []
def checkio(steps):
global moves
global int_pairs
max_depth = 2
if steps == []:
moves = []
moves.append("x")
moves.append("y")
generate_possible_expressions(0, moves, max_depth)
int_pairs = [(x, y) for x in range(5) for y in range(5)]
guess_x, guess_y = int_pairs.pop(0)
return [moves[0], guess_x, guess_y]
else:
if (steps[len(steps) - 1][2] == "ZeroDivisionError"):
moves = decrease_moves(moves, int(steps[len(steps) - 1][0]) * 1.0, int(steps[len(steps) - 1][1]) * 1.0, 1.0, 0.0)
else:
moves = decrease_moves(moves, int(steps[len(steps) - 1][0]) * 1.0, int(steps[len(steps) - 1][1]) * 1.0, int(steps[len(steps) - 1][2][0]) * 1.0, int(steps[len(steps) - 1][2][1]) * 1.0)
guess_x, guess_y = int_pairs.pop(0)
if len(moves) == 0:
return "No satisfying function"
else:
return [moves[0], guess_x, guess_y]
def generate_possible_expressions(depth, expr_list, max_depth):
if depth < max_depth:
new_currents = ["(" + "w" + " + v" + ")", "(" + "w" + " - v" + ")", "(" + "w" + " * v" + ")", "(" + "w" + " / v " + ")", "(" + "v / " + "w" + ")"]
copy_expr_list = copy.deepcopy(expr_list)
for new_current in new_currents:
for move1 in copy_expr_list:
value1 = new_current.replace("v", move1)
for move2 in copy_expr_list:
value2 = value1.replace("w", move2)
expr_list.append(value2)
generate_possible_expressions(depth + 1, expr_list, max_depth)
def decrease_moves(moves, x, y, numerator, denominator):
new_moves = []
for move in moves:
try:
result_expr = eval(move)
except ZeroDivisionError:
result_expr = -100
try:
result_guess = eval(str(numerator / denominator))
except ZeroDivisionError:
result_guess = -100
if (round(result_expr, 2) == round(result_guess, 2)):
new_moves.append(move)
return new_moves
#This part is using only for self-testing
#It's "light" version of the grader
#The hidden expression should be correct (non x/(y-y))
if __name__ == '__main__':
def test_it(hidden_expression, solver):
from fractions import Fraction
from random import randint
def check_is_right(guess, expression):
for _ in range(10):
result_guess = 0
result_expr = 1
for __ in range(100):
x, y = Fraction(randint(-100, 100)), Fraction(randint(-100, 100))
try:
result_expr = eval(expression)
result_guess = eval(guess)
except ZeroDivisionError:
continue
break
if result_guess != result_expr:
return False
return True
input_data = []
for step in range(50):
user_guess, x_real, y_real = solver(input_data)
x = Fraction(x_real)
y = Fraction(y_real)
try:
result = eval(hidden_expression)
output = [result.numerator, result.denominator]
except ZeroDivisionError:
output = "ZeroDivisionError"
input_data.append([x_real, y_real, output])
if check_is_right(user_guess, hidden_expression):
return True
else:
return False
assert test_it("x+y", checkio), "x+y"
assert test_it("x*y", checkio), "x*y"
assert test_it("x-y", checkio), "x-y"
assert test_it("x/y", checkio), "x/y"
assert test_it("(x+y)/x", checkio), "(x+y)/x"
June 20, 2014