我曾经像您一样解决代码难题,但后来我却屈指可数


18

用箭头击中膝盖似乎是目前选择伤害。因此,我提出以下高尔夫挑战。

您有一个冒险家,看起来像这样:

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

给定一个文本文件,其中包含一个弓箭(绘制为}符号),一组墙壁(绘制为#符号)和一个冒险家,编写最小的代码,计算出应该发射箭头以击中的角度和初始速度他在膝盖上。

假设以下内容:

  • 文件中的每个字符为0.5 x 0.5米。
  • 从的中心发射箭头},即偏移量为0.25m, 0.25m
  • 重力是 10ms^-2
  • 箭重 0.1kg
  • 箭头是一个点,即仅当箭头的坐标进入一个块时才发生碰撞。
  • 最大初始速度为 50m/s
  • 角度可能在0(直上)和180(直下)之间
  • 击中冒险者腿部的任何部分都被认为是膝盖的重物。
  • 一堵墙(#字符)占据整个0.5mx 0.5m的块。
  • 箭头可以在文件的“顶部”上移动,但是没有什么可以阻止输入以#字符的上限开头。
  • 您不能用箭头穿透墙壁。
  • 不允许击中冒险者的任何其他部分!
  • 如果不可能用膝盖打他,应该显示一个错误。

输入示例:

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

如有问题,请随时提问:)


1
箭头可以在文本文件描绘的区域上“移动”吗?
JB

2
您知道有多少人身高超过3m?:P
彼得·泰勒

@JB-是的,但是没有什么可以阻止输入的开头是大行#############...
多项式

2
@PeterTaylor-每个人都知道RPG游戏中的人非常庞大;)
多项式

2
箭头的重量肯定是多余的吗?
Paul R

Answers:


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 = ax ^ 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+1w。我虽然没有编写太多Python代码,所以我可能是错的。
多项式
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.