introduction
L'arène est une plaine parsemée de gratte-ciel, que vos ennemis utilisent pour se couvrir. Vous et vos ennemis vous tirez dessus avec des lasers. Vous transportez tous des jet packs, permettant le vol.
Quels ennemis pouvez-vous frapper avec votre laser et lesquels se cachent?
Problème
Tout d'abord, la taille d'une arène est donnée par un entier n
sur une seule ligne. Les n
lignes suivantes contiennent des n
entiers par ligne séparés par un espace. Chaque entier représente la hauteur du bâtiment à cet endroit. Chaque bâtiment est un solide rectangulaire de 1 unité par 1 unité de hauteur.
Ensuite, votre position est donnée sur une seule ligne en trois nombres à virgule flottante x
, y
, z
.
Enfin, le nombre d'ennemis est donné par un entier m
sur une seule ligne. Les m
lignes suivantes contiennent trois nombres à virgule flottante par ligne séparés par un espace. Ceux-ci représentent le x
, y
et les z
coordonnées d'un ennemi. Le système de coordonnées est défini comme suit:
x
est mesurée de gauche à droite dans l'entrée villey
est mesuré de haut en basz
est mesuré à partir de zéro
Pour chaque ennemi, si une ligne dégagée peut être tracée de vous vers cet ennemi, émettez un entier positif . Sinon, sortez un entier négatif . Sorties séparées avec une nouvelle ligne.
Exemple d'entrée
Les commentaires, notés «#», sont présents pour vous aider à voir rapidement ce que fait chaque ligne. Ils ne seront pas présents dans l'entrée réelle.
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
Exemple de sortie
Pour l'exemple d'entrée ci-dessus, nous générons les éléments suivants:
-1
1
1
Hypothèses
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Les joueurs ne seront pas situés sur ou à l'intérieur d'un coin, d'un bord ou d'un côté d'un bâtiment
- Votre ligne de vue vers un ennemi ne sera jamais tangente au coin, au bord ou au côté d'un bâtiment
- Un joueur n'est pas une obstruction
Réponses:
Perl,
301 296282Edit 2: En fait, en compétition ou non, il n'y a aucune raison de ne pas le jouer un peu plus loin. Testez-le en ligne .
Edit: couple de parenthèses disparu, regex plus simple pour vérifier un entier non nul.
Avec des nouvelles lignes et un retrait pour la lisibilité:
Il nécessite en
5.14
raison de l'argument scalaire (référence de tableau) àpop
.la source
PE
relie deux points dans l'espace 3D, "Player" (X1Y1Z1) et "Enemy" (X2Y2Z2). Sa projection sur le(XY)
plan coupe certaines des lignes de la grille, c'est-à-dire des nombres entiersx = const
ouy = const
tels queX1 < x < X2
ouY1 < y < Y2
(en supposant ici que par exempleX1 < X2
, mais ce n'est pas important). Les coordonnéesx y
de ces intersections peuvent être facilement trouvées, et donc également lesz
coordonnées d'un point enPE
ligne.x y
coordonnées, nous connaissons la hauteurh
du bâtiment (plutôt, la hauteur maximale de jusqu'à 4 bâtiments qui partagent lex y
point). L'ennemi peut être abattu si (et seulement si)h < z
pour tous les "points d'intersection" mentionnés ci-dessus. La mise en œuvre est quelques arithmétiques de base, ainsi que plusieurs astuces avec Perl pour le golf. Décrypter les détails de la façon dont je l'ai fait il y a un mois prendra du temps :-).@a
tableau dans l'grep
expression devraient apparaître dans l'ordre0,3,0,4,1,5,2
au lieu de3,0,3,1,4,2,5
- désolé.Python 2.7 -
429420308308 caractèresJ'ai pensé à ce défi plus comme un problème mathématique qu'un problème de golf de code, alors ne soyez pas trop dur avec moi si j'ai raté des optimisations évidentes. Quoi qu'il en soit, voici le code:
Cela devrait fonctionner pour les cas de bord et d'angle (jeu de mots involontaire) et est assez solide. Sortie pour l'exemple fourni:
Et voici une "courte" explication:
Je suppose que c'est plein de défauts. Btw J'ai enregistré des caractères lors de l'imbrication (le premier niveau est un espace, le deuxième un onglet, puis un onglet et un espace ...). J'espère qu'après tout, cette réponse pourra montrer la voie à suivre.
la source
print 1-2*...
au lieu deprint.5-...
) Donc ce n'est pas une si grande différence que je supposeC - 2468
Pas du tout joué au golf, mais j'espère que c'est un point de départ pour des implémentations plus intéressantes. La mise en œuvre de
intersect
est lourdement gérée par Adrian Boeing . Son pseudo-code était incomplet, mais son explication des mathématiques était inestimable. L'idée de base est que vous prenez une ligne du joueur vers la cible et que vous l'attachez à tous les murs de chaque bâtiment, en mettant à jour la longueur de chaque mur. La longueur restante est la partie à l'intérieur du bâtiment, donc si elle est nulle, il n'y avait pas d'intersection.la source