2017-10-20 8 views
0

私はPythonで友人を指導しています。この割り当ては、文字 "p"を追加した後にすべての母音シーケンスを繰り返すエイリアン言語を逆にするスクリプトを書くことです。いくつかの例:サブストリングの交換に関するbeginner pythonスクリプトの最適化

tomato -> topomapatopogroovy->groopoovybeautiful -> beaupeautipifupul

の目標は、これを逆にすることです。 groopoovy -> groovyから。

オランダの割り当てであるため、「ij」は母音として認識されます。だからblijpij -> blij(多くのことを複雑にする、私は見つける)

私のソリューションは私にとって非常に嵩張っているようだと私はより良い、より洗練されたソリューションに興味があります。これはプログラミングの導入コースなので、残念ながら基本が重要です。

word = input() 
    vowels = ('a', 'e', 'i', 'o', 'u') 
    position = 0 
    solution = "" 
    while position < len(word): 
     if word[position] == 'p':  # obviously, search for the letter 'p' 
      add = 1      # keep track of the sub string size 
      group = "" 
      while True:     # loop to get consecutive vowels 
       if word[position + add] in vowels: 
        group += word[position + add] 
        if word[position + add] == 'i' and word[position + add + 1] == 'j': # recognize the "ij" 
         group += 'j' 
         add += 1 
        add += 1 
       else: 
        break 
       if position+add == len(word):  # stay within the bounds of the string 
        break 
      add -= 1 
      if word[position - add:position].lower() == group.lower() and group != "": 
       position += add 
      else: 

       solution += 'p' 
     else: 
      solution += word[position] 
     position += 1 
    print(solution) 

答えて

0

どのように行う必要があります。 上部にいくつかの例文があります。コメントを変更するだけです#。

すべてのステップで「p」をチェックする代わりに、母音シーケンスの先頭をチェックします。このシーケンスは常に "p"で終了します。これは、文字をソリューションに追加したくない唯一のケースです。代わりに、母音シーケンスの最後までスキップします。

"ij"が母音であるという事実は、 "i"が母音列を始めるので、特別な場合を作成しません。

word = "poopoo-poopoo" 
# word = "poopooh" 
# word = "hijipijinks" 
# word = "apapepe" 
# word = "copovfepefepe" 
vowels = ('a', 'e', 'i', 'o', 'u') 
position = 0 
solution = "" 
vowel_count = 0 # consecutive vowels 
while position < len(word): 
    c = word[position] 
    if vowel_count > 0: 
     if c == 'p': 
      position += vowel_count + 1 
      vowel_count = 0 
      continue 
     vowel_count += 1 
    else: 
     if c in vowels: 
      vowel_count = 1 
    solution += c 
    position += len(c) 

print(solution) 
+0

これは一行にも当てはまります。これは確かに私が探していたよりエレガントなソリューションです。ありがとうポール。 'c == 'p''のときに左右の部分をチェックするために少し微調整が必​​要でした。そうでなければ'岬 'という言葉が破られました。 –

+0

プログラムは、入力語がレシピに従ってフォーマットされているとみなし、構文やスペルミスをチェックしません。あなたのバージョンはそれをチェックしません。 "岬"は有効な入力ではありません。 "capapepe" *は有効であり、正しく "cape"という結果を返します。 –

1
import re 
input_text = "tomato" 
encoded = re.sub('([aeiou]+)','\\1p\\1',input_text) 
print(encoded) 
decoded = re.sub('([aeiou]+)p\\1','\\1',encoded) 
print(decoded) 

入門Pythonクラスのために、このことについてちょうどその

+0

お返事ありがとうございます。私も正規表現を検討していたが、 "ij" -is-a-母音の部分をどのように扱うかを知らなかった。まだ正規表現がそれを行う方法を考えることはできません。 –

+1

@FrankVermeulen '[aeiou]を'(?:[aeiou] | ij) 'に変更してください – Barmar

+0

生の文字列を使用するので、バックスラッシュ。 – Barmar

関連する問題