2016-07-20 2 views
0

私はこれをほぼ2日間コーディングしていますが、それを得ることはできません。私はそれを見つけることを試みる2つの異なったビットをコード化した。文字を数字に置き換えて、いつでも再変換する方法(シーザー暗号)?

コード#1 だからこの1つは文字を一覧表示されますが、数字に変更して文句を言わない(A-> 1、B-> 2、電気ショック療法)

import re 
text = input('Write Something- ') 
word = '{}'.format(text) 
for letter in word: 
    print(letter) 
    #lists down 

Outcome- 
Write something- test 
t 
e 
s 
t 

その後、私は変わり、このコードを持っています文字を数字に変換することはできますが、文字に変換することはできませんでした。 コード私は(テスト)を介してテキストを送信し、それがいずれかのセットの数字に変換することができますどのように#2

u = input('Write Something') 
a = ord(u[-1]) 
print(a) 
#converts to number and prints ^^ 
enter code here 
print('') 
print(????) 
#need to convert from numbers back to letters. 

Outcome: 
Write Something- test 
116 

(A-> 1、B-> 2)、または乱数に保存します。 txtファイルを開き、いつでも戻って読むことができるでしょうか?

+0

これはこれは、コードの書き込みやチュートリアルサービスではない、あまりにも広いです。また、乱数を入れ替えた場合、どうやって元に戻しますか? – jonrsharpe

+1

辞書を使用して、特定の数字を各文字にマップするのはなぜでしょうか。または、各文字の乱数が必要ですか?あるいは、各文字のASCII表現をしたいですか? –

+0

あなたはいくつかの基本が欠落しているようです。なぜ 'word = '{}'。書式(テキスト)'を使うのですか? – Matthias

答えて

0

何youreのがここで達成しようとしてと呼ばれています。例えば

あなたは通常、あなたが持っているだろうと言う:A = 1、A = 2、B = 3、B = 4、等...

その後、あなたはどの "シフト" "キー" を持っています手紙。 A = 4、a = 5、B = 6、b = 7など...

これは、キーが「3」であると言うことができます。もちろん、皇帝の暗号化を行うための唯一の方法です。これが最も基本的な例です。

A = G、a = g、B = H、b = hなど...または
A = G、a = H、 B = I、b = Jなど...

あなたは私が何を話しているか理解していますか?ここでも、これはほんの一例です。

ここで、プログラム/スクリプトでは、このキーを定義する必要があります。また、キーを変える必要がある場合は、どこかに保存する必要があります(書き留めてください)。あなたの言葉を文字列に入れて、各文字をチェックして変換し、それを新しい文字列に書き出します。

次に、(擬似コード!)と言うことができる:

var key = READKEYFROMFILE; 
string old = READKEYFROMFILE_OR_JUST_A_NORMAL_STRING_:) 
string new = ""; 

for (int i=0, i<old.length, i++){ 
get the string at i; 
compare with your "key"; 
shift it; 
write it in new; 
} 

は、私はあなたを助けることができる願っています。

編集:

(他の答えが言うように)あなたはまた、辞書を使用することができますが、これは非常に静的な(しかし簡単な)方法です。

また、プログラミングに関するガイド/チュートリアルもご覧ください。あなたはその経験をしていないようです。また、このトピックをよりよく理解するためのGoogleカエサル暗号化(その非常に興味深い)。

EDIT2:

オクラホマので、基本的には:

あなたはこの変数の「キー」と呼ばれる変数を、持っている、あなたがあなたの鍵を保存する(私は、キーとかして上に書いたものを理解します?)

"old"という文字列変数があります。もう一つは「新」と呼ばれています。

古いバージョンでは、変換する文字列を書きます。 新規は空です。

"forループ"を実行します。これは、 "古い"文字列の ".length"と同じくらい長くなります。 (つまり、文章が15文字の場合、ループは15回繰り返され、常にforループからの小さな "i"変数をカウントします)。

それから、「古い」から手紙を手に入れてみる必要があります(もう1つの短期間のために保存してください。たとえば、char temp = "")。

この後、現在の手紙を比較し、それをシフトする方法を決定する必要があります。 これが完了した場合は、変換された文字を「新しい」文字列に追加してください。ここで

いくつかのより正確な擬似コードである(そのないのpythonコード、私はうまくパイソンを知らない)、「文字」(手紙)のためところで文字スタンド:

var key = g; 
string old = "teststring"; 
string new = ""; 
char oldchar = ""; 
char newchar = ""; 

