Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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