2016-04-23 5 views
0

私はこの解決しようとしている - https://www.e-olymp.com/en/problems/7549を私は(唯一の1/4を通過した)すべてのテストに合格することはできません。私は、これらの入力で自分のコードをテストしていた。別の原子は、プログラム

(AlC2)3Na4 
3Al+6C+4Na 

Gh(G2H3(H1A45)2)5(Bn6Mn3)5 
450A+30Bn+10G+Gh+25H+15Mn 

(Na1000)10Na02 
10002Na 

だから、それは動作しますが、それは動作しませんように見えます。どんなヒントも素晴らしいだろう。 Mは、その原子メイクアップを記述する分子の化学式:ここで

は問題そのものです。化学式は以下の文法に従う:

M:= G | M G

G:= S | S C

S:= A | '(' M ')'

C:= T | N E

E:= D | D E

T:= '2' | ... | '9'

N:= '1' | ... | '9'

D:= '0' | .. | '9'

A:= U | | U L L

U:= 'A' | .. | 'Z'

L:= 'a' | .. | 「Z」

カウントCは、それに先行するサブグループSのための乗数を表します。例えば、H 2 Oは2つのH(水素)原子と1つのO(酸素)原子を有し、(AlC 2)3 Na 4は3つのAl(アルミニウム)、6 C(炭素)および4 Na(ナトリウム)原子を含む。

入力

複数のテストケースが含まれています。各テストケースについて、有効な化学式を含む1行が表示されます。各行の長さは100文字以下です。

各行に対する出力

サンプル出力に示すように和の形で化学の原子分解である出力の1行が存在することになります。原子は辞書順にリストされ、1のカウントが暗示され、明示的に書かれていない。出力には空白がありません。正しい出力のすべてのカウントは、32ビット符号付き整数で表現できます。

そして、これは私のコード(それは可能性があります嫌に見えますが、とにかく)です:

import java.io.PrintWriter; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Scanner; 
//Gh(G2H3(H1A45)2)5(Bn6Mn3)5 

public class Main { 

    static Scanner mIn; 
    static PrintWriter mOut; 

    public static void main(String[] args) { 
     mIn = new Scanner(System.in); 
     mOut = new PrintWriter(System.out); 

     String line = mIn.nextLine(); 

     ArrayList<Atom> atoms = new ArrayList<>(); 

     ArrayList<Integer> startBr = new ArrayList<>(); 
     for (int i = 0; i < line.length(); i++) { 
      if (line.charAt(i) == '(') { 
       //starting 
       startBr.add(atoms.size()); 
      } else if (line.charAt(i) == ')') { 
       //ending 
       int n = 1; 

       if (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
        n = line.charAt(i + 1) - '0'; 
        i++; 
        while (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
         n *= 10; 
         n += line.charAt(i + 1) - '0'; 
         i++; 
        } 
       } 

       for (int j = startBr.get(startBr.size() - 1); j < atoms.size(); j++) { 
        atoms.get(j).n *= n; 
       } 

       startBr.remove(startBr.size() - 1); 
      } else if (Character.isUpperCase(line.charAt(i))) { 
       Atom atom = new Atom(); 
       atom.name = String.valueOf(line.charAt(i)); 
       if (line.length() > i + 1 && isCont(line.charAt(i + 1))) { 
        atom.name += String.valueOf(line.charAt(i + 1)); 
        i++; 

        if (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
         atom.n = line.charAt(i + 1) - '0'; 
         i++; 

         while (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
          atom.n *= 10; 
          atom.n += line.charAt(i + 1) - '0'; 
          i++; 
         } 
        } 
       } 

       if (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
        atom.n = Integer.parseInt(String.valueOf(line.charAt(i + 1))); 
        i++; 
        while (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
         atom.n *= 10; 
         atom.n += line.charAt(i + 1) - '0'; 
         i++; 
        } 
       } 
       atoms.add(atom); 
      } 
     } 

     for (int i = 0; i < atoms.size(); i++) { 
      for (int j = i + 1; j < atoms.size(); j++) { 
       if (atoms.get(i).name.equals(atoms.get(j).name)) { 
        atoms.get(i).n += atoms.get(j).n; 
        atoms.get(j).n = -1; 
       } 
      } 
     } 

     for (int i = 0; i < atoms.size(); i++) { 
      if (atoms.get(i).n < 1) { 
       atoms.remove(i); 
      } 
     } 

     Collections.sort(atoms, ALPHABETICAL_ORDER); 

     for (int i = 0; i < atoms.size(); i++) { 
      p(atoms.get(i).toString()); 
      if (i != atoms.size() - 1) { 
       p("+"); 
      } 
     } 
    } 

    private static Comparator<Atom> ALPHABETICAL_ORDER = new Comparator<Atom>() { 
     public int compare(Atom atom1, Atom atom2) { 
      return atom1.name.compareTo(atom2.name); 
     } 
    }; 

    private static boolean isCont(char c) { 
     return c >= 'a' && c <= 'z'; 
    } 

    private static boolean isNum(char c) { 
     return c >= '0' && c <= '9'; 
    } 

    private static void p(Object obj) { 
     mOut.print(obj); 
     mOut.flush(); 
    } 

    private static class Atom { 
     public String name; 
     public int n = 1; 

     public String toString() { 
      if (n == 1) { 
       return name; 
      } 
      return n + name; 
     } 
    } 
} 
+0

動作しない入力と出力の例を教えてください。 –

+0

私は2つのテストを例として挙げていますが、どちらも機能します。 e-olympにはさまざまなテストがありますが、私はそれらを見ることはできません。問題は私のコードが1/4のテストだけを通過することです。 – sssemil

答えて

1

は、あなたが入力としてNa123またはO1234を試してみましたか?どちらも文法で許可されているようですか?ところで

: - またはちょうど(c - '0')方法のいくつかははるかに短くすることができ...

private static boolean isCont(char c) { 
    return c >= 'a' && c <= 'z'; 
} 

private static isNum(char c) { 
    return c >= '0' && c <= '9'; 
} 

対応する値に一桁の文字cを変換するためには、あなたはCharacter.getNumericalValue(c)を使用することができます。 Characterクラスのjavadocには、おそらくあなたのユースケースの興味深いヒントが含まれています...

P.S.あなたは条件付きで続き文字を追加した後、コードを解析し、同じ番号を使用していない理由を私は本当に理解していない ....

はあなたが役立つかもしれない私は、コードの断片に投げてみましょう:

while (line.length() > i + 1 && isNum(line.charAt(i + 1))) { 
    atom.n = 10 * atom.n + (line.charAt(++i) - '0'); 
} 
+0

あなたの答えをありがとう。だから私はそれを編集しましたが、現在は(Na1000)10Na02で 10002Naとなりますが、まだ3/4テストに失敗します。 – sssemil

+0

私は他の問題を見つけませんでした...私はあなたが失敗したものを見つけてからデバッグしようとするまで、もっと複雑な例を生成しようとします。 –