2015-12-05 2 views
2

Я тестировал свой код для вызова overlapping rectangles на codeeval. Я чувствую, что мой код близок к решению, поскольку я тестировал его на своей машине, и он кажется правильным. Однако Codeeval придирчив и не выполнит код, заявив, что он висит. Нет дополнительной информации. Это было сделано в прошлом, но это было связано с тем, что я не закрывал свой сканер в конце. Я нарушаю аналогичный принцип здесь?CodeEval Overlapping Rectangles code code

Оценены любые рекомендации по поиску решения более простой или лучшей практики кодирования.

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.util.Scanner; 

public class Main { 

public static void main(String[] args) throws FileNotFoundException { 
    File file = new File("C:/Users/minda_000/Desktop/text.txt"); 
    FileReader fr = new FileReader(file); 
    Scanner scan = new Scanner(fr); 
    scan.useDelimiter(","); 
    boolean flag = true; 
    while (scan.hasNextLine()) { 
     String line = scan.nextLine(); 
     Scanner scanline = new Scanner(line); 
     scanline.useDelimiter(","); 
     int lxa = scanline.nextInt(); 
     int lya = scanline.nextInt(); 
     int rxa = scanline.nextInt(); 
     int rya = scanline.nextInt(); 
     int lxb = scanline.nextInt(); 
     int lyb = scanline.nextInt(); 
     int rxb = scanline.nextInt(); 
     int ryb = scanline.nextInt(); 
     int[] contentsofx = contentsOfX(lxa, rxa); 
     int[] contentsofy = contentsOfY(lya, rya); 
     int[] contentsofx2 = contentsOfX(lxb, rxb); 
     int[] contentsofy2 = contentsOfY(lyb, ryb); 
     scanline.close(); 
     for (int i = 0; i < contentsofx.length; i++) { 
      for (int j = 0; j < contentsofx2.length; j++) { 
       if (contentsofx[i] == contentsofx2[j]) { 
        if(i<contentsofy.length && i<contentsofy2.length && contentsofy[i]==contentsofy2[j]){ 
         System.out.println(true); 
         flag=false; 

        } 
       } 

      } 
     } 
    if(flag) { 
     System.out.println(false); 
    } 
       flag=true; 

    } 

    scan.close(); 

} 


public static int[] contentsOfX(int lx, int rx) { 

    int[] line = new int[(rx - lx)]; 
    for (int i = 0; i < line.length; i++) { 
     line[i] = lx + i; 
    } 
    return line; 

} 

public static int[] contentsOfY(int ly, int ry) { 

    int[] line = new int[(ly - ry)]; 
    for (int i = 0; i < line.length; i++) { 
     line[i] = ry + i; 
    } 
    return line; 

} 
} 

ответ

1

Просто чтобы убедиться, вы изменяете "C: /Users/minda_000/Desktop/text.txt" в аргументы [0] перед загрузкой решения CodeEval, верно?

Некоторые другие вопросы:

Вы выводя истина и ложь в нижнем регистре, когда они должны быть капитализированы.

В этой строке -

if(i<contentsofy.length && i<contentsofy2.length && contentsofy[i]==contentsofy2[j]){ 

- у вас есть проблема, когда я и/или J больше, чем длины contentsofy и contentsofy2.

И комментарии сделают ваш код более удобным для чтения. :-)

+0

Да, я думаю, что проблема имеет какое-то отношение к сканеру или, возможно, к краевому решению, где мой код оказывается в бесконечном цикле. – mindahl

+0

Хорошие уловы. Спасибо за вашу помощь, я закончил скремблировать этот код, так как я понял, что все проще. Я сделал некоторые плохие предположения с этим кодом, поэтому я даже не знаю, будет ли вложенные петли работать даже с учетом ваших изменений. Я вижу реализацию, которая исправит ее, но это намного сложнее, чем мое другое решение, поэтому, возможно, это не стоит изучать. Я добавлю больше комментариев в мои будущие задачи, спасибо еще раз. – mindahl

+0

Да, я знаю, каково это - попасть в такую ​​ситуацию. :-) –

0

Я сломал этот код и начал более или менее с помощью более чистого решения, используя логическую логику. Проблемы с этим кодом - методы contentOfX и contentsOfY должны быть 1 размер больше для перекрытия одной точки. Кроме того, в это время я подразумевал, что один прямоугольник всегда будет слева от другого. Из-за этого цикл вложенных циклов не работает должным образом. Тем не менее массивы сортируются для каждого значения от минимального значения x, y до максимального значения x, y, поэтому, если вы проверяете индекс обратной полярности в массиве, а также логикой должна быть работа.