Wprowadzenie
Arena to równina usiana wieżowcami, które twoi wrogowie wykorzystują jako schronienie. Ty i twoi wrogowie strzelacie do siebie za pomocą laserów. Wszyscy nosicie plecaki odrzutowe, pozwalające na lot.
Których wrogów możesz trafić laserem, a którzy ukrywają się?
Problem
Po pierwsze, rozmiar areny jest podawany przez liczbę całkowitą n
w jednym wierszu. Następujące n
wiersze zawierają n
liczby całkowite w wierszu oddzielone spacją. Każda liczba całkowita reprezentuje wysokość budynku w tym miejscu. Każdy budynek jest prostokątną bryłą, 1 jednostka na 1 jednostkę według jednostek wysokości.
Następnie Twoja lokalizacja podana jest na jednej linii, co trzech liczb zmiennoprzecinkowych x
, y
, z
.
Na koniec liczbę wrogów podaje liczba całkowita m
w jednym wierszu. Następne m
linie zawierają trzy liczby zmiennoprzecinkowe na linię oddzielone spacją. Te reprezentują x
, y
oraz z
współrzędne wroga. Układ współrzędnych jest zdefiniowany następująco:
x
jest mierzony od lewej do prawej na wejściu miastay
mierzy się od góry do dołuz
jest mierzony od podstaw
Jeśli dla każdego wroga można narysować od niego niezakłóconą linię, wypisz dodatnią liczbę całkowitą. W przeciwnym razie wypisz ujemną liczbę całkowitą. Oddziel wyjścia za pomocą nowej linii.
Przykładowe dane wejściowe
Komentarze oznaczone jako „#” są obecne, aby pomóc Ci szybko zobaczyć, co robi każda linia. Nie będą one obecne w rzeczywistych danych wejściowych.
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
Próbka wyjściowa
Dla powyższego przykładowego danych wyjściowych wyprowadzamy następujące dane:
-1
1
1
Założenia
- 0
n
<<100 - 0
m
<<100 - 0 <=
x
<=n
- 0 <=
y
<=n
- 0 <=
z
<n
- Gracze nie będą znajdować się na ani wewnątrz narożnika, krawędzi ani boku budynku
- Twoja linia wzroku do wroga nigdy nie będzie styczna do rogu, krawędzi lub boku budynku
- Gracz nie jest przeszkodą
Odpowiedzi:
Perl,
301 296282Edycja 2: Właściwie, konkurencja czy nie, nie ma powodu, aby nie grać w nią trochę dalej. Przetestuj online .
Edycja: Kilka nawiasów zniknęło, prostsze wyrażenie regularne, aby sprawdzić niezerową liczbę całkowitą.
Z nowymi liniami i wcięciem dla czytelności:
Wymaga
5.14
to argumentu skalarnego (odwołanie do tablicy)pop
.źródło
PE
łączy dwa punkty w przestrzeni trójwymiarowej: „Player” (X1Y1Z1) i „Enemy” (X2Y2Z2). Jego rzut na(XY)
płaszczyznę przecina niektóre linie siatki, tj. Liczby całkowitex = const
luby = const
takie jakX1 < x < X2
lubY1 < y < Y2
(zakładając, że np.X1 < X2
Ale nie jest to ważne).x y
Można łatwo znaleźć współrzędne tych skrzyżowań, a zatem takżez
współrzędne punktu naPE
linii.x y
współrzędnych znamy wysokośćh
budynku (raczej maksymalną wysokość maksymalnie 4 budynków, które dzieląx y
punkt). Wróg może zostać zastrzelony, jeśli (i tylko wtedy)h < z
dla wszystkich „punktów przecięcia” wymienionych powyżej. Implementacja to podstawowa arytmetyka, a także kilka sztuczek z Perlem na potrzeby gry w golfa. Rozszyfrowanie szczegółów, jak to zrobiłem miesiąc temu, zajmie teraz trochę czasu :-).@a
tablicy wgrep
wyrażeniu powinny pojawiać się w kolejności0,3,0,4,1,5,2
zamiast3,0,3,1,4,2,5
- przepraszam.Python 2.7 -
429420308308 znakówPomyślałem o tym wyzwaniu bardziej jako problem matematyczny niż problem z golfem, więc nie bądź dla mnie zbyt surowy, jeśli przegapię jakieś oczywiste optymalizacje. Tak czy inaczej, oto kod:
Powinno to działać w przypadku krawędzi i narożników (niezamierzone kalambur) i jest dość solidne. Ouput dla podanego przykładu:
A oto „krótkie” wyjaśnienie:
Myślę, że to jest pełne wad. Przy okazji zapisałem znaki podczas zagnieżdżania (pierwszy poziom to jedna spacja, druga jedna tabulacja, następnie jedna tabulacja i spacja ...). Mam nadzieję, że mimo wszystko ta odpowiedź może wskazać sposób na zrobienie tego.
źródło
print 1-2*...
liczbę zmiennoprzecinkową, ale można to naprawić za pomocą 2 dodatkowych znaków ( zamiastprint.5-...
) Więc nie jest to duża różnica, tak sądzęC - 2468
W ogóle nie grałem w golfa, ale mam nadzieję, że jest to punkt wyjścia do ciekawszych wdrożeń. Implementacja
intersect
jest w dużej mierze szopowana przez Adriana Boeinga . Jego pseudokod był niekompletny, ale wyjaśnienie matematyki było bezcenne. Podstawową ideą jest przeniesienie linii od gracza do celu i przypięcie jej do wszystkich ścian każdego budynku, aktualizując długość każdej ściany. Pozostała długość to część wewnątrz budynku, więc jeśli wynosi zero, nie było przecięcia.źródło