ฉันเคยแก้ปริศนากอล์ฟรหัสเช่นคุณ แต่แล้วฉันก็เอาลูกธนูที่หัวเข่า


18

ได้รับการตีเข่าที่มีลูกศรน่าจะเป็นอาการบาดเจ็บของทางเลือกในขณะนี้ ดังนั้นฉันขอเสนอความท้าทายกอล์ฟต่อไปนี้

คุณมีนักผจญภัยที่มีลักษณะเช่นนี้:

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

รับไฟล์ข้อความที่มีหนึ่งธนู (วาดเป็น}สัญลักษณ์) ชุดของกำแพง (วาดเป็น#สัญลักษณ์) และนักผจญภัยคนหนึ่งเขียนรหัสที่เล็กที่สุดที่คำนวณมุมและความเร็วเริ่มต้นที่คุณควรยิงธนูเพื่อตี เขาที่หัวเข่า

สมมติว่าต่อไปนี้:

  • อักขระแต่ละตัวในไฟล์คือ 0.5 x 0.5 เมตร
  • ลูกศรถูกไล่ออกจากศูนย์กลาง}ของ0.25m, 0.25m
  • แรงโน้มถ่วงคือ 10ms^-2
  • ลูกศรมีน้ำหนัก 0.1kg
  • Arrow เป็นจุดเช่นการชนเกิดขึ้นเฉพาะเมื่อพิกัดของลูกศรเข้าสู่หนึ่งในบล็อก
  • ความเร็วเริ่มต้นสูงสุดคือ 50m/s
  • มุมอาจอยู่ระหว่าง 0 (ตรงขึ้น) และ 180 (ตรงลง)
  • การชนส่วนใดส่วนหนึ่งของขาของนักผจญภัยนั้นถือเป็นการชนที่หัวเข่า
  • กำแพง ( #ตัวอักษร) ใช้บล็อก 0.5 มม. 0.5 มม. ทั้งหมดหนึ่งบล็อก
  • ลูกศรสามารถเดินทางข้าม "ด้านบน" ของไฟล์ได้ แต่ไม่มีสิ่งใดที่จะหยุดอินพุตจากการเริ่มต้นด้วยเพดานของ#อักขระ
  • คุณไม่สามารถเจาะกำแพงด้วยลูกธนู
  • ไม่อนุญาตให้มีการชนส่วนอื่นใดของนักผจญภัย!
  • คุณควรแสดงข้อผิดพลาดหากไม่สามารถตีเขาที่หัวเข่าได้

อินพุตตัวอย่าง:

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

อย่าลังเลที่จะถามคำถามหากคุณต้องการ :)


1
ลูกศรสามารถ "ข้าม" พื้นที่ที่ปรากฎในไฟล์ข้อความได้หรือไม่
JB

2
มีกี่คนที่รู้ว่าใครสูงกว่า 3 เมตร? : P
Peter Taylor

@JB - ใช่ แต่ไม่มีอะไรจะหยุดอินพุตที่เริ่มต้นด้วยบรรทัดใหญ่ของ#############...
Polynomial

2
@PeterTaylor - ทุกคนรู้ว่าผู้คนในเกม RPG มีขนาดใหญ่มากอย่างไม่เป็นสัดส่วน;)
Polynomial

2
น้ำหนักของลูกธนูซ้ำซ้อนใช่ไหม?
Paul R

คำตอบ:


11

Python 599 ตัวอักษร

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)ประจำยิงพาราโบลาK=(a,b,c)ที่เป็นตัวแทนของการ y = ขวาน ^ 2 + BX + Cและส่วนของเส้นL=(a,b,c,d)ที่เป็นตัวแทนของส่วนระหว่าง(A, B)และ(C, D) ทั้งอุปสรรค ( O) และเป้าหมาย ( T) ถูกนำเสนอเป็นส่วนของเส้น ระยะทางทั้งหมดจะถูกปรับอัตราส่วนด้วย 2

ตัวอย่างอินพุตให้วิถีต่อไปนี้ (โดยค่าเริ่มต้นความเร็วขั้นต่ำหนึ่ง):

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

คุณสามารถย้อนกลับRเพื่อรับเส้นทางความเร็วสูงสุด:

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

การทำงานที่ดี. การร้องเรียนเพียงอย่างเดียวคือขีด จำกัด ขนาดอินพุตเท่ากับ 999 ไบต์ มันอาจจะง่ายขึ้นหากพิจารณาขนาดที่เป็นไปได้ของภาพวาด ASCII เหล่านี้ 9999 จะมีเหตุผลมากกว่านี้ในราคาเพียง 1 ตัวอักษร (ถึง ณ จุดนั้นคุณอาจทำ8**5เพื่อรับ 64kB)
พหุนาม

ค่อนข้างมั่นใจว่าคุณจะสามารถประหยัดที่ตัวละครตัวหนึ่งโดยการกำหนดw=v+1และการเปลี่ยน 3 กรณีด้วยv+1 wฉันไม่ได้เขียนรหัส Python มากดังนั้นฉันอาจผิด
พหุนาม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.