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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | =begin Description: You are a proud explorer, walking towards a range of mountains. These mountains, as they appear to you, are a series of isosceles triangles all clustered on the horizon. Check out this example image , sketched by your awesome aid nint22 (smiling-mountain not important). Your goal, given the position of the base of these triangles, how tall they are, and their base-width, is to compute the overall unique area. Note that you should not count areas that have overlapping mountains - you only care about what you can see (i.e. only count the purple areas once in the example image ). Formal Inputs & Outputs: Input Description: Integer n - The number of triangles Array of triangles T - An array of triangles, where each triangle has a position (float x), a base-length (float width), and a triangle-height (float height). Output Description: Print the area of the triangles you see (without measuring overlap more than once), accurate to the second decimal digit. Notes: #make start x, end x, slope for each side of each of the triangles #slope = change in y / change in x #y_intercept = y - slope(x) #start at left -- first line = highest line #@lines.each {|x| puts x.inspect + ": #{eq_maker(x)}" } #if two lines are true over any of the same range (if endx > startx of other line), check for intersection #y = (slope)x + height of triangle #make array of all intersections, sort by intercept_x, secondary sort by slope (edge case: triple intersect) #take the leftmost intersection #line whose slope is greater at that intersection point is higher #that line becomes new topline =end timer = Time.new @top_intersects = [] @all_intersects = {} @just_ints = [] @lines = [] #make a list of [[x1,y1],[x2,y2]], one for each line def eq_maker(line) slope = (line[1][1] - line[0][1]) / (line[1][0] - line[0][0]) y_intercept = line[0][1] - (slope * line[0][0]) return [slope, y_intercept] end def intersection_finder(line1,line2) #finds the intersection point when given four points -- makes 2 lines, solves for x=y line1 += eq_maker(line1) line2 += eq_maker(line2) if line1[2] == line2[2] return [line1,line2].sort_by {|x| x[1][0]}[0][1] if line1[3] == line2[3] #ultra edge case: if they're the same line, return the endpoint with the minimum x return [-10.0,-10.0] #less edge, but still exceptionally unlikely: if they have the same slope, return a range that doesn't exist in our board end x_int = (line2[3] - line1[3]) / (line1[2] - line2[2]) #otherwise, return the intersection point (z2 - z1) /(m1 - m2) y_int = (line1[2] * x_int) + line1[3] return [x_int, y_int] end def on_both?(line1,line2,int) #.round(3) is necessary because floats suck dick [line1,line2].each do |x| return false unless int[0].round(3) >= x[0][0].round(3) && int[0].round(3) <= x[1][0].round(3) y_range = [x[1][1].round(3),x[0][1].round(3)].sort return false unless int[1].round(3) >= y_range[0] && int[1].round(3) <= y_range[1] end return true end def intersects(current_line) #todo: make floats not suck, and make sure it's selecting the right line (check to see if the intercept coordinates fall both on the current line and the new line length, not extended lengths @all_intersects[current_line] = [] possibilities = @lines.select {|x| @all_intersects[x].nil?} #check for intersections against all other lines that haven't already been checked for intersections (or self) possibilities.each do |x| int = intersection_finder(current_line,x) if on_both?(current_line,x,int) @just_ints.push int @all_intersects[int] = [current_line,x] #every intersection has exactly 2 lines -- avoids some float problems end end return true end def area_totaler(point1,point2) #totals area under any straight_line segment from x axis -- rectangle + triangle x_range = [point1[0],point2[0]].sort y_range = [point1[1],point2[1]].sort width = x_range[1] - x_range[0] rect_height = y_range[0] triangle_height = (y_range[1] - y_range[0]) return (rect_height * width) + (0.5 * width * triangle_height) #rect area + triangle area end #format: [center-pos,base-length,height] triangles = [] 5.times do #make random triangles triangles.push [(rand(5000) + 2501) / 10.0 , (rand(5000) + 1) / 10.0 , (rand(5000) + 1001) / 10.0] end triangles.each do |x|#draw triangles coords = [(x[0] - (x[1] / 2)),0, x[0],x[2], (x[0] + (x[1] / 2)),0] @lines.push [[coords[0],coords[1]],[coords[2],coords[3]]] @lines.push [[coords[2],coords[3]],[coords[4],coords[5]]] end @lines.sort_by! {|x| x[0][0]} #start at left -- first line = highest line @lines.each { |x| intersects(x) } #build all real intersections @just_ints.sort_by! {|x| x[0]} #sort intercepts by x, move from left to right @top_intersects.push @lines[0][0] #first point on the line is the leftmost point last_point = @lines.sort_by {|x| x[1][0]}.last[1] current_line = @lines[0] #start with leftmost line @just_ints.each do |x| #iterate through intercepts, finding the top line if current_line[1][0] < x[0] && current_line[1][1].to_f == 0.0 #if the x of the next intercept is beyond the x of the end of our line, triangle hits the x axis, so add line endpoint and get the next line @top_intersects.push current_line[1] current_line = @lines[@lines.index {|z| z[0][0] > current_line[1][0]}] @top_intersects.push current_line[0] end if @all_intersects[x].include?(current_line) #if the next intersect includes our line, switch lines, push intersect to top_intersects @top_intersects.push x current_line = (@all_intersects[x] - [current_line])[0] end #otherwise, if the int isn't on our line, do nothing end @top_intersects.push last_point #add the last point after all intercepts =) triangles.each_index do |x| puts "Triangle #{x+1}: center-position='#{triangles[x][0]}', width='#{triangles[x][1]}', height='#{triangles[x][2]}'" end area = 0 (@top_intersects.length - 1).times do |x| #count the total area under all sections area += area_totaler(@top_intersects[x],@top_intersects[x + 1]) end puts "Computed area is: #{area}" sum = 0 triangles.each do |x| #sum all the triangles, for comparison sum += (x[1] * x[2] * 0.5) end puts "Area of all triangles, including overlap, is: #{sum}" puts "Done. Took #{Time.new - timer} seconds." |
PWJlZ2luCkRlc2NyaXB0aW9uOgpZb3UgYXJlIGEgcHJvdWQgZXhwbG9yZXIsIHdhbGtpbmcgdG93YXJkcyBhIHJhbmdlIG9mIG1vdW50YWlucy4gVGhlc2UgbW91bnRhaW5zLCBhcyB0aGV5IGFwcGVhciB0byB5b3UsIGFyZSBhIHNlcmllcyBvZiBpc29zY2VsZXMgdHJpYW5nbGVzIGFsbCBjbHVzdGVyZWQgb24gdGhlIGhvcml6b24uIENoZWNrIG91dCB0aGlzIGV4YW1wbGUgaW1hZ2UgLCBza2V0Y2hlZCBieSB5b3VyIGF3ZXNvbWUgYWlkIG5pbnQyMiAoc21pbGluZy1tb3VudGFpbiBub3QgaW1wb3J0YW50KS4gWW91ciBnb2FsLCBnaXZlbiB0aGUgcG9zaXRpb24gb2YgdGhlIGJhc2Ugb2YgdGhlc2UgdHJpYW5nbGVzLCBob3cgdGFsbCB0aGV5IGFyZSwgYW5kIHRoZWlyIGJhc2Utd2lkdGgsIGlzIHRvIGNvbXB1dGUgdGhlIG92ZXJhbGwgdW5pcXVlIGFyZWEuIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBjb3VudCBhcmVhcyB0aGF0IGhhdmUgb3ZlcmxhcHBpbmcgbW91bnRhaW5zIC0geW91IG9ubHkgY2FyZSBhYm91dCB3aGF0IHlvdSBjYW4gc2VlIChpLmUuIG9ubHkgY291bnQgdGhlIHB1cnBsZSBhcmVhcyBvbmNlIGluIHRoZSBleGFtcGxlIGltYWdlICkuCgpGb3JtYWwgSW5wdXRzICYgT3V0cHV0czoKSW5wdXQgRGVzY3JpcHRpb246CkludGVnZXIgbiAtIFRoZSBudW1iZXIgb2YgdHJpYW5nbGVzCkFycmF5IG9mIHRyaWFuZ2xlcyBUIC0gQW4gYXJyYXkgb2YgdHJpYW5nbGVzLCB3aGVyZSBlYWNoIHRyaWFuZ2xlIGhhcyBhIHBvc2l0aW9uIChmbG9hdCB4KSwgYSBiYXNlLWxlbmd0aCAoZmxvYXQgd2lkdGgpLCBhbmQgYSB0cmlhbmdsZS1oZWlnaHQgKGZsb2F0IGhlaWdodCkuCgpPdXRwdXQgRGVzY3JpcHRpb246ClByaW50IHRoZSBhcmVhIG9mIHRoZSB0cmlhbmdsZXMgeW91IHNlZSAod2l0aG91dCBtZWFzdXJpbmcgb3ZlcmxhcCBtb3JlIHRoYW4gb25jZSksIGFjY3VyYXRlIHRvIHRoZSBzZWNvbmQgZGVjaW1hbCBkaWdpdC4KCk5vdGVzOgojbWFrZSBzdGFydCB4LCBlbmQgeCwgc2xvcGUgZm9yIGVhY2ggc2lkZSBvZiBlYWNoIG9mIHRoZSB0cmlhbmdsZXMKI3Nsb3BlID0gY2hhbmdlIGluIHkgLyBjaGFuZ2UgaW4geAojeV9pbnRlcmNlcHQgPSB5IC0gc2xvcGUoeCkKICNzdGFydCBhdCBsZWZ0IC0tIGZpcnN0IGxpbmUgPSBoaWdoZXN0IGxpbmUKI0BsaW5lcy5lYWNoIHt8eHwgcHV0cyB4Lmluc3BlY3QgKyAiOiAje2VxX21ha2VyKHgpfSIgfQojaWYgdHdvIGxpbmVzIGFyZSB0cnVlIG92ZXIgYW55IG9mIHRoZSBzYW1lIHJhbmdlIChpZiBlbmR4ID4gc3RhcnR4IG9mIG90aGVyIGxpbmUpLCBjaGVjayBmb3IgaW50ZXJzZWN0aW9uCiAgICAjeSA9IChzbG9wZSl4ICsgaGVpZ2h0IG9mIHRyaWFuZ2xlCgkjbWFrZSBhcnJheSBvZiBhbGwgaW50ZXJzZWN0aW9ucywgc29ydCBieSBpbnRlcmNlcHRfeCwgc2Vjb25kYXJ5IHNvcnQgYnkgc2xvcGUgKGVkZ2UgY2FzZTogdHJpcGxlIGludGVyc2VjdCkKCSN0YWtlIHRoZSBsZWZ0bW9zdCBpbnRlcnNlY3Rpb24KCSNsaW5lIHdob3NlIHNsb3BlIGlzIGdyZWF0ZXIgYXQgdGhhdCBpbnRlcnNlY3Rpb24gcG9pbnQgaXMgaGlnaGVyCgkjdGhhdCBsaW5lIGJlY29tZXMgbmV3IHRvcGxpbmUKPWVuZAp0aW1lciA9IFRpbWUubmV3CkB0b3BfaW50ZXJzZWN0cyA9IFtdCkBhbGxfaW50ZXJzZWN0cyA9IHt9CkBqdXN0X2ludHMgPSBbXQpAbGluZXMgPSBbXSAjbWFrZSBhIGxpc3Qgb2YgW1t4MSx5MV0sW3gyLHkyXV0sIG9uZSBmb3IgZWFjaCBsaW5lCmRlZiBlcV9tYWtlcihsaW5lKQoJc2xvcGUgPSAobGluZVsxXVsxXSAtIGxpbmVbMF1bMV0pIC8gKGxpbmVbMV1bMF0gLSBsaW5lWzBdWzBdKQoJeV9pbnRlcmNlcHQgPSBsaW5lWzBdWzFdIC0gKHNsb3BlICogbGluZVswXVswXSkKCXJldHVybiBbc2xvcGUsIHlfaW50ZXJjZXB0XQplbmQKZGVmIGludGVyc2VjdGlvbl9maW5kZXIobGluZTEsbGluZTIpICNmaW5kcyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IHdoZW4gZ2l2ZW4gZm91ciBwb2ludHMgLS0gbWFrZXMgMiBsaW5lcywgc29sdmVzIGZvciB4PXkKCWxpbmUxICs9IGVxX21ha2VyKGxpbmUxKQoJbGluZTIgKz0gZXFfbWFrZXIobGluZTIpCglpZiBsaW5lMVsyXSA9PSAgbGluZTJbMl0gCgkJcmV0dXJuIFtsaW5lMSxsaW5lMl0uc29ydF9ieSB7fHh8IHhbMV1bMF19WzBdWzFdIGlmIGxpbmUxWzNdID09IGxpbmUyWzNdICN1bHRyYSBlZGdlIGNhc2U6IGlmIHRoZXkncmUgdGhlIHNhbWUgbGluZSwgcmV0dXJuIHRoZSBlbmRwb2ludCB3aXRoIHRoZSBtaW5pbXVtIHgKCQlyZXR1cm4gWy0xMC4wLC0xMC4wXSAjbGVzcyBlZGdlLCBidXQgc3RpbGwgZXhjZXB0aW9uYWxseSB1bmxpa2VseTogaWYgdGhleSBoYXZlIHRoZSBzYW1lIHNsb3BlLCByZXR1cm4gYSByYW5nZSB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gb3VyIGJvYXJkCgllbmQKCXhfaW50ID0gKGxpbmUyWzNdIC0gbGluZTFbM10pIC8gKGxpbmUxWzJdIC0gbGluZTJbMl0pICNvdGhlcndpc2UsIHJldHVybiB0aGUgaW50ZXJzZWN0aW9uIHBvaW50ICh6MiAtIHoxKSAvKG0xIC0gbTIpCgl5X2ludCA9IChsaW5lMVsyXSAqIHhfaW50KSArIGxpbmUxWzNdCglyZXR1cm4gW3hfaW50LCB5X2ludF0KZW5kCmRlZiBvbl9ib3RoPyhsaW5lMSxsaW5lMixpbnQpICAjLnJvdW5kKDMpIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGZsb2F0cyBzdWNrIGRpY2sKCVtsaW5lMSxsaW5lMl0uZWFjaCBkbyB8eHwKCQlyZXR1cm4gZmFsc2UgdW5sZXNzIGludFswXS5yb3VuZCgzKSA+PSB4WzBdWzBdLnJvdW5kKDMpICYmIGludFswXS5yb3VuZCgzKSA8PSB4WzFdWzBdLnJvdW5kKDMpCgkJeV9yYW5nZSA9IFt4WzFdWzFdLnJvdW5kKDMpLHhbMF1bMV0ucm91bmQoMyldLnNvcnQKCQlyZXR1cm4gZmFsc2UgdW5sZXNzIGludFsxXS5yb3VuZCgzKSA+PSB5X3JhbmdlWzBdICYmIGludFsxXS5yb3VuZCgzKSA8PSB5X3JhbmdlWzFdCgllbmQKCXJldHVybiB0cnVlCmVuZApkZWYgaW50ZXJzZWN0cyhjdXJyZW50X2xpbmUpICN0b2RvOiBtYWtlIGZsb2F0cyBub3Qgc3VjaywgYW5kIG1ha2Ugc3VyZSBpdCdzIHNlbGVjdGluZyB0aGUgcmlnaHQgbGluZSAoY2hlY2sgdG8gc2VlIGlmIHRoZSBpbnRlcmNlcHQgY29vcmRpbmF0ZXMgZmFsbCBib3RoIG9uIHRoZSBjdXJyZW50IGxpbmUgYW5kIHRoZSBuZXcgbGluZSBsZW5ndGgsIG5vdCBleHRlbmRlZCBsZW5ndGhzIAoJQGFsbF9pbnRlcnNlY3RzW2N1cnJlbnRfbGluZV0gPSBbXQoJcG9zc2liaWxpdGllcyA9IEBsaW5lcy5zZWxlY3Qge3x4fCBAYWxsX2ludGVyc2VjdHNbeF0ubmlsP30gI2NoZWNrIGZvciBpbnRlcnNlY3Rpb25zIGFnYWluc3QgYWxsIG90aGVyIGxpbmVzIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IgaW50ZXJzZWN0aW9ucyAob3Igc2VsZikKCXBvc3NpYmlsaXRpZXMuZWFjaCBkbyB8eHwKCQlpbnQgPSBpbnRlcnNlY3Rpb25fZmluZGVyKGN1cnJlbnRfbGluZSx4KQoJCWlmIG9uX2JvdGg/KGN1cnJlbnRfbGluZSx4LGludCkKCQkJQGp1c3RfaW50cy5wdXNoIGludAoJCQlAYWxsX2ludGVyc2VjdHNbaW50XSA9IFtjdXJyZW50X2xpbmUseF0gI2V2ZXJ5IGludGVyc2VjdGlvbiBoYXMgZXhhY3RseSAyIGxpbmVzIC0tIGF2b2lkcyBzb21lIGZsb2F0IHByb2JsZW1zCgkJZW5kCgllbmQKCXJldHVybiB0cnVlCmVuZApkZWYgYXJlYV90b3RhbGVyKHBvaW50MSxwb2ludDIpICN0b3RhbHMgYXJlYSB1bmRlciBhbnkgc3RyYWlnaHRfbGluZSBzZWdtZW50IGZyb20geCBheGlzIC0tIHJlY3RhbmdsZSArIHRyaWFuZ2xlCgl4X3JhbmdlID0gW3BvaW50MVswXSxwb2ludDJbMF1dLnNvcnQKCXlfcmFuZ2UgPSBbcG9pbnQxWzFdLHBvaW50MlsxXV0uc29ydAoJd2lkdGggPSB4X3JhbmdlWzFdIC0geF9yYW5nZVswXQoJcmVjdF9oZWlnaHQgPSB5X3JhbmdlWzBdCgl0cmlhbmdsZV9oZWlnaHQgPSAoeV9yYW5nZVsxXSAtIHlfcmFuZ2VbMF0pCglyZXR1cm4gKHJlY3RfaGVpZ2h0ICogd2lkdGgpICsgKDAuNSAqIHdpZHRoICogdHJpYW5nbGVfaGVpZ2h0KSAjcmVjdCBhcmVhICsgdHJpYW5nbGUgYXJlYQplbmQKCiNmb3JtYXQ6IFtjZW50ZXItcG9zLGJhc2UtbGVuZ3RoLGhlaWdodF0KdHJpYW5nbGVzID0gW10KNS50aW1lcyBkbyAjbWFrZSByYW5kb20gdHJpYW5nbGVzCgl0cmlhbmdsZXMucHVzaCBbKHJhbmQoNTAwMCkgKyAyNTAxKSAvIDEwLjAgLCAocmFuZCg1MDAwKSArIDEpIC8gMTAuMCAsIChyYW5kKDUwMDApICsgMTAwMSkgLyAxMC4wXQplbmQKCnRyaWFuZ2xlcy5lYWNoIGRvIHx4fCNkcmF3IHRyaWFuZ2xlcwoJY29vcmRzID0gWyh4WzBdIC0gKHhbMV0gLyAyKSksMCwJeFswXSx4WzJdLAkoeFswXSArICh4WzFdIC8gMikpLDBdCglAbGluZXMucHVzaCBbW2Nvb3Jkc1swXSxjb29yZHNbMV1dLFtjb29yZHNbMl0sY29vcmRzWzNdXV0KCUBsaW5lcy5wdXNoIFtbY29vcmRzWzJdLGNvb3Jkc1szXV0sW2Nvb3Jkc1s0XSxjb29yZHNbNV1dXQplbmQKCkBsaW5lcy5zb3J0X2J5ISB7fHh8IHhbMF1bMF19ICNzdGFydCBhdCBsZWZ0IC0tIGZpcnN0IGxpbmUgPSBoaWdoZXN0IGxpbmUKQGxpbmVzLmVhY2ggeyB8eHwgaW50ZXJzZWN0cyh4KSB9ICNidWlsZCBhbGwgcmVhbCBpbnRlcnNlY3Rpb25zCkBqdXN0X2ludHMuc29ydF9ieSEge3x4fCB4WzBdfSAjc29ydCBpbnRlcmNlcHRzIGJ5IHgsIG1vdmUgZnJvbSBsZWZ0IHRvIHJpZ2h0CkB0b3BfaW50ZXJzZWN0cy5wdXNoIEBsaW5lc1swXVswXSAjZmlyc3QgcG9pbnQgb24gdGhlIGxpbmUgaXMgdGhlIGxlZnRtb3N0IHBvaW50Cmxhc3RfcG9pbnQgPSBAbGluZXMuc29ydF9ieSB7fHh8IHhbMV1bMF19Lmxhc3RbMV0KY3VycmVudF9saW5lID0gQGxpbmVzWzBdICNzdGFydCB3aXRoIGxlZnRtb3N0IGxpbmUKCkBqdXN0X2ludHMuZWFjaCBkbyB8eHwgI2l0ZXJhdGUgdGhyb3VnaCBpbnRlcmNlcHRzLCBmaW5kaW5nIHRoZSB0b3AgbGluZQoJaWYgY3VycmVudF9saW5lWzFdWzBdIDwgeFswXSAmJiBjdXJyZW50X2xpbmVbMV1bMV0udG9fZiA9PSAwLjAgICNpZiB0aGUgeCBvZiB0aGUgbmV4dCBpbnRlcmNlcHQgaXMgYmV5b25kIHRoZSB4IG9mIHRoZSBlbmQgb2Ygb3VyIGxpbmUsIHRyaWFuZ2xlIGhpdHMgdGhlIHggYXhpcywgc28gYWRkIGxpbmUgZW5kcG9pbnQgYW5kIGdldCB0aGUgbmV4dCBsaW5lCgkJQHRvcF9pbnRlcnNlY3RzLnB1c2ggY3VycmVudF9saW5lWzFdCgkJY3VycmVudF9saW5lID0gQGxpbmVzW0BsaW5lcy5pbmRleCB7fHp8IHpbMF1bMF0gPiBjdXJyZW50X2xpbmVbMV1bMF19XQoJCUB0b3BfaW50ZXJzZWN0cy5wdXNoIGN1cnJlbnRfbGluZVswXQoJZW5kCgkKCWlmIEBhbGxfaW50ZXJzZWN0c1t4XS5pbmNsdWRlPyhjdXJyZW50X2xpbmUpICNpZiB0aGUgbmV4dCBpbnRlcnNlY3QgaW5jbHVkZXMgb3VyIGxpbmUsIHN3aXRjaCBsaW5lcywgcHVzaCBpbnRlcnNlY3QgdG8gdG9wX2ludGVyc2VjdHMKCQlAdG9wX2ludGVyc2VjdHMucHVzaCB4CgkJY3VycmVudF9saW5lID0gKEBhbGxfaW50ZXJzZWN0c1t4XSAtIFtjdXJyZW50X2xpbmVdKVswXQoJZW5kCgkjb3RoZXJ3aXNlLCBpZiB0aGUgaW50IGlzbid0IG9uIG91ciBsaW5lLCBkbyBub3RoaW5nCmVuZAoKQHRvcF9pbnRlcnNlY3RzLnB1c2ggbGFzdF9wb2ludCAjYWRkIHRoZSBsYXN0IHBvaW50IGFmdGVyIGFsbCBpbnRlcmNlcHRzID0pCgp0cmlhbmdsZXMuZWFjaF9pbmRleCBkbyB8eHwKCXB1dHMgIlRyaWFuZ2xlICN7eCsxfTogY2VudGVyLXBvc2l0aW9uPScje3RyaWFuZ2xlc1t4XVswXX0nLCB3aWR0aD0nI3t0cmlhbmdsZXNbeF1bMV19JywgaGVpZ2h0PScje3RyaWFuZ2xlc1t4XVsyXX0nIgplbmQKCmFyZWEgPSAwCihAdG9wX2ludGVyc2VjdHMubGVuZ3RoIC0gMSkudGltZXMgZG8gfHh8ICNjb3VudCB0aGUgdG90YWwgYXJlYSB1bmRlciBhbGwgc2VjdGlvbnMKCWFyZWEgKz0gYXJlYV90b3RhbGVyKEB0b3BfaW50ZXJzZWN0c1t4XSxAdG9wX2ludGVyc2VjdHNbeCArIDFdKQplbmQKcHV0cyAiQ29tcHV0ZWQgYXJlYSBpczogI3thcmVhfSIKCnN1bSA9IDAKdHJpYW5nbGVzLmVhY2ggZG8gfHh8ICNzdW0gYWxsIHRoZSB0cmlhbmdsZXMsIGZvciBjb21wYXJpc29uCglzdW0gKz0gKHhbMV0gKiB4WzJdICogMC41KQplbmQKcHV0cyAiQXJlYSBvZiBhbGwgdHJpYW5nbGVzLCBpbmNsdWRpbmcgb3ZlcmxhcCwgaXM6ICN7c3VtfSIKcHV0cyAiRG9uZS4gIFRvb2sgI3tUaW1lLm5ldyAtIHRpbWVyfSBzZWNvbmRzLiI=
-
upload with new input
-
result: Success time: 0.01s memory: 4848 kB returned value: 0
Triangle 1: center-position='453.7', width='312.8', height='427.3' Triangle 2: center-position='550.6', width='312.1', height='585.7' Triangle 3: center-position='551.5', width='373.2', height='197.0' Triangle 4: center-position='531.7', width='408.0', height='432.9' Triangle 5: center-position='281.1', width='388.2', height='428.4' Computed area is: 187396.47292787468 Area of all triangles, including overlap, is: 366452.445 Done. Took 0.001122064 seconds.


