2016-05-30 17 views
-1

文字列内の文字を対応する数値に変換し、結果が6またはNOで割り切れる場合はYESを出力します。たとえば、abは12で、YESを返します。プログラムは小さな文字列に対してうまくいきますが、非常に長い入力に対しては間違った答えを与えます。私は整数のデータ型を長く変更しようとしましたが、何も変わりませんでした。文字列デコーダが正しく機能しない

それが機能しなかったため、テストケース:here#1

編集:入力制限は小文字のみを許可する「」「i」は オリジナル問題リンクする:https://www.hackerearth.com/problem/algorithm/encoded-strings-3/

str = raw_input() 
n = len(str) 
value = 0L 
str = str[::-1] 

for i in arange(n): 
    value = value*1L + (10L**i)*(ord(str[i])-96) 

if value%6 == 0: 
    print "YES" 
else: 
    print "NO" 
+0

「テストケース」のように見えず、チャレンジでいっぱいのように見えますが、テスト**のケースが短くても機能しますか? –

+0

実際に両方のケースで実際にコードを実行することができただけで、 'value%6'は最初のケースで' 4'、2番目で '3'でした。どちらもそうではないと思う**' YES "となる。 –

+0

@ TadhgMcDonald-Jensenはい、短時間のテストケースで動作しました。私は動作する新しいコードで答えを投稿しました。おそらく、私は、変換後の文字列が長整数型では長すぎるという問題があると思います。両方の回答がYESです。 –

答えて

-1

コードの問題は、long intが、指定されたとおりにデコードされた文字列の整数値を保持するのに十分な長さではない可能性があるように思われました。

したがって、除算の数学的ルールを適用することで問題を簡素化できます。

文字列の最後の文字の対応する数字が偶数であることを確認します。表示されていない場合は「いいえ」と入力して終了します。

次に、sum divisibilityプロパティを使用して3で除算を確認します。

ここにコードがあります。

#Title: String decoding and divisibility by 6 
    #Author: Rtg 
    #Date: 29-05-16 

    str = raw_input() 
    n = len(str) 

    if (ord(str[n-1])-96)%2: 
     print "NO" 
     raise SystemExit 

    value = 0 
    for i in xrange(n): 
     value = value + ord(str[i])-96 

    if value%3 == 0: 
     print "YES" 
    else: 
     print "NO" 
+0

1:長い整数は可変長なので、文字通り多くの桁を格納できるので、生の文字列を扱うことができます.2:これは両方のテストケースで「NO」を表示します。 –

+0

これはHackerearthの練習問題であり、テストケースのために働いていました。あなたが望むなら、私はあなたに問題へのリンクを付けることができます。 –

1

をあなたのコードはそう入力に空白、CR、タブなどの余分な文字がない場合は、「数字が6で割り切れるかどうかを正しくテストする」のように動作します。指定したURLが機能していないため、失敗したテストは表示されませんでした。あなたのコード内

二つの主要なエラー:あなたは96を

1)を引いている - なぜ?もし、ord( '0')が48に等しいならば、strの真の整数値を求めたいならば、48を引く必要があります.96と48の差は6で割り切れるので、このエラーは " 6インチのテストで割り切れますが、私には利点もありません。

2)コードでは数字以外の文字を無視する必要があります。そうしないと、変換がオフビームになります。たとえば、単純な空白は最終値に-64を追加します。これは6で割り切れず、テストを中断します。

文字列をintに変換するためにint(str)を使用してください(長整数の場合は長整数が自動的に生成されます)。無効なstrのValueError例外を取得します。

+0

質問に遅れて返答し、複数の問題をおかけして申し訳ありません。それを編集し、テスト入力用の作業リンクを追加しました。 –

+0

また、端末にテストケースを貼り付けてコピーすると、(間違った)結果が自動的に表示されます。押さずに入力します –

+0

あなたはそれを間違って解釈しています。入力は '230'ではありません。入力は 'abcd'で、私が1234にデコードし、6で割り切れるかどうかをチェックする必要があります。 –

0
dic = {} 
for i in xrange(97,123): 
    dic[chr(i)] = str(i-96) 

str = raw_input() 
new_str = "" 
for i in xrange(len(str)): 
    new_str += dic[str[i]] 

val = 0 
for i in xrange(len(new_str)): 
    val = ((val*10)%6 + ((int(new_str[i]))%6))%6 # without modular arithmetic val will turn to long data type 

print "NO" if val else "YES" 

longデータ型を使用し、それに対して操作を適用するには時間がかかります。したがって、元の文字列を最初にデコードし、文字列データ型で整数形式を格納します。次に、基本モジュラ演算、すなわち(a + b)%m =(a%m + b%m)%mを適用する。

関連する問題