0

だから私は次のような2つの入力を受け取ることができるプログラムを作成しようとしています

encrypt('12345','12')

そしてそれは戻ります

'33557'

ここで、コード( '12345')とキー( '12')によってインクリメントされ、右から左に機能します。

コードとキーの両方が8の長さの場合に機能するものをすでに作成しましたが、コードを任意のサイズにすることができる場合、おそらくステートメント用にネストされている場合、これを行う方法を理解できませんか?

これが私が早くやったことですので、あなたは私がやろうとしていることをよりよく見ることができます

def code_block(char,charBlock):
    if len(char) == 8 and len(charBlock) == 8:    #Check to make sure both are 8 didgets.
        c = char
        cB = charBlock
        line = ""
        for i in range(0,8):
            getDidget = code_char2(front(c),front(cB))
            c = last(c)
            cB = str(last(cB))
            line =line + getDidget
        print(line)
    else:
        print("Make sure two inputs are 8 didgets long")

def front(word):
    return word[:+1]

def last(word):
    return word[+1:]
4

1 に答える 1

1

Python3.2でテストされたいくつかのコード:

from decimal import Decimal
import itertools

def encrypt(numbers_as_text, code):
    key = itertools.cycle(code[::-1])

    num = Decimal(numbers_as_text)

    power = 1
    for _ in numbers_as_text:
        num += power * int(next(key))
        power *= Decimal(10)

    return num



if __name__ == "__main__":
    print(encrypt('12345','12'))

いくつかの説明:

  • code[::-1]文字列を逆にするクールな方法です。ここから盗まれた
  • itertools.cycleキーを際限なく繰り返します。したがって、変数には、、、、、、、などをkey生成するジェネレータが含まれています。212121
  • Decimal任意精度の数値を処理できるデータ型です。実際には、Python 3の整数は、任意の桁数の整数を処理できるため、十分です。型名を関数として呼び出すと、型のコンストラクターDecimal()が呼び出され、その型の新しいオブジェクトが作成されます。コンストラクターは1つの引数を処理でき、それがDecimalオブジェクトに変換されます。この例では、文字列と整数の両方がコンストラクターを使用して型に変換されます。Decimal()numbers_as_text10Decimal
  • powerは、(右から数えて)作業したすべての桁に対して1乗算される変数です。これは基本的に、現在のループ反復で10変更する必要がある場所へのポインターです。num
  • ループヘッダーはfor、指定された入力テキストの各桁に対して1回の反復を実行することを保証します。次のようなものを使用することもできますfor index in range(len(numbers_as_text))が、それは不必要に複雑です

もちろん、テキストをエンコードする場合、このアプローチは機能しません。しかし、それはあなたの質問の仕様にはなかったので、これは整数の処理に焦点を合わせた関数です。

于 2013-03-08T14:27:50.600 に答える