質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

732閲覧

Pythonでテキスト文をノックコードに変換・その逆の方法

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/25 14:28

編集2020/06/26 00:09

Pythonでテキストをノックコードに変換するプログラムについてです。
以下のような表が与えられています。
||1|2|3|4|5|
|:--|:--:|--:|
|1|A|B|C/K|D|E
|2|F|G|H|I|J
|3|L|M|N|O|P
|4|Q|R|S|T|U
|5|V|W|X|Y|Z

CとKはセットで考えていいようです。
例えばTは(4,4),Hは(2,3), Eは(1,5)とあらわされ、THEは(4,4)(2,3)(1,5)となります。
スペースはXと表現するとしてテキスト文をノックコード(と表現されていました)に変換するプログラムを組むのですが、定義方法がよくわかりません。
if文でアルファベットを定義するのは長くなりすぎてわかりにくいとのことでした。
15行程度の関数で表すようにとのことですが、どういう方法があるのか思いつきません。
今まで習ったことを使ってということでリストなどは使わないということです。

ちなみに変換するテキスト文は
PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS
をコードに変換します。
それができたらその逆も考えなくてはなりません。

if文以外でアルファベットをノックコードに変換するいい方法、また逆にする際どうすればいいかなど教えていただきたくよろしくお願いします。

なお、アルファベットはすべて大文字で、import string、string.ascii_uppercaseというのは先日ならいました。アルファベットはstring.ascii_uppercase[i]などでとりだすのだろうと思います。(enumerateはまだ習っていません)
また、tupleについては習っていないのですが、(1,1)(3,5)などの数字のペアは順番のあるtupleとなるというようなことがかいてあります。
どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

リストを使わず、かつstring.ascii_uppercaseを活かすとしたら以下のような感じでしょうか。

import string knockdict = {} for index,char in enumerate(string.ascii_uppercase): if index < 10: knockdict[char] = index // 5 + 1, index % 5 + 1 else: knockdict[char] = (index - 1) // 5 + 1, (index - 1) % 5 + 1 knockdict['K'] = knockdict['C'] codedict = {(v[0] - 1) * 5 + v[1]: k for k, v in knockdict.items()} def encode(message): print(tuple(knockdict.get(char) for char in message if char!=" ")) def decode(codes): print(''.join((codedict.get((code[0] - 1) * 5 + code[1]) for code in codes))) message = "PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS" encode(message) codes = ((3, 5),(1, 1),(1, 3),(1, 3),(3, 2),(5, 4),(1, 2),(3, 4),(5, 3),(5, 2),(2, 4),(4, 4),(2, 3),(2, 1),(2, 4),(5, 1),(1, 5),(1, 4),(3, 4),(5, 5),(1, 5),(3, 3),(3, 1),(2, 4),(4, 1),(4, 5),(3, 4),(4, 2),(2, 5),(4, 5),(2, 2),(4, 3)) decode(codes)

実行結果

((3, 5), (1, 1), (1, 3), (1, 3), (3, 2), (5, 4), (1, 2), (3, 4), (5, 3), (5, 2), (2, 4), (4, 4), (2, 3), (2, 1), (2, 4), (5, 1), (1, 5), (1, 4), (3, 4), (5, 5), (1, 5), (3, 3), (3, 1), (2, 4), (4, 1), (4, 5), (3, 4), (4, 2), (2, 5), (4, 5), (2, 2), (4, 3)) PAKKMYBOXWITHFIVEDOZENLIQUORJUGS

投稿2020/06/25 17:53

編集2020/06/25 18:10
sfdust

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/26 14:55

色々とご検討いただきありがとうございました。 まだ習っていないものもあるのですが、大変参考になりました。 ListやDictionaryは使わないでとのことでしたが、本来はそのほうが早くできることも分かりました。 スペースをXに変換したり、CKは1文字とみなすようなので、そのあたりはいろいろやってみます。 ありがとうございました。
guest

0

ベストアンサー

まだ習っていないであろう内包表記を使うとこんな感じ。
リストも使っているので、習った範囲の文法で書き直す必要がありますが・・・
なんとなくヒントになれば幸いです。

py

1NOCK = 'ABCDEFGHIJLMNOPQRSTU5VWXYZ' 2 3def text2nock(text): 4 return [(index // 5 + 1, index % 5 + 1) 5 for index in map(NOCK.find, text.replace('K', 'C')) 6 if index >= 0] 7 8def nock2text(nock): 9 return ''.join(NOCK[(y - 1) * 5 + x - 1] for y, x in nock) 10 11nock = text2nock("PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS") 12print(nock) 13print(nock2text(nock))

実行結果

text

1[(3, 5), (1, 1), (1, 3), (1, 3), (3, 2), (5, 5), (1, 2), (3, 4), (5, 4), (5, 3), (2, 4), (4, 4), (2, 3), (2, 1), (2, 4), (5, 2), (1, 5), (1, 4), (3, 4), (6, 1), (1, 5), (3, 3), (3, 1), (2, 4), (4, 1), (4, 5), (3, 4), (4, 2), (2, 5), (4, 5), (2, 2), (4, 3)] 2PACCMYBOXWITHFIVEDOZENLIQUORJUGS

text2nock関数を for文にしてprintするとこうなります。

py

1def text2nock(text): 2 text = text.replace('K', 'C') 3 for character in text: 4 index = NOCK.find(character) 5 if index >= 0: 6 nockcode = (index // 5 + 1, index % 5 + 1) 7 print(nockcode)

投稿2020/06/25 17:11

編集2020/06/26 10:33
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/26 00:16

早速ありがとうございます。 リストを使えば簡単ですっきりするのですね。 ただlist, dictionalyは使わないということなので、retuen文のなかの数字の割り振りなど参考にさせていただきます。 漠然とですが、string.ascii_uppercase[i]などでアルファベットを取り出し、それに(x,y)のように数字を割り振っていけばいいのだろうとは思います。Kのときの例外処理は必要ですが。 ただ、具体的にどうするのかやろうとするとわけがわからなくなり苦戦中です。 お時間ありましたら引き続きよろしくお願いします。
shiracamus

2020/06/26 10:17 編集

リストを使わないということは、一つ一つprintするのですか? 逆変換するときは一つ一つ input() するのですか?
退会済みユーザー

退会済みユーザー

2020/06/26 12:19

わかりにくい表現ですみません。 今習った範囲でやろうとすると、単純にif文でコードに置き換えていくのが一番わかりやすいです。 ただ、それだととても長くなるのでもっといい方法で考えてほしいといわれましたが、リストやディクショナリーは使わないでということでした。 習っていない関数もあるので、どこまで許容範囲なのかは確認が必要ですので、お教えいただいたコードを参考に自分でやってみます。 何度もお付き合いいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問