나는 당신과 같은 코드 골프 퍼즐을 해결하는 데 사용했지만 무릎에 화살표를


18

화살로 무릎에 부딪히는 것은 지금 선택부상 인 것 같습니다 . 따라서 다음과 같은 골프 도전을 제안합니다.

다음과 같은 모험가가 있습니다.

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

활 1 개 ( }기호 로 그려 짐 ), 벽 세트 ( #기호로 그려 짐 ) 및 모험가 1 개를 포함하는 텍스트 파일이 주어진 경우 , 화살을 치기 위해 화살을 발사해야하는 각도와 초기 속도를 계산하는 가장 작은 코드를 작성하십시오 무릎을 꿇고

다음을 가정하십시오.

  • 파일의 각 문자는 0.5 x 0.5 미터입니다.
  • 화살표가의 중심에서 해고되고 },의 오프셋 (offset), 즉0.25m, 0.25m
  • 중력은 10ms^-2
  • 화살 무게 0.1kg
  • 화살표는 포인트입니다. 즉, 화살표의 좌표가 블록 중 하나에 들어갈 때만 충돌이 발생합니다.
  • 최대 초기 속도는 50m/s
  • 각도는 0 (직선 위)에서 180 (직선 아래) 사이 일 수 있습니다.
  • 모험가의 다리를 치는 것은 무릎에 맞은 것으로 간주됩니다.
  • 벽 ( #캐릭터)은 0.5mx 0.5m 블록 전체를 차지합니다.
  • 화살표는 파일의 "상단"위로 이동할 수 있지만 입력이 #문자 한도에서 시작되는 것을 막을 수있는 것은 없습니다 .
  • 화살표가있는 벽을 관통 할 수 없습니다.
  • 모험가의 다른 부분을 치는 것은 허용되지 않습니다!
  • 무릎을 꿇는 것이 불가능한 경우 오류를 표시해야합니다.

입력 예 :

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

필요한 경우 언제든지 질문하십시오 :)


1
텍스트 파일로 표시된 영역을 화살표로 이동할 수 있습니까?
JB

2
키가 3m 이상인 사람을 몇 명이나 알고 있습니까? : P
Peter Taylor

@JB-네,하지만 큰 줄로 시작하는 입력을 막을 수있는 것은 없습니다 #############.
Polynomial

2
@PeterTaylor-RPG 게임에 참여하는 사람들이 너무 크다는 것을 누구나 알고 있습니다.)
Polynomial

2
화살표의 무게는 반드시 중복됩니다.
Paul R

답변:


11

파이썬, 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 배로 조정됩니다.

예제 입력은 다음과 같은 궤적을 제공합니다 (기본적으로 최소 속도 1).

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

R최대 속도 경로를 얻기 위해 반대로 할 수 있습니다 .

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

잘 했어. 입력 크기 제한이 999 바이트라는 불만이 있습니다. 이러한 ASCII 도면의 잠재적 크기를 고려하면 훨씬 더 쉬울 수 있습니다. 9999는 1 문자의 비용으로 더 합리적입니다. (이 시점에서 8**564kB를 얻을 수도 있습니다. )
다항식

그런 다음 w=v+13 개의 인스턴스를 v+1로 지정 하고 바꾸어 한 문자를 저장할 수 w있습니다. 나는 많은 파이썬을 코딩하지 않으므로 잘못되었을 수 있습니다.
다항식
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.