eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

python_problems

独学でPython『文字列操作』の基本を学ぶ【プログラミング基礎練習問題1】

独学でPython『文字列操作』の基本を学ぶ【プログラミング基礎練習問題1】




(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)



プログラミングの基本文法を学んだ方からよくこのような質問を頂きます。

悩むペン銀

Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい



こう言った『次に何すればいいか分からない』と言う疑問に対し



僕からの回答を言うと、



『沢山問題を解きましょう』

です。




これこそプログラミング力を飛躍的に向上させる一番の近道です。



このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題を、Pythonを駆使して解決できるようになるはずです。



本シリーズを習得した後、
得ることができる主な知識・内容は以下3点です。


本記事の内容

  • 基礎問題を解き、文字列操作の基礎知識を獲得する
  • 文字列操作を行う上で役立つ組み込み関数に関する知識


  • この記事を書いている僕は国立大学にてCSの学位を保有しており
    エンジニアとしての仕事では現実問題を解き続けています。



    実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
    新しい思考プロセスを学ぶことができます。



    それではやっていきましょう。


    作業用音楽でもかけながら
    勉強してみてください。







    (注) 問題のレベルについて



    以下に示す問題のレベルは五段階に分割しています。
    あくまでも目安なので、自分が解いてみたい・解ける問題から手をつけてみてください。

    解けない問題は無理して解いて理解しようとせず、もう少し学びを深めてから取り組みましょう。意外と時間を置いて取り組むと、あっさり解けたりします。


    プログラミングの勉強は継続が重要です。なので楽しさを優先しましょう!


  • very easy
  • easy
  • normal
  • difficult
  • very difficult





  • 【問題1】文字列操作 レベル: normal


    文字列を暗号化せよ!

    【問題】

    文字列操作においてrun-length encoding(文字列の長さをエンコーディングする事)は簡単で、よくあるエンコード方法として知られている。基本的なアイディアは連続する文字列の長さを数え、それぞれ整数値に置き換える事だ。問題はこれを実現するlengthEncoding関数を実装してほしい。



    具体例



    lengthEncoding関数に引数を渡した際
    出力結果は以下を想定しています。

  • lengthEncoding(‘AABBCCDDEEFFGGGG’)→’A2B2C2D2E2F2G4′
  • lengthEncoding(‘IIIIJJJDDDDKKKWW’)→ ‘I4J3D4K3W2’
  • lengthEncoding(‘IIIIPPPPPIIIIIKK’)→ ‘I4P5I5K2’



  • 注意事項



    以下、実装における注意事項です。

  • 引数として文字列を1つ受け取る
  • 文字列はアルファベットのみ
  • 戻り値はアルファベットと整数値を含む文字列



  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    作成した関数を以下のように自分の環境に書き込んで完成させ
    Runボタンを押して確認してみましょう。

    # This will get executed each time the exercise gets initialized def lengthEncoding(arg): ここにコードを入力してください return your_answer data ='AAABBBCCCDDDEEOOO' assert lengthEncoding(data) == 'A3B3C3D3E2O3' data = 'ABDNABDBSSBDNBSNS' assert lengthEncoding(data) == 'A1B1D1N1A1B1D1B1S2B1D1N1B1S1N1S1' data ='IIIIIDDDDDPPPPWWW' assert lengthEncoding(data) == 'I5D5P4W3' print('Pass!!')
    Use the assignment operator (<-) to create the variable a.




    解答例

    
    def lengthEncoding(word):
        n = len(word)
        if n == 0:
            return ''
    
        letter = word[0]
        length = 1
        res = ''
    
        for i in range(1, n):
            if word[i] == letter:
                length += 1
            else:
                res += letter + str(length)
                letter = word[i]
                length = 1
    
        res += letter + str(length)
    
        return res
    
    


    解説付き解答例

    
    
    def lengthEncoding(word):
        n = len(word) # wordの文字列長を取得
        if n == 0:
            return '' # wordの文字列長が0の場合
    
        letter = word[0] # wordの先頭文字をletterに格納
        length = 1
        res = ''
    
        for i in range(1, n):
            if word[i] == letter: # word先頭文字と続く文字が一致した場合
                length += 1   # lengthをインクリメント
            else:
                res += letter + str(length) # word先頭文字と続く文字が一致しなかった場合
                letter = word[i]            # resにその文字と文字列長を格納し、letterを先頭文字から一致しなかった文字に
                length = 1                  # アップデートし、lengthを1に戻す
    
        res += letter + str(length)   # wordに含まれる全ての文字列に対してfor文内の処理を実行し
                                      # 最終結果をresに記録する
        return res
    


    更に深く学ぶ+α











    【問題2】文字列操作 レベル: easy


    最長のprefix文字列を特定せよ!


    【問題】

    引数としてリストに格納された文字列が渡される。これら全ての文字列の中から最も長いprefix文字列を特定し、値を返すgetTheLongestPrefix関数を実装せよ。




    具体例


    実装したgetTheLongestPrefix関数に引数を与えた時、
    結果は以下のようになります。

  • getTheLongestPrefix(['fix','finance','fill'])→'fi'
  • getTheLongestPrefix(['action','activity','analysis'])→'a'


  • 注意事項


    以下の要件にしたがって関数を設計してください

  • 引数のリスト内の要素はInt型オンリー
  • 引数のリストサイズが違っても大丈夫
  • 引数のリスト内の要素はユニーク(ダブりがない)


  • テスト


    以下のテストコードをエラー無く通過できれば正解です。
    あなたの回答を書き込んで関数を完成させ、Runボタンを押して確認してみましょう。

    # This will get executed each time the exercise gets initialized def getTheLongestPrefix(arg): #ここにコードを入力してください return your_answer arg = ['cocatenate','conclude','code'] assert getTheLongestPrefix(arg) == 'co' arg = ['beautiful','bee','business'] assert getTheLongestPrefix(arg1) == 'b' arg = ['source','so','sister'] assert getTheLongestPrefix(arg1) == 's' print('Pass!!')
    Use the assignment operator (<-) to create the variable a.



    解答例


    少なくとも10分間は自分の頭で考えて問題を解きましょう。
    10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。

    
    def getTheLongestPrefix(strs):
        n = len(strs)
        if n == 0:
            return ''
    
        lcp = strs[0]
        # instead of string manipulations, manipulate with the last common index
        lcp_idx = len(lcp)
    
        for i in range(1, n):
            lcp_idx = min(lcp_idx, len(strs[i]))
    
            for j in range(lcp_idx):
                if lcp[j] != strs[i][j]:
                    lcp_idx = j
                    break
    
        return lcp[:lcp_idx]
       



    解説付き解答例

    
     def getTheLongestPrefix(strs):
         n = len(strs) # strs(リスト)の長さを取得する
         if n == 0:
             return '' # リストに要素が格納されていない場合
    
         lcp = strs[0] # リスト先頭の文字列を取得する
         lcp_idx = len(lcp) # 取得した文字列の文字列長を取得する
    
         for i in range(1, n): # strs(リスト)長回繰り返す
             lcp_idx = min(lcp_idx, len(strs[i]))  # 先頭文字の文字列長と次に続く文字列の文字列長とを比べ
                                                   # 小さい方の値をlcp_idxに格納する
             for j in range(lcp_idx):
                 if lcp[j] != strs[i][j]: #先頭文字列と次に続く文字列とを比べ、一致しない文字があった場合
                     lcp_idx = j          #lcp_idxにそのインデックスを格納し、for文を抜ける
                     break
    
         return lcp[:lcp_idx] #先頭文字列から一致した文字列までを返す
    



    更に深く学ぶ+α














    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します







    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.