for (int i=0; i<old.length; i++){ 
oldchar = old.charAt[i]; 
newchar = oldchar //shift here!!! 
new.addChar(newchar); 
} 

私はあなたを助けることができる希望;)

EDIT3:

多分また、このを見てみましょう:

https://inventwithpython.com/chapter14.html

Caesar Cipher Function in Python

https://www.youtube.com/watch?v=WXIHuQU6Vrs

+0

ちょっと、私はあなたのコードを使おうとしましたが、たくさん。万が一、例を挙げてもらえばよいのでしょうか?ありがとう:) – Jay

+0

ok、今行った^^ – Reaper

+0

助けてくれてありがとう!それは今働きます! :D – Jay

0

だけdictionaryを使用します。

letters = {'a': 1, 'b': 2, ... } 

、ループ内: "シーザー暗号化"

for letter in word: 
    print(letters[letter]) 
0

シンボルコードへと戻って文字に変換するには:

:ファイルから行を読み取るには

f = open("a.txt", "w") 
f.write("someline\n") 
f.close() 

:ファイルに書き込むには

text = input('Write Something') 
for t in text: 
    d = ord(t) 
    n = chr(d) 

    print(t,d,n) 

f = open("a.txt", "r") 
lines = f.readlines() 

for line in lines: 
    print(line, end='') # all lines have newline character at the end 

f.close() 

Python 3のドキュメントを参照してください。https://docs.python.org/3/

0

ここにいくつかの例があります。私の方法は、0を埋め込んだ整数の文字列表現に文字をマッピングすることです。したがって、長さは3文字で、長さはstr.zfillです。

例:0 -> '000', 42 -> '042', 125 -> '125'

それはここ3つの

from string import printable 
#'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>[email protected][\\]^_`{|}~ \t\n\r\x0b\x0c' 
from random import sample 

# Option 1 
char_to_num_dict = {key : str(val).zfill(3) for key, val in zip(printable, sample(range(1000), len(printable))) } 

# Option 2 
char_to_num_dict = {key : str(val).zfill(3) for key, val in zip(printable, range(len(printable))) } 

# Reverse mapping - applies to both options 
num_to_char_dict = {char_to_num_dict[key] : key for key in char_to_num_dict } 

の多くになりますので、これはそれがはるかに簡単に戻って文字に数字の文字列を変換することができます辞書の2セットがあります文字を数字にマップする。最初のオプションは乱数を使用します。たとえば、'a' = '042', 'b' = '756', 'c' = '000'これは問題を1回使用してプログラムを終了し、次回にマッピングが最も確実に一致しない場合に発生します。ランダムな値を使用する場合は、辞書をファイルに保存して、キーを開くことができます。

第2のオプションは、文字を数字にマッピングして順序を維持する辞書を作成します。したがって、毎回'a' = '010', 'b' = '011', 'c' = '012'のようなシーケンスに従います。今、私はここにマッピングの選択肢について説明しました

は、使用の

>>> text_to_num('Hello World!') 
'043014021021024094058024027021013062' 
>>> num_to_text('043014021021024094058024027021013062') 
'Hello World!' 

(オプション2辞書で)そして最後に、あなたがしたくない場合は

def text_to_num(s): 
    return ''.join(char_to_num_dict.get(char, '') for char in s) 

def num_to_text(s): 
    slices = [ s[ i : i + 3 ] for i in range(0, len(s), 3) ] 
    return ''.join(num_to_char_dict.get(char, '') for char in slices) 

例の間で変換する関数であり、辞書を使用するには、ordchrを使用して、数字を0でパディングします。

def text_to_num2(s): 
    return ''.join(str(ord(char)).zfill(3) for char in s) 

def num_to_text2(s): 
    slices = [ s[ i : i + 3] for i in range(0, len(s), 3) ] 
    return ''.join(chr(int(val)) for val in slices) 

使用例

>>> text_to_num2('Hello World!') 
'072101108108111032087111114108100033' 
>>> num_to_text2('072101108108111032087111114108100033') 
'Hello World!' 
+0

ねえ、私は本当にオプション2が好きですが、コードは何らかの理由で動作していません。私はそれが動作するかどうかを見るためにabitの周りにそれを変更しましたが、それはまだisntです。それぞれのビットが何であるかを見て、例を挙げてください。ありがとう:) – Jay

+0

どのように動作していないか説明できますか?エラーはありますか?辞書を印刷して、それが大丈夫かどうか確認してください。 –

関連する問題