2017-01-11 2 views
0

J'essaye d'écrire un programme python qui va crypter le message d'entrée de l'utilisateur en utilisant une équation qui est également donnée par l'utilisateur. Cela va être mon premier programme (sauf "bonjour monde" et "numéro devineur"). Je vais essayer d'être plus précis. Je pense que la première chose à faire est de créer une liste et d'écrire toutes les lettres et leurs numéros correspondants. demandant une entrée de chaîne, et demandant à l'utilisateur d'écrire une équation comme 3x + 2. Ce que j'essaye de faire est, pour chaque lettre de l'entrée de chaîne trouvez le nombre correspondant de la liste et employez l'équation pour produire une autre sortie. Je pense que je devrais diviser le message qui va être chiffré et trouver les valeurs de chaque nombre, mais comment vais-je faire que le python mette ces nombres dans l'équation? Merci pour toute aideProgramme de cryptage avec python utilisant une fonction spécifique

+0

vous pouvez utiliser 'eval()', mais il n'est pas méthode préférée (pour des raisons de sécurité). Vous pouvez créer une fonction universelle comme 'ax^2 + bx + c' et ne demander que l'utilisateur pour' a', 'b',' c' alors vous pouvez facilement définir 'def fun (a, b, c, x): return a * x ** 2 + b * x + c'. Ou vous pouvez essayer le module [sympy] (http://www.sympy.org/en/index.html) pour les mathématiques symboliques. – furas

+0

@Emre Pourriez-vous donner un exemple? Il sera beaucoup plus facile d'aider de cette façon .. –

+0

Merci beaucoup pour l'explication! Je suppose que j'ai compris la façon dont 'rednammoc' a fait. –

Répondre

0

Vous pouvez aller char-by-char dans une boucle for et utiliser ord() pour obtenir le nombre ordinal d'un caractère ASCII. Pour évaluer les expressions arithmétiques, vous pouvez utiliser ast (voir Evaluating a mathematical expression in a string). Avant cela, vous devez remplacer "x" par le nombre ordinal précédemment recueilli.

Voici un exemple minimal qui, je l'espère, fera exactement cela.

Utilisation:

$ python mycrypt.py "Stack Overflow is Awesome!" "3x+2" 
:251:350:293:299:323:98:239:356:305:344:308:326:335:359:98:317:347:98:197:359:305:347:335:329:305:101: 

code:

#!/usr/bin/python 
import sys 
import ast 
import operator as op 

# supported operators 
operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, 
      ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor, 
      ast.USub: op.neg} 

def eval_expr(expr): 
    """ 
    >>> eval_expr('2^6') 
    4 
    >>> eval_expr('2**6') 
    64 
    >>> eval_expr('1 + 2*3**(4^5)/(6 + -7)') 
    -5.0 
    """ 
    return eval_(ast.parse(expr, mode='eval').body) 

def eval_(node): 
    if isinstance(node, ast.Num): # <number> 
     return node.n 
    elif isinstance(node, ast.BinOp): # <left> <operator> <right> 
     return operators[type(node.op)](eval_(node.left), eval_(node.right)) 
    elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1 
     return operators[type(node.op)](eval_(node.operand)) 
    else: 
     raise TypeError(node) 

# Your first argument (e.g. "Stack Overflow is Awesome!") 
text = sys.argv[1] 
# Your second argument (e.g. "3x+2") 
calc = sys.argv[2] 

# Print beginning 
sys.stdout.write(":") 
# For each character in text do your calculation     
for c in text: 
    # Generate expression by replacing x with ascii ordinal number 
    # prefixed with a multiplicator. 
    # -> character "a" has ordinal number "97" 
    # -> expression "3x+2" will be changed to "3*97+2" 
    # likewise the expression "3*x+2" will be changed to "3**97+2" 
    # which might not be the expected result. 
    expr = calc.replace("x", "*" + str(ord(c))) 
    # Evaluate expression 
    out = eval_expr(expr) 
    # Print cipher with trailing colon and without newline       
    sys.stdout.write(str(out) + ":") 
# Print ending newline 
print("")           
+0

Celui-ci exactement ce que je cherchais. Je vais essayer ça et vous le faire savoir. Merci beaucoup! –