Problem 102 auf projecteuler.net
Hier ist mal wieder eine neue Lösung auf projecteuler.net, dieses Mal für Problem 102.
Als erstes wurden 2 Methoden erstellt. Eine für die Flächenberechnung des Dreiecks (https://en.wikipedia.org/wiki/Triangle#Using_coordinates) und eine, die prüft, ob der Ursprung im Dreieck enthalten ist.
Danach wurde nur noch die Textdatei mit den zufällig generierten Werten eingelesen und entsprechend aufgesplittet sodass das Programm die Daten nutzen kann.
Die Berechnung ging ebenfalls wieder sehr schnell:
Result: 228
real 0m0.161s
user 0m0.231s
sys 0m0.022s
Hier der Code in Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; public final class Prob102 { private final static int areaOfTriangle(int ax, int ay, int bx, int by, int cx, int cy) { return Math.abs((ax - cx) * (by - ay) - (ax - bx) * (cy - ay)); } private final static boolean triangleContainsPoint(int ax, int ay, int bx, int by, int cx, int cy, int px, int py) { return (areaOfTriangle(ax, ay, bx, by, cx, cy) == areaOfTriangle(ax, ay, bx, by, px, py) + areaOfTriangle(ax, ay, px, py, cx, cy) + areaOfTriangle(px, py, bx, by, cx, cy)); } public static void main(String[] args) { String[] l = null; int result = 0; try { final byte[] f = Files.readAllBytes(Paths.get("triangles.txt")); l = (new String(f, StandardCharsets.UTF_8)).split("\\r?\\n"); } catch (IOException e) { e.printStackTrace(); } for(int i = 0; i < l.length; i++) { int[] C = Arrays.stream(l[i].split(",")).mapToInt(Integer::parseInt).toArray(); if(triangleContainsPoint(C[0], C[1], C[2], C[3], C[4], C[5], 0, 0)) result++; } System.out.println("Result: "+result); } } |
Veröffentlicht am 30. August 2015 von admin in Java, Programmierung, projecteuler