Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで垂直暗号を実装!文字列を縦読み形式に変換するプログラム


垂直暗号とは

垂直暗号(縦読み式の転置暗号)は、平文となる文字列を指定した行数のグリッドに行ごとに書き込み、それを列ごとに上から下へ読み上げることで暗号文を作る古典的な手法です。本記事では、Pythonを使ってこの変換をシンプルに実装する方法を解説します。

問題の概要

文字列 s と整数 n が与えられたとします。sn 行に並べ替え、その結果を縦方向(上から下、左から右)に読み取った文字列のリストを求めます。

たとえば、入力が s = "ilovepythonprogramming"n = 5 の場合、出力は次のようになります。

['ipnrn', 'lypag', 'otrm', 'vhom', 'eogi']

動作イメージ

n = 5 のとき、文字列は次のように5行に分割されます。

ilove
pytho
nprog
rammi
ng

これを1列目から順に上から下へ読むと、「ipnrn」「lypag」「otrm」「vhom」「eogi」となり、期待される出力と一致します。

解決の手順

  • 空のリスト L を用意します。
  • i を 0 から n - 1 まで順に処理します。
    • i 番目の文字から始めて n 文字おきに取り出した部分文字列を作成し、L に追加します。
  • L を返します。

ここでのポイントは、Pythonのスライス記法 s[i::n] です。「インデックス i から開始して n 文字ごとに要素を取り出す」という意味を持つため、わずか1行で列の抽出が実現できます。

実装例

class Solution:
    def solve(self, s, n):
        return [s[i::n] for i in range(n)]

ob = Solution()
s = "ilovepythonprogramming"
n = 5
print(ob.solve(s, n))

入力

"ilovepythonprogramming", 5

出力

['ipnrn', 'lypag', 'otrm', 'vhom', 'eogi']

計算量について

各スライス操作でコピーされる文字数の合計は元の文字列長と等しいため、全体の時間計算量は O(|s|)、必要なメモリも O(|s|) で抑えられます。ループ回数が増えても文字列長に比例したコストで済む、非常に効率的な実装です。


  1. セットを使って文字列内の母音の数をカウントするPythonプログラム

    本記事では、Pythonを使って文字列内に含まれる母音の数をカウントする方法について解説します。セット(set)を活用した効率的な実装を中心に、初心者の方にもわかりやすく説明していきます。 問題の概要 問題文:任意の文字列が与えられたとき、その文字列に含まれる母音の数をセットを使って数えます。 基本的なアプローチとしては、文字列全体を先頭から順に走査し、各文字が母音であるかどうかを判定します。母音であればカウントを1ずつ増やしていき、最終的な合計を出力します。 実装例 def vowel_count(str_): count = 0 # 母音をセットとして定義 vowe

  2. Pythonでsetを使って文字列内の母音の数をカウントするプログラム

    この記事では、ユーザーが入力した文字列に含まれる母音の数をカウントするPythonプログラムを紹介します。ポイントとなるのはPythonのset(セット)の活用です。setとは、反復可能(iterable)で可変(mutable)、かつ重複する要素を持たないという特徴をもつ、順序なしのコレクションデータ型です。 実行例 入力:str1 = pythonprogram 出力:3 アルゴリズム ステップ1:まず、文字列内の母音を数えるためのカウンター変数を用意します。 ステップ2:母音のセットを作成します。 ステップ3:与えられた文字列内のすべての文字を順番に走査します。 ステップ4:文字が