#!/usr/bin/perl
# your code goes here
# "Read line from STDIN, split on whitespace, return list".
# We do it several times, therefore make it a sub:
sub i{<>=~/\S+/g}
# @b is height-map of city-scape ("array of arrays",
# i.e. array of array references).
# Also, store grid-lines range in @r array for later re-use:
# Next, things are getting somewhat compressed.
# Let's take them apart and start from the very end.
@a[1,0,2,4,3]=@a;
@b=map{$i=$_;[map$b[$_][$i],@r]}@r; &&($k=(($x=$_)-$a[3])/$a[0])**2<=$k
($_=$a[4]+$k*$a[1]),$_-/^\d+$/]
>=$a[5]+$k*$a[2]
,@R=@r
}@a=map$_-shift@v,i
,@u=@v=@$_),$
/for([i
])x
<>
# Read player coordinates, make anonymous array, duplicate reference
# as many times as there are enemies, return a list:
# ([i])x<>
# For each element of this list, compare 0.1 with result of some operation
# (on which more later), print result of comparison
# (can be "-1" or "1" here) followed by a newline:
# print.1<=>(...),$/for([i])x<>
# That "..." operation is a "map" in scalar (because of comparison)
# context, i.e. number of elements in list returned by "map":
# "1" is printed for empty list, "-1" for non-empty.
# This "map" arguments are CODE-BLOCK and LIST.
# LIST is result of another "map":
# @a=map$_-shift@v,i,@u=@v=@$_
# @$_ is dereferencing of "for" loop variable and that's player coordinates.
# "i" returns current enemy coordinates.
# So, what _this_ "map" returns and what's stored (for later re-use)
# in @a array and what's the LIST for "main" map - they are six numbers:
# Xe - Xp
# Ye - Yp
# Ze - Zp
# Xp
# Yp
# Zp
# i.e. they are differences between enemy and player respective coordinates,
# followed by player coordinates.
# The CODE-BLOCK mentioned above:
# @a[1,0,2,4,3]=@a;
# @b=map{$i=$_;[map$b[$_][$i],@r]}@r;
# grep$a[0]
# &&($k=(($x=$_)-$a[3])/$a[0])**2<=$k
# &&pop[sort map@{$b[$_]}[$x-!!$x,$x],
# ($_=$a[4]+$k*$a[1]),$_-/^\d+$/]
# >=$a[5]+$k*$a[2]
# ,@R=@r
# As you see, the topic variable ($_) of enclosing "map" is _not_ used.
# The whole point was to build @a array, execute CODE-BLOCK two
# (or _any even number_ of) times (6, here), and return list which,
# in turn, is composed of results of "grep" executions in above BLOCK.
# Two first lines of this BLOCK are to swap "x y" coordinates.
# @a[1,0,2,4,3]=@a;
# @b=map{$i=$_;[map$b[$_][$i],@r]}@r;
# With this little trick we can use the same "grep" part to check both
# "x" and "y" grid-lines.
# Because BLOCK is executed even number of times, coordinates will be
# restored to original state by the time we get to the next enemy.
# Now to the "grep" part.
# It evaluates some expression for each element of @r array (grid-lines)
# and returns non-empty list if "expression" is TRUE for any grid-line.
# This, in turn, makes "map" return non-empty list i.e. "-1" is printed
# for a given enemy.
# It means that the "expression" checks if, for each integer "x"
# in range, the PE ("player-enemy") line is above or below city-scape.
# There are 3 boolean sub-expressions, multiplied with logical "and"s.
# First,
# $a[0]
# i.e. only make further checks if Xe != Xp to avoid "division by zero",
# later. The case of Xe == Xp will be checked when we swap coordinates.
# Second,
# ($k=(($x=$_)-$a[3])/$a[0])**2<=$k
# This sub-expression, apart from defining $x and $k variables for later
# re-use, actually checks if current grid-line is in Xe .. Xp range
# (or Xp .. Xe) - i.e. only go to the 3d sub-expression if it is.
# Third,
# pop[sort map@{$b[$_]}[$x-!!$x,$x],
# ($_=$a[4]+$k*$a[1]),$_-/^\d+$/]
# >=$a[5]+$k*$a[2]
# As you see, it finds a maximum value in some LIST
# pop[sort LIST]
# and compares it to some value. Alphabetical sorting is OK in our case.
# The "value" is none other than "z" coordinate on PE line:
# $a[5]+$k*$a[2]
# And that LIST is a list of up to 4 "buildings" heights, which share
# the same (x,y) point. BTW, "y" is
# $_=$a[4]+$k*$a[1]
# These comments are getting a bit long. Understanding sub-expressions
# "2" and "3" mentioned above, as well as "swapping" X <-> Y mechanics
# may require some effort, though not very much.
# I hope it's clearer now how it all works. All this complexity was only
# introduced for brevity.
IyEvdXNyL2Jpbi9wZXJsCiMgeW91ciBjb2RlIGdvZXMgaGVyZQoKIyAiUmVhZCBsaW5lIGZyb20gU1RESU4sIHNwbGl0IG9uIHdoaXRlc3BhY2UsIHJldHVybiBsaXN0Ii4gCiMgV2UgZG8gaXQgc2V2ZXJhbCB0aW1lcywgdGhlcmVmb3JlIG1ha2UgaXQgYSBzdWI6CgpzdWIgaXs8Pj1+L1xTKy9nfQoKIyBAYiBpcyBoZWlnaHQtbWFwIG9mIGNpdHktc2NhcGUgKCJhcnJheSBvZiBhcnJheXMiLCAKIyBpLmUuIGFycmF5IG9mIGFycmF5IHJlZmVyZW5jZXMpLiAKIyBBbHNvLCBzdG9yZSBncmlkLWxpbmVzIHJhbmdlIGluIEByIGFycmF5IGZvciBsYXRlciByZS11c2U6CgpAYj1tYXBbaV0sQHI9MC4uPD4tMTsKCiMgTmV4dCwgdGhpbmdzIGFyZSBnZXR0aW5nIHNvbWV3aGF0IGNvbXByZXNzZWQuIAojIExldCdzIHRha2UgdGhlbSBhcGFydCBhbmQgc3RhcnQgZnJvbSB0aGUgdmVyeSBlbmQuIAoKcHJpbnQuMTw9PihtYXB7CiAgICBAYVsxLDAsMiw0LDNdPUBhOwogICAgQGI9bWFweyRpPSRfO1ttYXAkYlskX11bJGldLEByXX1AcjsKICAgIGdyZXAkYVswXQogICAgICAgICYmKCRrPSgoJHg9JF8pLSRhWzNdKS8kYVswXSkqKjI8PSRrCiAgICAgICAgJiZwb3Bbc29ydCBtYXBAeyRiWyRfXX1bJHgtISEkeCwkeF0sCiAgICAgICAgICAgICAgICAgICAoJF89JGFbNF0rJGsqJGFbMV0pLCRfLS9eXGQrJC9dCiAgICAgICAgICA+PSRhWzVdKyRrKiRhWzJdCiAgICAsQFI9QHIKfUBhPW1hcCRfLXNoaWZ0QHYsaSxAdT1Adj1AJF8pLCQvZm9yKFtpXSl4PD4KCiMgUmVhZCBwbGF5ZXIgY29vcmRpbmF0ZXMsIG1ha2UgYW5vbnltb3VzIGFycmF5LCBkdXBsaWNhdGUgcmVmZXJlbmNlIAojIGFzIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGVuZW1pZXMsIHJldHVybiBhIGxpc3Q6CgojIChbaV0peDw+CgojIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhpcyBsaXN0LCBjb21wYXJlIDAuMSB3aXRoIHJlc3VsdCBvZiBzb21lIG9wZXJhdGlvbiAKIyAob24gd2hpY2ggbW9yZSBsYXRlciksIHByaW50IHJlc3VsdCBvZiBjb21wYXJpc29uIAojIChjYW4gYmUgIi0xIiBvciAiMSIgaGVyZSkgZm9sbG93ZWQgYnkgYSBuZXdsaW5lOgoKIyBwcmludC4xPD0+KC4uLiksJC9mb3IoW2ldKXg8PgoKIyBUaGF0ICIuLi4iIG9wZXJhdGlvbiBpcyBhICJtYXAiIGluIHNjYWxhciAoYmVjYXVzZSBvZiBjb21wYXJpc29uKSAKIyBjb250ZXh0LCBpLmUuIG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0IHJldHVybmVkIGJ5ICJtYXAiOiAKIyAiMSIgaXMgcHJpbnRlZCBmb3IgZW1wdHkgbGlzdCwgIi0xIiBmb3Igbm9uLWVtcHR5LgoKIyBUaGlzICJtYXAiIGFyZ3VtZW50cyBhcmUgQ09ERS1CTE9DSyBhbmQgTElTVC4gCiMgTElTVCBpcyByZXN1bHQgb2YgYW5vdGhlciAibWFwIjoKCiMgQGE9bWFwJF8tc2hpZnRAdixpLEB1PUB2PUAkXwoKIyBAJF8gaXMgZGVyZWZlcmVuY2luZyBvZiAiZm9yIiBsb29wIHZhcmlhYmxlIGFuZCB0aGF0J3MgcGxheWVyIGNvb3JkaW5hdGVzLiAKIyAiaSIgcmV0dXJucyBjdXJyZW50IGVuZW15IGNvb3JkaW5hdGVzLiAKIyBTbywgd2hhdCBfdGhpc18gIm1hcCIgcmV0dXJucyBhbmQgd2hhdCdzIHN0b3JlZCAoZm9yIGxhdGVyIHJlLXVzZSkgCiMgaW4gQGEgYXJyYXkgYW5kIHdoYXQncyB0aGUgTElTVCBmb3IgIm1haW4iIG1hcCAtIHRoZXkgYXJlIHNpeCBudW1iZXJzOgoKIyBYZSAtIFhwCiMgWWUgLSBZcAojIFplIC0gWnAKIyBYcAojIFlwCiMgWnAKCiMgaS5lLiB0aGV5IGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGVuZW15IGFuZCBwbGF5ZXIgcmVzcGVjdGl2ZSBjb29yZGluYXRlcywKIyBmb2xsb3dlZCBieSBwbGF5ZXIgY29vcmRpbmF0ZXMuCgojIFRoZSBDT0RFLUJMT0NLIG1lbnRpb25lZCBhYm92ZToKCiMgQGFbMSwwLDIsNCwzXT1AYTsKIyBAYj1tYXB7JGk9JF87W21hcCRiWyRfXVskaV0sQHJdfUByOwojIGdyZXAkYVswXQojICAgICAmJigkaz0oKCR4PSRfKS0kYVszXSkvJGFbMF0pKioyPD0kawojICAgICAmJnBvcFtzb3J0IG1hcEB7JGJbJF9dfVskeC0hISR4LCR4XSwKIyAgICAgICAgICAgICAgICAoJF89JGFbNF0rJGsqJGFbMV0pLCRfLS9eXGQrJC9dCiMgICAgICAgPj0kYVs1XSskayokYVsyXQojICxAUj1AcgoKIyBBcyB5b3Ugc2VlLCB0aGUgdG9waWMgdmFyaWFibGUgKCRfKSBvZiBlbmNsb3NpbmcgIm1hcCIgaXMgX25vdF8gdXNlZC4gCiMgVGhlIHdob2xlIHBvaW50IHdhcyB0byBidWlsZCBAYSBhcnJheSwgZXhlY3V0ZSBDT0RFLUJMT0NLIHR3byAKIyAob3IgX2FueSBldmVuIG51bWJlcl8gb2YpIHRpbWVzICg2LCBoZXJlKSwgYW5kIHJldHVybiBsaXN0IHdoaWNoLCAKIyBpbiB0dXJuLCBpcyBjb21wb3NlZCBvZiByZXN1bHRzIG9mICJncmVwIiBleGVjdXRpb25zIGluIGFib3ZlIEJMT0NLLgoKIyBUd28gZmlyc3QgbGluZXMgb2YgdGhpcyBCTE9DSyBhcmUgdG8gc3dhcCAieCB5IiBjb29yZGluYXRlcy4gCgojIEBhWzEsMCwyLDQsM109QGE7CiMgQGI9bWFweyRpPSRfO1ttYXAkYlskX11bJGldLEByXX1AcjsKCiMgV2l0aCB0aGlzIGxpdHRsZSB0cmljayB3ZSBjYW4gdXNlIHRoZSBzYW1lICJncmVwIiBwYXJ0IHRvIGNoZWNrIGJvdGggCiMgIngiIGFuZCAieSIgZ3JpZC1saW5lcy4gCiMgQmVjYXVzZSBCTE9DSyBpcyBleGVjdXRlZCBldmVuIG51bWJlciBvZiB0aW1lcywgY29vcmRpbmF0ZXMgd2lsbCBiZSAKIyByZXN0b3JlZCB0byBvcmlnaW5hbCBzdGF0ZSBieSB0aGUgdGltZSB3ZSBnZXQgdG8gdGhlIG5leHQgZW5lbXkuCgojIE5vdyB0byB0aGUgImdyZXAiIHBhcnQuIAojIEl0IGV2YWx1YXRlcyBzb21lIGV4cHJlc3Npb24gZm9yIGVhY2ggZWxlbWVudCBvZiBAciBhcnJheSAoZ3JpZC1saW5lcykKIyBhbmQgcmV0dXJucyBub24tZW1wdHkgbGlzdCBpZiAiZXhwcmVzc2lvbiIgaXMgVFJVRSBmb3IgYW55IGdyaWQtbGluZS4gCiMgVGhpcywgaW4gdHVybiwgbWFrZXMgIm1hcCIgcmV0dXJuIG5vbi1lbXB0eSBsaXN0IGkuZS4gIi0xIiBpcyBwcmludGVkIAojIGZvciBhIGdpdmVuIGVuZW15LiAKCiMgSXQgbWVhbnMgdGhhdCB0aGUgImV4cHJlc3Npb24iIGNoZWNrcyBpZiwgZm9yIGVhY2ggaW50ZWdlciAieCIgCiMgaW4gcmFuZ2UsIHRoZSBQRSAoInBsYXllci1lbmVteSIpIGxpbmUgaXMgYWJvdmUgb3IgYmVsb3cgY2l0eS1zY2FwZS4KCiMgVGhlcmUgYXJlIDMgYm9vbGVhbiBzdWItZXhwcmVzc2lvbnMsIG11bHRpcGxpZWQgd2l0aCBsb2dpY2FsICJhbmQicy4KCiMgRmlyc3QsIAoKIyAkYVswXQoKIyBpLmUuIG9ubHkgbWFrZSBmdXJ0aGVyIGNoZWNrcyBpZiBYZSAhPSBYcCB0byBhdm9pZCAiZGl2aXNpb24gYnkgemVybyIsIAojIGxhdGVyLiBUaGUgY2FzZSBvZiBYZSA9PSBYcCB3aWxsIGJlIGNoZWNrZWQgd2hlbiB3ZSBzd2FwIGNvb3JkaW5hdGVzLgoKIyBTZWNvbmQsCgojICgkaz0oKCR4PSRfKS0kYVszXSkvJGFbMF0pKioyPD0kawoKIyBUaGlzIHN1Yi1leHByZXNzaW9uLCBhcGFydCBmcm9tIGRlZmluaW5nICR4IGFuZCAkayB2YXJpYWJsZXMgZm9yIGxhdGVyIAojIHJlLXVzZSwgYWN0dWFsbHkgY2hlY2tzIGlmIGN1cnJlbnQgZ3JpZC1saW5lIGlzIGluIFhlIC4uIFhwIHJhbmdlIAojIChvciBYcCAuLiBYZSkgLSBpLmUuIG9ubHkgZ28gdG8gdGhlIDNkIHN1Yi1leHByZXNzaW9uIGlmIGl0IGlzLgoKIyBUaGlyZCwKCiMgcG9wW3NvcnQgbWFwQHskYlskX119WyR4LSEhJHgsJHhdLAojICAgICAgICAgICgkXz0kYVs0XSskayokYVsxXSksJF8tL15cZCskL10KIyA+PSRhWzVdKyRrKiRhWzJdCgojIEFzIHlvdSBzZWUsIGl0IGZpbmRzIGEgbWF4aW11bSB2YWx1ZSBpbiBzb21lIExJU1QgCgojIHBvcFtzb3J0IExJU1RdCgojIGFuZCBjb21wYXJlcyBpdCB0byBzb21lIHZhbHVlLiBBbHBoYWJldGljYWwgc29ydGluZyBpcyBPSyBpbiBvdXIgY2FzZS4KCiMgVGhlICJ2YWx1ZSIgaXMgbm9uZSBvdGhlciB0aGFuICJ6IiBjb29yZGluYXRlIG9uIFBFIGxpbmU6CgojICRhWzVdKyRrKiRhWzJdCgojIEFuZCB0aGF0IExJU1QgaXMgYSBsaXN0IG9mIHVwIHRvIDQgImJ1aWxkaW5ncyIgaGVpZ2h0cywgd2hpY2ggc2hhcmUgCiMgdGhlIHNhbWUgKHgseSkgcG9pbnQuIEJUVywgInkiIGlzIAoKIyAkXz0kYVs0XSskayokYVsxXQoKIyBUaGVzZSBjb21tZW50cyBhcmUgZ2V0dGluZyBhIGJpdCBsb25nLiBVbmRlcnN0YW5kaW5nIHN1Yi1leHByZXNzaW9ucyAKIyAiMiIgYW5kICIzIiBtZW50aW9uZWQgYWJvdmUsIGFzIHdlbGwgYXMgInN3YXBwaW5nIiBYIDwtPiBZIG1lY2hhbmljcyAKIyBtYXkgcmVxdWlyZSBzb21lIGVmZm9ydCwgdGhvdWdoIG5vdCB2ZXJ5IG11Y2guIAoKIyBJIGhvcGUgaXQncyBjbGVhcmVyIG5vdyBob3cgaXQgYWxsIHdvcmtzLiBBbGwgdGhpcyBjb21wbGV4aXR5IHdhcyBvbmx5CiMgaW50cm9kdWNlZCBmb3IgYnJldml0eS4K