Einführung
Die Arena ist ein Flachland mit Wolkenkratzern, die Ihre Feinde als Deckung nutzen. Sie und Ihre Feinde schießen sich gegenseitig mit Lasern. Sie tragen alle Jet-Packs, die den Flug ermöglichen.
Welche Feinde kannst du mit deinem Laser treffen und welche verstecken sich?
Problem
Zunächst wird die Größe einer Arena durch eine ganze Zahl n
in einer einzelnen Zeile angegeben. Die folgenden n
Zeilen enthalten n
ganze Zahlen pro Zeile, die durch ein Leerzeichen getrennt sind. Jede Ganzzahl repräsentiert die Höhe des Gebäudes an dieser Stelle. Jedes Gebäude ist ein rechteckiger Körper, 1 Einheit mal 1 Einheit mal Höheneinheit.
Als nächstes wird Ihr Standort auf einer einzige Zeile als drei Gleitkommazahlen gegeben x
, y
, z
.
Schließlich wird die Anzahl der Feinde durch eine ganze Zahl m
in einer einzelnen Zeile angegeben. Die folgenden m
Zeilen enthalten drei Gleitkommazahlen pro Zeile, die durch ein Leerzeichen getrennt sind. Diese stellen die x
, y
und z
Koordinaten eines Feindes. Das Koordinatensystem ist wie folgt definiert:
x
wird in der Stadteingabe von links nach rechts gemesseny
wird von oben nach unten gemessenz
wird von Grund auf gemessen
Wenn für jeden Feind eine freie Linie von Ihnen zu diesem Feind gezogen werden kann, geben Sie eine positive ganze Zahl aus. Andernfalls geben Sie eine negative Ganzzahl aus. Ausgänge durch eine neue Zeile trennen.
Sample Input
Mit '#' gekennzeichnete Kommentare helfen Ihnen dabei, schnell zu erkennen, was die einzelnen Zeilen bewirken. Sie sind in der tatsächlichen Eingabe nicht vorhanden.
5 # Size of the map
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
4 4 4 4 4 # Buildings
0 0 0 0 0 # Buildings
0 0 0 0 0 # Buildings
2.5 0.0 4.0 # Your location
3 # Number of enemies
2.5 5.0 0.1 # Enemy location
2.5 5.0 5.0 # Enemy location
0.0 2.7 4.5 # Enemy location
Beispielausgabe
Für die obige Beispieleingabe geben wir Folgendes aus:
-1
1
1
Annahmen
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Die Spieler werden sich nicht an oder innerhalb einer Ecke, Kante oder Seite eines Gebäudes befinden
- Ihre Sichtlinie auf einen Feind wird niemals die Ecke, den Rand oder die Seite eines Gebäudes berühren
- Ein Spieler ist kein Hindernis
Antworten:
Perl,
301 296282Edit 2: Eigentlich, Konkurrenz oder nicht, gibt es keinen Grund, nicht ein bisschen weiter zu golfen. Testen Sie es online .
Bearbeiten: Ein paar Klammern weg, einfacher Regex für ungleich Null Ganzzahl zu überprüfen.
Mit Zeilenumbrüchen und Einrückung zur besseren Lesbarkeit:
Es erfordert
5.14
wegen des skalaren (Array-Referenz) Arguments zupop
.quelle
PE
verbindet zwei Punkte im 3D-Raum, "Spieler" (X1Y1Z1) und "Feind" (X2Y2Z2). Seine Projektion auf der(XY)
Ebene schneidet einige der Gitterlinien, dh ganze Zahlenx = const
odery = const
solche wieX1 < x < X2
oderY1 < y < Y2
(vorausgesetzt, dass dies z. B.X1 < X2
nicht wichtig ist). Koordinatenx y
dieser Schnittpunkte können leicht gefunden werden und daher auchz
Koordinaten einesPE
Linienpunkts.x y
kennen wir für alle Koordinaten die Höheh
des Gebäudes (stattdessen die maximale Höhe von bis zu 4 Gebäuden, die sich einenx y
Punkt teilen ). Feind kann erschossen werden, wenn (und nur wenn)h < z
für alle oben genannten "Schnittpunkte". Die Implementierung umfasst einige Grundrechenarten sowie einige Tricks mit Perl zum Golfen. Das Entschlüsseln der Details, wie ich es vor einem Monat gemacht habe, wird jetzt einige Zeit dauern :-).@a
Arrays imgrep
Ausdruck sollten in der Reihenfolge0,3,0,4,1,5,2
anstelle von3,0,3,1,4,2,5
- sorry erscheinen.Python 2.7 -
429420308308 ZeichenIch dachte, diese Herausforderung sei eher ein mathematisches Problem als ein Code-Golf-Problem. Seien Sie also nicht zu hart für mich, wenn ich einige offensichtliche Optimierungen übersehen hätte. Sowieso ist hier der Code:
Dies sollte für Rand- und Eckfälle funktionieren (Wortspiel unbeabsichtigt) und ist ziemlich solide. Ergebnis für das Beispiel:
Und hier ist eine "kurze" Erklärung:
Ich denke, das ist voller Mängel. Übrigens habe ich beim Verschachteln Zeichen gespeichert (erste Ebene ist ein Leerzeichen, zweite ein Tab, dann ein Tab und ein Leerzeichen ...). Ich hoffe, nach all dieser Antwort kann der Weg weisen, um es zu tun.
quelle
print 1-2*...
anstelle vonprint.5-...
) behoben werden. Es ist also kein so großer Unterschied, denke ichC - 2468
Überhaupt nicht golfen, aber hoffentlich ist es ein Ausgangspunkt für interessantere Implementierungen. Die Umsetzung von
intersect
wird stark von Adrian Boeing beschnitten . Sein Pseudocode war unvollständig, aber seine Erklärung der Mathematik war von unschätzbarem Wert. Die Grundidee ist, dass Sie eine Linie vom Spieler zum Ziel nehmen und diese an alle Wände jedes Gebäudes kleben und die Länge für jede Wand aktualisieren. Die verbleibende Länge ist der Teil innerhalb des Gebäudes. Wenn er also Null ist, gab es keinen Schnittpunkt.quelle