Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

Coderbyte Python入門チャレンジ: Longest Word

 

・コード

def LongestWord(sen): 
# code goes here
array=sen.split(" ")
sen=array[0]
for i in range(1,len(array)-1):
if(len(array[i])>len(array[i-1])):
sen=array[i]
return sen

# keep this function call here
print LongestWord(raw_input())

 ・チャレンジ結果

f:id:z773733850:20190219002418p:plain

・問題点

 フィルタリング失敗のケース:

  1. 一番長い単語が最後にある場合

  2. 単語に記号をくっつけた場合

 

・改善点

 1.  

for i in range(1,len(array)-1):

to

for i in range(1,len(array)):

 2.

 先頭に以下のコードを追加し、記号をフィルタする。

sen = sen.translate(None, "~!@#$%^&*()-_+={}[]:;'<>?/,.|`")

さらにもう一つの間違いを発見した。

if(len(array[i])>len(array[i-1])):

to

if(len(array[i])>len(sen)):

 

 ・修正後のコード

def LongestWord(sen): 

    # code goes here 

    sen = sen.translate(None, "~!@#$%^&*()-_+={}[]:;'<>?/,.|`")

    array=sen.split(" ")

    sen=array[0]

    for i in range(1,len(array)):

        if(len(array[i])>len(sen)):

            sen=array[i]

    return sen

    

# keep this function call here  

print LongestWord(raw_input())  



 

・答え

def LongestWord(sen): 



    # first we remove non alphanumeric characters from the string

    # using the translate function which deletes the specified characters

    sen = sen.translate(None, "~!@#$%^&*()-_+={}[]:;'<>?/,.|`")



    # now we separate the string into a list of words

    arr = sen.split(" ")



    # the list max function will return the element in arr

    # with the longest length because we specify key=len

    return max(arr, key=len)

    

print LongestWord("the $$$longest# word is coderbyte") 

 - for文で比較するほかに、max関数でそのまま一番長い単語を取り出すこともできる

 - 「return max(arr, key=len)」: max関数内でkeyを指定することにより、arrそのものを比較して最大値を選ぶのではなく、arrの長さlen(arr)で比較することになる。

 - 文字列置換用の関数について:

 こちらのブログをご参考ください 

note.nkmk.me

 

・感想

 自分のプログラミング力が低くなっていると感じました。また、コードの厳密さを確保するのが難しいと感じました。厳密さが欠くとプログラムの脆弱性につながるので今後はプログラミングにより多くの力を入れていきたいと思います。

 

 

 

Copyright Mars 2019