Eskiden senin gibi kod golf bulmacalarını çözerdim, ama sonra dizde bir ok aldım


18

Dizde oklarla vurmak, şu anda seçimin yaralanması gibi görünüyor . Bu nedenle, aşağıdaki golf mücadelesini öneriyorum.

Şöyle bir maceracı var:

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

Bir yay ( }sembol olarak çizilmiş ), bir dizi duvar ( #sembol olarak çizilmiş ) ve bir maceracı içeren bir metin dosyası verildiğinde, vurmak için bir oku ateşlemeniz gereken açıyı ve hızı hesaplayan en küçük kodu yazın. onu dizinde.

Aşağıdakileri varsayalım:

  • Dosyadaki her karakter 0,5 x 0,5 metredir.
  • Ok }, yani0.25m, 0.25m
  • Yerçekimi 10ms^-2
  • Ok ağırlığında 0.1kg
  • Ok bir noktadır, yani çarpışmalar yalnızca okun koordinatı bloklardan birine girdiğinde meydana gelir.
  • Maksimum başlangıç ​​hızı: 50m/s
  • Açı 0 (düz yukarı) ve 180 (düz aşağı) arasında olabilir
  • Maceracının bacağının herhangi bir kısmına vurmak dizine bir vuruş olarak kabul edilir.
  • Bir duvar ( #karakter) 0.5mx 0.5m'lik bir bloğun tamamını kaplar.
  • Ok, dosyanın üst kısmından geçebilir, ancak girdinin bir #karakter tavanıyla başlamasını engelleyecek hiçbir şey yoktur .
  • Duvarlara oklarla nüfuz edemezsiniz.
  • Maceracının başka bir yerine vurmak yasaktır!
  • Dizinden vurmak mümkün değilse bir hata göstermelisiniz.

Örnek girdi:

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

Gerekirse soru sormaktan çekinmeyin :)


1
Ok, metin dosyasının gösterdiği alanı "geçebilir" mi?
JB

2
3 metreden uzun kim olduğunu biliyor musunuz? : P
Peter Taylor

@JB - Evet, ama büyük bir çizgi ile başlayan girişi durdurmak için hiçbir şey yok #############...
Polinom

2
@PeterTaylor - Herkes RPG oyunlarındaki insanların orantısız olarak büyük olduğunu bilir;)
Polinom

2
Okun ağırlığı elbette gereksiz mi?
Paul R

Yanıtlar:


11

Python, 599 karakter

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'

X(K,L)Rutin bir parabol alır K=(a,b,c)temsil y = ax ^ 2 + bx + c ve bir hat segmenti L=(a,b,c,d)arasındaki kesiminden (a, b) ve (c, d) . Hem engeller ( O) hem de target ( T) çizgi parçaları olarak temsil edilir. Tüm mesafeler 2 katına göre ölçeklendirilir.

Örnek girdi aşağıdaki yörüngeyi verir (varsayılan olarak, minimum hız olanı):

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

Rmaksimum hız yolunu elde etmek için tersine çevirebilirsiniz :

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

İyi iş. Yalnızca şikayet, girdi boyutu sınırının 999 bayt olmasıdır. Bu ASCII çizimlerinin potansiyel büyüklüğü göz önüne alındığında, daha kolay olabilir. 9999, sadece 1 karakter pahasına daha mantıklı olurdu. (bu noktada 8**564kB elde etmek için de yapabilirsiniz )
Polinom

Oldukça emin ardından atayarak bu bir karakter kurtarabilir w=v+1ve 3 örneğini değiştirilmesi v+1ile w. Çok Python kodlamıyorum, bu yüzden yanlış olabilir.
Polinom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.