2017-01-11 4 views
0

私はユーザーから与えられた式を使ってユーザーの入力メッセージを暗号化しようとしているPythonプログラムを作成しようとしています。これは私の最初のプログラム( "hello world"と "number guesser"を除く)になります。私はより具体的にしようとします。私は最初に行うべきことは、リストを作成し、すべての手紙とその対応する数字を書くことだと思います。文字列の入力を求め、3x + 2のような方程式を書くように求める。私がしようとしていることは、文字列入力の各文字がリストから対応する数字を見つけ、式を使って別の出力を生成することです。私は暗号化されるメッセージを分割して各数値の値を見つけなければならないと思いますが、どのようにしてその数値を式に入れるのでしょうか?特定の関数を使用したPythonによる暗号化プログラム

+0

あなたが使用することができ、 'のeval()'(セキュリティ上の理由のために)それが好まれていない方法。あなたは 'ax^2 + bx + c'のような普遍的な関数を作成し、' a'、 'b'、' c'をユーザに尋ねるだけで 'def fun(a、b、c、x)を簡単に定義できます:return a * x ** 2 + b * x + c'となる。あるいは、シンボリックな数学のための[sympy](http://www.sympy.org/en/index.html)モジュールを試すこともできます。 – furas

+0

@Emre例を挙げてください。この方法を助ける方がはるかに簡単です。 –

+0

説明をありがとうございました!私は 'rednammoc'のやり方を理解していたと思う。 –

答えて

0

for-loop内でchar-by-charを実行し、ord()を使用してascii文字の序数を取得することができます。算術式を評価するには、astを使用してください(Evaluating a mathematical expression in a string参照)。その前に、 "x"を以前に収集した序数で置き換える必要があります。

ここにはうまくいけば最小限の例があります。

用途:

$ 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: 

コード:

#!/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

これはまさに私が探していたものです。私はこれを試し、あなたに知らせるでしょう。どうもありがとうございます! –

関連する問題