0

CodeChefオンライン ジャッジで NZEC エラーを表示し続ける単純な python コードがあります。コードは問題GRANAMA用です。

シェフは、2 つのレシピを比較するための新しいテクニックを学びました。レシピには、処理される時間の昇順で成分のリストが含まれています。成分は文字「a」-「z」で表されます。レシピの i 番目の文字は、i 番目の材料を表します。材料は、レシピ内で複数回使用できます。

テクニックは以下の通り。それぞれのリストを比較して、2 つのレシピを比較します。両方のレシピで使用される材料のセットが等しく、各材料が
両方で同じ回数使用される場合 (処理順序は関係ありません)、
それらはグラナマ レシピとして宣言されます。(「グラナマ」は「似たような」という意味のシェフ語です。) シェフは昨日考案した 2 つのレシピを取り入れました。彼は技術を使ってそれらを比較したかった. 残念なことに、Chef は各材料がレシピで使用された回数を追跡するのを忘れていました。彼は成分を比較しただけで、それらの成分は比較しませんでした
周波数。より正確には、一方のレシピで使用され、他方のレシピで使用されていない材料がない場合、Chef は 2 つのレシピをグラナマと見なします。あなたの仕事は、Chef が 2 つのレシピを (グラナマかグラナマでないか) 正しく分類したかどうかを報告することですが、Chef は頻度を追跡するのを忘れていました。

 Input

 The first line of the input contains a single integer T denoting the number of test 
 cases. The description for T test cases follows. Each test case consists of a single 
 line containing two space-separated strings R and S denoting the two recipes.

 Output

 For each test case, output a single line containing "YES" (quotes for clarity) if Chef 
 correctly classified the two recipes as granama or not granama. Otherwise, output a 
 single line containing "NO" (quotes for clarity) if Chef declared two recipes as 
 granama when they actually are not.

 Constraints

 1 ≤ T ≤ 100
 1 ≤ |R|, |S| ≤ 1000
 Example

 Input:

 3
 alex axle
 paradise diapers
 alice bob

 Output:

 YES 
 NO
 YES

 Explanation:

 Example case 1: Chef declared them as granama recipes. They are actually granama 
 because the sets of ingredients and the number of times each ingredient has been used 
 are equal. The Chef got it right!
 Example case 2: Chef declared them as granama recipes because both sets of ingredients 
 are equal. But they are NOT granama since ingredient 'a' has been used twice in the 
 first recipe but only once in the second. The Chef was incorrect!
 Example case 3: Chef declare them as not granama. They are not granama as the sets of 
 ingredients are different. Hence, the Chef was right!

コードは次のとおりです。

k=int(raw_input())
for n in range(k):
    recipes=raw_input().split(' ')
    w1=recipes[0]
    w2=recipes[1]
    for i in w1:
        if i in w1:
            w1=w1.replace(i,'')
            w2=w2.replace(i,'')

    if w1=='' and w2=='':
        dict1={}
        dict2={}
        for i in recipes[0]:
            if i in dict1:
                dict1[i]+=1
            else:
                dict1[i]=1
        for i in recipes[1]:
            if i in dict2:
                dict2[i]+=1
            else:
                dict2[i]=1
        flag=True
        for i in dict1:
            if not dict1[i]==dict2[i]:
                print 'NO'
                flag=False
                break
        if flag:
            print 'YES'

    else:
        print 'YES'  
4

1 に答える 1

1

エラーはここにあると思います-

for i in w1:
    if i in w2:    # You were checking again in 'w1'
        w1=w1.replace(i,'')
        w2=w2.replace(i,'')

これでNZECの問題は解決するはずです。提出したソリューションはこちらでご覧いただけます。実行時間は 0.23 秒です。

このコードをコンパクトにする余地はたくさんあります。あなたのコード スニペットをいくつかピックアップして、その方法をお見せしましょう -

w1=recipes[0]
    w2=recipes[1]
    for i in w1:
        if i in w2:
            w1=w1.replace(i,'')
            w2=w2.replace(i,'')

if w1=='' and w2=='':

Python には、このような場合に非常に便利な一連のデータ構造があります。

if set(recipes[0]) == set(recipes[1]):    # Check for equality between two sets

各文字の頻度が 2 つのレシピ間で一致するかどうかを確認するために、辞書は必要ありません。ソートされた文字列を単純に比較できます。

if sorted(recipes[0]) == sorted(recipes[1])

したがって、30 行のコードを 7 行に置き換えることができます。

    if set(recipes[0]) == set(recipes[1]):
        if sorted(recipes[0]) == sorted(recipes[1]):
            print 'YES'
        else:
            print 'NO'
    else:
        print 'YES'

上記のコードに基づくコードでは、少し異なる方法で入力を行いました。0.09 秒で実行されます。

于 2013-01-07T03:47:59.717 に答える