Risolvevo puzzle di codice come te, ma poi ho preso una freccia nel ginocchio


18

Essere colpiti al ginocchio con le frecce sembra essere la ferita di scelta in questo momento. Come tale, propongo la seguente sfida di golf.

Hai un avventuriero che assomiglia a questo:

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

Dato un file di testo che contiene un arco (disegnato come un }simbolo), un insieme di muri (disegnato come un #simbolo) e un avventuriero, scrivi il codice più piccolo che calcola l'angolo e la velocità iniziale a cui devi sparare una freccia per colpire lui nel ginocchio.

Supponiamo che:

  • Ogni personaggio nel file è 0,5 x 0,5 metri.
  • La freccia viene lanciata dal centro di }, ovvero un offset di0.25m, 0.25m
  • La gravità è 10ms^-2
  • La freccia pesa 0.1kg
  • La freccia è un punto, ovvero le collisioni si verificano solo quando la coordinata della freccia entra in uno dei blocchi.
  • La velocità iniziale massima è 50m/s
  • L'angolo può essere compreso tra 0 (verso l'alto) e 180 (verso il basso)
  • Colpire qualsiasi parte della gamba dell'avventuriero è considerato un colpo al ginocchio.
  • Un muro ( #personaggio) occupa un intero blocco di 0,5 mx 0,5 m.
  • La freccia può spostarsi sopra la "parte superiore" del file, ma non c'è nulla per impedire che l'input inizi con un limite di #caratteri.
  • Non puoi penetrare nei muri con le frecce.
  • Colpire qualsiasi altra parte dell'avventuriero non è permesso!
  • Dovresti visualizzare un errore se è impossibile colpirlo al ginocchio.

Esempio di input:

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

Sentiti libero di fare domande se è necessario :)


1
La freccia può spostarsi "sopra" l'area rappresentata dal file di testo?
JB

2
Quante persone conosci che sono alte più di 3 metri? : P
Peter Taylor,

@JB - Sì, ma non c'è nulla per fermare l'ingresso a partire da una grande linea di #############...
Polynomial

2
@PeterTaylor - Tutti sanno che le persone nei giochi di ruolo sono enormemente sproporzionate;)
Polinomio

2
Il peso della freccia è ridondante, sicuramente?
Paolo R

Risposte:


11

Python, 599 caratteri

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'

La X(K,L)routine prende una parabola che K=(a,b,c)rappresenta y = ax ^ 2 + bx + c e un segmento di linea che L=(a,b,c,d)rappresenta il segmento tra (a, b) e (c, d) . Entrambi gli ostacoli ( O) e il target ( T) sono rappresentati come segmenti di linea. Tutte le distanze sono ridimensionate di un fattore 2.

L'input di esempio fornisce la seguente traiettoria (per impostazione predefinita, la velocità minima):

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

è possibile invertire Rper ottenere il percorso di velocità massima:

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

Buon lavoro. L'unica lamentela è che il limite della dimensione di input è 999 byte. Potrebbe facilmente essere di più, considerando le dimensioni potenziali di questi disegni ASCII. 9999 sarebbe più sensato, al costo di 1 solo personaggio. (anche se a quel punto potresti anche farlo8**5 64 KB)
Polynomial

Abbastanza sicuro di poter quindi salvare quel personaggio assegnando w=v+1e sostituendo le 3 istanze di v+1con w. Non codifico molto Python, quindi potrei sbagliarmi.
Polinomio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.