Kiedyś rozwiązywałem łamigłówki z golfem, jak ty, ale potem wziąłem strzałę w kolano

18

Uderzenie strzałą w kolano wydaje się być teraz zranieniem z wyboru . Jako taki, proponuję następujące wyzwanie golfowe.

Masz poszukiwacza przygód, który wygląda tak:

  O
 /|\
/ | \
  |
  |
 / \
/   \

Biorąc pod uwagę plik tekstowy zawierający jeden łuk (narysowany jako }symbol), zestaw ścian (narysowany jako #symbole) i jednego poszukiwacza przygód, napisz najmniejszy kod, który oblicza kąt i prędkość początkową, z jaką powinieneś wystrzelić strzałę, aby trafić go w kolanie.

Załóż, że:

  • Każdy znak w pliku ma 0,5 x 0,5 metra.
  • Strzała jest wystrzeliwana ze środka }, tj. Z przesunięcia o0.25m, 0.25m
  • Grawitacja jest 10ms^-2
  • Strzała waży 0.1kg
  • Strzałka jest punktem, tzn. Kolizje występują tylko wtedy, gdy współrzędna strzałki wchodzi w jeden z bloków.
  • Maksymalna prędkość początkowa wynosi 50m/s
  • Kąt może wynosić od 0 (prosto w górę) do 180 (prosto w dół)
  • Uderzenie w dowolną część nogi poszukiwacza przygód jest uważane za uderzenie w kolano.
  • Ściana ( #postać) zajmuje jeden cały blok 0,5 mx 0,5 m.
  • Strzałka może przemieszczać się nad „górą” pliku, ale nic nie stoi na przeszkodzie, aby wejście zaczynało się od górnego pułapu #znaków.
  • Nie możesz przebić ścian strzałami.
  • Trafienie w inną część poszukiwacza przygód jest niedozwolone!
  • Powinieneś wyświetlić błąd, jeśli uderzenie go w kolano jest niemożliwe.

Przykładowe dane wejściowe:

                                 #                        
}                                                     O   
                        #                            /|\  
                                                    / | \ 
            #                                         |   
                            #                         |   
                                                     / \  
                                                    /   \  

Jeśli chcesz, możesz zadawać pytania :)

Wielomian
źródło
1
Czy strzałka może przemieszczać się „nad” obszarem przedstawionym przez plik tekstowy?
JB,
2
Ile znasz osób, które mają ponad 3 metry wzrostu? : P
Peter Taylor,
@JB - Tak, ale nic nie stoi na przeszkodzie, aby wejście zaczynało się od dużej linii #############...
Wielomian
2
@PeterTaylor - Wszyscy wiedzą, że ludzie w grach RPG są nieproporcjonalnie ogromne;)
Wielomian
2
Z pewnością ciężar strzały jest zbędny?
Paul R

Odpowiedzi:

11

Python, 599 znaków

import os,sys
from math import*
I=os.read(0,999)
O=[]
h=v=0
for i in I:
 if'#'==i:O+=[(h,v,h+1,v+1),(h+1,v,h,v+1)]
 if'O'==i:O+=[(h,v+1,h-2,v+3)];T=(h,v+5,h-2,v+7)
 if'}'==i:e=h+.5;c=v+.5
 h+=1
 if'\n'==i:v+=1;h=0

def X(K,L):
 A,B,C=K;p=L[0];q=L[2]-p;r=L[1];s=L[3]-r;A,B,C=A*q*q,2*A*p*q+B*q-s,A*p*p+B*p+C-r;d=B*B-4*A*C
 return 0 if d<0 else any(0<x<1 for x in[(sqrt(d)-B)/2/A,(-sqrt(d)-B)/2/A])

R=range(1,999)
for v in R:
 for z in R:
  z*=pi/999;d=v*sin(z)/10;b=-v*cos(z)/10
  K=20/d/d,b/d-40*e/d/d,c+20*e*e/d/d-b*e/d
  if X(K,T)and not any(X(K,x)for x in O):print v/2,z;sys.exit(0)
print'ERROR'

Procedura X(K,L)przyjmuje parabolę K=(a,b,c)reprezentującą y = ax ^ 2 + bx + c i odcinek linii L=(a,b,c,d)reprezentujący odcinek między (a, b) i (c, d) . Zarówno przeszkody ( O), jak i cel ( T) są powtarzane jako segmenty linii. Wszystkie odległości są skalowane 2-krotnie.

Przykładowe dane wejściowe przedstawiają następującą trajektorię (domyślnie minimalną prędkość):

  --                             #          --            
--                                            -       O   
                        #                      -     /|\  
                                                -   / | \ 
            #                                    -    |   
                            #                     -   |   
                                                   - / \  
                                                    -   \  

możesz odwrócić, Raby uzyskać ścieżkę maksymalnej prędkości:

                                 #                        
-------------                                         O   
             -----------#                            /|\  
                        --------                    / | \ 
            #                   -------               |   
                            #          -----          |   
                                            -----    / \  
                                                 -----  \  
Keith Randall
źródło
Dobra robota. Jedynym zarzutem jest to, że limit rozmiaru wejściowego wynosi 999 bajtów. Może to być całkiem więcej, biorąc pod uwagę potencjalną wielkość tych rysunków ASCII. 9999 byłoby bardziej rozsądne, kosztem tylko 1 postaci. (chociaż w tym momencie równie dobrze możesz zrobić, 8**5aby uzyskać 64kB)
Wielomian
Całkiem pewien, że można następnie zapisać, że jeden znak przypisując w=v+1i zastępując 3 wystąpień v+1z w. Jednak nie koduję dużo Pythona, więc mogę się mylić.
Wielomian