def generate_factorization_function(function_name): """ Generate a factorization function with random variable. :param function_name: The random function name :return: A code block with the function. """ random_var_while = utils.get_random_var(vars) vars.add(random_var_while) random_var_par = utils.get_random_var(vars) vars.add(random_var_par) random_var_for = utils.get_random_var(vars) vars.add(random_var_for) block = 'def ' + function_name + '(' + random_var_par + '):\n' res = utils.get_random_var(vars) vars.add(res) block += ' ' * utils.SPACE_NUM block += res block += '=1\n' block += ' ' * utils.SPACE_NUM block += 'while ' + random_var_par + '>1:\n' block += ' ' * (utils.SPACE_NUM * 2) block += 'for ' + random_var_for + ' in range(2,' + random_var_par + '+1):\n' block += ' ' * (utils.SPACE_NUM * 3) block += 'if ' + random_var_par + '%' + random_var_for + '==0:\n' block += ' ' * (utils.SPACE_NUM * 4) block += random_var_par + '//=' + random_var_for + '\n' block += ' ' * (utils.SPACE_NUM * 4) block += res + '*=' + random_var_for + '\n' block += ' ' * (utils.SPACE_NUM * 4) block += 'break\n' block += ' ' * (utils.SPACE_NUM * 1) block += 'return ' + res + '\n' return block
def replace_constant_var_num(lines): """ For each line, if it is neccessary, it replaces a constant assignment to a variable with a call to a new function. :param lines: A list of lines returned from tokenizer.tokenize_file(...) :return: A list of lines. """ for index, line in enumerate(lines): line_tokenized = tokenizer.tokenize_line(line) if is_var_num(line): constant = get_constant(line_tokenized) if constant is not None: if constant <= 100000000000: if random.randint(0, 1) == 0: if is_not_prime(constant): # inject factorization random_function_name = utils.get_random_var(vars) vars.add(random_function_name) lines[index] = replace_var_constant( line_tokenized, random_function_name, constant) new_def.append( generate_factorization_function( random_function_name)) else: random_function_name = utils.get_random_var(vars) vars.add(random_function_name) lines[index] = replace_var_constant( line_tokenized, random_function_name, constant) new_def.append( generate_ascii_function(random_function_name)) else: random_function_name = utils.get_random_var(vars) vars.add(random_function_name) lines[index] = replace_var_constant( line_tokenized, random_function_name, constant) new_def.append( generate_ascii_function(random_function_name)) return lines
def generate_ascii_function(function_name): """ Generate a function with random variable to play with a constant. :param function_name: The random function name :return: A code block with the function. """ random_var_par = utils.get_random_var(vars) vars.add(random_var_par) random_var_list = utils.get_random_var(vars) vars.add(random_var_list) block = 'def ' + function_name + '(' + random_var_par + '):\n' block += ' ' * utils.SPACE_NUM block += random_var_list + '=[]\n' random_var_for = utils.get_random_var(vars) vars.add(random_var_for) block += ' ' * utils.SPACE_NUM block += 'for ' + random_var_for + ' in str(' + random_var_par + '):\n' block += ' ' * (utils.SPACE_NUM * 2) block += random_var_list + '.append(str(ord(' + random_var_for + ')))\n' random_var_count = utils.get_random_var(vars) vars.add(random_var_count) block += ' ' * utils.SPACE_NUM block += random_var_count + '=len(' + random_var_list + ')-1\n' random_var_res = utils.get_random_var(vars) vars.add(random_var_res) block += ' ' * utils.SPACE_NUM block += random_var_res + '=0\n' random_var_for_2 = utils.get_random_var(vars) vars.add(random_var_for_2) block += ' ' * utils.SPACE_NUM block += 'for ' + random_var_for_2 + ' in ' + random_var_list + ':\n' block += ' ' * (utils.SPACE_NUM * 2) block += random_var_res + '+=(10**' + random_var_count + ')*int(chr(int(' + random_var_for_2 + ')))\n' block += ' ' * (utils.SPACE_NUM * 2) block += random_var_count + '-=1\n' block += ' ' * utils.SPACE_NUM block += 'return ' + random_var_res + '\n' return block
def replace_constant_while(lines): """ Replace a constant into a while statement. :param lines: A list of lines returned from tokenizer.tokenize_file(...) :return: A list of lines. """ for index, line in enumerate(lines): line_tokenized = tokenizer.tokenize_line(line) if is_while(line): constant = get_constant(line_tokenized) if constant is not None and constant <= 100000000000: # inject factorization random_function_name = utils.get_random_var(vars) vars.add(random_function_name) lines[index] = replace_while(line_tokenized, random_function_name) new_def.append( generate_factorization_function(random_function_name)) return lines
def replace_constant_for(lines): """ Replace a constant into a for statement. :param lines: A list of lines returned from tokenizer.tokenize_file(...) :return: A list of lines. """ for index, line in enumerate(lines): line_tokenized = tokenizer.tokenize_line(line) if is_for(line): spec = get_for_spec(line_tokenized) if is_a_integer(spec['end']): if int(spec['end']) <= 100000000000: # inject factorization random_function_name = utils.get_random_var(vars) vars.add(random_function_name) lines[index] = replace_for(line_tokenized, spec, random_function_name) new_def.append( generate_factorization_function(random_function_name)) return lines
def generate_mult_var_var_num(operators): """ Generate a sequence of instructions to replace a simple multiplication instruction. Instruction format: variable = variable * integer. :param operators: A dictionary with operators. :return: A string as the new block of instructions. """ # var = var * num # prendo l'indentazione indentation = operators['indentation'] # get variable name var_name = operators['first'] # get term term = int(operators['third']) if random.randint(0, 1) == 0: # generate for if operators['first'] == operators['second']: # v1 = v1 * num block = ' ' * indentation block += 'var_base = ' block += var_name block += '\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += str(term-1) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + var_base' block += '\n' else: # v1 = v2 * num block = ' ' * indentation block += var_name block += '=0\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += str(term) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + ' block += operators['second'] block += '\n' else: # generate while if operators['first'] == operators['second']: # v1 = v1 * num block = ' ' * indentation block += 'var_base = ' block += var_name block += '\n' block += ' ' * indentation var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += str(term-1) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + var_base' #incremento la variabile block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name_while block += ' = ' block += var_name_while block += ' + 1' #incremento la variabile sentinella del while block += '\n' else: # v1 = v2 * num block = ' ' * indentation block += var_name block += '=0\n' var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += ' ' * indentation block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += str(term) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + ' block += operators['second'] #incremento la variabile block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name_while block += ' = ' block += var_name_while block += ' + 1' #incremento la variabile sentinella del while block += '\n' return block
def generate_sum_sub_var_var_var(operators): """ Generate a sequence of instructions to replace a simple sum o subtraction instruction. Instruction format: variable = variable [+,-] variable. :param operators: A dictionary with operators. :return: A string as the new block of instructions. """ # var = var {+,-} var # prendo l'indentazione indentation = operators['indentation'] # get variable name var_name = operators['first'] # get term term = operators['third'] if random.randint(0, 1) == 0: #se è 0 allora faccio un for # generate for if operators['first'] == operators['second']: # v1 = v1 + v2 block = ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for #così di fanno term giri del ciclo block += ' in range(0, ' block += term block += '-1):\n' block += ' ' * (indentation + utils.SPACE_NUM) #sono dentro al ciclo, quindi ho un'indentazione in più da considerare #nel ciclo la variabile è incrementata sempre di 1 e viene fatto term volte! block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' else: # v1 = v2 {+,-} v3 block = ' ' * indentation block += var_name block += '=' block += operators['second'] block += '\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += term block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' else: #se la variabile random è 1, genero il while # generate while if operators['first'] == operators['second']: # v1 = v1 {+,-} v2 block = ' ' * indentation var_name_while = utils.get_random_var(vars) #variabile sentinella generata random vars.add(var_name_while) block += var_name_while block += '=0\n' #variabile sentinella settata a zero block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += term block += '-1):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + 1' #incremento la variabile block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name_while block += ' = ' block += var_name_while block += ' + 1' #incremento la variabile sentinella del while block += '\n' else: # v1 = v2 {+,-} v3 block = ' ' * indentation block += var_name block += '=' block += operators['second'] block += '\n' var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += ' ' * indentation block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += term block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name block += ' = ' block += var_name block += ' + 1' #incremento la variabile block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) #dentro al while metto un'identazione in più! block += var_name_while block += ' = ' block += var_name_while block += ' + 1' #incremento la variabile sentinella del while block += '\n' return block
def generate_mult_var_var_var(operators): """ Generate a sequence of instructions to replace a simple multiplication instruction. Instruction format: variable = variable * variable. :param operators: A dictionary with operators. :return: A string as the new block of instructions. """ # var = var * var # get indentation indentation = operators['indentation'] # get variable name var_name = operators['first'] # get term term = operators['third'] if random.randint(0, 1) == 0: # generate for if operators['first'] == operators['second']: # v1 = v1 * v2 block = ' ' * indentation block += 'var_base = ' block += var_name block += '\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += term block += '-1):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + var_base' block += '\n' else: # v1 = v2 * v3 block = ' ' * indentation block += var_name block += '=0\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += term block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + ' block += operators['second'] block += '\n' else: # generate while if operators['first'] == operators['second']: # v1 = v1 * v2 block = ' ' * indentation block += 'var_base = ' block += var_name block += '\n' block += ' ' * indentation var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += term block += '-1):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + var_base' block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name_while block += ' = ' block += var_name_while block += ' + 1' block += '\n' else: # v1 = v2 * v3 block = ' ' * indentation block += var_name block += '=0\n' var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += ' ' * indentation block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += term block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + ' block += operators['second'] block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name_while block += ' = ' block += var_name_while block += ' + 1' block += '\n' return block
def generate_sum_sub_var_var_num(operators): """ Generate a sequence of instructions to replace a simple sum o subtraction instruction. Instruction format: variable = variable [+,-] integer. :param operators: A dictionary with operators. :return: A string as the new block of instructions. """ # var = var {+,-} num # get indentation indentation = operators['indentation'] # get variable name var_name = operators['first'] # get term term = int(operators['third']) if random.randint(0, 1) == 0: # generate for if operators['first'] == operators['second']: # v1 = v1 {+,-} num block = ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += str(term-1) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' else: # v1 = v2 {+,-} num block = ' ' * indentation block += var_name block += '=' block += operators['second'] block += '\n' block += ' ' * indentation block += 'for ' var_name_for = utils.get_random_var(vars) vars.add(var_name_for) block += var_name_for block += ' in range(0, ' block += str(term) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' else: # generate while if operators['first'] == operators['second']: # v1 = v1 {+,-} num block = ' ' * indentation var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += str(term-1) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name_while block += ' = ' block += var_name_while block += ' + 1' block += '\n' else: # v1 = v2 {+,-} num block = ' ' * indentation block += var_name block += '=' block += operators['second'] block += '\n' var_name_while = utils.get_random_var(vars) vars.add(var_name_while) block += ' ' * indentation block += var_name_while block += '=0\n' block += ' ' * indentation block += 'while (' block += var_name_while block += '<' block += str(term) block += '):\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name block += ' = ' block += var_name block += ' + 1' block += '\n' block += ' ' * (indentation + utils.SPACE_NUM) block += var_name_while block += ' = ' block += var_name_while block += ' + 1' block += '\n' return block