

Aizu
onlineの[「表計算」問題](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_C)を解いています。

下記のコードでは`presentation error`になってしまいます。  
これは [Aizu Onlineジャッジの問題について(presentation
error)](https://ja.stackoverflow.com/questions/24300/) によると、output
の仕様に違反していることを意味しているようです。

しかし、一見`Sample Output`と同じ結果が得られています。  
どこが違うのでしょうか。  
また、こういった場合`Sample Output`との違いや、余分な空白などを見つけるにはどうしたらよいでしょうか。

[code]

    import java.util.Arrays;
    import java.util.Scanner;
    
    
    public class test{
    
        public static void main(String[] args){
    
            Scanner scan=new Scanner(System.in);
            int r=scan.nextInt();
            int c=scan.nextInt();
            int[][] matrix_rc=new int[r+1][c+1];
            int sum_r;
            int[] sum_c=new int[c+1];
            Arrays.fill(sum_c, 0);
            for(int i=0;i<r;i++){
                sum_r=0;//毎回の行で初期化
                for(int j=0;j<c+1;j++){
                    if(j!=c){
                    matrix_rc[i][j]=scan.nextInt();
                    sum_r+=matrix_rc[i][j];}
                    else if(j==c){
                        matrix_rc[i][j]=sum_r;
                    }//c+1列までを完成させた
                    sum_c[j]+=matrix_rc[i][j];//j列をすべて足したものを配列に代入
                }
            }
            for(int j=0;j<c+1;j++){
                matrix_rc[r][j]=sum_c[j];
            }//r+1行の配列に代入
            for(int i=0;i<r+1;i++){
                for(int j=0;j<c+1;j++){
                    System.out.print(matrix_rc[i][j]);
                    if(j<=c){System.out.print(" ");}
                }System.out.println();
            }
            scan.close();
    }
    
    
    }
    
[/code]


CC BY-SA 3.0
2016-04-25T11:42:51.267
24333
2016-04-27T12:33:08.207
2017-04-13T12:52:39.113
-1
15279
question
java
余分な空白などの、仕様に違反している箇所を見つけるには？


サンプルのInputとOutputがありますので、それを利用して入出力の仕様に沿った出力になっているか確認するプログラムを書けば良いように思います。

[code]

    public class TestTest {
    
        public static void main(String args[]) {
            // 入力仕様
            String[] input = new String[]{
                    "4 5",
                    "1 1 3 4 5",
                    "2 2 2 4 5",
                    "3 3 0 1 1",
                    "2 3 4 4 6",
            };
    
            System.setIn(new ByteArrayInputStream(String.join(System.lineSeparator(), input).getBytes()));
    
            // 出力結果を保持
            PrintStream originalOut = System.out;
            ByteArrayOutputStream dummyOut = new ByteArrayOutputStream();
            System.setOut(new PrintStream(dummyOut));
    
            // 実行
            test.main(null);
    
            // 出力仕様
            String[] expect = new String[]{
                    "1 1 3 4 5 14",
                    "2 2 2 4 5 15",
                    "3 3 0 1 1 8",
                    "2 3 4 4 6 19",
                    "8 9 9 13 17 56"
            };
    
            System.setOut(originalOut);
    
            String[] actual = dummyOut.toString().split(System.lineSeparator());
            if(expect.length != actual.length) {
                throw new RuntimeException("出力される行数が違います。\n"
                        + "期待行数\t["+expect.length+"]\n"
                        + "結果行数\t["+actual.length+"]");
            }
    
            for(int i = 0, length = actual.length; i < length; i++) {
                if(!expect[i].equals(actual[i])) {
                    throw new RuntimeException("結果に差異があります。\n"
                            + "期待値\t["+expect[i]+"] \n"
                            + "結果\t["+actual[i]+"]");
                }
            }
    
            System.out.println("おめでとー");
        }
    }
    
[/code]

質問にある`test`クラスでテストをすると、結果は以下のようになります。

[code]

    Exception in thread "main" java.lang.RuntimeException: 結果に差異があります。
    期待値 [1 1 3 4 5 14] 
    結果   [1 1 3 4 5 14 ]
        at TestTest.main(TestTest.java:48)
    
[/code]

「末尾に空白があるため、期待結果と異なる」ということを機械的に検出できます。


CC BY-SA 3.0
2016-04-27T12:33:08.207
24386
2016-04-27T12:33:08.207
5337
24333
answer